#!/bin/bash # shellcheck source=kz-common.sh ############################################################################### # Installatiemenu. # # Geschreven door Karel Zimmer . ############################################################################### PROGRAM_PATH=$(realpath "$(dirname "$0")") readonly PROGRAM_PATH source "$PROGRAM_PATH"/kz-common.sh readonly PROGRAM_NAME='kz-menu' readonly DISPLAY_NAME=${PROGRAM_NAME/kz-/kz } readonly RELEASE_YEAR=2015 ############################################################################### # Global constants ############################################################################### readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON'g' readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON',gui' readonly USAGE="Gebruik: $DISPLAY_NAME [-g|--gui] $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $DISPLAY_NAME [OPTIE...] Installatiemenu. Opties: -g, --gui start in grafische modus $OPTIONS_HELP_COMMON" readonly MENU1_TITLE=Installatiemenu readonly MENU1_HEAD="\ ${DASHES:0:57} = $MENU1_TITLE = ${DASHES:0:57}" readonly -a MENU1_ACTIONS=( [1]='Installatie voorbereiden' 'Installatie uitvoeren' 'Installatie afronden' 'Gebruiker inrichten' 'Opdrachtenmenu' 'Stoppen' ) readonly -a MENU1_COMMANDS=( [1]='Checklist hoofdstuk 1' 'Checklist hoofdstuk 2' 'Checklist hoofdstuk 3' 'Checklist hoofdstuk 4' 'Opdrachten uitvoeren' 'Menu verlaten' ) readonly MENU1_LINES=${#MENU1_ACTIONS[@]} readonly MENU2_TITLE=Opdrachtenmenu readonly MENU2_HEAD="\ ${DASHES:0:57} = $MENU2_TITLE = ${DASHES:0:57}" readonly -a MENU2_ACTIONS=( [1]='Back-up maken' 'Apps installeren' 'Applijst maken' 'Netwerkschijf aankoppelen' 'Back-up terugzetten' 'Apps instellen' 'Instellijst maken' 'Terug' ) readonly -a MENU2_COMMANDS=( [1]='kz backup' 'kz install' 'kz install --list' 'kz nas' 'kz restore' 'kz setup' 'kz setup --list' 'Naar vorig menu' ) readonly MENU2_LINES=${#MENU2_ACTIONS[@]} ############################################################################### # Global variables ############################################################################### declare EXECUTE_COMMAND=false declare -a EXEC=() declare OPTION_GUI=false ############################################################################### # Functions ############################################################################### function check_input { local -i getopt_rc=0 local parsed='' parsed=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$DISPLAY_NAME" \ -- "$@" ) || getopt_rc=$? if [[ $getopt_rc -ne $SUCCESS ]]; then process_usage NOERROR=true exit $ERROR fi eval set -- "$parsed" process_common_options "$@" while true; do case $1 in -g|--gui) OPTION_GUI=true reset_terminal_attributes shift ;; --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then info 'Geen argumenten toegestaan.' process_usage NOERROR=true exit $ERROR fi check_user_root } function process_input { if $OPTION_GUI; then process_menu1_gui else process_menu1_tui fi } function process_menu1_gui { local -i zenity_rc=0 while true; do TITLE=$MENU1_TITLE # Constructie '2> >($LOGCMD)' om stderr naar de log te krijgen. REPLY=$( zenity --list \ --radiolist \ --width 480 \ --height 240 \ --title "$TITLE" \ --text 'Selecteer een keuze:' \ --ok-label 'Verder' \ --cancel-label 'Afsluiten' \ --column 'Keuze' \ --column 'Nr.' \ --column 'Actie' \ --column 'Toelichting' \ TRUE 1 "${MENU1_ACTIONS[1]}" "${MENU1_COMMANDS[1]}" \ FALSE 2 "${MENU1_ACTIONS[2]}" "${MENU1_COMMANDS[2]}" \ FALSE 3 "${MENU1_ACTIONS[3]}" "${MENU1_COMMANDS[3]}" \ FALSE 4 "${MENU1_ACTIONS[4]}" "${MENU1_COMMANDS[4]}" \ FALSE 5 "${MENU1_ACTIONS[5]}" "${MENU1_COMMANDS[5]}" \ 2> >($LOGCMD) ) || zenity_rc=$? if [[ $zenity_rc -ne 0 ]]; then exit $SUCCESS fi process_menu1_choice done } function process_menu1_tui { local action='' while true; do # Toon menu. clear -x info "$MENU1_HEAD " for action in "${!MENU1_ACTIONS[@]}"; do printf '%2s. %-29.29s - %s\n' \ "$action" \ "${MENU1_ACTIONS[$action]}" \ "${MENU1_COMMANDS[$action]}" done info while true; do read -rp "Voer uit nummer [1-$MENU1_LINES]: " case $REPLY in *[^[:digit:]]*) printf '%s' "${REWRITE_LINE}" continue ;; *) if [[ $REPLY -ge 1 && $REPLY -le $MENU1_LINES ]] \ &> /dev/null; then break else printf '%s' "${REWRITE_LINE}" continue fi ;; esac done process_menu1_choice if $EXECUTE_COMMAND; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' fi EXECUTE_COMMAND=false done } function process_menu1_choice { case $REPLY in 1) process_menu1_choice1 ;; 2) process_menu1_choice2 ;; 3) process_menu1_choice3 ;; 4) process_menu1_choice4 ;; 5) process_menu2 ;; 6) exit $SUCCESS ;; *) error 'Niet afgehandelde keuze.' NOERROR=true exit $ERROR ;; esac } function process_menu1_choice1 { TITLE="${MENU1_ACTIONS[1]}" EXEC=( [1]="${MENU2_ACTIONS[3]}#${MENU2_COMMANDS[3]}" "${MENU2_ACTIONS[7]}#${MENU2_COMMANDS[7]}" "${MENU2_ACTIONS[1]}#${MENU2_COMMANDS[1]}" ) process_commands } function process_menu1_choice2 { TITLE="${MENU1_ACTIONS[2]}" TEXT=' Volg de stappen zoals beschreven in Checklist installatie, hoofdstuk 2. Deze checklist is te vinden: - in de Persoonlijke map / kz-data - in de map /usr/share/doc/kz - op de site https://karelzimmer.nl, onder Linux Komt globaal neer op: 1. Download een beeldbestand (.iso). 2. Maak een opstartbare Live USB-stick of DVD aan. 3. Start de computer op vanaf deze USB-stick of DVD. 4. Installeer Linux.' info "$TEXT" if ! $OPTION_GUI; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' fi } function process_menu1_choice3 { TITLE="${MENU1_ACTIONS[3]}" if [[ ($HOSTNAME = pc-van-soe && $USER = soe ) || ($HOSTNAME = pc-van-hugo && $USER = hugo) ]]; then EXEC=( [1]="${MENU2_ACTIONS[4]}#${MENU2_COMMANDS[4]}" "${MENU2_ACTIONS[2]}#${MENU2_COMMANDS[2]}" ) else EXEC=( [1]="${MENU2_ACTIONS[2]}#${MENU2_COMMANDS[2]}" ) fi process_commands } function process_menu1_choice4 { TITLE="${MENU1_ACTIONS[4]}" EXEC=( [1]="${MENU2_ACTIONS[5]}#${MENU2_COMMANDS[5]}" "${MENU2_ACTIONS[6]}#${MENU2_COMMANDS[6]}" ) process_commands } function process_menu2 { if $OPTION_GUI; then process_menu2_gui else process_menu2_tui fi } function process_menu2_gui { local -i zenity_rc=0 while true; do TITLE=$MENU2_TITLE REPLY=$( zenity --list \ --radiolist \ --width 480 \ --height 280 \ --title "$TITLE" \ --text 'Selecteer een keuze:' \ --ok-label 'Verder' \ --cancel-label 'Terug' \ --column 'Keuze' \ --column 'Nr.' \ --column 'Actie' \ --column 'Opdracht' \ TRUE 1 "${MENU2_ACTIONS[1]}" "${MENU2_COMMANDS[1]}" \ FALSE 2 "${MENU2_ACTIONS[2]}" "${MENU2_COMMANDS[2]}" \ FALSE 3 "${MENU2_ACTIONS[3]}" "${MENU2_COMMANDS[3]}" \ FALSE 4 "${MENU2_ACTIONS[4]}" "${MENU2_COMMANDS[4]}" \ FALSE 5 "${MENU2_ACTIONS[5]}" "${MENU2_COMMANDS[5]}" \ FALSE 6 "${MENU2_ACTIONS[6]}" "${MENU2_COMMANDS[6]}" \ FALSE 7 "${MENU2_ACTIONS[7]}" "${MENU2_COMMANDS[7]}" \ 2> >($LOGCMD) ) || zenity_rc=$? if [[ $zenity_rc -ne 0 ]]; then break fi process_menu2_choice done } function process_menu2_tui { local action='' local exit_menu2=false while true; do # Toon menu. clear -x info "$MENU2_HEAD " for action in "${!MENU2_ACTIONS[@]}"; do printf '%2s. %-29.29s - %s\n' \ "$action" \ "${MENU2_ACTIONS[$action]}" \ "${MENU2_COMMANDS[$action]}" done info while true; do read -rp "Voer uit nummer [1-$MENU2_LINES]: " case $REPLY in *[^[:digit:]]*) printf '%s' "${REWRITE_LINE}" continue ;; *) if [[ $REPLY -ge 1 && $REPLY -le $MENU2_LINES ]] \ 2> /dev/null; then break else printf '%s' "${REWRITE_LINE}" continue fi ;; esac done process_menu2_choice if $exit_menu2; then break fi if $EXECUTE_COMMAND; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' fi EXECUTE_COMMAND=false done } function process_menu2_choice { if [[ $REPLY -ge 1 && $REPLY -le 7 ]]; then TITLE="${MENU2_ACTIONS[$REPLY]}" EXEC=( [1]="${MENU2_ACTIONS[$REPLY]}#${MENU2_COMMANDS[$REPLY]}" ) process_commands elif [[ $REPLY -eq 8 ]]; then exit_menu2=true else error 'Niet afgehandelde keuze.' NOERROR=true exit $ERROR fi } function process_commands { local action='' local command='' local -i exec=0 show_commands_before_execution if $EXECUTE_COMMAND; then check_backup_restore for exec in "${!EXEC[@]}"; do action=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=1 ) command=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=2 ) execute_command done fi if $EXECUTE_COMMAND; then show_commands_after_execution fi } function show_commands_before_execution { local action='' local command='' local -i exec=0 local prompt='' TEXT=" Het volgende wordt uitgevoerd: " for exec in "${!EXEC[@]}"; do action=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=1 ) command=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=2 ) TEXT+=" $exec. $action ($command)" done prompt=' Doorgaan?' if $OPTION_GUI; then TEXT+=" $prompt" if zenity --question \ --no-markup \ --width 400 \ --height 100 \ --title "$TITLE" \ --text "$TEXT" \ --ok-label 'Ja' \ --cancel-label 'Nee' 2> >($LOGCMD); then EXECUTE_COMMAND=true else EXECUTE_COMMAND=false fi else info " $TEXT" while true; do read -rp "$prompt [J/n]: " case $REPLY in j*|J*|'') EXECUTE_COMMAND=true break ;; n*|N*) EXECUTE_COMMAND=false break ;; *) printf '%s' "${REWRITE_LINE}" continue ;; esac done fi } function check_backup_restore { if [[ $TITLE = "${MENU1_ACTIONS[1]}" || $TITLE = "${MENU2_ACTIONS[1]}" ]] then TEXT=' Zorg dat het USB-medium is aangekoppeld waarop de back-up wordt geplaatst.' warning "$TEXT" elif [[ $TITLE = "${MENU1_ACTIONS[4]}" || $TITLE = "${MENU2_ACTIONS[5]}" ]] then TEXT=' Zorg dat het USB-medium is aangekoppeld waarop de back-up staat.' warning "$TEXT" fi } function execute_command { local -i cmd_rc=0 local exec='' local gui_option='' local prompt='' exec=${command/kz /kz-} cmd=$( printf '%s' "$exec" | cut --delimiter=' ' --fields=1 ) arg=$( printf '%s' "$exec" | cut --delimiter=' ' --fields=2- --only-delimited ) if $OPTION_GUI; then gui_option='--gui' fi "$PROGRAM_PATH/$cmd" "$arg" $gui_option -- || cmd_rc=$? log "$command: rc=$cmd_rc" } function show_commands_after_execution { local action='' local command='' local -i exec=0 local prompt='' TEXT=" Het volgende is uitgevoerd: " for exec in "${!EXEC[@]}"; do action=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=1 ) command=$( printf '%s' "${EXEC[$exec]}" | cut --delimiter='#' --fields=2 ) TEXT+=" $exec. $action ($command)" done info " $TEXT" } function term_script { exit $SUCCESS } ############################################################################### # Script ############################################################################### function main { init_script "$@" check_input "$@" process_input term_script } main "$@"