0
|
1 #! /bin/sh |
|
2 |
|
3 # daily DCC cron job |
|
4 |
|
5 # This script should be run daily or more often when there is a shortage |
|
6 # of disk space to run dbclean to discard and compress old checksums. |
|
7 # It also discards old DCC client log files. |
|
8 |
|
9 #. By default it is installed in @libexecdir@. Instead of being copied |
|
10 # to a directory such as /etc/cron/daily on some systems, a symbolic link |
|
11 # should be used. |
|
12 |
|
13 # cron tab entry like this can be used: |
|
14 # 15 2 * * * @libexecdir@/cron-dccd |
|
15 # It is best to choose different times for each of your DCC servers so |
|
16 # that your servers are not all busy cleaning their databases at once. |
|
17 |
|
18 # -x turn on debugging |
|
19 # -F do not follow symbolic links because they are used to share |
|
20 # per-user directories |
|
21 # -h dir override DCC home directory @prefix@ |
|
22 # -a args for dbclean in addition to DBCLEAN_ARGS in @prefix@/dcc_conf |
|
23 |
|
24 # Copyright (c) 2008 by Rhyolite Software, LLC |
|
25 # |
|
26 # This agreement is not applicable to any entity which sells anti-spam |
|
27 # solutions to others or provides an anti-spam solution as part of a |
|
28 # security solution sold to other entities, or to a private network |
|
29 # which employs the DCC or uses data provided by operation of the DCC |
|
30 # but does not provide corresponding data to other users. |
|
31 # |
|
32 # Permission to use, copy, modify, and distribute this software without |
|
33 # changes for any purpose with or without fee is hereby granted, provided |
|
34 # that the above copyright notice and this permission notice appear in all |
|
35 # copies and any distributed versions or copies are either unchanged |
|
36 # or not called anything similar to "DCC" or "Distributed Checksum |
|
37 # Clearinghouse". |
|
38 # |
|
39 # Parties not eligible to receive a license under this agreement can |
|
40 # obtain a commercial license to use DCC by contacting Rhyolite Software |
|
41 # at sales@rhyolite.com. |
|
42 # |
|
43 # A commercial license would be for Distributed Checksum and Reputation |
|
44 # Clearinghouse software. That software includes additional features. This |
|
45 # free license for Distributed ChecksumClearinghouse Software does not in any |
|
46 # way grant permision to use Distributed Checksum and Reputation Clearinghouse |
|
47 # software |
|
48 # |
|
49 # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL |
|
50 # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |
|
51 # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC |
|
52 # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES |
|
53 # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
|
54 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
|
55 # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
|
56 # SOFTWARE. |
|
57 # Rhyolite Software DCC 1.3.103-1.81 $Revision$ |
|
58 # @configure_input@ |
|
59 |
|
60 exec 1>&2 </dev/null |
|
61 # English messages so grep can suppress them; |
|
62 # simple collating sequence for sort |
|
63 # sane gcc error messages |
|
64 LC_ALL=C; export LC_ALL |
|
65 |
|
66 |
|
67 LOGGER_TAG=cron-dccd |
|
68 DCC_LOGGER="@DCC_LOGGER@" |
|
69 DCC_HOMEDIR=@prefix@ |
|
70 DEBUG= |
|
71 QUIET=-q |
|
72 FOLLOW=-follow |
|
73 # check the args once to get the home directory |
|
74 while getopts ":xFh:a:" c; do |
|
75 case $c in |
|
76 x) set -x; DEBUG=-x; QUIET=;; |
|
77 h) DCC_HOMEDIR="$OPTARG";; |
|
78 *) ;; |
|
79 esac |
|
80 done |
|
81 . $DCC_HOMEDIR/dcc_conf |
|
82 # deal with bash reserved $UID and old versions of dcc_conf |
|
83 if test 0"$DCC_CONF_VERSION" -lt 2 -a -z "$DCCUID" -a -n "$UID"; then |
|
84 DCCUID="$UID" |
|
85 fi |
|
86 |
|
87 USAGE="`basename $0`: [-xF] [-h homedir] [-a args]" |
|
88 OPTIND=1 |
|
89 while getopts "xFh:a:" c; do |
|
90 case $c in |
|
91 x) ;; |
|
92 F) FOLLOW=;; |
|
93 h) ;; |
|
94 a) DBCLEAN_ARGS="$DBCLEAN_ARGS $OPTARG";; |
|
95 *) eval $DCC_LOGGER "$USAGE"; exit 1;; |
|
96 esac |
|
97 done |
|
98 shift `expr $OPTIND - 1 || true` |
|
99 if test "$#" -ne 0; then |
|
100 eval $DCC_LOGGER "$USAGE" |
|
101 exit 1 |
|
102 fi |
|
103 |
|
104 DCCD_GETOPTS="64dVbfFQi:n:h:a:I:q:G:t:W:K:T:u:C:L:R:" |
|
105 DBCLEAN_GETOPTS="64dfFNRPSVqWi:a:h:G:s:e:E:t:L:" |
|
106 |
|
107 DBCLEAN_ARGS="$QUIET -h $DCC_HOMEDIR $DCC_LOG_ARGS $DBCLEAN_ARGS" |
|
108 |
|
109 # remove -e, -E, and -t from args for `dbclean -Gon` |
|
110 set -f |
|
111 GREY_DBCLEAN_ARGS= |
|
112 OPTIND=1 |
|
113 while getopts "$DBCLEAN_GETOPTS" c $DBCLEAN_ARGS; do |
|
114 case $c in |
|
115 [eEt:?]) ;; |
|
116 *) GREY_DBCLEAN_ARGS="$GREY_DBCLEAN_ARGS -$c $OPTARG";; |
|
117 esac |
|
118 done |
|
119 |
|
120 # find addresses that dccd is using |
|
121 ADDR= |
|
122 OPTIND=1 |
|
123 while getopts "$DCCD_GETOPTS" c $DCCD_ARGS; do |
|
124 case $c in |
|
125 [46a]) ADDR="$ADDR -$c $OPTARG";; |
|
126 *) ;; |
|
127 esac |
|
128 done |
|
129 DBCLEAN_ARGS="$ADDR $DBCLEAN_ARGS" |
|
130 |
|
131 ADDR= |
|
132 OPTIND=1 |
|
133 while getopts "$DCCD_GETOPTS" c $GREY_DCCD_ARGS; do |
|
134 case $c in |
|
135 [46a]) ADDR="$ADDR -$c $OPTARG";; |
|
136 *) ;; |
|
137 esac |
|
138 done |
|
139 GREY_DBCLEAN_ARGS="$ADDR $GREY_DBCLEAN_ARGS" |
|
140 set +f |
|
141 |
|
142 |
|
143 # make the paths absolute and trim the per day/hour/minute business |
|
144 DCCM_LOGDIR=`echo $DCCM_LOGDIR \ |
|
145 | sed -e 's@["'"']*@@g" -e "s@[DHM]?@@" -e "s@^[^/]@$DCC_HOMEDIR/&@"` |
|
146 DCCM_USERDIRS=`echo $DCCM_USERDIRS \ |
|
147 | sed -e "s@^[^/]@$DCC_HOMEDIR/&@"` |
|
148 DCCIFD_LOGDIR=`echo $DCCIFD_LOGDIR \ |
|
149 | sed -e 's@["'"']*@@g" -e "s@[DHM]?@@" -e "s@^[^/]@$DCC_HOMEDIR/&@"` |
|
150 DCCIFD_USERDIRS=`echo $DCCIFD_USERDIRS \ |
|
151 | sed -e "s@^[^/]@$DCC_HOMEDIR/&@"` |
|
152 LOGDIRS= |
|
153 if test -n "$DCCM_LOGDIR" -a -d "$DCCM_LOGDIR"; then |
|
154 LOGDIRS="$DCCM_LOGDIR" |
|
155 fi |
|
156 if test "$LOGDIRS" != "$DCCIFD_LOGDIR" -a -n "$DCCIFD_LOGDIR" \ |
|
157 -a -d "$DCCIFD_LOGDIR"; then |
|
158 LOGDIRS="$LOGDIRS $DCCIFD_LOGDIR" |
|
159 fi |
|
160 USERDIRS= |
|
161 if test -n "$DCCM_USERDIRS" -a -d "$DCCM_USERDIRS"; then |
|
162 USERDIRS="$DCCM_USERDIRS" |
|
163 fi |
|
164 if test -n "$DCCIFD_USERDIRS" -a -d "$DCCIFD_USERDIRS"; then |
|
165 # $DCCM_USERDIRS is often an initial substring of $DCCIFD_USERDIRS |
|
166 if expr "$DCCIFD_USERDIRS" : "$DCCM_USERDIRS" >/dev/null; then : |
|
167 else |
|
168 USERDIRS="$USERDIRS $DCCIFD_USERDIRS" |
|
169 fi |
|
170 fi |
|
171 |
|
172 # trim the greylist database |
|
173 case X"$GREY_ENABLE" in |
|
174 [oO][nN]) |
|
175 GREY_ENABLE=on |
|
176 ;; |
|
177 X) |
|
178 if test -n "$GREY_CLIENT_ARGS"; then |
|
179 GREY_ENABLE=on |
|
180 fi |
|
181 ;; |
|
182 esac |
|
183 if test -z "$GREY_SRVR_ID"; then |
|
184 if test -n "`grep '# auto local greylist server-ID' $DCC_HOMEDIR/ids`" \ |
|
185 -a -n "`grep '^32702' $DCC_HOMEDIR/ids`"; then |
|
186 GREY_SRVR_ID=32702 |
|
187 fi |
|
188 fi |
|
189 if test -n "$GREY_SRVR_ID" -a "$GREY_ENABLE" = on; then |
|
190 if $DCC_LIBEXEC/dbclean -Gon -i $GREY_SRVR_ID $GREY_DBCLEAN_ARGS; then : |
|
191 else |
|
192 # assume EX_DCC_RESTART=79 |
|
193 if test $? -eq 79; then |
|
194 eval $DCC_LOGGER "running dbclean -S and restarting greylist server" |
|
195 $DCC_LIBEXEC/dbclean -S -Gon -i $GREY_SRVR_ID $GREY_DBCLEAN_ARGS |
|
196 $DCC_LIBEXEC/start-grey |
|
197 fi |
|
198 fi |
|
199 fi |
|
200 |
|
201 |
|
202 # Delete old checksums from the dccd database if it seems dccd can run. |
|
203 # For historical reasons, SRVR_ID set and DCCD_ENABLE null |
|
204 # also turns on dccd. |
|
205 case "$DCCD_ENABLE" in |
|
206 [oO][fF][fF]) DCCD_ENABLE=off;; |
|
207 *) DCCD_ENABLE=on;; |
|
208 esac |
|
209 if test -n "$SRVR_ID" -a "$DCCD_ENABLE" = on; then |
|
210 if $DCC_LIBEXEC/dbclean -i $SRVR_ID $SADDR $DBCLEAN_ARGS; then : |
|
211 else |
|
212 # assume EX_DCC_RESTART=79 |
|
213 if test $? -eq 79; then |
|
214 eval $DCC_LOGGER "running dbclean -S and restarting DCC server" |
|
215 $DCC_LIBEXEC/dbclean -S -i $SRVR_ID $SADDR $DBCLEAN_ARGS |
|
216 $DCC_LIBEXEC/start-dccd |
|
217 fi |
|
218 fi |
|
219 fi |
|
220 |
|
221 |
|
222 # Remove old dccm and dccifd log files. |
|
223 if test -n "$DBCLEAN_LOGDAYS" -a -n "$LOGDIRS$USERDIRS"; then |
|
224 ( find $LOGDIRS $USERDIRS $FOLLOW -type f \ |
|
225 \( \( -name 'msg.*' -mtime +$DBCLEAN_LOGDAYS \) \ |
|
226 -o \( -name 'tmp.*' -mtime +1 \) \) -print \ |
|
227 | @DCC_XARGS@ /bin/rm |
|
228 find $LOGDIRS $USERDIRS $FOLLOW -depth -type d \ |
|
229 \( -name '[0-9]' -o -name '[0-9][0-9]' \ |
|
230 -o -name '[0-9][0-9][0-9]' \) -print \ |
|
231 | @DCC_XARGS@ /bin/rmdir |
|
232 ) 2>&1 | grep -v 'No such file or directory' \ |
|
233 | grep -v 'Directory not empty' |
|
234 fi |
|
235 |
|
236 # Notify users about new log files. |
|
237 # The file $DCC_LIBEXEC/webuser-notify must be a script that will send |
|
238 # a suitable message. See the example in the cgi-bin directory. |
|
239 if test -n "$USERDIRS" -a -x $DCC_LIBEXEC/webuser-notify; then |
|
240 for DIR in $USERDIRS; do |
|
241 MARKER=$DIR/notify.marker |
|
242 if test -r $MARKER; then |
|
243 NEWER="-newer $MARKER" |
|
244 else |
|
245 NEWER= |
|
246 fi |
|
247 rm -f $MARKER.new |
|
248 touch $MARKER.new |
|
249 |
|
250 # Find usernames with a pending message or with a new but not newer |
|
251 # than new log file. Avoid newer than new files to ensure we |
|
252 # generate at most one notification per log file. |
|
253 (cd $DIR; find . $FOLLOW -type f \( -name notify.pending \ |
|
254 -o \( $NEWER -name 'msg.*' \) \) \ |
|
255 ! -newer $MARKER.new -print ) \ |
|
256 | sed -n -e 's@\./\(.*\)/log/msg\..*@\1@p' \ |
|
257 -e 's@\./\(.*\)/log/[0-9/]*/msg\..*@\1@p' \ |
|
258 -e 's@\./\(.*\)/notify.pending$@\1@p' \ |
|
259 | sort -u \ |
|
260 | $DCC_LIBEXEC/webuser-notify $DEBUG -d "$DIR" |
|
261 |
|
262 mv -f $MARKER.new $MARKER |
|
263 done |
|
264 fi |
|
265 |
|
266 |
|
267 # encourage local DCC clients to switch back |
|
268 @bindir@/cdcc -q rtt >/dev/null 2>&1 |