#!/bin/sh

# Duncan Findlay
# duncf@debian.org

# Daily cronjob for SpamAssassin updates. This isn't pretty but it
# should do the job.

CHRBIN=/usr/sbin/chroot
CHRDIR=/chroot/maild

AMAVIS_USER=amavis

CRON=0

test -f $CHRDIR/etc/default/spamassassin && . $CHRDIR/etc/default/spamassassin

test -x $CHRDIR/usr/bin/sa-update || exit 0

if [ "$ENABLED" = "1" ] ; then
    test -x /etc/init.d/spamassassin || exit 0
fi

if [ "$CRON" = "0" ] ; then
    exit 0
fi

# If there's a problem with the ruleset or configs, print the output
# of spamassassin --lint (which will typically get emailed to root)
# and abort.
die_with_lint() {
    $CHRBIN $CHRDIR su debian-spamd -c "spamassassin --lint -D 2>&1"
    exit 1
}

do_compile() {
# Compile, if rules have previously been compiled, and it's possible
    if [ -x $CHRDIR/usr/bin/re2c -a -x $CHRDIR/usr/bin/sa-compile \
        -a -d $CHRDIR/var/lib/spamassassin/compiled ]; then
	chown debian-spamd.debian-spamd $CHRDIR/var/lib/spamassassin/compiled -R
        $CHRBIN $CHRDIR su debian-spamd -c "sa-compile --quiet"
        # Fixup perms -- group and other should be able to
        # read and execute, but never write.  Works around
        # sa-compile's failure to obey umask.
	if [ -d $CHRDIR/var/lib/spamassassin ]; then
	    chmod -R go-w,go+rX $CHRDIR/var/lib/spamassassin/compiled
	    chown root.root $CHRDIR/var/lib/spamassassin/compiled -R
	fi
    fi
}

# Tell a running spamd to reload its configs and rules.
reload() {
    # Reload
    if [ "$ENABLED" = "1" ] ; then
	if which invoke-rc.d >/dev/null 2>&1; then
	    invoke-rc.d spamassassin reload > /dev/null
	else
	    /etc/init.d/spamassassin reload > /dev/null
	fi
    fi

    if [ -d $CHRDIR/etc/spamassassin/sa-update-hooks.d ]; then
	$CHRBIN $CHRDIR run-parts --lsbsysinit /etc/spamassassin/sa-update-hooks.d
    fi
}

# Sleep for up to 3600 seconds
#RANGE=3600
#number=`od -vAn -N2 -tu4 < /dev/urandom`
#number=`expr $number "%" $RANGE`
#sleep $number
sleep 3

# Update
#umask 022
$CHRBIN $CHRDIR su debian-spamd -c "sa-update --gpghomedir /var/lib/spamassassin/sa-update-keys"

case $? in
    0)
        # got updates!
        $CHRBIN $CHRDIR su debian-spamd -c "spamassassin --lint" || die_with_lint
        do_compile
	reload
        ;;
    1)
        # no updates
        exit 0
        ;;
    2)
        # lint failed!
        die_with_lint
        ;;
    *)
        echo "sa-update failed for unknown reasons" 1>&2
        ;;
esac

