cgi: Provide presets for the campaign page.
[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 htdocs="/var/www/www/www.gnupg.org/htdocs"
27
28 donors="$htdocs/donate/donors.dat"
29 donations="$htdocs/donate/donations.dat"
30
31 journal_dir="/var/log/payproc"
32 LOCKFILE="$donors.lock"
33
34 if [ ! -f "$donors" ]; then
35   echo "$pgm: '$donors' not found" >&2;
36   exit 1
37 fi
38
39 if [ x"$(idn --quiet wk@gnupg.org)" != x"wk@gnupg.org" ]; then
40   echo  "$pgm: idn(1) tool not installed or not working"
41   exit 1
42 fi
43 if [ x"$(mu-tool 2047 -c utf-8 '<wk@gnupg.org>')" \
44       != x"=?utf-8?Q?<wk@gnupg.org>?=" ]; then
45   echo "$pgm: mu-tool(1) tool not installed or not working"
46   exit 1
47 fi
48
49
50 if ! lockfile -l 7200 -r 2 $LOCKFILE; then
51     echo "$pgm: another instance is still running"
52     exit 0
53 fi
54 trap "rm -f $LOCKFILE $donors.tmp $donors.stamp" 0
55
56
57 # Send a thank you mail
58 # Uses these variables:
59 #  amount   - The amount of the donation
60 #  currency - The currency for the amount
61 #  euro     - The amount cinvertet to Euro
62 #  xmail    - The mailbox
63 #  name     - The name or empty for an anonymous donation
64 #  message  - The message to us or empty
65 # Used scratch variables:
66 #  upcurrency
67 #  ineuro
68 #  xamount
69 #
70 # FIXME: Clean message and name and use an appropriate encoding.
71 #        The second mail should actually be encrypted.  In fact
72 #        we would better try to encrypt also the first mail.  Add a
73 #        pubkey field to the donation page?
74 #
75 send_thanks () {
76     upcurrency=$(echo $currency | tr [a-z] [A-Z])
77     if [ "$upcurrency" = EUR ]; then
78         ineuro=
79     else
80         ineuro=" (about $(echo $euro| awk '{print int($0 + 0.5)}') EUR)"
81     fi
82     xamount="$(echo $amount| awk '{print int($0 + 0.5)}')"
83     if [ -n "$xmail" ]; then
84       xidnmail=$(CHARSET=UTF-8 idn --no-tld --quiet "$xmail")
85     else
86       xidnmail=""
87     fi
88     if [ x"$xidnmail" = x"$xmail" ]; then
89       xqpmail="$xmail"
90     else
91       xqpmail=$(mu-tool 2047 -c utf-8 "$xmail")
92     fi
93     ( cat <<EOF
94 From: donations@gnupg.org
95 To: $xqpmail
96 Subject: Thank you for supporting GnuPG
97 Date: $RFCDATE
98 Mime-Version: 1.0
99 Content-Type: text/plain
100 X-Loop: gnupg-donations-thanks.gnupg.org
101
102 Dear ${name:-Anonymous},
103
104 we received $xamount $upcurrency$ineuro as a donation to the GnuPG project.
105 Your donation helps us to develop and maintain GnuPG and related software.
106
107 Thank you.
108
109   Werner
110
111
112 $SIGDELIM
113 GnuPG - helping to keep private data private
114 EOF
115     ) | $SENDMAIL -oi donations@gnupg.org "$xidnmail"
116
117
118 if [ -n "$message" ]; then
119     ( cat <<EOF
120 From: donations@gnupg.org
121 To: donations@gnupg.org
122 Reply-To: $xqpmail
123 Subject: Message from GnuPG donor
124 Date: $RFCDATE
125 Mime-Version: 1.0
126 Content-Type: text/plain
127 X-Loop: gnupg-donations-thanks.gnupg.org
128
129 Name ..: ${name:-Anonymous}
130 Amount : $amount $upcurrency $ineuro
131 Message: $message
132 EOF
133     ) | $SENDMAIL -oi donations@gnupg.org
134 fi
135
136 }
137
138
139 # Find the last entry in donors which we have put in.
140 tmp=$(awk -F: <$donors '
141     /^(#.*)?$/ {next}
142     $5!="" { date=$2;lineno=$5 }
143     END {gsub(/-/,"",date)
144          print date ":" lineno}
145 ')
146 lastdate=$(echo $tmp | cut -d: -f1 | sed 's/T.*//')
147 lastline=$(echo $tmp | cut -d: -f2)
148 [ -z "$lastdate" ] && lastdate=19700101
149 [ -z "$lastline" ] && lastline=0
150
151
152 [ -f "$donors".stamp ] && rm "$donors".stamp
153 cat "$donors" > "$donors.tmp"
154 find $journal_dir -type f -name 'journal-????????.log' -print \
155      | sort | while read fname; do
156     fname=$(basename "$fname")
157     jdate=${fname%.log}
158     jdate=${jdate#journal-}
159     jyear=$(echo $jdate |sed 's/\(....\).*/\1/')
160     if [ "$jdate" -ge "$lastdate" ]; then
161         [ "$jdate" -gt "$lastdate" ] && lastline=0
162         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
163                      -Fmail -Famount -Fcurrency -Feuro\
164            -S "_lnr > $lastline" -Stype=C -Saccount==1 \
165            --html --print "$journal_dir/journal-$jdate.log" \
166          | while IFS=: read lnr datestr name message \
167                             xmail amount currency euro rest; do
168             name=$(echo "$name" | tr \`\$: ...)
169             message=$(echo "$message" | tr \`\$ ..)
170             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
171             # Note that we removed colons from $name
172             echo "$jyear:$datestr:$name::$lnr:" >> "$donors.tmp"
173             touch "$donors".stamp
174             send_thanks
175          done
176     fi
177 done
178
179 # If we have any new records update the files.
180 if [ -f "$donors".stamp ]; then
181
182   if ! mv "$donors.tmp" "$donors"; then
183     echo "$pgm: error updating $donors" >&2
184     exit 1
185   fi
186
187   if [ -f "$donations" ]; then
188     payproc-stat -u "$donations" -- > "$donations".tmp  \
189       $(find /var/log/payproc -type f -name 'journal-????????.log' -print|sort)
190     if ! mv "$donations".tmp "$donations"; then
191         echo "$pgm: error updating $donations" >&2
192         exit 1
193     fi
194   else
195     payproc-stat -u "$donations" -- > "$donations"  \
196       $(find /var/log/payproc -type f -name 'journal-????????.log' -print|sort)
197   fi
198 fi