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
1013set -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 ------------------------------------
1324if [[ ${EUID:- $UID } -ne 0 ]]; then
1425 echo " Ce script doit être exécuté en root."
1526 exec sudo -E bash " $0 " " $@ "
1627fi
1728
18- # ----------------------------- URLs des scripts --------------------------------
29+ # ----------------------------- URLs des scripts -------------------------------
1930DOCKER_URL=" https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/.assets/dockerinstall.sh"
2031YARN_URL=" https://raw.githubusercontent.com/OverStyleFR/AutoScriptBash/main/.assets/yarninstall.sh"
2132NEW_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 ------------------------------------
2940DIALOG_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
4047fi
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 --------------------------------
7551NEW_F_DEBUG=0
@@ -91,20 +67,66 @@ build_new_flags() {
9167}
9268flags_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: +\n Dernier 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