| #!/bin/sh |
| |
| # Duncan Findlay |
| # duncf@debian.org |
| |
| # Daily cronjob for SpamAssassin updates. This isn't pretty but it |
| # should do the job. |
| |
| CRON=0 |
| |
| test -f /etc/default/spamassassin && . /etc/default/spamassassin |
| |
| test -x /usr/bin/sa-update || exit 0 |
| test -x /etc/init.d/spamassassin || exit 0 |
| |
| 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() { |
| spamassassin --lint -D 2>&1 |
| exit 1 |
| } |
| |
| do_compile() { |
| # Compile, if rules have previously been compiled, and it's possible |
| if [ -x /usr/bin/re2c -a -x /usr/bin/sa-compile \ |
| -a -d /var/lib/spamassassin/compiled ]; then |
| 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 /var/lib/spamassassin ]; then |
| chmod -R go-w,go+rX /var/lib/spamassassin/ |
| fi |
| fi |
| } |
| |
| # Tell a running spamd to reload its configs and rules. |
| reload() { |
| # Reload |
| 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 |
| if [ -d /etc/spamassassin/sa-update-hooks.d ]; then |
| 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 |
| |
| |
| # Update |
| umask 022 |
| sa-update |
| |
| case $? in |
| 0) |
| # got updates! |
| 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 |
| |