#!/bin/bash # shellcheck source=kzcommon.sh # ----------------------------------------------------------------------------- # Installatiemenu. # # Geschreven door Karel Zimmer . # # Auteursrecht (c) 2015-2021 Karel Zimmer. # GNU Algemene Publieke Licentie . # # RelNum=35.03.13 # RelDat=2021-01-15 # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Global constants # ----------------------------------------------------------------------------- source "$(dirname "$0")"/kzcommon.sh readonly MENU1_TITLE=Installatiemenu readonly MENU1_HEAD="\ ${DASHES:0:58} - $MENU1_TITLE - ${DASHES:0:58}" readonly -a ACTIONS1=( [1]='Installatie voorbereiden' 'Installatie uitvoeren' 'Installatie afronden' 'Gebruiker inrichten' 'Opdrachtenmenu' 'Stoppen' ) readonly -a COMMANDS1=( [1]='Checklist hoofdstuk 1' 'Checklist hoofdstuk 2' 'Checklist hoofdstuk 3' 'Checklist hoofdstuk 4' 'Opdrachten apart uitvoeren' 'Menu verlaten' ) readonly MENU1_LINES=${#ACTIONS1[@]} readonly MENU2_TITLE=Opdrachtenmenu readonly MENU2_HEAD="\ ${DASHES:0:58} - $MENU2_TITLE - ${DASHES:0:58}" readonly -a ACTIONS2=( [1]='Backup maken' 'Apps installeren' 'Apps installeren info' 'Apps verwijderen info' 'Applijst maken' 'Netwerkschijf aankoppelen' 'Backup terugzetten' 'Apps instellen' 'Apps instellen info' 'Apps herstellen info' 'Terug' ) readonly -a COMMANDS2=( [1]='kzbackup' 'kzinstall' 'kzinstall --info' 'kzinstall --remove-info' 'kzlsinstalled' 'kznas' 'kzrestore' 'kzsetup' 'kzsetup --info' 'kzsetup --restore-info' 'Naar vorig menu' ) readonly MENU2_LINES=${#ACTIONS2[@]} # Bij aanpassingen ook .completion aanpassen! readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON readonly USAGE="Gebruik: $PROGNAME $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $PROGNAME [OPTIE...] Installatiemenu. Opties: $OPTIONS_HELP_COMMON" # ----------------------------------------------------------------------------- # Global variables # ----------------------------------------------------------------------------- declare -a COMMAND_RESULT='' declare -a EXEC='' declare COMMANDS_EXECUTED=false declare -i NUMBER_OF_COMMANDS=0 declare ZENITY_TITLE='' # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- check_input() { local -i getopt_rc=0 local parsed='' parsed=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$PROGNAME" \ -- "$@" ) || getopt_rc=$? if [[ $getopt_rc -ne 0 ]]; then printf '%s\n' "$USAGELINE" >&2 QUIET=true exit $ERROR fi eval set -- "$parsed" process_general_options "$@" while true; do case $1 in --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then printf "$PROGNAME: %s\n%s\n" 'geen argumenten opgeven' "$USAGELINE" >&2 QUIET=true exit $ERROR fi check_user } process_input() { if $OPTION_GUI; then process_menu1_gui else process_menu1_tui fi } process_menu1_gui() { local -i zenity_rc=0 while true; do ZENITY_TITLE=$MENU1_TITLE # Constructie '2> >($LOGCMD)' om stderr naar de log te krijgen. # Voorbeeld: Unable to init server: Kon niet verbinden: # Verbinding is geweigerd # en: (zenity:47712): Gtk-WARNING **: 10:35:49.339: # cannot open display: REPLY=$( zenity --list \ --radiolist \ --width 510 \ --height 230 \ --title "$ZENITY_TITLE" \ --text 'Selecteer een keuze:' \ --ok-label 'Verder' \ --cancel-label 'Afsluiten' \ --column 'Keuze' \ --column 'Nr.' \ --column 'Actie' \ --column 'Toelichting' \ TRUE 1 "${ACTIONS1[1]}" "${COMMANDS1[1]}" \ FALSE 2 "${ACTIONS1[2]}" "${COMMANDS1[2]}" \ FALSE 3 "${ACTIONS1[3]}" "${COMMANDS1[3]}" \ FALSE 4 "${ACTIONS1[4]}" "${COMMANDS1[4]}" \ FALSE 5 "${ACTIONS1[5]}" "${COMMANDS1[5]}" \ 2> >($LOGCMD) ) || zenity_rc=$? if [[ $zenity_rc -ne 0 ]]; then QUIET=true exit $SUCCESS fi process_menu1_choice done } process_menu1_tui() { local action1='' while true; do # Toon menu. clear -x printf "%s\n\n" "$MENU1_HEAD" for action1 in "${!ACTIONS1[@]}"; do printf "%2s. %-25.25s - %-26.26s\n" "$action1" \ "${ACTIONS1[$action1]}" "${COMMANDS1[$action1]}" done printf '\n' while true; do read -rp "Voer uit nummer [1-$((MENU1_LINES-1)), $MENU1_LINES]: " \ < /dev/tty case $REPLY in *[^[:digit:]]*) printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue ;; *) if [[ $REPLY -ge 1 && $REPLY -le $MENU1_LINES ]] \ &> /dev/null; then break else printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue fi ;; esac done process_menu1_choice if $COMMANDS_EXECUTED; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' < /dev/tty fi COMMANDS_EXECUTED=false done } 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) info 'Gestopt.' QUIET=true exit $SUCCESS ;; esac } process_menu1_choice1() { warning ' Zorg dat het medium is aangekoppeld waarop de backup wordt geplaatst.' ZENITY_TITLE="${ACTIONS1[1]}" EXEC=( [1]="${ACTIONS2[5]}#${COMMANDS2[5]}" "${ACTIONS2[1]}#${COMMANDS2[1]}" ) process_commands } process_menu1_choice2() { local text=' Volg de stappen zoals beschreven in Checklist installatie, hoofdstuk 2. Deze Checklist is te vinden op de site karelzimmer.nl onder Linux. Komt globaal neer op: 1. Download een beeldbestand (.iso) vanaf nl.releases.ubuntu.com. 2. Maak een opstartbare Ubuntu Live USB-stick of DVD aan. 3. Start de computer op vanaf deze USB-stick of DVD. 4. Installeer Ubuntu.' ZENITY_TITLE="${ACTIONS1[2]}" info "$text" if ! $OPTION_GUI; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' < /dev/tty fi } process_menu1_choice3() { warning ' Zorg dat het medium is aangekoppeld waarop de backup staat.' ZENITY_TITLE="${ACTIONS1[3]}" case $HOSTNAME in hugo*|soe*) EXEC=( [1]="${ACTIONS2[6]}#${COMMANDS2[6]}" "${ACTIONS2[7]}#${COMMANDS2[7]}" "${ACTIONS2[2]}#${COMMANDS2[2]}" "${ACTIONS2[3]}#${COMMANDS2[3]}" ) ;; *) EXEC=( [1]="${ACTIONS2[7]}#${COMMANDS2[7]}" "${ACTIONS2[2]}#${COMMANDS2[2]}" "${ACTIONS2[3]}#${COMMANDS2[3]}" ) ;; esac process_commands } process_menu1_choice4() { ZENITY_TITLE="${ACTIONS1[4]}" EXEC=( [1]="${ACTIONS2[8]}#${COMMANDS2[8]}" "${ACTIONS2[9]}#${COMMANDS2[9]}" ) process_commands } process_menu2() { if $OPTION_GUI; then process_menu2_gui else process_menu2_tui fi } process_menu2_gui() { local -i zenity_rc=0 while true; do ZENITY_TITLE=$MENU2_TITLE REPLY=$( zenity --list \ --radiolist \ --width 510 \ --height 340 \ --title "$ZENITY_TITLE" \ --text 'Selecteer een keuze:' \ --ok-label 'Verder' \ --cancel-label 'Terug' \ --column 'Keuze' \ --column 'Nr.' \ --column 'Actie' \ --column 'Opdracht' \ TRUE 1 "${ACTIONS2[1]}" "${COMMANDS2[1]}" \ FALSE 2 "${ACTIONS2[2]}" "${COMMANDS2[2]}" \ FALSE 3 "${ACTIONS2[3]}" "${COMMANDS2[3]}" \ FALSE 4 "${ACTIONS2[4]}" "${COMMANDS2[4]}" \ FALSE 5 "${ACTIONS2[5]}" "${COMMANDS2[5]}" \ FALSE 6 "${ACTIONS2[6]}" "${COMMANDS2[6]}" \ FALSE 7 "${ACTIONS2[7]}" "${COMMANDS2[7]}" \ FALSE 8 "${ACTIONS2[8]}" "${COMMANDS2[8]}" \ FALSE 9 "${ACTIONS2[9]}" "${COMMANDS2[9]}" \ FALSE 10 "${ACTIONS2[10]}" "${COMMANDS2[10]}" \ 2> >($LOGCMD) ) || zenity_rc=$? if [[ $zenity_rc -ne 0 ]]; then break fi process_menu2_choice done } process_menu2_tui() { local action2='' local exit_menu2=false while true; do # Toon menu. clear -x printf "%s\n\n" "$MENU2_HEAD" for action2 in "${!ACTIONS2[@]}"; do printf "%2s. %-25.25s - %-23.23s\n" "$action2" \ "${ACTIONS2[$action2]}" "${COMMANDS2[$action2]}" done printf '\n' while true; do read -rp "Voer uit nummer [1-$((MENU2_LINES-1)), $MENU2_LINES]: " \ < /dev/tty case $REPLY in *[^[:digit:]]*) printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue ;; *) if [[ $REPLY -ge 1 && $REPLY -le $MENU2_LINES ]] \ 2> /dev/null; then break else printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue fi ;; esac done process_menu2_choice if $exit_menu2; then break fi if $COMMANDS_EXECUTED; then read -rp ' Druk op de Enter-toets voor het menu [Enter]: ' < /dev/tty fi COMMANDS_EXECUTED=false done } process_menu2_choice() { case $REPLY in 1) local text=' Zorg dat het medium is aangekoppeld waarop de backup wordt geplaatst.' warning "$text" ZENITY_TITLE="${ACTIONS2[1]}" EXEC=( [1]="${ACTIONS2[1]}#${COMMANDS2[1]}" ) process_commands ;; 2) ZENITY_TITLE="${ACTIONS2[2]}" EXEC=( [1]="${ACTIONS2[2]}#${COMMANDS2[2]}" ) process_commands ;; 3) ZENITY_TITLE="${ACTIONS2[3]}" EXEC=( [1]="${ACTIONS2[3]}#${COMMANDS2[3]}" ) process_commands ;; 4) ZENITY_TITLE="${ACTIONS2[4]}" EXEC=( [1]="${ACTIONS2[4]}#${COMMANDS2[4]}" ) process_commands ;; 5) ZENITY_TITLE="${ACTIONS2[5]}" EXEC=( [1]="${ACTIONS2[5]}#${COMMANDS2[5]}" ) process_commands ;; 6) ZENITY_TITLE="${ACTIONS2[6]}" EXEC=( [1]="${ACTIONS2[6]}#${COMMANDS2[6]}" ) process_commands ;; 7) ZENITY_TITLE="${ACTIONS2[7]}" local text=' Zorg dat het medium is aangekoppeld waarop de backup staat.' warning "$text" EXEC=( [1]="${ACTIONS2[7]}#${COMMANDS2[7]}" ) process_commands ;; 8) ZENITY_TITLE="${ACTIONS2[8]}" EXEC=( [1]="${ACTIONS2[8]}#${COMMANDS2[8]}" ) process_commands ;; 9) ZENITY_TITLE="${ACTIONS2[9]}" EXEC=( [1]="${ACTIONS2[9]}#${COMMANDS2[9]}" ) process_commands ;; 10) ZENITY_TITLE="${ACTIONS2[10]}" EXEC=( [1]="${ACTIONS2[10]}#${COMMANDS2[10]}" ) process_commands ;; 11) exit_menu2=true ;; esac } process_commands() { local -i exec=0 local action='' local command='' NUMBER_OF_COMMANDS=${#EXEC[@]} if [[ $NUMBER_OF_COMMANDS -eq 1 ]]; then COMMANDS_EXECUTED=true else show_commands_before_execution fi if $COMMANDS_EXECUTED; then for exec in "${!EXEC[@]}"; do action=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $1}') command=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $2}') execute_command done fi if $COMMANDS_EXECUTED && [[ $NUMBER_OF_COMMANDS -gt 1 ]]; then show_commands_after_execution fi } show_commands_before_execution() { local prompt='' local -i exec=0 local action='' local command='' local text='' text=" De volgende $NUMBER_OF_COMMANDS acties worden achter elkaar uitgevoerd: " for exec in "${!EXEC[@]}"; do action=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $1}') command=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $2}') text=$text" $exec. $action" done prompt='Doorgaan en deze acties uitvoeren?' if $OPTION_GUI; then text=$text" $prompt" if zenity --question \ --no-markup \ --width 400 \ --height 100 \ --title "$ZENITY_TITLE" \ --text "$text" \ --ok-label 'Ja' \ --cancel-label 'Nee' \ 2> >($LOGCMD); then COMMANDS_EXECUTED=true else COMMANDS_EXECUTED=false fi else printf '%b\n' "$text" while true; do read -rp "$prompt [J/n]: " < /dev/tty case $REPLY in j*|J*|'') COMMANDS_EXECUTED=true break ;; n*|N*) COMMANDS_EXECUTED=false break ;; *) printf '%b' "${UP_ONE_LINE}${ERASE_LINE}" continue ;; esac done fi } execute_command() { local -i cmd_rc=0 case $command in kzbackup|kzinstall|kzlsinstalled|kznas|kzrestore) # Zogenaamde sudo-scripts. if $OPTION_GUI; then pkexec "$PROGDIR/$command" --gui -- || cmd_rc=$? check_rc $? else sudo "$command" -- || cmd_rc=$? check_rc $cmd_rc fi ;; kzsetup|*-info) # Zogenaamde non-sudo-scripts. # shellcheck disable=SC2086 if $OPTION_GUI; then "$PROGDIR"/$command --gui -- || cmd_rc=$? check_rc $cmd_rc else "$PROGDIR"/$command -- || cmd_rc=$? check_rc $cmd_rc fi ;; *) warning "Niet af te handelen opdracht: $command" check_rc $ERROR ;; esac } check_rc() { local rc=${1:-rc?} case $rc in $SUCCESS) COMMAND_RESULT[$exec]=$STATUS_SUCCESS ;; $WARNING) COMMAND_RESULT[$exec]=$STATUS_WARNING ;; *) COMMAND_RESULT[$exec]=$STATUS_ERROR ;; esac } show_commands_after_execution() { local action='' local command='' local -i exec=0 local prompt='' local temp_text_file='' temp_text_file=$(mktemp -t "$PROGNAME-XXXXXXXXXX.txt") printf '\n%s\n\n' "De volgende $NUMBER_OF_COMMANDS acties zijn \ uitgevoerd:" > "$temp_text_file" for exec in "${!EXEC[@]}"; do action=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $1}') command=$(printf '%s' "${EXEC[$exec]}" | awk -F# '{print $2}') cmd_result=${COMMAND_RESULT[$exec]} printf "%2d. %-25s %s\n" "$exec" "$action" "$cmd_result" >> \ "$temp_text_file" done if $OPTION_GUI; then remove_non_printables "$temp_text_file" if ! zenity --text-info \ --width 400 \ --height 200 \ --title "$ZENITY_TITLE" \ --filename "$temp_text_file" \ --font 'Ubuntu Mono 12' \ --ok-label 'Oké' \ --cancel-label 'Annuleren' \ 2> >($LOGCMD); then true fi else cat "$temp_text_file" fi rm "$temp_text_file" } term_script() { exit $SUCCESS } # ----------------------------------------------------------------------------- # Main line # ----------------------------------------------------------------------------- main() { init_script check_input "$@" process_input term_script } main "$@" # EOF