-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdbinst
executable file
·200 lines (175 loc) · 6.65 KB
/
dbinst
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
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
MYDIR="$(cd "$(dirname -- "$0")"; pwd)"
"$MYDIR/sbin/runphp" --bs --ue --ci || exit 1
DREMGR="$MYDIR"
source "$DREMGR/sbin/vendor/nulib/php/load.sh" || exit 1
source "$DREMGR/sbin/functions.sh" || exit 1
function start_dbinst() {
local composefile="$DREMGR/dbinst-docker-compose.yml"
[ -f "$composefile" ] || die "$composefile: fichier introuvable"
if [ -n "$ForceStart" ]; then
:
elif dcrunning "$composefile"; then
enote "DRE [$Profile] est démarré"
return
fi
"$DREMGR/build" ${Rebuild:+--rebuild} || die
estep "Démarrage de DRE [$Profile]"
rsync -rlpt "$DREMGR/config/cron/" "$DREDATA/cron-config/"
docker compose -f "$composefile" up -d --wait || die
}
function stop_dbinst() {
local composefile="$DREMGR/dbinst-docker-compose.yml"
[ -f "$composefile" ] || return 0
if dcrunning "$composefile"; then
estep "Arrêt de DRE [$Profile]"
docker compose -f "$composefile" down || die
fi
}
function refresh_dbinst() {
local ForceStart=1
start_dbinst "$@"
}
function restart_dbinst() {
stop_dbinst "$@"
start_dbinst "$@"
}
function import_dumps() {
local composefile="$DREMGR/dbinst-docker-compose.yml"
[ -f "$composefile" ] || return 0
if dcrunning "$composefile"; then
estep "Import des dumps [$Profile]"
docker compose -f "$composefile" exec cron dl-dumps "$@" || die
else
eerror "Impossible d'importer les dumps: DRE [$Profile] est arrêté"
fi
}
function import_one() {
local name="$1"; shift
[ -n "$name" ] || die "Vous devez spécifier le nom de l'addon à importer"
import_dumps -@ latest --runao -o "$name" "$@"
}
function import_one_devel() {
local srcdir="$1"; shift
[ -n "$srcdir" ] || die "Vous devez spécifier le répertoire source de l'addon à importer"
[ -d "$srcdir" ] || die "$srcdir: répertoire d'addon introuvable"
local name="$(basename "$srcdir")"
local importlog="$DREMGR/var/${Profile}-dredata/import.log"
local destdir="$DREMGR/var/${Profile}-dredata/addons/$name"
estep "Copie des fichiers vers ${destdir#$DREMGR/}"
[ "$(id -u)" == 0 ] && sudo= || sudo=sudo
$sudo rsync -rlp --delete -f "- /.git/" -f "P /.git/" "$srcdir/" "$destdir/" || die
import_dumps --clean-import-log -@ latest --no-updateao --runao -o "$name" "$@"
less -eF "$importlog"
}
function psql_prompt() {
local composefile="$DREMGR/dbinst-docker-compose.yml"
[ -f "$composefile" ] || return 0
if dcrunning "$composefile"; then
estep "Invite psql [$Profile]"
docker compose -f "$composefile" exec db psql "$@" || die
else
eerror "Impossible de lancer l'invite psql: DRE [$Profile] est arrêté"
fi
}
function shell_prompt() {
local composefile="$DREMGR/dbinst-docker-compose.yml"
[ -f "$composefile" ] || return 0
if dcrunning "$composefile"; then
estep "Invite shell [$Profile]"
local container="$1"; shift
docker compose -f "$composefile" exec "$container" bash "$@" || die
else
eerror "Impossible de lancer l'invite shell: DRE [$Profile] est arrêté"
fi
}
case "$MYNAME" in
*_dbinst) Profile="${MYNAME%_dbinst}";;
*) Profile=prod;;
esac
action=auto
Rebuild=
args=(
"Gérer cette instance de DRE"
#"usage"
--check-only action=none "++Ne faire que la vérification de l'environnement"
-g:,--profile:PROFILE Profile= "\
++Spécifier le profil. Un fichier de configuration PROFILE_profile.env doit exister.
Si cette option n'est pas spécifiée, le profil sélectionné par défaut est $Profile"
-A,--all-profiles Profile=ALL "++Faire l'opération pour tous les profils définis dans dremgr.env"
-P,--prod Profile=prod "++alias pour --profile prod"
-T,--test Profile=test "++alias pour --profile test"
-s,--start action=start "Démarrer DRE"
-k,--stop action=stop "Arrêter DRE"
-r,--refresh action=refresh "(Re)démarrer DRE si nécessaire"
-R,--restart action=restart "Forcer le (re)démarrage de DRE"
-b,--rebuild Rebuild=1 "++Forcer le rebuild de l'image avant le démarrage"
-i,--import-all action=import_all "Lancer l'import complet maintenant, sans attendre la planification"
-I,--import-one action=import_one "\
++Lancer l'import d'un unique addon sans attendre la planification
- soit la commande suivante:
$MYNAME -I DREADDON
- l'addon est importé comme avec les options suivantes:
$MYNAME -i -- --runao -o DREADDON \"\$@\"
cf la documentation pour les détails"
-J,--import-one-devel action=import_one_devel "\
++Importer un addon en mode développement:
- Soit la commande suivante:
$MYNAME -J path/to/DREADDON
- le contenu du répertoire de l'addon est synchronisé vers le répertoire correspondant du conteneur
- puis l'addon est importé comme avec les options suivantes:
$MYNAME -i -- --no-updateao --runao -o DREADDON \"\$@\"
cf la documentation pour les détails"
-q,--psql action=psql "Lancer une invite psql connecté avec le compte administrateur"
--shell-db action=shell_db "++Lancer une invite bash dans le container db"
-x,--shell-cron action=shell_cron "++Lancer une invite bash dans le container cron"
)
parse_args "$@"; set -- "${args[@]}"
if [ "$Profile" == ALL ]; then
[ -f "$DREMGR/dremgr.env" ] || die "dremgr.env: fichier introuvable"
eval "$(source "$DREMGR/dremgr.env"; echo_setv APP_PROFILES="$APP_PROFILES")"
[ -n "$APP_PROFILES" ] || die "Aucun profil n'est défini"
args=(
${Rebuild:+--rebuild}
)
case "$action" in
none) args+=(--check-only);;
auto) ;;
*) args+=("--${action//_/-}");;
esac
read -a profiles <<<"${APP_PROFILES//
/ }"
for profile in "${profiles[@]}"; do
etitle "$profile"
"$MYSELF" --profile "$profile" "${args[@]}" -- "$@"; r=$?
[ $r -eq 22 ] && exit
eend
done
exit
fi
Profile="${Profile##*/}"
Profile="${Profile%_profile.env}"
envfile="$DREMGR/${Profile}_profile.env"
IS_DBINST=1
run_check_env || exit 22
[ -f "$envfile" ] || die "$Profile: profil invalide (${envfile#$DREMGR/}: fichier de profil introuvable)"
DREDATA="$DREMGR/var/${Profile}-dredata"
for dir in addons downloads; do
mkdir -p "$DREDATA/$dir"
done
[ "$action" == auto ] && action=start
[ "$action" == none ] && exit 0
ForceStart=
case "$action" in
start) start_dbinst "$@";;
stop) stop_dbinst "$@";;
refresh) refresh_dbinst "$@";;
restart) restart_dbinst "$@";;
import_all) import_dumps "$@";;
import_one) import_one "$@";;
import_one_devel) import_one_devel "$@";;
psql) psql_prompt "$@";;
shell_*) shell_prompt "${action#shell_}" "$@";;
*) die "$action: action non implémentée";;
esac