cgi: Convey Recur parameter to payproc.
[gnupg-doc.git] / tools / append-to-donors.sh
1 #!/bin/sh
2 # append-to-donors.sh
3 # Append new names from the payproc journal to the donors file
4 # and send a Thank You mail.
5 #
6 # Note that this script does not yet handle subscriptions.  Because we
7 # want to verify the mail address anyway, it makes sense to move mai
8 # sending to payprocd.  The final plan is to use webhooks to create
9 # charge records and use them to add a Donor reulary to the list of
10 # donors (but may be limited to once a year)
11
12 pgm="append-to-donors.sh"
13 set -e
14
15 # We temporary need the next line due to an libgpg-error update
16 LD_LIBRARY_PATH=/usr/local/lib
17 export LD_LIBRARY_PATH
18
19 PATH=/usr/local/bin:$PATH
20 SENDMAIL="/usr/sbin/sendmail"
21 LC_ALL=C
22 LC_CTYPE=C
23 RFCDATE="$(date -R)"
24 SIGDELIM="-- "
25
26 usage()
27 {
28     cat <<EOF
29 Usage: $pgm [OPTIONS]
30 Options:
31         --verbose  Run in verbose mode
32         --force    Force re-creation of files.
33         --test     Run in test environment (preview.gnupg.org)
34 EOF
35     exit $1
36 }
37
38
39 verbose=no
40 force=no
41 testmode=no
42 while [ $# -gt 0 ]; do
43     case "$1" in
44         # Set up `optarg'.
45         --*=*)
46             optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
47             ;;
48         *)
49             optarg=""
50             ;;
51     esac
52
53     case $1 in
54         --verbose)
55             verbose=yes
56             ;;
57         --force)
58             force=yes
59             ;;
60         --test)
61             testmode=yes
62             ;;
63         --help)
64             usage 0
65             ;;
66         *)
67             usage 1 1>&2
68             ;;
69     esac
70     shift
71 done
72
73
74 if [ $testmode = yes ]; then
75   htdocs="/var/www/www/preview.gnupg.org/htdocs"
76   journal_dir="/var/log/payproc-test"
77 else
78   htdocs="/var/www/www/www.gnupg.org/htdocs"
79   journal_dir="/var/log/payproc"
80 fi
81
82 donors="$htdocs/donate/donors.dat"
83 donations="$htdocs/donate/donations.dat"
84
85 LOCKFILE="$donors.lock"
86
87 if [ ! -f "$donors" ]; then
88   echo "$pgm: '$donors' not found" >&2;
89   exit 1
90 fi
91
92 if [ x"$(idn --quiet wk@gnupg.org)" != x"wk@gnupg.org" ]; then
93   echo  "$pgm: idn(1) tool not installed or not working"
94   exit 1
95 fi
96 if [ x"$(mu-tool 2047 -c utf-8 '<wk@gnupg.org>')" \
97       != x"=?utf-8?Q?<wk@gnupg.org>?=" ]; then
98   echo "$pgm: mu-tool(1) tool not installed or not working"
99   exit 1
100 fi
101
102
103 if ! lockfile -l 7200 -r 2 $LOCKFILE; then
104     echo "$pgm: another instance is still running"
105     exit 0
106 fi
107 trap "rm -f $LOCKFILE $donors.tmp $donors.stamp" 0
108
109
110 # Send a thank you mail
111 # Uses these variables:
112 #  amount   - The amount of the donation
113 #  currency - The currency for the amount
114 #  euro     - The amount cinvertet to Euro
115 #  xmail    - The mailbox
116 #  name     - The name or empty for an anonymous donation
117 #  message  - The message to us or empty
118 #  recur    - only when called with an arg > 0
119 # Used scratch variables:
120 #  upcurrency
121 #  ineuro
122 #  xamount
123 #  recur_text
124 #
125 # FIXME: Clean message and name and use an appropriate encoding.
126 #        The second mail should actually be encrypted.  In fact
127 #        we would better try to encrypt also the first mail.  Add a
128 #        pubkey field to the donation page?
129 #
130 send_thanks () {
131     recur_text="one-time"
132     if [ $1 -gt 0 ]; then
133         case "$recur" in
134             12) recur_text="monthly"
135                 ;;
136             6) recur_text="bi-monthly"
137                 ;;
138             4) recur_text="quarterly"
139                 ;;
140             1) recur_text="yearly"
141                 ;;
142         esac
143     fi
144     upcurrency=$(echo $currency | tr [a-z] [A-Z])
145     if [ "$upcurrency" = EUR ]; then
146         ineuro=
147     else
148         ineuro=" (about $(echo $euro| awk '{print int($0 + 0.5)}') EUR)"
149     fi
150     xamount="$(echo $amount| awk '{print int($0 + 0.5)}')"
151     if [ -n "$xmail" ]; then
152       xidnmail=$(CHARSET=UTF-8 idn --no-tld --quiet "$xmail")
153     else
154       xidnmail=""
155     fi
156     if [ x"$xidnmail" = x"$xmail" ]; then
157       xqpmail="$xmail"
158     else
159       xqpmail=$(mu-tool 2047 -c utf-8 "$xmail")
160     fi
161     if [ $testmode = yes ]; then
162       xisatest="[TEST DONATION] "
163     else
164       xisatest=""
165     fi
166     ( cat <<EOF
167 From: donations@gnupg.org
168 To: $xqpmail
169 Subject: ${xisatest}Thank you for supporting GnuPG
170 Date: $RFCDATE
171 Mime-Version: 1.0
172 Content-Type: text/plain
173 X-Loop: gnupg-donations-thanks.gnupg.org
174
175 Dear ${name:-Anonymous},
176
177 we received $xamount $upcurrency$ineuro as a ${recur_text} donation to the GnuPG project.
178 Your donation helps us to develop and maintain GnuPG and related software.
179
180 Thank you.
181
182   The GnuPG Team
183
184
185 $SIGDELIM
186 GnuPG - helping to keep private data private
187 EOF
188     ) | $SENDMAIL -oi donations@gnupg.org "$xidnmail"
189
190
191 if [ -n "$message" ]; then
192     ( cat <<EOF
193 From: donations@gnupg.org
194 To: donations@gnupg.org
195 Reply-To: $xqpmail
196 Subject: ${xisatest}Message from GnuPG donor
197 Date: $RFCDATE
198 Mime-Version: 1.0
199 Content-Type: text/plain
200 X-Loop: gnupg-donations-thanks.gnupg.org
201
202 Name ..: ${name:-Anonymous}
203 Amount : $amount $upcurrency $ineuro
204 Recur .: $recur_text
205 Message: $message
206 EOF
207     ) | $SENDMAIL -oi donations@gnupg.org
208 fi
209
210 }
211
212
213 # Find the last entry in donors which we have put in.
214 tmp=$(awk -F: <$donors '
215     /^(#.*)?$/ {next}
216     $5!="" { date=$2;lineno=$5 }
217     END {gsub(/-/,"",date)
218          print date ":" lineno}
219 ')
220 lastdate=$(echo $tmp | cut -d: -f1 | sed 's/T.*//')
221 lastline=$(echo $tmp | cut -d: -f2)
222 [ -z "$lastdate" ] && lastdate=19700101
223 [ -z "$lastline" ] && lastline=0
224
225
226 [ -f "$donors".stamp ] && rm "$donors".stamp
227 cat "$donors" > "$donors.tmp"
228 find $journal_dir/ -type f -name 'journal-????????.log' -print \
229      | sort | while read fname; do
230     fname=$(basename "$fname")
231     jdate=${fname%.log}
232     jdate=${jdate#journal-}
233     jyear=$(echo $jdate |sed 's/\(....\).*/\1/')
234     if [ "$jdate" -ge "$lastdate" ]; then
235         [ "$jdate" -gt "$lastdate" ] && lastline=0
236         # First for charge records
237         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
238                      -Fmail -Famount -Fcurrency -Feuro\
239            -S "_lnr > $lastline" -Stype=C -Saccount==1 \
240            --html --print "$journal_dir/journal-$jdate.log" \
241          | while IFS=: read lnr datestr name message \
242                             xmail amount currency euro rest; do
243             name=$(echo "$name" | tr \`\$: ...)
244             message=$(echo "$message" | tr \`\$ ..)
245             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
246             # Note that we removed colons from $name
247             echo "$jyear:$datestr:$name::$lnr:" >> "$donors.tmp"
248             touch "$donors".stamp
249             send_thanks 0
250          done
251         # Second for new subscriptions
252         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
253                      -Fmail -Famount -Fcurrency -Feuro -Frecur\
254            -S "_lnr > $lastline" -Stype=S -Saccount==1 \
255            --html --print "$journal_dir/journal-$jdate.log" \
256          | while IFS=: read lnr datestr name message \
257                             xmail amount currency euro recur rest; do
258             name=$(echo "$name" | tr \`\$: ...)
259             message=$(echo "$message" | tr \`\$ ..)
260             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
261             # Note that we removed colons from $name
262             echo "$jyear:$datestr:$name:S:$lnr:" >> "$donors.tmp"
263             touch "$donors".stamp
264             send_thanks 1
265          done
266     fi
267 done
268
269 # If we have any new records update the files.
270 if [ -f "$donors".stamp -o $force = yes ]; then
271
272   if ! mv "$donors.tmp" "$donors"; then
273     echo "$pgm: error updating $donors" >&2
274     exit 1
275   fi
276
277   if [ -f "$donations" ]; then
278     payproc-stat -u "$donations" -- > "$donations".tmp  \
279       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
280     if ! mv "$donations".tmp "$donations"; then
281         echo "$pgm: error updating $donations" >&2
282         exit 1
283     fi
284   else
285     payproc-stat -u "$donations" -- > "$donations"  \
286       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
287   fi
288 fi