#!/bin/sh /etc/rc.common
# Copyright (C) 2015 OpenWrt.org

START=90
STOP=10

USE_PROCD=1
PROG=/usr/sbin/clamd
CLAMD_CONFIGFILE="/tmp/clamav/clamd.conf"

validate_clamav_section() {
	uci_validate_section clamav clamav "${1}" \
		'clamd_config_file:string' \
		'LogFile:string' \
		'LogFileMaxSize:string' \
		'LogVerbose:string' \
		'ExtendedDetectionInfo:string' \
		'LogTime:string' \
		'OfficialDatabaseOnly:string' \
		'StreamMinPort:uinteger' \
		'StreamMaxPort:uinteger' \
		'MaxThreads:uinteger' \
		'ReadTimeout:uinteger' \
		'CommandReadTimeout:uinteger' \
		'MaxDirectoryRecursion:uinteger' \
		'FollowDirectorySymlinks:string' \
		'FollowFileSymlinks:string' \
		'SelfCheck:uinteger' \
		'DetectPUA:string' \
		'ScanPE:string' \
		'DisableCertCheck:string' \
		'ScanELF:string' \
		'DetectBrokenExecutables:string' \
		'ScanOLE2:string' \
		'ScanPDF:string' \
		'ScanSWF:string' \
		'ScanMail:string' \
		'ScanPartialMessages:string' \
		'ScanArchive:string' \
		'TemporaryDirectory:string' \
		'ArchiveBlockEncrypted:string' \
		'MaxFileSize:string' \
		'LocalSocket:string' \
		'User:string' \
		'ExitOnOOM:string' \
		'DatabaseDirectory:string'
}

start_service() {
	local clamd_config_file LogFile LogTime StreamMinPort \
		StreamMaxPort MaxThreads ReadTimeout CommandReadTimeout MaxDirectoryRecursion \
		FollowFileSymlinks FollowDirectorySymlinks SelfCheck DetectPUA ScanPE DisableCertCheck \
		ScanELF DetectBrokenExecutables ScanOLE2 ScanPDF ScanSWF ScanMail ScanPartialMessages \
		ScanArchive TemporaryDirectory ArchiveBlockEncrypted MaxFileSize LocalSocket User \
		DatabaseDirectory

	validate_clamav_section clamav || {
		echo "validation failed"
		return 1
	}

	mkdir -p $DatabaseDirectory
	mkdir -p /etc/clamav/
	mkdir -p /var/run/clamav/
	chmod a+rw /var/run/clamav

	mkdir -p $(dirname $CLAMD_CONFIGFILE)
	ln -sf $clamd_config_file $CLAMD_CONFIGFILE

	echo "LogFile " $LogFile > $CLAMD_CONFIGFILE
	echo "LogFileMaxSize " $LogFileMaxSize >> $CLAMD_CONFIGFILE
	echo "LogVerbose " $LogVerbose >> $CLAMD_CONFIGFILE
	echo "ExtendedDetectionInfo " $ExtendedDetectionInfo >> $CLAMD_CONFIGFILE
	echo "LogTime " $LogTime >> $CLAMD_CONFIGFILE
	echo "OfficialDatabaseOnly " $OfficialDatabaseOnly >> $CLAMD_CONFIGFILE
	echo "StreamMinPort " $StreamMinPort >> $CLAMD_CONFIGFILE
	echo "StreamMaxPort " $StreamMaxPort >> $CLAMD_CONFIGFILE
	echo "MaxThreads " $MaxThreads >> $CLAMD_CONFIGFILE
	echo "ReadTimeout " $ReadTimeout >> $CLAMD_CONFIGFILE
	echo "CommandReadTimeout " $CommandReadTimeout >> $CLAMD_CONFIGFILE
	echo "MaxDirectoryRecursion " $MaxDirectoryRecursion >> $CLAMD_CONFIGFILE
	echo "FollowDirectorySymlinks " $FollowDirectorySymlinks >> $CLAMD_CONFIGFILE
	echo "FollowFileSymlinks " $FollowFileSymlinks >> $CLAMD_CONFIGFILE
	echo "SelfCheck " $SelfCheck >> $CLAMD_CONFIGFILE
	echo "DetectPUA " $DetectPUA >> $CLAMD_CONFIGFILE
	echo "ScanPE " $ScanPE >> $CLAMD_CONFIGFILE
	echo "DisableCertCheck " $DisableCertCheck >> $CLAMD_CONFIGFILE
	echo "ScanELF " $ScanELF >> $CLAMD_CONFIGFILE
	echo "DetectBrokenExecutables " $DetectBrokenExecutables >> $CLAMD_CONFIGFILE
	echo "ScanOLE2 " $ScanOLE2 >> $CLAMD_CONFIGFILE
	echo "ScanPDF " $ScanPDF >> $CLAMD_CONFIGFILE
	echo "ScanSWF " $ScanSWF >> $CLAMD_CONFIGFILE
	echo "ScanMail " $ScanMail >> $CLAMD_CONFIGFILE
	echo "ScanPartialMessages " $ScanPartialMessages >> $CLAMD_CONFIGFILE
	echo "ScanArchive " $ScanArchive >> $CLAMD_CONFIGFILE
	echo "TemporaryDirectory " $TemporaryDirectory >> $CLAMD_CONFIGFILE
	echo "ArchiveBlockEncrypted " $ArchiveBlockEncrypted >> $CLAMD_CONFIGFILE
	echo "MaxFileSize " $MaxFileSize >> $CLAMD_CONFIGFILE
	echo "LocalSocket " $LocalSocket >> $CLAMD_CONFIGFILE
	echo "User " $User >> $CLAMD_CONFIGFILE
	echo "ExitOnOOM " $ExitOnOOM >> $CLAMD_CONFIGFILE
	echo "DatabaseDirectory " $DatabaseDirectory >> $CLAMD_CONFIGFILE

	procd_open_instance
	procd_set_param command $PROG -c $CLAMD_CONFIGFILE
	procd_set_param file $CLAMD_CONFIGFILE
	procd_close_instance
}

stop_service()
{
	service_stop ${PROG}
}

service_triggers()
{
	procd_add_reload_trigger "clamav"
	procd_add_validation validate_clamav_section
}
