campaign: Remove First Look Media note from the thanks mail.
[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 #  service  - 1 = Stripe, 2 = Paypal, 3 = SEPA
120 # Used scratch variables:
121 #  upcurrency
122 #  ineuro
123 #  xamount
124 #  recur_text
125 #
126 # FIXME: Clean message and name and use an appropriate encoding.
127 #        The second mail should actually be encrypted.  In fact
128 #        we would better try to encrypt also the first mail.  Add a
129 #        pubkey field to the donation page?
130 #
131 send_thanks () {
132     recur_text="one-time"
133     xextratext=""
134     if [ $1 -gt 0 ]; then
135         case "$recur" in
136             12) recur_text="monthly"
137                 ;;
138             6) recur_text="bi-monthly"
139                 ;;
140             4) recur_text="quarterly"
141                 ;;
142             1) recur_text="yearly"
143                 ;;
144         esac
145     fi
146     case "$service" in
147         1) service_text="Stripe"
148            ;;
149         2) service_text="PayPal"
150            ;;
151         3) service_text="SEPA"
152            ;;
153         *) service_text="$service"
154            ;;
155     esac
156     upcurrency=$(echo $currency | tr [a-z] [A-Z])
157     if [ "$upcurrency" = EUR ]; then
158         ineuro=
159     else
160         ineuro=" (about $(echo $euro| awk '{print int($0 + 0.5)}') EUR)"
161     fi
162     xamount="$(echo $amount| awk '{print int($0 + 0.5)}')"
163     if [ -n "$xmail" ]; then
164       xidnmail=$(CHARSET=UTF-8 idn --no-tld --quiet "$xmail")
165     else
166       xidnmail=""
167     fi
168     if [ x"$xidnmail" = x"$xmail" ]; then
169       xqpmail="$xmail"
170     else
171       xqpmail=$(mu-tool 2047 -c utf-8 "$xmail")
172     fi
173     if [ $testmode = yes ]; then
174       xisatest="[TEST DONATION] "
175     else
176       xisatest=""
177     fi
178     ( cat <<EOF
179 From: donations@gnupg.org
180 To: $xqpmail
181 Subject: ${xisatest}Thank you for supporting GnuPG
182 Date: $RFCDATE
183 Mime-Version: 1.0
184 Content-Type: text/plain
185 X-Loop: gnupg-donations-thanks.gnupg.org
186
187 Dear ${name:-Anonymous},
188
189 we received $xamount $upcurrency$ineuro as a ${recur_text} donation for GnuPG (via $service_text).
190
191 Your donation helps us to develop and maintain GnuPG and related software.
192 $xextratext
193
194 Thank you.
195
196   The GnuPG Team
197
198
199 $SIGDELIM
200 GnuPG - helping to keep private data private
201 EOF
202     ) | $SENDMAIL -oi donations@gnupg.org "$xidnmail"
203
204
205 if [ -n "$message" ]; then
206     ( cat <<EOF
207 From: donations@gnupg.org
208 To: donations@gnupg.org
209 Reply-To: $xqpmail
210 Subject: ${xisatest}Message from GnuPG donor
211 Date: $RFCDATE
212 Mime-Version: 1.0
213 Content-Type: text/plain
214 X-Loop: gnupg-donations-thanks.gnupg.org
215
216 Name ..: ${name:-Anonymous}
217 Amount : $amount $upcurrency $ineuro
218 Recur .: $recur_text
219 Account: $service_text
220 Message: $message
221 EOF
222     ) | $SENDMAIL -oi donations@gnupg.org
223 fi
224
225 }
226
227
228 # Find the last entry in donors which we have put in.
229 tmp=$(awk -F: <$donors '
230     /^(#.*)?$/ {next}
231     $5!="" { date=$2;lineno=$5 }
232     END {gsub(/-/,"",date)
233          print date ":" lineno}
234 ')
235 lastdate=$(echo $tmp | cut -d: -f1 | sed 's/T.*//')
236 lastline=$(echo $tmp | cut -d: -f2)
237 [ -z "$lastdate" ] && lastdate=19700101
238 [ -z "$lastline" ] && lastline=0
239
240
241 [ -f "$donors".stamp ] && rm "$donors".stamp
242 cat "$donors" > "$donors.tmp"
243 find $journal_dir/ -type f -name 'journal-????????.log' -print \
244      | sort | while read fname; do
245     fname=$(basename "$fname")
246     jdate=${fname%.log}
247     jdate=${jdate#journal-}
248     jyear=$(echo $jdate |sed 's/\(....\).*/\1/')
249     if [ "$jdate" -ge "$lastdate" ]; then
250         [ "$jdate" -gt "$lastdate" ] && lastline=0
251         # First for charge records
252         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
253                      -Fmail -Famount -Fcurrency -Feuro -Fservice \
254            -S "_lnr > $lastline" -Stype=C -Saccount==1 \
255            --html --print "$journal_dir/journal-$jdate.log" \
256          | while IFS=: read lnr datestr name message \
257                             xmail amount currency euro service 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::$lnr:" >> "$donors.tmp"
263             touch "$donors".stamp
264             send_thanks 0
265          done
266         # Second for new subscriptions
267         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
268                      -Fmail -Famount -Fcurrency -Feuro -F service -Frecur \
269            -S "_lnr > $lastline" -Stype=S -Saccount==1 \
270            --html --print "$journal_dir/journal-$jdate.log" \
271          | while IFS=: read lnr datestr name message \
272                             xmail amount currency euro service recur rest; do
273             name=$(echo "$name" | tr \`\$: ...)
274             message=$(echo "$message" | tr \`\$ ..)
275             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
276             # Note that we removed colons from $name
277             echo "$jyear:$datestr:$name:S:$lnr:" >> "$donors.tmp"
278             touch "$donors".stamp
279             send_thanks 1
280          done
281     fi
282 done
283
284 # If we have any new records update the files.
285 if [ -f "$donors".stamp -o $force = yes ]; then
286
287   if ! mv "$donors.tmp" "$donors"; then
288     echo "$pgm: error updating $donors" >&2
289     exit 1
290   fi
291
292   if [ -f "$donations" ]; then
293     payproc-stat -u "$donations" -- > "$donations".tmp  \
294       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
295     if ! mv "$donations".tmp "$donations"; then
296         echo "$pgm: error updating $donations" >&2
297         exit 1
298     fi
299   else
300     payproc-stat -u "$donations" -- > "$donations"  \
301       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
302   fi
303 fi