update.sh
12.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#!/bin/bash
# ----------------------------------------------------------------------------------------------------------------
# Ce script permet de mettre à jour automatiquement le code source du logiciel, ainsi que la BD (si besoin).
# C'est une bonne pratique de l'exécuter assez régulièrement pour garder un logiciel bien à jour.
# Il ne fait essentiellement qu'un "git pull" suivi de la mise à jour de la BD (si besoin).
# La BD est mise à jour SEULEMENT s'il existe au moins 1 NOUVEAU script de mise à jour db-update-YYYY-MM-DD.sh
# récupéré avec git pull (dans le dossier database/update/).
# S'il y en a plusieurs, ils sont exécutés dans l'ordre chronologique.
# ----------------------------------------------------------------------------------------------------------------
# (Bash Arrays : cf https://www.cyberciti.biz/faq/finding-bash-shell-array-length-elements/)
#[[ $WITH_DOCKER == 0 ]] && echo "SANS docker"
#[[ $WITH_DOCKER == 1 ]] && echo "AVEC docker"
# Version pour MacOS si MACOS=1
MACOS=0
#MACOS=1
# Ne pas vider le fichier $ftpf (CLEAN=1 pour le vider)
CLEAN=0
# Normal mode
TEST=0
# Test mode
#TEST=1
#db_update_scripts_folder="../database/update"
db_update_scripts_folder="../database/update/script_sql"
#db_update_scripts_folder_tmp=/tmp/database_update
db_update_scripts_folder_tmp=/tmp/database_update_script_sql
# files_to_process.txt file
ftpf=files_to_process.txt
function abort() {
error_msg=$1
echo "******************************************************"
echo "!!! Script $0 aborté à cause d'une erreur d'exécution !!!"
echo "******************************************************"
echo $error_msg
exit 1
}
# Ce script peut être appelé avec une option "-c" (CLEAN) en 1er argument ($1)
if [[ $1 != '' ]] ; then
[[ $1 != '-c' ]] && abort "Option $1 inconnue !"
CLEAN=1
fi
# Si option CLEAN => vider le fichier $ftpf
if [[ $CLEAN == 1 ]] ; then
cat /dev/null > $ftpf
[[ -s $ftpf ]] && abort "Le fichier $ftpf n'est pas vide alors qu'il devrait l'être (1) !"
echo "Le fichier $ftpf a été vidé"
fi
# ----------------------------------------
# 0a) Affichage de la version courante du logiciel
# ----------------------------------------
echo
echo "------------------------------"
echo " Version actuelle du logiciel"
echo "------------------------------"
grep "^Version:" ../README.md
grep "^Date:" ../README.md
echo
echo
# TEST only
#[[ $TEST == 1 ]] && (rm ../database/update/test.txt ; rm ../database/update/db-update-2014-*.sh ; touch ../database/update/db-update-2014-08-23.sh)
if [[ $TEST == 1 ]] ; then
MACOS=1
echo "(TEST MODE)"
echo "Suppression des fichiers de test créés précédemment (si besoin)"
(rm $db_update_scripts_folder/test.txt ; rm $db_update_scripts_folder/db-update-2014-*.sql ; touch $db_update_scripts_folder/db-update-2014-08-23.sql)
fi
#mv ../database/update/db-update-2019-01-12.sh /tmp/
# ----------------------------------------
# 0b) Sauvegarde de certains éléments (dans /tmp)
# (pour voir s'ils vont changer après le "git pull")
# ----------------------------------------
# a) Sauvegarde du fichier composer.json
cp -fp ../composer.json /tmp/ || abort
######[[ $TEST == 1 ]] && cp ../composer.lock /tmp/composer.json
composer_json_prev=/tmp/composer.json
# b) Sauvegarde du dossier database/update/script_sql/
#db_update_scripts_before=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
rm -rf $db_update_scripts_folder_tmp/ || abort
mkdir $db_update_scripts_folder_tmp/ || abort
#cp -fp $db_update_scripts_folder/db-update-????-??-??.sh $db_update_scripts_folder_tmp/ || abort
cp -fp $db_update_scripts_folder/db-update-????-??-??.sql $db_update_scripts_folder_tmp/ || abort
cd $db_update_scripts_folder_tmp/ || abort
#db_update_scripts_before=$(ls -1 db-update-????-??-??.sh) || abort
db_update_scripts_before=$(ls -1 db-update-????-??-??.sql) || abort
cd - >/dev/null || abort
#echo ; echo ${db_update_scripts_before[@]}
# ----------------------------------------
# 1) Mise à jour du code source (git pull)
# ----------------------------------------
#db_update_scripts_after=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key0" "key11" )
echo
echo "********************************************"
echo "* 1) Mise à jour du code source (git pull) *"
echo "********************************************"
#echo "* 1) Mise à jour du code source (git pull) (o/n) ? [o]"
#read do_it ; [[ -z $do_it ]] && do_it="o"
#echo $do_it
#[[ $do_it != "o" ]] && exit 0
cd ../ || abort
# TODO: AVIRER dès que ca a été fait au moins 1 fois (dans tous les labos utilisateurs)
# Temporairement nécessaire pour nettoyer définitivement vendor/
#rm -rf vendor/*
#git pull || abort
git -c http.sslVerify=false pull || abort
# Utile à faire si pb avec docs attachés
chmod 777 webroot/files/
chmod 777 webroot/img/photos/
cd - >/dev/null || abort
# ----------------------------------------
# 1b) Affichage de la nouvelle version
# ----------------------------------------
echo
echo "------------------------------"
echo " Nouvelle Version du logiciel"
echo "------------------------------"
grep "^Version:" ../README.md
grep "^Date:" ../README.md
# ----------------------------------------
# 2) Mise a jour des plugins php (dossier vendor/) si nécessaire
# (seulement si le fichier composer.json a changé)
# ----------------------------------------
echo
echo
echo
echo
echo "************************************************************"
echo "* 2) Mise à jour des plugins php (seulement si nécessaire) *"
echo "************************************************************"
plugins_dir=../vendor
# Creation dossier vendor/ si n'existe pas encore
if [ ! -d $plugins_dir ] ; then
mkdir $plugins_dir
chmod 777 $plugins_dir
fi
chmod +x plugins_set.sh
chmod +x plugins_update.sh
chmod +x plugins_install.sh
diff ../composer.json $composer_json_prev >/dev/null
# Attention, ne pas faire "update" mais "install"
# car "install" n'installe que les NOUVEAUX plugins non déjà installés
# et "update" risquerait aussi d'installer des versions plus récentes
# que les plugins qui sont déjà installés (et donc pas encore testés)
##[[ $? == 1 ]] && ./plugins_install.sh
if [[ $? == 0 ]] ; then
echo "==> PAS NÉCESSAIRE"
else
#echo "OUI"
#./plugins_install.sh
./plugins_update.sh
fi
# ----------------------------------------
# 3) Mise a jour de la BD (si nécessaire)
# (seulement s'il y a au moins 1 nouveau script db-update-YYYY-MM-DD.sql dans database/update/script_sql/)
# ----------------------------------------
echo
echo
echo
echo
echo "******************************************************************"
echo "* 3) Mise à jour de la Base de Données (seulement si nécessaire) *"
echo "******************************************************************"
# Créer le fichier files_to_process.txt s'il n'existe pas encore
[ ! -f $ftpf ] && touch $ftpf
# a) On fait la différence entre les fichiers de mise à jour BD présents après le git et avant
# TEST only
#[[ $TEST == 1 ]] && (rm ../database/update/db-update-2014-08-23.sh ; touch ../database/update/test.txt ; touch ../database/update/db-update-2014-08-24.sh ; touch ../database/update/db-update-2014-08-25.sh; chmod +x ../database/update/db-update-2014-*.sh)
[[ $TEST == 1 ]] && (rm $db_update_scripts_folder/db-update-2014-08-23.sql ; touch $db_update_scripts_folder/test.txt ; touch $db_update_scripts_folder/db-update-2014-08-24.sql ; touch $db_update_scripts_folder/db-update-2014-08-25.sql)
#mv /tmp/db-update-2019-01-12.sh ../database/update/
cd $db_update_scripts_folder/ || abort
#db_update_scripts_after=$(ls -1 db-update-????-??-??.sh) || abort
db_update_scripts_after=$(ls -1 db-update-????-??-??.sql) || abort
cd - >/dev/null || abort
#echo ; echo ${db_update_scripts_after[@]}
db_update_scripts_new=$( echo ${db_update_scripts_before[@]} ${db_update_scripts_after[@]} | tr ' ' '\n' | sort | uniq -u ) || abort
#temp=() ; for t in ${db_update_scripts_new[@]} ; do temp+=($t) ; done ; temp+=('toto') ; db_update_scripts_new=$temp
#echo ${#db_update_scripts_new[@]} ; echo ${db_update_scripts_new[@]}
# Pas de nouveau script de mise à jour BD à exécuter => exit
#[[ $db_update_scripts_new == '' ]] && echo "==> PAS NÉCESSAIRE" ; exit 0
# On ajoute les anciens fichiers (de l'itération précédente) restant à traiter
echo "- (a) Fichiers restant à traiter de l'itération précédente"
#cat $ftpf
#if [[ $TEST == 2 ]] ; then
if [[ $TEST == 1 ]] ; then
echo "db-update-2014-08-23.sql" > $ftpf
echo "db-update-2014-08-24.sql" >> $ftpf
echo "db-update-2014-08-26.sql" >> $ftpf
db_update_scripts_new+=("db-update-2014-08-10.sql")
fi
db_update_scripts_old=$(cat $ftpf)
#echo $db_update_scripts_old
echo ${db_update_scripts_old[*]}
echo "- (b) Nouveaux fichiers à traiter (pour cette itération)"
#echo ${db_update_scripts_new[@]}
echo ${db_update_scripts_new[*]}
# Ensemble des fichiers à traiter (anciens || nouveaux) : anciens UNION nouveaux (fusion sans doublon)"
echo "- (c) Ensemble des fichiers à traiter (a + b)"
declare -a db_update_scripts
#[[ " ${a[@]} " =~ " ${val} " ]] && echo "true" || echo "false
# foreach old script, add it to array db_update_scripts (only if not duplicate)
for db_update_script_old in ${db_update_scripts_old[*]} ; do
if [[ ! "${db_update_scripts_new[*]}" =~ "${db_update_script_old}" ]] ; then
db_update_scripts_new+=($db_update_script_old) || abort
fi
done
db_update_scripts_new_tmp=$( echo ${db_update_scripts_new[*]} | tr ' ' '\n' | sort ) || abort
db_update_scripts_new=(${db_update_scripts_new_tmp[*]})
#echo ${db_update_scripts_new[*]}
# On sauve les noms des nouveaux fichiers à traiter dans le fichier ftpf (MERGE)
# D'abord, on le vide
cat /dev/null > $ftpf
# Puis, on le remplit
for db_update_script_new in ${db_update_scripts_new[*]} ; do
echo $db_update_script_new >> $ftpf
done
# Si pas de nouveau fichier à traiter (ftpf est vide), rien à faire, on stoppe
#if [ ! -s $ftpf ] ; then
if [[ $db_update_scripts_new == '' ]] ; then
#echo "Le fichier ftpf est vide"
echo "==> PAS NÉCESSAIRE"
echo
echo
echo
exit 0
fi
#nb_scripts=${#db_update_scripts_new[@]}
#[[ $nb_scripts == 0 ]] && exit 0
# b) Mise a jour de la BD
#echo "Voici le(s) script(s) à exécuter :"
#cat $ftpf
#echo $db_update_scripts_new
echo ${db_update_scripts_new[*]}
# Remove files that were DELETED by "git pull"
for db_update_script_new in ${db_update_scripts_new[@]} ; do
[[ ! -f ../database/update/script_sql/$db_update_script_new ]] && echo "$db_update_script_new sera ignoré car supprimé par le 'git pull'" # TODO: supprimer cet element du tableau
done
# On va dans le dossier database/update/ :
#cd $db_update_scripts_folder/ || abort
echo "* Exécuter ces scripts SQL (o/n) ? [o]"
read do_it ; [[ -z $do_it ]] && do_it="o"
#echo $do_it
[[ $do_it != "o" ]] && exit 0
# Retour à database/update/
cd $db_update_scripts_folder/../ || abort
for db_update_script_new in ${db_update_scripts_new[@]} ; do
# Ignorer les fichiers supprimés par le "git pull"
#[[ ! -f $db_update_script_new ]] && continue
#[[ ! -f script_sql/$db_update_script_new ]] && continue
if [[ ! -f script_sql/$db_update_script_new ]] ; then
echo "$db_update_script_new ignoré car supprimé par le 'git pull'" # TODO: supprimer cet element du tableau
else
echo ; echo
#echo "- Execution du script de mise à jour de la BD $db_update_scripts_folder/$db_update_script_new (o/n) ? [o]"
echo "- Execution du script de mise à jour de la BD $db_update_scripts_folder/$db_update_script_new"
#read do_it ; [[ -z $do_it ]] && do_it="o" ; echo $do_it
#if [[ $do_it == "o" ]] ; then
#ls -l ./$db_update_script_new_ || abort
#./$db_update_script_new || abort
[[ $TEST == 0 ]] && (./db-update.sh script_sql/$db_update_script_new || abort)
#fi
fi
# On supprime le fichier traité de $ftpf
#echo "Suppression $db_update_script_new de $ftpf"
#echo "- avant suppr"
#cat ../../install/$ftpf
if [[ $MACOS == 1 ]] ; then
# For Mac OS :
sed -e "/$db_update_script_new/d" -i '' ../../install/$ftpf || abort
else
# For Linux :
sed -e "/$db_update_script_new/d" -i ../../install/$ftpf || abort
fi
#echo "- après suppr"
#cat ../../install/$ftpf
done
#[[ $TEST == 1 ]] && (rm test.txt ; rm db-update-2014-*.sh)
[[ $TEST == 1 ]] && (rm script_sql/test.txt ; rm script_sql/db-update-2014-*.sql)
cd - >/dev/null
# A ce stade, $ftpf doit être vide, sinon abort
#cat $ftpf
[[ -s $ftpf ]] && abort "Le fichier $ftpf n'est pas vide alors qu'il devrait l'être (2) !"
echo
echo
echo
#echo "=> MISE À JOUR TERMINÉE"