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