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