0
|
1 #! /bin/sh |
|
2 |
|
3 # send mail messages about new per-user DCC log files |
|
4 |
|
5 # This script can be run by the daily DCC cron job after it has been |
|
6 # 1. changed to contain the URL of the local DCC CGI scripts, |
|
7 # 2. changed to use a locally suitable command to send mail |
|
8 # 3. copied to the DCC libexec directory, |
|
9 # 4. and made executable. |
|
10 # It is remotely possible that the default values in this script are |
|
11 # suitable and that you could use this script directly by putting |
|
12 # the following in the libexec directory: |
|
13 # #! /bin/sh |
|
14 # sh /var/dcc/cgi-bin/webuser-notify -d $* |
|
15 # |
|
16 # This script expects to be called by the standard DCC cron job to read a |
|
17 # series of user names on stdin, each of which has a new log file. |
|
18 # Each user name must be prefixed with the appropriate subdirectory such |
|
19 # as "local/". The single argument to this script must be the |
|
20 # DCCM_USERDIRS or DCCIFD_USERDIRS_directory made into an absolute path. |
|
21 |
|
22 |
|
23 # Copyright (c) 2008 by Rhyolite Software, LLC |
|
24 # |
|
25 # This agreement is not applicable to any entity which sells anti-spam |
|
26 # solutions to others or provides an anti-spam solution as part of a |
|
27 # security solution sold to other entities, or to a private network |
|
28 # which employs the DCC or uses data provided by operation of the DCC |
|
29 # but does not provide corresponding data to other users. |
|
30 # |
|
31 # Permission to use, copy, modify, and distribute this software without |
|
32 # changes for any purpose with or without fee is hereby granted, provided |
|
33 # that the above copyright notice and this permission notice appear in all |
|
34 # copies and any distributed versions or copies are either unchanged |
|
35 # or not called anything similar to "DCC" or "Distributed Checksum |
|
36 # Clearinghouse". |
|
37 # |
|
38 # Parties not eligible to receive a license under this agreement can |
|
39 # obtain a commercial license to use DCC by contacting Rhyolite Software |
|
40 # at sales@rhyolite.com. |
|
41 # |
|
42 # A commercial license would be for Distributed Checksum and Reputation |
|
43 # Clearinghouse software. That software includes additional features. This |
|
44 # free license for Distributed ChecksumClearinghouse Software does not in any |
|
45 # way grant permision to use Distributed Checksum and Reputation Clearinghouse |
|
46 # software |
|
47 # |
|
48 # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL |
|
49 # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |
|
50 # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC |
|
51 # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES |
|
52 # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
|
53 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
|
54 # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
|
55 # SOFTWARE. |
|
56 # Rhyolite Software DCC 1.3.103-1.11 $Revision$ |
|
57 |
|
58 |
|
59 # http or https; prefer https. |
|
60 HTTPS="https" |
|
61 |
|
62 # URL of the CGI scripts |
|
63 # you will probably need to change this |
|
64 BASE=`hostname` |
|
65 BASE=`expr "$BASE" : '.*\.\([^.]*\.[^.]*$\)' \| "$BASE"` |
|
66 BASE="www.$BASE/DCC-cgi-bin" |
|
67 |
|
68 |
|
69 SWITCH='#webuser mail-notify' |
|
70 |
|
71 USAGE="`basename $0`: [-x] -d userdirs" |
|
72 USERDIRS= |
|
73 while getopts "xd:" c; do |
|
74 case $c in |
|
75 x) set -x;; |
|
76 d) USERDIRS=$OPTARG;; |
|
77 *) ;; |
|
78 esac |
|
79 done |
|
80 shift `expr $OPTIND - 1 || true` |
|
81 if test "$#" -ne 0 -o "$USERDIRS" = ""; then |
|
82 echo "$USAGE" 1>&2 |
|
83 exit 1 |
|
84 fi |
|
85 if test ! -d "$USERDIRS"; then |
|
86 echo "userdir $1 is not a directory" 1>&2 |
|
87 exit 1 |
|
88 fi |
|
89 |
|
90 |
|
91 while read NM; do |
|
92 # ignore users that are not configured to use the machinery |
|
93 if test ! -f "$USERDIRS/$NM/whiteclnt"; then |
|
94 continue; |
|
95 fi |
|
96 |
|
97 DIR="$USERDIRS/$NM" |
|
98 |
|
99 UNAME=`expr "$NM" : 'local/\(.*\)' \| "$NM"` |
|
100 OK=no |
|
101 BOX="$UNAME" |
|
102 eval `sed -n -e '/^[^#]/q' \ |
|
103 -e "s/^$SWITCH=on mailbox=$/OK=yes;/p" \ |
|
104 -e "s/^$SWITCH=on mailbox=\(.*\)/BOX=\1;OK=yes;/p" \ |
|
105 -e "s/^$SWITCH=off.*/OK=no;/p" $USERDIRS/$NM/whiteclnt` |
|
106 if test "$OK" != yes; then |
|
107 # forget it if notifications are turned off for this user |
|
108 continue |
|
109 fi |
|
110 |
|
111 # Don't send a notification of messages older than this file, |
|
112 # because the user has already check them through the CGI scripts. |
|
113 MARKER=notify.marker |
|
114 |
|
115 # Postpone notifications until this file is current to avoid sending |
|
116 # daily notes that the user is ignoring. |
|
117 BLOCK=notify.block |
|
118 |
|
119 # Send a notification when this file is current |
|
120 PENDING=notify.pending |
|
121 |
|
122 FND="find $DIR -follow" |
|
123 |
|
124 if test -f $DIR/$PENDING; then |
|
125 # Because `find -mtime -0` sometimes means `find -mtime -1` |
|
126 # or vice versa, use this to see if $DIR/$PENDING is finally ready. |
|
127 rm -f $DIR/$MARKER |
|
128 touch $DIR/$MARKER |
|
129 if test "`$FND -name $PENDING -newer $DIR/$MARKER`" != ""; then |
|
130 continue; |
|
131 fi |
|
132 rm $DIR/$PENDING |
|
133 |
|
134 else |
|
135 if test -f $DIR/$MARKER; then |
|
136 if test "`$FND -name 'msg.*' -newer $DIR/$MARKER \ |
|
137 | head -1`" = ""; then |
|
138 # there are no messages the user has not seen |
|
139 continue |
|
140 fi |
|
141 fi |
|
142 # We have at least one new message. If we are blocked by having |
|
143 # sent a notification within the past week, make a pending message. |
|
144 rm -f $DIR/$MARKER |
|
145 touch $DIR/$MARKER |
|
146 if test "`$FND -name $BLOCK -newer $DIR/$MARKER`" != ""; then |
|
147 mv $DIR/$BLOCK $DIR/$PENDING |
|
148 continue; |
|
149 fi |
|
150 fi |
|
151 |
|
152 # browsers don't tolerate '/' or '@' in usernames and passwords in URLs |
|
153 URL_UNAME="`expr "$UNAME@" : '\([^/@]*@$\)' || true`$BASE" |
|
154 |
|
155 |
|
156 |
|
157 #################################################################### |
|
158 # Modify the following message to taste. |
|
159 |
|
160 MAIL_SUBJECT="bulk mail notification for $UNAME" |
|
161 if test "`basename @NOTIFYMAILER@`" = sendmail; then |
|
162 HEADERS="Subject: $MAIL_SUBJECT |
|
163 Precedence: bulk |
|
164 " |
|
165 CMD="@NOTIFYMAILER@ $BOX" |
|
166 else |
|
167 HEADERS= |
|
168 CMD="@NOTIFYMAILER@ -s '$MAIL_SUBJECT' $BOX" |
|
169 fi |
|
170 eval $CMD <<EOF |
|
171 $HEADERS |
|
172 Recently logged bulk messages for $UNAME can be viewed at |
|
173 $HTTPS://$URL_UNAME/list-log |
|
174 Edit your whitelist at |
|
175 $HTTPS://$URL_UNAME/edit-whiteclnt |
|
176 if any of those are solicited bulk messages instead of spam |
|
177 or to stop or redirect these messages. |
|
178 |
|
179 The user name for both web pages is $UNAME |
|
180 EOF |
|
181 |
|
182 # no more of this mail for a week |
|
183 NWEEK=`@PERL@ -e 'use POSIX; |
|
184 print strftime("%y%m%d%H%M", localtime(time()+7*24*60*60))'` |
|
185 rm -f $DIR/$BLOCK |
|
186 touch -t "$NWEEK" $DIR/$BLOCK |
|
187 |
|
188 done |