8b74b76a050458394eb2354244a1e6aa294723a2
[ccoop.git] / ccoop-update
1 #!/usr/bin/env bash
2 #
3 # Crédit Coopératif account tools
4 #
5 # It fetch csv file and merge them to previous ones
6 # It also generates a local file suitable for a feed reader
7 #
8 # Depends on wget, iconv
9
10 set -e
11
12 export CCPATH=~/ccoop
13 LOGFILE=$CCPATH/coop.log # unsued unless --log option is used
14 COOKIEJAR=$CCPATH/cookiejar # cookies, deleted on exit
15 TMP=$CCPATH/lastpage.html # last html page, deleted on exit
16
17 function parsearg() {
18     _OPT="${1%=?*}"
19     _VAL="${1#?*=}"
20 }
21
22 function usage() {
23     #echo $'\n' $@ $'\n'
24     echo "Usage: ccoop-update [options]"
25     echo "  -h|--help             Display that help"
26     echo "  -q|--quiet            Don't display informationnal messages"
27     echo "  --log                 Log everything to $LOGFILE"
28     echo "  --config              Setup a config file and install cron entry"
29     echo "  --unconfig            Remove config file and remove cron entry"
30     #echo "  --target=<filename>  Set target filename. Defaults to $target_file"
31     #echo "See man ccoop-update(1) for documentation."
32 }
33
34 for arg in "$@"; do
35     parsearg $arg
36
37     case $_OPT in
38     -q|--quiet)
39         quiet=1
40         continue
41     ;;
42     --log)
43         log=1
44         continue
45     ;;
46     --config)
47         isconfig=1
48         continue
49     ;;
50     --unconfig)
51         isunconfig=1
52         continue
53     ;;
54     -h|--help)
55         usage 
56         exit 0
57     ;;
58     #--target)
59     #    target_file=$_VAL
60     #    continue
61     #;;
62     *)
63         echo "Unknown option $_OPT"
64         usage
65         exit 22
66     ;;
67     esac
68 done
69
70 # That function prints messages to stderr, unless quiet is set
71 # It logs into $LOGFILE if log is set, no matter whether quiet is set or not
72 function inform() {
73     if [ -n "$quiet" ]; then
74         if [ -n "$log" ]; then
75             echo $@ >> $LOGFILE >&2
76         fi
77     else # not quiet
78         if [ -n "$log" ]; then
79             echo $@ | tee -a $LOGFILE >&2
80         else
81             echo $@ >&2
82         fi
83     fi
84 }
85
86 function fetch() {
87     wget -q --load-cookies $COOKIEJAR --save-cookies $COOKIEJAR --keep-session-cookies $@ -O - | iconv -f ISO-8859-1 -t UTF-8 > $TMP
88     if [ -n "$log" ]; then
89         cat $TMP >> $LOGFILE
90     fi
91 }
92
93 function doconfig() {
94     read -p "Coopanet login: " COOPLOGIN
95     read -p "Coopanet password: " -s COOPPASSWORD
96     mkdir -p $CCPATH
97     echo "# coopanet configuration">$CCPATH/config
98     echo "COOPLOGIN=$COOPLOGIN">>$CCPATH/config
99     echo "COOPPASSWORD=$COOPPASSWORD">>$CCPATH/config
100     echo >&2
101     echo "config writen to $CCPATH/config" >&2
102     if [[ "${0:0:1}"=="/" ]]; then
103         # absolute path
104         command="$0"
105     else
106         command="$PWD/$0"
107     fi
108     crontab -l | grep -v ccoop-update || echo "$(($RANDOM%60)) 6     * * *   $command -q" | crontab -
109     echo "crontab installed" >&2
110 }
111
112 function dounconfig() {
113     local ok
114     if [[ -e $CCPATH/config ]]; then
115         rm -f $CCPATH/config
116         echo "$CCPATH/config deleted">&2
117         ok=1
118     fi
119     if crontab -l | grep -q ccoop-update ; then
120         crontab -l | grep -v ccoop-update | crontab -
121         echo "crontab uninstalled" >&2
122         ok=1
123     fi
124     if [[ -z "$ok" ]]; then
125         echo "Allready uninstalled." >&2
126     fi
127     if [[ -e "$CCPATH" ]]; then
128         echo "Password cleared. Remove ~/ccoop manually if you want to erase history." >&2
129     fi
130     exit 0
131 }
132
133 function fetchall() {
134     echo> $COOKIEJAR
135     if [[ -n "$log" ]]; then
136         echo> $LOGFILE
137     fi
138     
139     inform "WGET login form"
140     fetch https://www.coopanet.com/banque/cpt/
141     
142     inform "WGET bql/connexion.do"
143     fetch "--post-data=site=C&codeUtil=$COOPLOGIN&motPasse=$COOPPASSWORD&pbValider=Valider" https://www.coopanet.com/banque/cpt/bql/connexion.do
144     
145     inform "WGET cpt/connexion.do"
146     fetch https://www.coopanet.com/banque/cpt/cpt/connexion.do
147  
148     if grep -q "Vous venez de quitter  COOP@NET" $TMP; then
149         echo "Can't log in. Check password" >&2
150     fi
151
152     IFS=$'\n'
153     accountsId=(`grep numeroExterne $TMP | grep hidden | cut -d \" -f 8`)
154     ccountsNames=(`grep "<TD class=txt width=\"99%\">" $TMP |  cut -d \> -f 6  | cut -d "<" -f 1`)
155     accountsBalances=(`grep "Consulter votre relevé" $TMP | cut -d ">" -f 3 | cut -d "<" -f 1`)
156     unset IFS
157
158     for idx in ${!accountsId[@]}; do
159         account=${accountsId[$idx]}
160         name=${accountsNames[$idx]}
161         balance=${accountsBalances[$idx]}
162         inform "$name $account $balance"
163     
164         inform "WGET situationcomptes.do"
165         fetch "--post-data=numeroExterne=$account&typeAction=2&btAction=OK" https://www.coopanet.com/banque/cpt/cpt/situationcomptes.do
166         
167         dateFin=`grep dateFin $TMP | cut -d \" -f 10`
168         inform "WGET selectiontelechargement.do"
169         fetch "--post-data=format=3&dateDebut=01/01/2001&dateFin=$dateFin&btValider=Valider" https://www.coopanet.com/banque/cpt/cpt/selectiontelechargement.do
170     
171         inform "WGET telechargement.do"
172         ppath=`grep path $TMP | cut -d \" -f 6`
173         fetch "--post-data=path=$ppath&zip=2&btConfirmer=Confirmer" https://www.coopanet.com/banque/cpt/cpt/telechargement.do
174         tail -n +2 $TMP > $CCPATH/$account.`date +%Y%m%d`.csv
175         rm -f $CCPATH/$account.last.csv
176         ln -s $CCPATH/$account.`date +%Y%m%d`.csv $CCPATH/$account.last.csv
177     done
178     
179     # logout
180     inform "WGET reconnect.do"
181     fetch https://www.coopanet.com/banque/cpt/communs/reconnect.do
182     
183     # delete tmp files
184     rm -f $COOKIEJAR $TMP
185 }
186
187
188 # That function updates $account.csv files, adding the latest missing entries
189 # It dumps on stdout the new lines
190 function updatehistory() {
191     inform "Updating complete csv files"
192     # merge values in $account.csv
193     for idx in ${!accountsId[@]}; do
194         account=${accountsId[$idx]}
195         name=${accountsNames[$idx]}
196         balance=${accountsBalances[$idx]}
197
198         # get new lines into $account.new.csv
199         diff -Nau $CCPATH/$account.last.csv $CCPATH/$account.csv | grep "^-" | grep -v "^---" | cut -c 2- > $CCPATH/$account.new.csv
200     
201         # print new entries
202         cat $CCPATH/$account.new.csv
203     
204         cat $CCPATH/$account.csv >>$CCPATH/$account.new.csv
205         mv $CCPATH/$account.new.csv $CCPATH/$account.csv
206     done
207 }
208
209 function makefeed() {
210     inform "Updating feeds"
211     if [[ "${0:0:1}"=="/" ]]; then
212         # absolute path
213         path="`dirname $0`"
214     else
215         path="$PWD/`dirname $0`"
216     fi
217     for idx in ${!accountsId[@]}; do
218         account=${accountsId[$idx]}
219         name=${accountsNames[$idx]}
220         balance=${accountsBalances[$idx]}
221
222         "$path/ccoop-feeder" "$account" "$name" "$balance" > $CCPATH/$account.atom
223     done
224 }
225
226
227 umask 0077 # make sure the generated files are only readable by the user
228
229 if [[ -n $isconfig ]]; then
230     doconfig
231 fi
232 if [[ -n $isunconfig ]]; then
233     dounconfig
234 fi
235
236 # Make sure our temporary files are deleted on error and on exit
237 trap "rm -f $COOKIEJAR $TMP; exit" INT TERM EXIT
238
239 if [[ ! -r $CCPATH/config ]]; then
240     echo "Use '$0 --config'"
241     exit 1
242 fi
243 if [[ `ls -l $CCPATH/config | cut -c 8-10` != "---" ]]; then
244     echo "Security warning: config file should be chmod o-rwx" >&2
245 fi
246 source $CCPATH/config
247
248 if [[ -n $log ]]; then
249     inform "Warning, $LOGFILE will contain sensitive information. You should delete it."
250 fi
251
252
253 fetchall
254 updatehistory
255 makefeed
256