Mercurial > notdcc
diff misc/cron-dccd.in @ 0:c7f6b056b673
First import of vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 13:49:58 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/cron-dccd.in Tue Mar 10 13:49:58 2009 +0100 @@ -0,0 +1,268 @@ +#! /bin/sh + +# daily DCC cron job + +# This script should be run daily or more often when there is a shortage +# of disk space to run dbclean to discard and compress old checksums. +# It also discards old DCC client log files. + +#. By default it is installed in @libexecdir@. Instead of being copied +# to a directory such as /etc/cron/daily on some systems, a symbolic link +# should be used. + +# cron tab entry like this can be used: +# 15 2 * * * @libexecdir@/cron-dccd +# It is best to choose different times for each of your DCC servers so +# that your servers are not all busy cleaning their databases at once. + +# -x turn on debugging +# -F do not follow symbolic links because they are used to share +# per-user directories +# -h dir override DCC home directory @prefix@ +# -a args for dbclean in addition to DBCLEAN_ARGS in @prefix@/dcc_conf + +# Copyright (c) 2008 by Rhyolite Software, LLC +# +# This agreement is not applicable to any entity which sells anti-spam +# solutions to others or provides an anti-spam solution as part of a +# security solution sold to other entities, or to a private network +# which employs the DCC or uses data provided by operation of the DCC +# but does not provide corresponding data to other users. +# +# Permission to use, copy, modify, and distribute this software without +# changes for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear in all +# copies and any distributed versions or copies are either unchanged +# or not called anything similar to "DCC" or "Distributed Checksum +# Clearinghouse". +# +# Parties not eligible to receive a license under this agreement can +# obtain a commercial license to use DCC by contacting Rhyolite Software +# at sales@rhyolite.com. +# +# A commercial license would be for Distributed Checksum and Reputation +# Clearinghouse software. That software includes additional features. This +# free license for Distributed ChecksumClearinghouse Software does not in any +# way grant permision to use Distributed Checksum and Reputation Clearinghouse +# software +# +# THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC +# BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +# SOFTWARE. +# Rhyolite Software DCC 1.3.103-1.81 $Revision$ +# @configure_input@ + +exec 1>&2 </dev/null +# English messages so grep can suppress them; +# simple collating sequence for sort +# sane gcc error messages +LC_ALL=C; export LC_ALL + + +LOGGER_TAG=cron-dccd +DCC_LOGGER="@DCC_LOGGER@" +DCC_HOMEDIR=@prefix@ +DEBUG= +QUIET=-q +FOLLOW=-follow +# check the args once to get the home directory +while getopts ":xFh:a:" c; do + case $c in + x) set -x; DEBUG=-x; QUIET=;; + h) DCC_HOMEDIR="$OPTARG";; + *) ;; + esac +done +. $DCC_HOMEDIR/dcc_conf +# deal with bash reserved $UID and old versions of dcc_conf +if test 0"$DCC_CONF_VERSION" -lt 2 -a -z "$DCCUID" -a -n "$UID"; then + DCCUID="$UID" +fi + +USAGE="`basename $0`: [-xF] [-h homedir] [-a args]" +OPTIND=1 +while getopts "xFh:a:" c; do + case $c in + x) ;; + F) FOLLOW=;; + h) ;; + a) DBCLEAN_ARGS="$DBCLEAN_ARGS $OPTARG";; + *) eval $DCC_LOGGER "$USAGE"; exit 1;; + esac +done +shift `expr $OPTIND - 1 || true` +if test "$#" -ne 0; then + eval $DCC_LOGGER "$USAGE" + exit 1 +fi + +DCCD_GETOPTS="64dVbfFQi:n:h:a:I:q:G:t:W:K:T:u:C:L:R:" +DBCLEAN_GETOPTS="64dfFNRPSVqWi:a:h:G:s:e:E:t:L:" + +DBCLEAN_ARGS="$QUIET -h $DCC_HOMEDIR $DCC_LOG_ARGS $DBCLEAN_ARGS" + +# remove -e, -E, and -t from args for `dbclean -Gon` +set -f +GREY_DBCLEAN_ARGS= +OPTIND=1 +while getopts "$DBCLEAN_GETOPTS" c $DBCLEAN_ARGS; do + case $c in + [eEt:?]) ;; + *) GREY_DBCLEAN_ARGS="$GREY_DBCLEAN_ARGS -$c $OPTARG";; + esac +done + +# find addresses that dccd is using +ADDR= +OPTIND=1 +while getopts "$DCCD_GETOPTS" c $DCCD_ARGS; do + case $c in + [46a]) ADDR="$ADDR -$c $OPTARG";; + *) ;; + esac +done +DBCLEAN_ARGS="$ADDR $DBCLEAN_ARGS" + +ADDR= +OPTIND=1 +while getopts "$DCCD_GETOPTS" c $GREY_DCCD_ARGS; do + case $c in + [46a]) ADDR="$ADDR -$c $OPTARG";; + *) ;; + esac +done +GREY_DBCLEAN_ARGS="$ADDR $GREY_DBCLEAN_ARGS" +set +f + + +# make the paths absolute and trim the per day/hour/minute business +DCCM_LOGDIR=`echo $DCCM_LOGDIR \ + | sed -e 's@["'"']*@@g" -e "s@[DHM]?@@" -e "s@^[^/]@$DCC_HOMEDIR/&@"` +DCCM_USERDIRS=`echo $DCCM_USERDIRS \ + | sed -e "s@^[^/]@$DCC_HOMEDIR/&@"` +DCCIFD_LOGDIR=`echo $DCCIFD_LOGDIR \ + | sed -e 's@["'"']*@@g" -e "s@[DHM]?@@" -e "s@^[^/]@$DCC_HOMEDIR/&@"` +DCCIFD_USERDIRS=`echo $DCCIFD_USERDIRS \ + | sed -e "s@^[^/]@$DCC_HOMEDIR/&@"` +LOGDIRS= +if test -n "$DCCM_LOGDIR" -a -d "$DCCM_LOGDIR"; then + LOGDIRS="$DCCM_LOGDIR" +fi +if test "$LOGDIRS" != "$DCCIFD_LOGDIR" -a -n "$DCCIFD_LOGDIR" \ + -a -d "$DCCIFD_LOGDIR"; then + LOGDIRS="$LOGDIRS $DCCIFD_LOGDIR" +fi +USERDIRS= +if test -n "$DCCM_USERDIRS" -a -d "$DCCM_USERDIRS"; then + USERDIRS="$DCCM_USERDIRS" +fi +if test -n "$DCCIFD_USERDIRS" -a -d "$DCCIFD_USERDIRS"; then + # $DCCM_USERDIRS is often an initial substring of $DCCIFD_USERDIRS + if expr "$DCCIFD_USERDIRS" : "$DCCM_USERDIRS" >/dev/null; then : + else + USERDIRS="$USERDIRS $DCCIFD_USERDIRS" + fi +fi + +# trim the greylist database +case X"$GREY_ENABLE" in + [oO][nN]) + GREY_ENABLE=on + ;; + X) + if test -n "$GREY_CLIENT_ARGS"; then + GREY_ENABLE=on + fi + ;; +esac +if test -z "$GREY_SRVR_ID"; then + if test -n "`grep '# auto local greylist server-ID' $DCC_HOMEDIR/ids`" \ + -a -n "`grep '^32702' $DCC_HOMEDIR/ids`"; then + GREY_SRVR_ID=32702 + fi +fi +if test -n "$GREY_SRVR_ID" -a "$GREY_ENABLE" = on; then + if $DCC_LIBEXEC/dbclean -Gon -i $GREY_SRVR_ID $GREY_DBCLEAN_ARGS; then : + else + # assume EX_DCC_RESTART=79 + if test $? -eq 79; then + eval $DCC_LOGGER "running dbclean -S and restarting greylist server" + $DCC_LIBEXEC/dbclean -S -Gon -i $GREY_SRVR_ID $GREY_DBCLEAN_ARGS + $DCC_LIBEXEC/start-grey + fi + fi +fi + + +# Delete old checksums from the dccd database if it seems dccd can run. +# For historical reasons, SRVR_ID set and DCCD_ENABLE null +# also turns on dccd. +case "$DCCD_ENABLE" in + [oO][fF][fF]) DCCD_ENABLE=off;; + *) DCCD_ENABLE=on;; +esac +if test -n "$SRVR_ID" -a "$DCCD_ENABLE" = on; then + if $DCC_LIBEXEC/dbclean -i $SRVR_ID $SADDR $DBCLEAN_ARGS; then : + else + # assume EX_DCC_RESTART=79 + if test $? -eq 79; then + eval $DCC_LOGGER "running dbclean -S and restarting DCC server" + $DCC_LIBEXEC/dbclean -S -i $SRVR_ID $SADDR $DBCLEAN_ARGS + $DCC_LIBEXEC/start-dccd + fi + fi +fi + + +# Remove old dccm and dccifd log files. +if test -n "$DBCLEAN_LOGDAYS" -a -n "$LOGDIRS$USERDIRS"; then + ( find $LOGDIRS $USERDIRS $FOLLOW -type f \ + \( \( -name 'msg.*' -mtime +$DBCLEAN_LOGDAYS \) \ + -o \( -name 'tmp.*' -mtime +1 \) \) -print \ + | @DCC_XARGS@ /bin/rm + find $LOGDIRS $USERDIRS $FOLLOW -depth -type d \ + \( -name '[0-9]' -o -name '[0-9][0-9]' \ + -o -name '[0-9][0-9][0-9]' \) -print \ + | @DCC_XARGS@ /bin/rmdir + ) 2>&1 | grep -v 'No such file or directory' \ + | grep -v 'Directory not empty' +fi + +# Notify users about new log files. +# The file $DCC_LIBEXEC/webuser-notify must be a script that will send +# a suitable message. See the example in the cgi-bin directory. +if test -n "$USERDIRS" -a -x $DCC_LIBEXEC/webuser-notify; then + for DIR in $USERDIRS; do + MARKER=$DIR/notify.marker + if test -r $MARKER; then + NEWER="-newer $MARKER" + else + NEWER= + fi + rm -f $MARKER.new + touch $MARKER.new + + # Find usernames with a pending message or with a new but not newer + # than new log file. Avoid newer than new files to ensure we + # generate at most one notification per log file. + (cd $DIR; find . $FOLLOW -type f \( -name notify.pending \ + -o \( $NEWER -name 'msg.*' \) \) \ + ! -newer $MARKER.new -print ) \ + | sed -n -e 's@\./\(.*\)/log/msg\..*@\1@p' \ + -e 's@\./\(.*\)/log/[0-9/]*/msg\..*@\1@p' \ + -e 's@\./\(.*\)/notify.pending$@\1@p' \ + | sort -u \ + | $DCC_LIBEXEC/webuser-notify $DEBUG -d "$DIR" + + mv -f $MARKER.new $MARKER + done +fi + + +# encourage local DCC clients to switch back +@bindir@/cdcc -q rtt >/dev/null 2>&1