#!/bin/bash if [[ -z "${WELCOME_SCRIPT_PATH}" ]]; then WELCOME_SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." &>/dev/null && pwd)" fi . "${WELCOME_SCRIPT_PATH}/config/config_colors.sh" . "${WELCOME_SCRIPT_PATH}/config/config_install.sh" . "${WELCOME_SCRIPT_PATH}/func/common.sh" . "${WELCOME_SCRIPT_PATH}/func/message.sh" . "${WELCOME_SCRIPT_PATH}/func/network.sh" . "${WELCOME_SCRIPT_PATH}/func/deb_sys.sh" SUDO="" [[ "$EUID" -ne 0 ]] && command -v sudo >/dev/null 2>&1 && SUDO="sudo" # Vérification JQ (une seule fois) if ! command -v jq >/dev/null 2>&1; then echo -e "${COLOR_YELLOW}⚡ JQ manquant... installation...${NONE}" $SUDO apt-get update -qq && $SUDO apt-get install -y jq -qq fi # ========================================== # 2. DÉFINITION DES DONNÉES (JSON) # ========================================== # OPTIMISATION : On parse le JSON en tableaux Bash UNE SEULE FOIS mapfile -t ALL_DEB_INSTALL_IDS < <(echo "$CONFIG_DEB_INSTALL_JSON" | jq -r '.[].id') mapfile -t ALL_DEB_INSTALL_LABELS < <(echo "$CONFIG_DEB_INSTALL_JSON" | jq -r '.[].label') mapfile -t ALL_DEB_INSTALL_TYPES < <(echo "$CONFIG_DEB_INSTALL_JSON" | jq -r '.[].type') mapfile -t ALL_DEB_INSTALL_PARAMS < <(echo "$CONFIG_DEB_INSTALL_JSON" | jq -r '.[].params') # ========================================== # 3. LOGIQUE INTERFACE # ========================================== do_deb_install_menu(){ local cursor selected_ids visible_indices cursor=0 selected_ids=() while true; do # On filtre les indices visibles via Bash (très rapide) visible_indices=() for i in "${!ALL_DEB_INSTALL_IDS[@]}"; do if ! check_deb_status "${ALL_DEB_INSTALL_TYPES[$i]}" "${ALL_DEB_INSTALL_PARAMS[$i]}"; then visible_indices+=("$i") fi done # Sortie si vide [[ ${#visible_indices[@]} -eq 0 ]] && echo -e "${COLOR_GREEN}Tout est OK !${NONE}" && exit 0 # Affichage clear echo -e "${COLOR_LIGHT_BLUE}====[ FROGG DEPLOY ]====${NONE}" echo -e "Flèches: Naviguer | Espace: Sélectionner | Entrée: Lancer | ${COLOR_LIGHT_RED}q: Quitter ou Ctrl+C${NONE}\n" for i in "${!visible_indices[@]}"; do idx=${visible_indices[$i]} id=${ALL_DEB_INSTALL_IDS[$idx]} [[ $i -eq $cursor ]] && echo -ne "${COLOR_CYAN}> ${NONE}" || echo -ne " " is_selected=false [[ " ${selected_ids[*]} " == *" $id "* ]] && is_selected=true [[ $is_selected == true ]] && echo -e "[X] ${ALL_DEB_INSTALL_LABELS[$idx]}" || echo -e "[ ] ${ALL_DEB_INSTALL_LABELS[$idx]}" done # Lecture touche IFS= read -rsn1 key [[ $key == "q" ]] && exit 0 if [[ $key == $'\x1b' ]]; then read -rsn2 key case $key in '[A') ((cursor--)); [[ $cursor -lt 0 ]] && cursor=$((${#visible_indices[@]} - 1)) ;; '[B') ((cursor++)); [[ $cursor -ge ${#visible_indices[@]} ]] && cursor=0 ;; esac elif [[ $key == "" ]]; then break elif [[ $key == " " ]]; then target_id=${ALL_DEB_INSTALL_IDS[${visible_indices[$cursor]}]} if [[ " ${selected_ids[*]} " == *" $target_id "* ]]; then selected_ids=("${selected_ids[@]//$target_id/}") # Décocher else selected_ids+=("$target_id") # Cocher fi fi done # ========================================== # 5. EXÉCUTION # ========================================== clear # On compte le nombre d'éléments dans le tableau des IDs sélectionnés nb_actions=${#selected_ids[@]} if [[ $nb_actions -eq 0 ]]; then msg_warning "Aucune action sélectionnée. Sortie du script." exit 0 fi emsg_info "Lancement de $nb_actions tâche(s) sélectionnée(s)..." for id in "${selected_ids[@]}"; do [[ -z "$id" ]] && continue # Trouver l'index original pour cet ID for i in "${!ALL_DEB_INSTALL_IDS[@]}"; do if [[ "${ALL_DEB_INSTALL_IDS[$i]}" == "$id" ]]; then echo -e "${COLOR_YELLOW}--- ${ALL_DEB_INSTALL_LABELS[$i]} ---${NONE}" do_deb_install_action "${ALL_DEB_INSTALL_TYPES[$i]}" "${ALL_DEB_INSTALL_PARAMS[$i]}" fi done done msg_success "Terminé ! ✨" pause . "${WELCOME_SCRIPT_PATH}/777-welcome.sh" } do_deb_install_menu