rendered paste body
DAEMON=/usr/bin/freshclam
NAME=freshclam
DESC="ClamAV virus database updater"
[ -x $DAEMON ] || exit 0
CLAMAV_CONF_FILE=/etc/clamav/clamd.conf
FRESHCLAM_CONF_FILE=/etc/clamav/freshclam.conf
PIDFILE=/var/run/clamav/freshclam.pid
[ -f /var/lib/clamav/interface ] && INTERFACE=`cat /var/lib/clamav/interface`
. /lib/lsb/init-functions
check_ucf()
{
if ucf -h 2>&1 | grep -q debconf-ok; then
echo ok
else
echo notok
fi
}
ucf_cleanup()
{
# This only does something if I've fucked up before
# Not entirely impossible :(
configfile=$1
if [ `grep "$configfile" /var/lib/ucf/hashfile | wc -l` -gt 1 ]; then
grep -v "$configfile" /var/lib/ucf/hashfile > /var/lib/ucf/hashfile.tmp
grep "$configfile" /var/lib/ucf/hashfile | tail -n 1 >> /var/lib/ucf/hashfile.tmp
mv /var/lib/ucf/hashfile.tmp /var/lib/ucf/hashfile
fi
}
add_to_ucf()
{
configfile=$1
ucffile=$2
if ! grep -q "$configfile" /var/lib/ucf/hashfile; then
md5sum $configfile >> /var/lib/ucf/hashfile
cp $configfile $ucffile
fi
}
ucf_upgrade_check()
{
configfile=$1
sourcefile=$2
ucffile=$3
if [ -f "$configfile" ]; then
add_to_ucf $configfile $ucffile
if [ "$UCFVER" = 'ok' ]; then
ucf --three-way --debconf-ok "$sourcefile" "$configfile"
else
ucf --three-way "$sourcefile" "$configfile" < /dev/tty
fi
else
[ -d /var/lib/ucf/cache ] || mkdir -p /var/lib/ucf/cache
cp $sourcefile $configfile
add_to_ucf $configfile $ucffile
fi
}
slurp_config()
{
CLAMAVCONF="$1"
if [ -e "$CLAMAVCONF" ]; then
for variable in `egrep -v '^[[:space:]]*(#|$)' "$CLAMAVCONF" | awk '{print $1}'`; do
if [ "$variable" = 'DatabaseMirror' ]; then
if [ -z "$DatabaseMirror" ]; then
for i in `grep ^$variable $CLAMAVCONF | awk '{print $2}'`; do
value="$i $value"
done
else
continue
fi
elif [ "$variable" = 'VirusEvent' ] || [ "$variable" = 'OnUpdateExecute' ] || [ "$variable" = 'OnErrorExecute' ]; then
value=`grep ^$variable $CLAMAVCONF | head -n1 | sed -e s/$variable\ //`
else
value=`grep ^$variable $CLAMAVCONF | head -n1 | awk '{print $2}'`
fi
if ! [ "$value" = "$variable" ] || [ "$value" = "" ]; then
export "$variable"="$value"
else
export "$variable"="true"
fi
unset value
done
fi
}
slurp_config "$FRESHCLAM_CONF_FILE"
PID=`pidofproc -p $PIDFILE $DAEMON`
[ "$PID" = '1' ] && unset PID
handle_iface()
{
if [ "$1" = "stop" ]; then
pidofproc -p $PIDFILE $DAEMON > /dev/null || return 1
elif [ "$1" = "start" ]; then
pidofproc -p $PIDFILE $DAEMON > /dev/null && return 1
else
return 0
fi
IS_UP=0
MATCH=0
for inet in $INTERFACE; do
route | grep -q "$inet" && IS_UP=`expr "$IS_UP" + 1`
[ "$inet" = "$IFACE" ] && MATCH=1
done
if [ -n "$INTERFACE" ]; then # Want if-up.d handling
if [ -n "$IFACE" ]; then # Called by if-up.d - for us
if [ "$MATCH" = '1' ]; then # IFACE is ours
if [ "$IS_UP" = '1' ]; then # and is only one up
return 0
else # Either not up, or others are up
return 1
fi
else # IFACE is not ours
return 1
fi
else # Not called by if-up.d && $1='(stop|start)'
return 1
fi
else # No if-up.d handling - just return
return 0
fi
}
handle_iface $1 || exit 0
[ -z "$UpdateLogFile" ] && UpdateLogFile=/var/log/clamav/freshclam.log
[ -z "$DatabaseDirectory" ] && DatabaseDirectory=/var/lib/clamav/
case "$1" in
no-daemon)
log_warning_msg "It takes freshclam ~3min to timeout and try the next mirror in the list"
freshclam -l "$UpdateLogFile" --datadir "$DatabaseDirectory"
;;
start)
log_daemon_msg "Starting $DESC" "$NAME"
# If user wants it run from cron, we only accept no-daemon and stop
if [ -f /etc/cron.d/clamav-freshclam ]; then
log_warning_msg "Not starting $NAME - cron option selected"
log_warning_msg "Run the init script with the 'no-daemon' option"
log_end_msg 1
exit 0
fi
start_daemon $DAEMON -p $PIDFILE -d --quiet
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
if [ -n "$PID" ]; then
kill -15 -"$PID"
ret=$?
sleep 1
if kill -0 "$PID" 2>/dev/null; then
ret=$?
log_progress_msg "Waiting . "
cnt=0
while kill -0 "$PID" 2>/dev/null; do
ret=$?
cnt=`expr "$cnt" + 1`
if [ "$cnt" -gt 15 ]; then
kill -9 "$PID"
ret=$?
break
fi
sleep 2
log_progress_msg ". "
done
fi
else
killproc -p $PIDFILE $DAEMON
ret=$?
fi
log_end_msg $ret
;;
restart|force-reload)
$0 stop
$0 start
;;
reload-log)
log_daemon_msg "Reloading $DESC" "$NAME"
killproc -p $PIDFILE $DAEMON 1
log_end_msg $?
;;
skip)
;;
status)
pidofproc -p $PIDFILE $DAEMON > /dev/null
case "$?" in
0) log_success_msg "$NAME is running."
;;
2) log_warning_msg "$NAME is not running, but pidfile $PIDFILE exists."
;;
3) log_failure_msg "$NAME is not running."
;;
*) log_failure_msg "$NAME is unknown."
;;
esac
;;
*)
log_failure_msg "Usage: $0 {no-daemon|start|stop|restart|force-reload|reload-log|skip|status}" >&2
exit 1
;;
esac
exit 0