Skip to content

Commit 7dd14b6

Browse files
committed
Udpate | Whiptail & Bash.
Whiptail est utiliser par défaut lorsque c'est possible, sinon fallback sur bash. Point a améliorer : - Reprendre le même style de menu bash que avant.
1 parent 15263fc commit 7dd14b6

File tree

1 file changed

+179
-108
lines changed

1 file changed

+179
-108
lines changed

menu.sh

Lines changed: 179 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11
#!/usr/bin/env bash
22
# ==============================================================================
3-
# menu.sh — TUI façon raspi-config (whiptail/dialog) avec sous-menus + options
4-
# - Cancel fonctionne partout (main + sous-menus)
5-
# - Les flags de new.sh n'apparaissent que s'il y en a
3+
# menu.sh — TUI façon raspi-config (whiptail/dialog) avec fallback menu texte
4+
#
65
# USAGE :
7-
# sudo ./menu.sh
6+
# bash <(curl -fsSL https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/menu.sh)
7+
# bash <(curl -fsSL https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/menu.sh) --bash
8+
#
9+
# OPTIONS :
10+
# --bash Force le menu texte (désactive whiptail/dialog même s'ils sont présents)
811
# ==============================================================================
912

1013
set -uo pipefail
1114

15+
# ------------------------------ CLI flags -------------------------------------
16+
FORCE_BASH=0
17+
for arg in "$@"; do
18+
case "$arg" in
19+
--bash) FORCE_BASH=1 ;;
20+
esac
21+
done
22+
1223
# ------------------------------ Vérif root ------------------------------------
1324
if [[ ${EUID:-$UID} -ne 0 ]]; then
1425
echo "Ce script doit être exécuté en root."
1526
exec sudo -E bash "$0" "$@"
1627
fi
1728

18-
# ----------------------------- URLs des scripts --------------------------------
29+
# ----------------------------- URLs des scripts -------------------------------
1930
DOCKER_URL="https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/.assets/dockerinstall.sh"
2031
YARN_URL="https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/.assets/yarninstall.sh"
2132
NEW_URL="https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/refs/heads/fix/script-new-interactive-mode/.assets/new.sh"
@@ -27,49 +38,14 @@ SSH_MENU_URL="https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/
2738

2839
# ------------------------------ Backend UI ------------------------------------
2940
DIALOG_BIN=""
30-
if command -v whiptail >/dev/null 2>&1; then
31-
DIALOG_BIN="whiptail"
32-
elif command -v dialog >/dev/null 2>&1; then
33-
DIALOG_BIN="dialog"
34-
else
35-
if command -v apt-get >/dev/null 2>&1; then
36-
apt-get update -y >/dev/null 2>&1 || true
37-
apt-get install -y whiptail >/dev/null 2>&1 || true
38-
command -v whiptail >/dev/null 2>&1 && DIALOG_BIN="whiptail"
41+
if [[ $FORCE_BASH -eq 0 ]]; then
42+
if command -v whiptail >/dev/null 2>&1; then
43+
DIALOG_BIN="whiptail"
44+
elif command -v dialog >/dev/null 2>&1; then
45+
DIALOG_BIN="dialog"
3946
fi
4047
fi
41-
42-
if [[ -z "$DIALOG_BIN" ]]; then
43-
echo "Ni 'whiptail' ni 'dialog' détecté. Installe 'whiptail' (apt install -y whiptail) puis relance."
44-
exit 1
45-
fi
46-
47-
# Wrapper uniforme pour --menu (retourne le choix sur stdout, et code:
48-
# 0=OK, 1=Cancel, 255=ESC)
49-
ui_menu() {
50-
local title="$1" prompt="$2" h="$3" w="$4" mh="$5"; shift 5
51-
local status out
52-
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
53-
out=$(whiptail --title "$title" --ok-button "OK" --cancel-button "Cancel" \
54-
--menu "$prompt" "$h" "$w" "$mh" "$@" 3>&1 1>&2 2>&3)
55-
status=$?
56-
else
57-
out=$(dialog --title "$title" --ok-label "OK" --cancel-label "Cancel" \
58-
--menu "$prompt" "$h" "$w" "$mh" "$@" 3>&1 1>&2 2>&3)
59-
status=$?
60-
fi
61-
printf "%s" "$out"
62-
return $status
63-
}
64-
65-
ui_msg() {
66-
local title="$1" msg="$2"
67-
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
68-
whiptail --title "$title" --msgbox "$msg" 13 70
69-
else
70-
dialog --title "$title" --msgbox "$msg" 13 70
71-
fi
72-
}
48+
# Si DIALOG_BIN vide -> on utilisera le menu texte
7349

7450
# ------------------------------ Options new.sh --------------------------------
7551
NEW_F_DEBUG=0
@@ -91,20 +67,66 @@ build_new_flags() {
9167
}
9268
flags_inline_if_any() {
9369
build_new_flags
94-
if ((${#NEW_FLAGS[@]}==0)); then
95-
echo "" # rien si aucun flag (demande)
70+
((${#NEW_FLAGS[@]})) && echo " [${NEW_FLAGS[*]}]" || echo ""
71+
}
72+
73+
# ------------------------------- Helpers communs ------------------------------
74+
download_to_tmp() {
75+
local url="$1" prefix="${2:-script}" tmp
76+
tmp="$(mktemp -p /tmp "${prefix}.XXXXXX")" || { echo "mktemp a échoué"; return 98; }
77+
if command -v curl >/dev/null 2>&1; then
78+
curl -fsSL --retry 3 --retry-delay 1 "$url" -o "$tmp" || { rm -f "$tmp"; return 90; }
79+
elif command -v wget >/dev/null 2>&1; then
80+
wget -q "$url" -O "$tmp" || { rm -f "$tmp"; return 90; }
9681
else
97-
echo " [${NEW_FLAGS[*]}]"
82+
rm -f "$tmp"; return 91
9883
fi
84+
chmod +x "$tmp"
85+
printf "%s" "$tmp"
86+
}
87+
run_remote() {
88+
local url="$1" label="${2:-script}"; shift 2 || true
89+
local args=( "$@" ) tmp rc
90+
tmp="$(download_to_tmp "$url" "$label")" || { echo "Échec de téléchargement de ${label}."; return 90; }
91+
clear; echo "=== Exécution de ${label} ==="
92+
bash "$tmp" "${args[@]}"; rc=$?
93+
rm -f "$tmp" 2>/dev/null || true
94+
if [[ $rc -ne 0 ]]; then
95+
local hint; hint="$(ls -1 /var/log/new-basics-*.log 2>/dev/null | tail -n 1)"
96+
[[ -n "$hint" ]] && echo "Dernier log : $hint"
97+
fi
98+
return $rc
9999
}
100100

101-
adv_menu() {
102-
local dbg="OFF" dry="OFF" qui="OFF"
101+
# =============================== UI: WHIPTAIL/DIALOG ==========================
102+
ui_menu() {
103+
local title="$1" prompt="$2" h="$3" w="$4" mh="$5"; shift 5
104+
local status out
105+
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
106+
out=$(whiptail --title "$title" --ok-button "OK" --cancel-button "Cancel" \
107+
--menu "$prompt" "$h" "$w" "$mh" "$@" 3>&1 1>&2 2>&3)
108+
status=$?
109+
else
110+
out=$(dialog --title "$title" --ok-label "OK" --cancel-label "Cancel" \
111+
--menu "$prompt" "$h" "$w" "$mh" "$@" 3>&1 1>&2 2>&3)
112+
status=$?
113+
fi
114+
printf "%s" "$out"
115+
return $status
116+
}
117+
ui_msg() {
118+
local title="$1" msg="$2"
119+
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
120+
whiptail --title "$title" --msgbox "$msg" 13 70
121+
else
122+
dialog --title "$title" --msgbox "$msg" 13 70
123+
fi
124+
}
125+
adv_menu_ui() {
126+
local dbg="OFF" dry="OFF" qui="OFF" sel status
103127
(( NEW_F_DEBUG )) && dbg="ON"
104128
(( NEW_F_DRYRUN )) && dry="ON"
105129
(( NEW_F_QUIET )) && qui="ON"
106-
107-
local sel status
108130
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
109131
sel=$(whiptail --title "Options avancées (new.sh)" \
110132
--checklist "Sélectionne les flags à activer :" 16 70 6 \
@@ -121,7 +143,6 @@ adv_menu() {
121143
3>&1 1>&2 2>&3); status=$?
122144
fi
123145
[[ $status -ne 0 ]] && return 0
124-
125146
NEW_F_DEBUG=0; NEW_F_DRYRUN=0; NEW_F_QUIET=0
126147
for t in $sel; do
127148
t="${t%\"}"; t="${t#\"}"
@@ -131,7 +152,6 @@ adv_menu() {
131152
QUIET) NEW_F_QUIET=1 ;;
132153
esac
133154
done
134-
135155
local extra
136156
if [[ "$DIALOG_BIN" == "whiptail" ]]; then
137157
extra=$(whiptail --title "Arguments libres (new.sh)" \
@@ -144,45 +164,11 @@ adv_menu() {
144164
fi
145165
[[ $status -ne 0 ]] && return 0
146166
NEW_EXTRA_ARGS="$extra"
147-
148167
ui_msg "Options mises à jour" "new.sh sera lancé avec : $(flags_inline_if_any)"
149168
}
150-
151-
# ------------------------------- Helpers exec ---------------------------------
152-
download_to_tmp() {
153-
local url="$1" prefix="${2:-script}" tmp
154-
tmp="$(mktemp -p /tmp "${prefix}.XXXXXX")" || { echo "mktemp a échoué"; return 98; }
155-
if command -v curl >/dev/null 2>&1; then
156-
curl -fsSL --retry 3 --retry-delay 1 "$url" -o "$tmp" || { rm -f "$tmp"; return 90; }
157-
elif command -v wget >/dev/null 2>&1; then
158-
wget -q "$url" -O "$tmp" || { rm -f "$tmp"; return 90; }
159-
else
160-
rm -f "$tmp"; return 91
161-
fi
162-
chmod +x "$tmp"
163-
printf "%s" "$tmp"
164-
}
165-
run_remote() {
166-
local url="$1" label="${2:-script}"; shift 2 || true
167-
local args=( "$@" ) tmp rc
168-
tmp="$(download_to_tmp "$url" "$label")" || { ui_msg "Erreur" "Échec de téléchargement de ${label}."; return 90; }
169-
clear; echo "=== Exécution de ${label} ==="
170-
bash "$tmp" "${args[@]}"; rc=$?
171-
rm -f "$tmp" 2>/dev/null || true
172-
if [[ $rc -eq 0 ]]; then
173-
ui_msg "Terminé" "${label} s'est terminé avec succès."
174-
else
175-
local hint; hint="$(ls -1 /var/log/new-basics-*.log 2>/dev/null | tail -n 1)"
176-
ui_msg "Échec" "${label} a échoué (rc=$rc).${hint:+\nDernier log : $hint}"
177-
fi
178-
return $rc
179-
}
180-
181-
# ------------------------------- Sous-menus ------------------------------------
182-
submenu_installation() {
169+
submenu_installation_ui() {
183170
while true; do
184-
local sel
185-
sel=$(ui_menu "Installation" "Choisis une action :" 15 70 6 \
171+
local sel; sel=$(ui_menu "Installation" "Choisis une action :" 15 70 6 \
186172
1 "Installer docker" \
187173
2 "Installer yarn" \
188174
3 "Retour")
@@ -194,11 +180,10 @@ submenu_installation() {
194180
esac
195181
done
196182
}
197-
submenu_scripts() {
183+
submenu_scripts_ui() {
198184
while true; do
199185
local flags; flags="$(flags_inline_if_any)"
200-
local sel
201-
sel=$(ui_menu "Scripts" "Choisis un script à exécuter :" 20 78 8 \
186+
local sel; sel=$(ui_menu "Scripts" "Choisis un script à exécuter :" 20 78 8 \
202187
1 "Exécuter 'new.sh'${flags}" \
203188
2 "Exécuter 'speedtest.sh'" \
204189
3 "Exécuter 'fastfetch-install.sh'" \
@@ -214,10 +199,9 @@ submenu_scripts() {
214199
esac
215200
done
216201
}
217-
submenu_autres() {
202+
submenu_autres_ui() {
218203
while true; do
219-
local sel
220-
sel=$(ui_menu "Autres menus" "Choisis une action :" 15 70 6 \
204+
local sel; sel=$(ui_menu "Autres menus" "Choisis une action :" 15 70 6 \
221205
1 "Exécuter le Pterodactyl Menu" \
222206
2 "Menu SSH" \
223207
3 "Retour")
@@ -229,25 +213,112 @@ submenu_autres() {
229213
esac
230214
done
231215
}
232-
233-
# ------------------------------- Menu principal --------------------------------
234-
main_menu() {
216+
main_menu_ui() {
235217
while true; do
236-
local sel
237-
sel=$(ui_menu "Menu principal" "Sélectionne une catégorie :" 16 60 6 \
218+
local sel; sel=$(ui_menu "Menu principal" "Sélectionne une catégorie :" 16 60 6 \
238219
1 "Installation" \
239220
2 "Scripts" \
240221
3 "Autres menus" \
241222
4 "Options avancées (new.sh)")
242223
case $? in 1|255) exit 0 ;; esac
243224
case "$sel" in
244-
1) submenu_installation ;;
245-
2) submenu_scripts ;;
246-
3) submenu_autres ;;
247-
4) adv_menu ;;
248-
*) : ;;
225+
1) submenu_installation_ui ;;
226+
2) submenu_scripts_ui ;;
227+
3) submenu_autres_ui ;;
228+
4) adv_menu_ui ;;
249229
esac
250230
done
251231
}
252232

253-
main_menu
233+
# =============================== UI: MENU TEXTE ===============================
234+
pause() { read -rp $'\n(Entrée pour continuer) ' _; }
235+
adv_menu_text() {
236+
echo; echo "=== Options avancées (new.sh) ==="
237+
echo "Actuelles : $(flags_inline_if_any)"
238+
read -rp "Activer --debug ? (y/N) " r; [[ "$r" =~ ^[Yy]$ ]] && NEW_F_DEBUG=1 || NEW_F_DEBUG=0
239+
read -rp "Activer --dry-run ? (y/N) " r; [[ "$r" =~ ^[Yy]$ ]] && NEW_F_DRYRUN=1 || NEW_F_DRYRUN=0
240+
read -rp "Activer --quiet ? (y/N) " r; [[ "$r" =~ ^[Yy]$ ]] && NEW_F_QUIET=1 || NEW_F_QUIET=0
241+
read -rp "Autres arguments (ligne unique) : " NEW_EXTRA_ARGS
242+
echo "Mis à jour : $(flags_inline_if_any)"; pause
243+
}
244+
submenu_installation_text() {
245+
while true; do
246+
clear; cat <<'TXT'
247+
=== Installation ===
248+
1) Installer docker
249+
2) Installer yarn
250+
r) Retour
251+
TXT
252+
read -rp "Choix : " c
253+
case "$c" in
254+
1) run_remote "$DOCKER_URL" "dockerinstall.sh" ; pause ;;
255+
2) run_remote "$YARN_URL" "yarninstall.sh" ; pause ;;
256+
r|R) return 0 ;;
257+
esac
258+
done
259+
}
260+
submenu_scripts_text() {
261+
while true; do
262+
clear; echo "=== Scripts ==="
263+
echo "Flags new.sh : $(flags_inline_if_any)"
264+
cat <<'TXT'
265+
1) Exécuter 'new.sh'
266+
2) Exécuter 'speedtest.sh'
267+
3) Exécuter 'fastfetch-install.sh'
268+
4) Exécuter 'pterodactyl-panel-reinstaller'
269+
r) Retour
270+
TXT
271+
read -rp "Choix : " c
272+
case "$c" in
273+
1) build_new_flags; run_remote "$NEW_URL" "new.sh" "${NEW_FLAGS[@]}"; pause ;;
274+
2) run_remote "$SPEED_URL" "speedtest.sh" ; pause ;;
275+
3) run_remote "$FASTFETCH_URL" "fastfetch-install.sh" ; pause ;;
276+
4) run_remote "$PANEL_REINSTALL_URL" "pterodactylpanelreinstall.sh"; pause ;;
277+
r|R) return 0 ;;
278+
esac
279+
done
280+
}
281+
submenu_autres_text() {
282+
while true; do
283+
clear; cat <<'TXT'
284+
=== Autres menus ===
285+
1) Pterodactyl Menu
286+
2) Menu SSH
287+
r) Retour
288+
TXT
289+
read -rp "Choix : " c
290+
case "$c" in
291+
1) run_remote "$PTERO_MENU_URL" "PterodactylMenu.sh" ; pause ;;
292+
2) run_remote "$SSH_MENU_URL" "menu_id.sh" ; pause ;;
293+
r|R) return 0 ;;
294+
esac
295+
done
296+
}
297+
main_menu_text() {
298+
while true; do
299+
clear; cat <<'TXT'
300+
=========== MENU ===========
301+
1) Installation
302+
2) Scripts
303+
3) Autres menus
304+
4) Options avancées (new.sh)
305+
q) Quitter
306+
TXT
307+
read -rp "Choix : " c
308+
case "$c" in
309+
1) submenu_installation_text ;;
310+
2) submenu_scripts_text ;;
311+
3) submenu_autres_text ;;
312+
4) adv_menu_text ;;
313+
q|Q) exit 0 ;;
314+
esac
315+
done
316+
}
317+
318+
# =============================== Lancement ====================================
319+
if [[ -n "$DIALOG_BIN" ]]; then
320+
main_menu_ui
321+
else
322+
echo "(UI texte : whiptail/dialog indisponibles ou --bash forcé)"
323+
main_menu_text
324+
fi

0 commit comments

Comments
 (0)