ce9a6d3d14c4dfce15de7b6bb9e21b1f04c26a0d
[ccoop.git] / ccoop-update.sh
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 LOGFILE=coop.log # unsued unless --log option is used
13 COOKIEJAR=cookiejar # cookies, deleted on exit
14 TMP=lastpage.html # last html page, deleted on exit
15
16 function parsearg() {
17     _OPT="${1%=?*}"
18     _VAL="${1#?*=}"
19 }
20
21 function usage() {
22     #echo $'\n' $@ $'\n'
23     echo "Usage: ccoop.sh [options]"
24     echo "  -h|--help             Display that help"
25     echo "  -q|--quiet            Don't display informationnal messages"
26     echo "  --log                 Log everything to $LOGFILE"
27     echo "  --config              Setup a config file"
28     #echo "  --target=<filename>  Set target filename. Defaults to $target_file"
29     #echo "See man ccoop.sh(1) for documentation."
30 }
31
32 for arg in "$@"; do
33     parsearg $arg
34
35     case $_OPT in
36     -q|--quiet)
37         quiet=1
38         continue
39     ;;
40     --log)
41         log=1
42         continue
43     ;;
44     --config)
45         ismakeconfig=1
46         continue
47     ;;
48     -h|--help)
49         usage 
50         exit 0
51     ;;
52     #--target)
53     #    target_file=$_VAL
54     #    continue
55     #;;
56     *)
57         echo "Unknown option $_OPT"
58         usage
59         exit 22
60     ;;
61     esac
62 done
63
64 # That function prints messages to stderr, unless quiet is set
65 # It logs into $LOGFILE if log is set, no matter whether quiet is set or not
66 function inform() {
67     if [ -n "$quiet" ]; then
68         if [ -n "$log" ]; then
69             echo $@ >> $LOGFILE >&2
70         fi
71     else # not quiet
72         if [ -n "$log" ]; then
73             echo $@ | tee -a $LOGFILE >&2
74         else
75             echo $@ >&2
76         fi
77     fi
78 }
79
80 function fetch() {
81     wget -q --load-cookies $COOKIEJAR --save-cookies $COOKIEJAR --keep-session-cookies $@ -O - | iconv -f ISO-8859-1 -t UTF-8 > $TMP
82     if [ -n "$log" ]; then
83         cat $TMP >> $LOGFILE
84     fi
85 }
86
87 function makeconfig() {
88     read -p "Coopanet login: " COOPLOGIN
89     read -p "Coopanet password: " -s COOPPASSWORD
90     echo "# coopanet configuration">config
91     echo "COOPLOGIN=$COOPLOGIN">>config
92     echo "COOPPASSWORD=$COOPPASSWORD">>config
93     echo >&2
94     echo "config file writen" >&2
95 }
96
97 function fetchall() {
98     echo> $COOKIEJAR
99     echo> $LOGFILE
100     
101     inform "WGET login form"
102     fetch https://www.coopanet.com/banque/cpt/
103     
104     inform "WGET bql/connexion.do"
105     fetch "--post-data=site=C&codeUtil=$COOPLOGIN&motPasse=$COOPPASSWORD&pbValider=Valider" https://www.coopanet.com/banque/cpt/bql/connexion.do
106     
107     inform "WGET cpt/connexion.do"
108     fetch https://www.coopanet.com/banque/cpt/cpt/connexion.do
109  
110     if grep -q "Vous venez de quitter  COOP@NET" $TMP; then
111         echo "Can't log in. Check password" >&2
112     fi
113
114     IFS=$'\n'
115     accountsId=(`grep numeroExterne $TMP | grep hidden | cut -d \" -f 6`)
116     accountsNames=(`grep "<td style=\"width:9%;\">" $TMP | cut -d ">" -f 2 | cut -d "<" -f 1`)
117     accountsBalances=(`grep "Consulter votre relevé" $TMP | cut -d ">" -f 3 | cut -d "<" -f 1`)
118     unset IFS
119
120     for idx in ${!accountsId[@]}; do
121         account=${accountsId[$idx]}
122         name=${accountsNames[$idx]}
123         balance=${accountsBalances[$idx]}
124         inform "$name $account $balance"
125     
126         inform "WGET situationcomptes.do"
127         fetch "--post-data=numeroExterne=$account&typeAction=2&btAction=OK" https://www.coopanet.com/banque/cpt/cpt/situationcomptes.do
128         
129         dateFin=`grep dateFin $TMP | cut -d \" -f 10`
130         inform "WGET selectiontelechargement.do"
131         fetch "--post-data=format=3&dateDebut=01/01/2001&dateFin=$dateFin&btValider=Valider" https://www.coopanet.com/banque/cpt/cpt/selectiontelechargement.do
132     
133         inform "WGET telechargement.do"
134         ppath=`grep path $TMP | cut -d \" -f 6`
135         fetch "--post-data=path=$ppath&zip=2&btConfirmer=Confirmer" https://www.coopanet.com/banque/cpt/cpt/telechargement.do
136         tail -n +2 $TMP > $account.`date +%Y%m%d`.csv
137         rm -f $account.last.csv
138         ln -s $account.`date +%Y%m%d`.csv $account.last.csv
139     done
140     
141     # logout
142     inform "WGET reconnect.do"
143     fetch https://www.coopanet.com/banque/cpt/communs/reconnect.do
144     
145     # delete tmp files
146     rm -f $COOKIEJAR $TMP
147 }
148
149
150 # That function updates $account.csv files, adding the latest missing entries
151 # It dumps on stdout the new lines
152 function updatehistory() {
153     inform "Updating complete csv files"
154     # merge values in $account.csv
155     for idx in ${!accountsId[@]}; do
156         account=${accountsId[$idx]}
157         name=${accountsNames[$idx]}
158         balance=${accountsBalances[$idx]}
159
160         # get new lines into $account.new.csv
161         diff -Nau $account.last.csv $account.csv | grep "^-" | grep -v "^---" | cut -c 2- > $account.new.csv
162     
163         # print new entries
164         cat $account.new.csv
165     
166         cat $account.csv >>$account.new.csv
167         mv $account.new.csv $account.csv
168     done
169 }
170
171 function atomize() {
172     inform "Updating feeds"
173     for idx in ${!accountsId[@]}; do
174         account=${accountsId[$idx]}
175         name=${accountsNames[$idx]}
176         balance=${accountsBalances[$idx]}
177
178         ./ccoop-atomize.py "$account" "$name" "$balance" > $account.atom
179     done
180 }
181
182
183 cd `dirname $0`
184
185
186 umask 0077 # make sure the generated files are only readable by the user
187
188 if [[ -n $ismakeconfig ]]; then
189     makeconfig
190 fi
191
192 # Make sure our temporary files are deleted on error and on exit
193 trap "rm -f $COOKIEJAR $TMP; exit" INT TERM EXIT
194
195 if [[ `ls -l config | cut -c 8-10` != "---" ]]; then
196     echo "Security warning: config file should be chmod o-rwx" >&2
197 fi
198 source config
199
200 if [[ -n $log ]]; then
201     inform "Warning, $LOGFILE will contain sensitive information. You should delete it."
202 fi
203
204
205 fetchall
206 updatehistory
207 atomize
208