--- /dev/null
+RescueSys v1.0 - Hilfe
+======================
+
+RescueSys kann Inhalte von Laufwerken eines Computers sichern und wiederher-
+stellen. Das Backup der Daten wird auf einen Server im lokalen Netzwerk gespei-
+chert und von diesem - nach Bedarf - wiederhergestellt.
+
+Steuerung
+---------
+
+Die Steuerung funktioniert komplett über die Tastatur (Pfeil-/Bildlauftasten,
+Tabulator-, Space-, Enter-/Escape-Taste sowie F1). Um die Einträge in einem
+Menü zu wechseln, muss die Pfeil-Oben-/Pfeil-Unten-Taste genutzt werden. Um
+Dialoge zu bestätigen (OK, Weiter) oder abzulehnen (Abbrechen, Zurück) müssen
+die Pfeil-Links-/-Rechts-Tasten zusammen mit Enter oder Escape genutzt werden.
+Um Einträge aus- oder abzuwählen, drücken Sie die Leertaste. Für das Blättern
+eines Textes in einem Dialog können die Pfeiltasten oder die Bildlauftasten
+(Bild-Auf/Bild-Ab) genutzt werden. Für die Anzeige dieser Hilfe drücken Sie F1.
+
+In der Kopfzeile wird angezeigt, in wecher der nachfolgenden Funktionen man ist.
+
+Hauptmenü
+---------
+
+Das Hauptmenü ist in der Regel der erste Dialog den man sehen kann. Er führt zu
+den Funktionen, die bei Auswahl aktiv werden. Nach Beendigung jeder Funktion,
+kehrt man in der Regel zum Hauptmenü zurück.
+
+Funktion "Einstellungen"
+------------------------
+
+Gibt es noch keine Einstellungen, wird RescueSys Sie aufrufen, diese einzugeben.
+Erfolgen falsche Eingaben, macht RescueSys Sie daruf aufmerksam. Gibt es bereits
+aufgenommene Eingaben, erscheinen diese und müssen nur noch bestätigt werden.
+Alle Einstellungen bleiben nach Beenden von RescueSys erhalten.
+
+Es gibt folgende Einstellungspunkte:
+
+ - Benutzername: ist das der Name des Benutzers bzw. des Kontos im Windows Netz-
+ werk. Beispiel: mustermann.max
+
+ - Passwort: ist das Passwort des Benutzers bzw. des Kontos im Windows Netzwerk.
+ Beachten Sie: das Passwort muss jedes mal eingegeben werden!
+
+ - Netzlaufwerk: Pfad des Speicherortes im Windows Netzwerk. Er besteht aus
+ \\server\kompletter\pfad und kann statt des Servernamens auch eine IP-Adresse
+ enthalten.
+
+ - Datenträger: Auswahl der zu sichernden Laufwerke des Computers. Die ausge-
+ wählten Laufwerke können auch inspiziert werden. Dabei wird eine Liste von
+ Details über das Laufwerk und seine Partitionen ausgegeben.
+ Beachten Sie: die Sicherung kann nur ganze Laufwerke enthalten!
+
+ - Laufwerksbereinigung: diese Option führt in der Regel zu deutlich kleineren
+ Sicherungsdateien und einer Verringerung der Sicherungszeit. Da die Option
+ nicht ungefährlich ist, sollte
+ 1. ein Backup ohne die Option erfolgt sein
+ 2. der Computer nicht im Ruhezustand (Hibernation) sein.
+ ACHTUNG: die Option kann zu Datenverlust führen!
+
+ - Autom. Herunterfahren: ist eine Sicherung oder Wiederherstellung erfolgt,
+ kann mit dieser Option der Computer automatisch ausgeschaltet werden.
+
+Funktion "Übersicht"
+--------------------
+
+Mit dieser Funktion können die Einstellungen angezeigt werden. Jeder Einstel-
+lungspunkt wird mit seinem entsprechenden Wert angezeigt. Die Einstellungen
+können hier nicht verändert werden.
+
+Funktion "Beenden"
+------------------
+
+Diese Funktion fährt den Computer herunter.
+
+Funktion "Sichern"
+------------------
+
+Mit "Sichern" führen Sie eine Sicherung der Laufwerke des Computers durch. Dabei
+werden die Einstellungen benutzt, die vorher getätigt wurden. Um eine Sicherung
+durchzuführen, muss der Sicherheitsdialog bestätigt werden.
+
+Je nach Einstellung erfolgt eine Bereinigung der Laufwerke, die Sicherung in
+Backupdateien und eine Überprüfung dieser.
+
+Beachten Sie: von jedem eingestellten Laufwerk wird nur eine Sicherung
+erstellt, d.h. ältere Sicherungen werden nach Erfolg dieser Funktion gelöscht.
+Die Sicherung kann viele Stunden Zeit in Anspruch nehmen. Der Computer wird gem.
+der Einstellungen ausgeschaltet.
+
+Funktion "Wiederherstellen"
+---------------------------
+
+Durch "Wiederherstellen" stellen Sie die Laufwerke aus der Sicherung wieder her.
+Sie müssen die Laufwerke auswählen, die Sie wiederhergestellt haben wollen. Die
+Auswahl zeigt den Laufwerknamen und den Zeitpunkt der Erstellung an.
+
+Nach einer erfolgreichen Wiederherstellung, werden die Partitionen des Laufwerke
+für eine Überprüfung markiert. Das betrift die Partitionen mit dem Dateisystem
+NTFS und EXT2/3/4. So werden diese beim Start des normalen Betriebssystems auto-
+matisch überprüft.
+
+ACHTUNG: mit der Wiederherstellung werden die Daten der ausgewählten Laufwerke
+unwiederbringlich überschrieben!
+
+Beachten Sie: die Wiederherstellung kann viele Minuten Zeit in Anspruch nehmen.
+Der Computer wird gem. der Einstellungen ausgeschaltet. Es ist empfohlen, FAT-
+-Partitionen manuell nach der Wiederherstellung zu überprüfen, da hierfür keine
+automatische Überprüfung beim Start des normalen Betriebssystems eingerichtet
+werden kann.
+
+Änderungshistorie
+-----------------
+
+v1.0 Initiale Version
+
+Lizenz
+------
+
+RescueSys V1.0 - Ein System zum Sichern und Wiederherstellen von Laufwerken
+Copyright (C) 2015 Dragan Isaković-Kutz
+
+Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU
+General Public License, wie von der Free Software Foundation veröffentlicht,
+weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
+(nach Ihrer Option) jeder späteren Version.
+
+Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von
+Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite
+Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.
+Details finden Sie in der GNU General Public License.
+
+Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem
+Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
--- /dev/null
+#!/bin/bash
+#
+# Main RescueSys shell script.
+#
+
+LOGFILE=/tmp/rescuesys.log
+exec 3>$LOGFILE
+BASH_XTRACEFD=3
+set -x
+
+# constants
+DIALOG_OK=0
+DIALOG_CANCEL=1
+DIALOG_HELP=2
+DIALOG_EXTRA=3
+DIALOG_ITEM_HELP=4
+DIALOG_ERROR=-1
+SETTINGS_DONE=0
+OUT=/tmp/output_file
+PROGRESS_FILE=/tmp/progress
+MNT_DIR=/mnt
+SETTINGS_FILE=$HOME/rescuesys.settings
+INSP_DIR=$HOME/mnt
+ERROR_FILE=/tmp/error
+FIFO=$HOME/fifo
+USB_PART=/dev/backup
+
+# variables
+mode=""
+user=""
+interface=""
+pass=""
+domain=""
+store_path=""
+backup_choice=""
+cleanup=""
+auto_down=""
+
+# welcome dialog: shows first message to the user
+welcome()
+{
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü " --title " Willkommen " --colors --ok-label "Weiter"\
+ --hfile help.txt --exit-label "Schließen" --msgbox "\nRescueSys hat entdeckt, dass Sie noch nie eine Sicherung"`
+ `" durchgeführt haben. Daher müssen Sie zunächst notwendige Einstellungen vornehmen.\n\nDiese Daten werden gespeichert"`
+ `" und beim nächsten Start von RescueSys benutzt." 12 60
+}
+
+# backup/restore dialog: input mask for backup/restore mode
+br_mode()
+{
+ # preset dialog
+ local usb_switch=off
+ local net_switch=on
+ if [ "$mode" = "USB" ]; then
+ usb_switch=on
+ net_switch=off
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Modus "\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --radiolist "Im welchen Modus wollen Sie die Sicherung und"`
+ `" Wiederherstellung vornehmen?" 10 60 2\
+ USB "USB-Laufwerk" $usb_switch\
+ Netzwerk "Netzlaufwerk" $net_switch 2>$OUT
+
+ mode="$(cat $OUT)"
+}
+
+# USB drive dialog: waits on plugging in USB drive and confirmation
+detect_drive()
+{
+ # flush data in fifo
+ dd if=$FIFO iflag=nonblock &> /dev/null
+
+ # show 1st dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --title " USB-Laufwerk "\
+ --hfile help.txt --colors --nocancel --nook --infobox "Stecken Sie das USB-Laufwerk, auf dem die Sicherung erfolgen"`
+ `" soll, jetzt ein.\n\nIst das Laufwerk schon eingesteckt, dann entfernen Sie es und stecken es wieder ein." 8 50
+
+ # wait on udev message
+ cat $FIFO &> /dev/null
+
+ # mount USB drive
+ sudo mount -o ro $USB_PART $INSP_DIR &> /dev/null
+ # TODO: error handling
+
+ # examine USB drive
+ local size=$(lsblk -nl $USB_PART | sed 's/\ */ /g' | cut -f 4 -d ' ')
+ local free=$(df -h | grep $INSP_DIR | sed 's/\ */ /g' | cut -f 4 -d ' ')
+ local text="Soll Laufwerk\n\n $USB_PART (1. Partition)\n Größe $size, frei $free\n\nverwendet werden?"
+
+ # umount USB drive
+ sudo umount $INSP_DIR &> /dev/null
+
+ # show 2nd dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " USB-Laufwerk "\
+ --hfile help.txt --colors --yes-label "Ja" --no-label "Nein" --yesno "$text" 10 40 2>$OUT
+
+ # examine result
+ local resp=$?
+ case $resp in
+ $DIALOG_OK)
+ return 0
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+# username dialog: input mask for username
+username()
+{
+ # preset dialog
+ local init=""
+ if ! [ "$user" = "" ]; then
+ init="$user"
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Benutzername "\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --inputbox "Geben Sie ihren Benutzernamen ein (falls leer"`
+ `" wird \"guest\" verwendet):" 9 50 $init 2>$OUT
+
+ user="$(cat $OUT)"
+ if [ -z $user ]; then
+ user="guest"
+ fi
+}
+
+# password dialog: input mask for password
+password()
+{
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Passwort "\
+ --hfile help.txt --colors --nocancel --insecure --ok-label "Weiter" --passwordbox "Geben Sie ihr Passwort ein (falls"`
+ `" leer wird \"guest\" verwendet):" 9 50 2>$OUT
+
+ pass="$(cat $OUT)"
+ if [ -z $pass ]; then
+ pass="guest"
+ fi
+}
+
+# domain dialog: input mask for domain
+dom()
+{
+ # preset dialog
+ local init=""
+ if ! [ "$domain" = "" ]; then
+ init="$domain"
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Domäne "\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --inputbox "Geben Sie den Domänennamen ein (falls leer wird"`
+ `" \"workgroup\" verwendet):" 9 50 $init 2>$OUT
+
+ domain="$(cat $OUT)"
+ if [ -z $domain ]; then
+ domain="workgroup"
+ fi
+}
+
+# interface dialog
+interface()
+{
+ # find devices
+ local IFS_saved=$IFS;
+ IFS=$'\n'
+ local devs=($(cat /proc/net/dev | grep -F ':' | tr -d ' ' | sed 's/:.*//g'))
+ IFS=$IFS_saved
+ local list=( )
+
+ # remove lo interface from array
+ for i in $(seq 0 $((${#devs[@]}-1))); do
+ if [ "${devs[$i]}" = "lo" ]; then
+ unset devs[$i]
+ else
+ list=(${list[@]} ${devs[$i]} ${devs[$i]} on)
+ fi
+ done
+
+ # show dialog
+ eval dialog --backtitle "\"RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen\"" --title "\" Netzwerkgerät \""\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --radiolist "\"Welches Netzwerkgerät soll verwendet werden?\""\
+ 10 50 5 ${list[@]} 2>$OUT
+
+ interface="$(cat $OUT)"
+
+ local type=
+ case $(cat /sys/class/net/$interface/type) in
+ 1)
+ if [ -d /sys/class/net/$interface/wireless ] || [ -L /sys/class/net/$interface/phy80211 ]; then
+ type=wlan
+ else
+ type=lan
+ fi
+ ;;
+ *)
+ echo "TODO: kein eth Netzwerkgerät gefunden"
+ read
+ ;;
+ esac
+
+ # switch off all interfaces
+ sudo ifdown -a &>/dev/null
+
+ # enter interface in /etc/network/interfaces
+ cat <<EOF > /tmp/interfaces
+# Created by rescuesys.sh
+
+auto lo
+iface lo inet loopback
+
+auto $interface
+iface $interface inet dhcp
+EOF
+
+ # handle a wireless interface by showing a dialog...
+ if [ "$type" = "wlan" ]; then
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " WPA Einstellungen "\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --form "Tragen Sie die Zugangsdaten ihres WPA/WPA2"`
+ `" Netzwerks ein:" 11 50 3\
+ "Name (SSID):" 1 1 "" 1 18 26 0\
+ "Schlüssel (PSK):" 2 1 "" 2 18 26 0\
+ "IP-Adresse:" 3 1 "(über DHCP)" 3 18 0 26 2>$OUT
+
+ # reading the settings...
+ local -a wlan_settings
+ while read -r line; do
+ wlan_settings=(${wlan_settings[@]} $line)
+ done < $OUT
+
+ # writing wpa_supplicant.conf...
+ sudo sed -e "s/\tssid=.*/\tssid=\"${wlan_settings[0]}\"/" -e "s/psk=.*/psk=\"${wlan_settings[1]}\"/"\
+ -i /etc/wpa_supplicant/wpa_supplicant.conf &> /dev/null
+
+ # and writing interfaces
+ echo -e "\twpa-conf /etc/wpa_supplicant/wpa_supplicant.conf" >> /tmp/interfaces
+ fi
+
+ sudo bash -c "cat /tmp/interfaces > /etc/network/interfaces"
+ rm /tmp/interfaces
+
+ # switch on all interfaces
+ sudo ifup -a &>/dev/null
+}
+
+# shutdown option dialog: sets shutdown as option for a backup process
+shutdown_option()
+{
+ # preset dialog
+ local init=yes
+ if [ "$auto_down" = "nein" ]; then
+ init=no
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Automatisches Herunterfahren "\
+ --colors --yes-label "Ja" --no-label "Nein" --hfile help.txt --exit-label "Schließen" --default-button $init\
+ --yesno "\nSoll der Computer nach einer Sicherung oder Wiederhestellung automatisch heruntergefahren werden?"\
+ 9 40 2>$OUT
+
+ # examine result
+ local resp=$?
+ case $resp in
+ $DIALOG_OK)
+ auto_down="ja"
+ ;;
+ $DIALOG_CANCEL)
+ auto_down="nein"
+ ;;
+ *)
+ auto_down="nein"
+ ;;
+ esac
+
+ # store settings
+ save_settings
+}
+
+# cleanup dialog: sets the cleanup method for file systems (zerofree etc.)
+cleanup_method()
+{
+ # preset dialog
+ local init=no
+ if [ "$cleanup" = "ja" ]; then
+ init=yes
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Laufwerksbereinigung "\
+ --colors --yes-label "Ja" --no-label "Nein" --hfile help.txt --exit-label "Schließen" --default-button $init\
+ --yesno "\nSoll vor einer Sicherung das Laufwerk bereinigt werden, so das die Sicherungsdatei so klein wie möglich"`
+ `" ausfällt?\n\Z1ACHTUNG: Bei der Wahl dieser Option kann das Laufwerk beschädigt werden, falls des Computer im"`
+ `" Ruhezustand ist!\Zn\nEs ist empfohlen, ein Backup ohne diese Option zu erstellen und erst dann eines mit."\
+ 14 60 2>$OUT
+
+ # examine result
+ local resp=$?
+ case $resp in
+ $DIALOG_OK)
+ cleanup="ja"
+ ;;
+ $DIALOG_CANCEL)
+ cleanup="nein"
+ ;;
+ *)
+ cleanup="nein"
+ ;;
+ esac
+
+ # store settings
+ save_settings
+}
+
+# mounts store/network drive
+mount_store()
+{
+ if [ "$mode" == "USB" ]; then
+ # detect drive
+ detect_drive
+ if [ $? -ne 0 ]; then
+ return 1;
+ fi
+ # mount USB drive
+ sudo mount $store_path $MNT_DIR &> /dev/null
+ else
+ # mount network drive
+ sudo mount -t cifs $(echo $store_path | sed 's/\\/\//g') $MNT_DIR -o\
+ "username=$user,password=$pass,domain=$domain,vers=1.0" &> /dev/null
+ fi
+
+ return $?
+}
+
+# unmount store/network drive
+unmount_store()
+{
+ sudo umount $MNT_DIR &>/dev/null
+}
+
+# no store dialog: error dialog for unmountable network drive
+no_store()
+{
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Fehler " --hfile help.txt\
+ --colors --ok-label "Abbrechen" --exit-label "Schließen" --msgbox "\nLaufwerk konnte nicht eingebunden werden."`
+ `" Bitte Einstellungen überprüfen und erneut versuchen." 9 50
+}
+
+# store dialog: input mask for network drive
+# param 1 is the init mode, setting a value turns it on, off otherwise
+# returns 0 if , 1 otherwise
+store()
+{
+ # prepare mode handling
+ local init=""
+ if [ -z $1 ]; then
+ init="$store_path"
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Netzlaufwerk "\
+ --hfile help.txt --colors --nocancel --ok-label "Weiter" --exit-label "Schließen" --inputbox "Geben Sie den Pfad"`
+ `" komplett an:\n(\\\\server\\kompletter\\pfad)" 9 60 $init 2>$OUT
+
+ # test network drive
+ store_path="$(cat $OUT)"
+ mount_store
+ local res=$?
+ unmount_store
+
+ return $res
+}
+
+# inspect dialog: shows disk and partition details
+# returns 0 if username is not empty, 1 otherwise
+inspect()
+{
+ # string template for inspect file
+ local disk_text="Datenträger: #disk#\n \x20Größe: #size#\n \x20Partitionen: #parts#\n"
+ local part_text="\nPartition: #part#\n \x20Größe: #psize#\n \x20Belegt: #used#\n \x20Dateisystem: #fstype#\n"`
+ `" \x20Bezeichnung: #label#\n \x20Inhalt (Dateien, Verzeichnisse/):\n"
+
+ # fill inspect file with information
+ rm -f /tmp/inspect_file &>/dev/null
+ for disk in $backup_choice; do
+ # write template to file
+ echo -en $disk_text >> /tmp/inspect_file
+
+ # replace placeholder for disk name
+ sed -i "s/#disk#/$disk/" /tmp/inspect_file
+
+ # replace placeholder for disk size
+ local size=$(lsblk -nl -o NAME,SIZE | grep "$disk\W" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ sed -i "s/#size#/$size/" /tmp/inspect_file
+
+ # determine partition names and replace placeholder
+ local parts=$(ls /dev/${disk}* | grep "$disk\w")
+ parts="$(echo $parts | sed -e 's/\ /\\\ /g' -e 's/\/dev\///g')"
+ sed -i "s/#parts#/$parts/" /tmp/inspect_file
+
+ # fill partition details
+ for part in $parts; do
+ # write template to file
+ echo -en $part_text >> /tmp/inspect_file
+
+ # replace placeholder for partition name
+ part="$(echo $part | sed -e 's/\\//g')"
+ sed -i "s/#part#/$part/" /tmp/inspect_file
+
+ # replace placeholder for partition size
+ local psize=$(lsblk -nl -o NAME,SIZE | grep "$part" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ sed -i "s/#psize#/$psize/" /tmp/inspect_file
+
+ # replace placeholder for partition type
+ local fstype=$(sudo lsblk -nl -o NAME,FSTYPE | grep "$part" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ sed -i "s/#fstype#/$fstype/" /tmp/inspect_file
+
+ # replace placeholder for partition label
+ local label="(keine)"
+ local lname=""
+ case $fstype in
+ vfat)
+ lname=$(sudo mlabel -i /dev/$part -s ::)
+ if [ " Volume has no label" = "$lname" ]
+ then
+ :
+ else
+ label="$(echo $lname | cut -f 4 -d ' ')"
+ fi
+ ;;
+ ntfs)
+ lname=$(sudo ntfslabel /dev/$part)
+ if ! [ -z $lname ]; then
+ label="$(echo $lname)"
+ fi
+ ;;
+ ext*)
+ lname=$(sudo tune2fs -l /dev/$part | grep "volume name" | sed "s/\ */ /g" | cut -f 4 -d ' ')
+ if ! [ "<none>" = "$lname" ]; then
+ label="$(echo $lname)"
+ fi
+ ;;
+ esac
+ sed -i "s/#label#/$label/" /tmp/inspect_file
+
+ # mount partition for content inspection
+ sudo mount -o ro /dev/$part $INSP_DIR &>/dev/null
+ # TODO: error handling
+
+ # replace placeholder for partition usage
+ local used="$(df -h | grep $part | sed 's/\ */ /g' | cut -f 4,5 -d ' ')"
+ sed -i "s/#used#/$used/" /tmp/inspect_file
+
+ # determine partition content
+ local IFS_saved=$IFS;
+ IFS=$'\n'
+ local entries=($(ls -F $INSP_DIR))
+ IFS=$IFS_saved
+
+ # write each entry to inspection file
+ for i in $(seq 0 $((${#entries[@]}-1))); do
+ echo " ${entries[$i]}" >> /tmp/inspect_file
+ done
+
+ # unmount partition
+ sudo umount $INSP_DIR &>/dev/null
+ done
+ echo "" >> /tmp/inspect_file
+ done
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen / Inspizieren" --hfile help.txt\
+ --title " Datenträgerdetails " --exit-label "Schließen" --colors --nocancel --exit-label "Zurück"\
+ --textbox /tmp/inspect_file 23 60
+}
+
+# disk choose dialog: lists disks, also for inspection
+# returns 0 if username is not empty, 1 otherwise
+choose()
+{
+ # look for disks
+ local disks=($(lsblk -nl -o NAME,TYPE,SIZE | grep disk | sort | sed 's/\ */ /g' | cut -f 1 -d ' '))
+ local sizes=($(lsblk -nl -o NAME,TYPE,SIZE | grep disk | sort | sed 's/\ */ /g' | cut -f 3 -d ' '))
+ local mount_dev=$(mount | grep 'on / '| cut -f 1 -d ' ')
+ local own_disk=$(echo ${mount_dev##*/} | sed 's/[0-9]*$//')
+ local usb_disk=$(echo ${usb_real_name##*/} | sed 's/[0-9]*$//')
+
+ while true; do
+ unset entries
+ declare -a entries
+ # prepare dialog entries
+ local i=0
+ for disk in ${disks[@]}; do
+ # look for checked entries
+ local checked=off
+ if ! [ -z "$(echo $backup_choice | grep $disk)" ]; then
+ checked=on
+ fi
+ # exclude own disk and USB drive
+ if [ "$disk" = "$own_disk" ] || [ "$disk" = "$usb_disk" ]; then
+ :
+ else
+ local parts=$(ls /dev/${disk}* | wc -l)
+ let 'parts=parts-1'
+ local entries=(${entries[@]} "$disk \"Größe: ${sizes[$i]}, Partitionen: $parts\" $checked")
+ fi
+ let "i=i+1"
+ done
+
+ # show dialog
+ eval dialog --backtitle "\"RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen\"" --exit-label "Schließen"\
+ --title "\" Datenträger \"" --hfile help.txt --colors --nocancel --ok-label "Weiter"\
+ --extra-button --extra-label "Inspizieren" --checklist "\"Wählen Sie einen oder mehrere Datenträger aus, die Sie"`
+ `" sichern wollen - ausgewählte Datenträger können vorher inspiziert werden:\"" 14 50 4 ${entries[@]} 2>$OUT
+
+ # save choice result
+ local res=$?
+ backup_choice="$(cat $OUT)"
+ if [ -z "$backup_choice" ]; then
+ # show error
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Einstellungen" --title " Fehler "\
+ --colors --ok-label "Weiter" --hfile help.txt --exit-label "Schließen" --msgbox "\nBitte wählen Sie"`
+ `" mindestens ein Laufwerk aus." 8 40
+
+ # show dialog again
+ continue
+ fi
+
+ # inspect disk if needed
+ if [ $res -eq $DIALOG_EXTRA ]; then
+ inspect wizz
+
+ # show dialog again
+ continue
+ fi
+
+ # end loop
+ break
+ done
+}
+
+# keeps only recent backups
+# param 1 is the time duration of backup
+clean_backup()
+{
+ # read config
+ local config_file=backup_$user.conf
+ local IFS_saved=$IFS
+ IFS=$'\n'
+ local entries=($(sudo cat $MNT_DIR/$config_file | sort | sed 's/=.*//g' | uniq -c | sed -e '' -e 's/\ */ /g'))
+ IFS=$IFS_saved
+
+ # process each entry
+ for i in $(seq 0 $((${#entries[@]}-1))); do
+ if [ $(echo ${entries[$i]} | cut -f 1 -d ' ') -eq 2 ]; then
+ local disk=$(echo ${entries[$i]} | cut -f 2 -d ' ')
+ local del_line=$(sudo cat $MNT_DIR/$config_file | grep $disk | head -n 1)
+
+ # edit config
+ sudo sed -i "/$del_line/d" $MNT_DIR/$config_file
+ # remove file
+ sudo rm -f $MNT_DIR/$(echo $del_line | sed 's/.*=//g')
+ fi
+ done
+
+ # save duration at least
+ local duration="$(sudo grep duration $MNT_DIR/$config_file)"
+ if [ -z $duration ]; then
+ sudo bash -c "echo \"duration=$(($1/3600))h$((($1%3600)/60))m$(($1%60))s\" >> $MNT_DIR/$config_file"
+ else
+ sudo sed -i "/$duration/d" $MNT_DIR/$config_file
+ sudo bash -c "echo \"duration=$(($1/3600))h$((($1%3600)/60))m$(($1%60))s\" >> $MNT_DIR/$config_file"
+ fi
+}
+
+# cleans up a ext filesystem for better compression and shows busy state
+# param 1 is the current partition
+# param 2 is the amount of all partition for cleaning up
+# param 3 is the partition name
+ext_cleanup()
+{
+ local progress=$((($1-1)*100/$2))
+ echo $progress | dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --colors\
+ --title " Bereinigung $1/$2 " --hfile help.txt --exit-label "Schließen" --gauge "\nBereinigung der EXT2/3/4 Partition"`
+ `" $3 läuft..." 8 56
+
+ # SSD?
+ if [ $(cat /sys/block/${3%3}/queue/rotational) ]; then
+ # mount and use fstrim
+ sudo mount -o ro /dev/$3 $INSP_DIR &>/dev/null
+ sudo fstrim $INSP_DIR &>/dev/null
+ sudo umount $INSP_DIR &>/dev/null
+ else
+ # zerofree partition
+ sudo zerofree /dev/$3 &>/dev/null
+ fi
+ sync &>/dev/null
+}
+
+# cleans up a ntfs filesystem for better compression and shows busy state
+# param 1 is the current partition
+# param 2 is the amount of all partition for cleaning up
+# param 3 is the partition name
+vfat_cleanup()
+{
+ local progress=$((($1-1)*100/$2))
+ echo $progress | dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --colors\
+ --title " Bereinigung $1/$2 " --hfile help.txt --exit-label "Schließen" --gauge "\nBereinigung der FAT Partition $3"`
+ `" läuft..." 8 56
+
+ # mount fs
+ sudo mount /dev/$3 $MNT_DIR &>/dev/null || return 1
+
+ # fill fs with n * 4GiB files and delete them
+ while true; do
+ sudo dd if=/dev/zero of=$MNT_DIR/zero_$(date +%s).tmp bs=512 count=8388607 &>/dev/null || break
+ done
+ sync &>/dev/null
+ sudo rm -f $MNT_DIR/zero_*.tmp
+ sync &>/dev/null
+
+ # unmount fs
+ sudo umount $MNT_DIR &>/dev/null
+}
+
+# cleans up a ntfs filesystem for better compression while showing busy state
+# param 1 is the current partition
+# param 2 is the amount of all partition for cleaning up
+# param 3 is the partition name
+ntfs_cleanup()
+{
+ local progress=$((($1-1)*100/$2))
+ echo $progress | dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --colors\
+ --title " Bereinigung $1/$2 " --hfile help.txt --exit-label "Schließen" --gauge "\nBereinigung der NTFS Partition"`
+ `" $3 läuft..." 8 56
+
+ # ntfswipe partition
+ sudo ntfswipe -a /dev/$3 &>/dev/null
+ sudo ntfsfix /dev/$3 &>/dev/null
+ sync &>/dev/null
+}
+
+# wipes out unneccessary data from file system for better compression
+wipeout()
+{
+ local pcount=0
+ local curr_part=0
+
+ # count partitions, process each disk
+ for disk in $backup_choice; do
+ local parts=$(ls /dev/${disk}* | grep "$disk\w")
+ parts="$(echo $parts | sed 's/\/dev\///g')"
+
+ # process each partition
+ for part in $parts; do
+ local fstype=$(sudo lsblk -nl -o NAME,FSTYPE | grep "$part" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ case $fstype in
+ vfat)
+ let 'pcount=pcount+1'
+ ;;
+ ntfs)
+ let 'pcount=pcount+1'
+ ;;
+ ext*)
+ let 'pcount=pcount+1'
+ ;;
+ esac
+ done
+ done
+
+ # wipe out, process each disk
+ for disk in $backup_choice; do
+ local parts=$(ls /dev/${disk}* | grep "$disk\w")
+ parts="$(echo $parts | sed 's/\/dev\///g')"
+
+ # process each partition
+ for part in $parts; do
+ local fstype=$(sudo lsblk -nl -o NAME,FSTYPE | grep "$part" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ case $fstype in
+ vfat)
+ let 'curr_part=curr_part+1'
+ vfat_cleanup $curr_part $pcount $part
+ ;;
+ ntfs)
+ let 'curr_part=curr_part+1'
+ ntfs_cleanup $curr_part $pcount $part
+ ;;
+ ext*)
+ let 'curr_part=curr_part+1'
+ ext_cleanup $curr_part $pcount $part
+ ;;
+ esac
+ done
+ done
+}
+
+# backup dialog: does disk backup with a progress indication
+backup()
+{
+ # confirm action
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --title " Sicherung bestätigen "\
+ --hfile help.txt --colors --yes-label "Weiter" --no-label "Abbrechen" --exit-label "Schließen" --yesno "\nWollen Sie"`
+ `" das/die Laufwerk/e \Z4${backup_choice}\Zn nach \Z4${store_path}\Zn sichern?" 9 50 2>$OUT
+
+ if ! [ $? -eq $DIALOG_OK ]; then
+ return
+ fi
+
+ # wipe out unneccessary data
+ if [ $cleanup = "ja" ]; then
+ wipeout
+ fi
+
+ # mount store
+ mount_store
+ if [ $? -ne 0 ]; then
+ # show error
+ no_store
+
+ return
+ fi
+
+ # process each disk
+ echo -n "" > $ERROR_FILE
+ i=1
+ count=$(echo $backup_choice | wc -w)
+ local start_ts=$(date +"%s")
+ for disk in $backup_choice; do
+ # set size and name
+ local psize=$(($(sudo fdisk -l 2>/dev/null | grep "${disk}:" | cut -f 5 -d ' ')/1024))
+ local arch_name="backup_$(date +%Y-%m-%d_%H-%M-%S).img"
+
+ # start compression process
+ local dd_opts="bs=512 conv=noerror,sync"
+ echo -n "" > $PROGRESS_FILE &>/dev/null
+ (sudo dd if=/dev/$disk $dd_opts 2>/dev/null | pv -s ${psize}k -n 2>$PROGRESS_FILE | sudo 7zr a -t7z -m0=lzma2 -mx=9\
+ -mfb=64 -md=32m -ms=on -bd -si $MNT_DIR/$arch_name 2>/dev/null | : | tail -fn0 $PROGRESS_FILE 2>>/dev/null |\
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --colors\
+ --title " Sicherung $i/$count " --hfile help.txt --exit-label "Schließen" --gauge "Sicherung von \Z4${disk}\Zn als"`
+ `" \Z4${store_path}\\$arch_name\Zn" 8 60)&
+
+ # supervise compression process
+ sleep 2
+ while true; do
+ sleep 1
+ local run=$(ps -e | grep 7zr)
+
+ if [ -z "$run" ]; then
+ killall tail &>/dev/null
+ rm -f $PROGRESS_FILE &>/dev/null
+ break
+ fi
+ done
+ let 'i=i+1'
+
+ # test archive
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --title " Überprüfung " --hfile help.txt\
+ --colors --exit-label "Schließen" --infobox "Backupdatei \Z4${store_path}\\$arch_name\Zn wird überprüft..." 7 60\
+ 2>$OUT
+
+ sudo 7zr t $MNT_DIR/$arch_name &>/dev/null
+ if [ $? -ne 0 ]; then
+ # show error messages
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Sichern" --title " Fehler " --colors\
+ --hfile help.txt --exit-label "Schließen" --msgbox "\nBei der Erstellung der Sicherung von \Z4${disk}\Zn als"`
+ `" \Z4${store_path}\\$arch_name\Zn ist ein Fehler aufgetreten. Das Archiv ist ungültig und wird gelöscht. Die"`
+ `" Sicherung wird abgebrochen." 12 50
+
+ # delete backup
+ rm -f $MNT_DIR/$arch_name &>/dev/null
+
+ # unmount store
+ unmount_store
+
+ return
+ fi
+
+ # create config entry
+ local config_file=backup_$user.conf
+ sudo bash -c "echo \"$disk=$arch_name\" >> $MNT_DIR/$config_file 2>>$ERROR_FILE"
+ done
+ unset i
+ unset count
+
+ # just keep recent update
+ local end_ts=$(date +"%s")
+ local diff=$(($end_ts-$start_ts))
+ clean_backup $diff
+
+ # unmount store
+ unmount_store
+
+ # shutdown?
+ if [ "$auto_down" = "ja" ]; then
+ shutdown_computer
+ fi
+}
+
+# mark dialog: marks partition for checking and shows busy state
+# param 1 is the list of disks that have been restored
+mark4check()
+{
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Wiederherstellen" --title " Überprüfung " --hfile help.txt\
+ --colors --exit-label "Schließen" --infobox "Laufwerke werden für eine Überprüfung beim Start des Computers"`
+ `"markiert..." 6 60 2>$OUT
+
+ # process each disk
+ for disk in $1; do
+ local parts=$(ls /dev/${disk}* | grep "$disk\w")
+ parts="$(echo $parts | sed 's/\/dev\///g')"
+
+ # process each partition
+ for part in $parts; do
+ local fstype=$(sudo lsblk -nl -o NAME,FSTYPE | grep "$part" | sed 's/\ */ /g' | cut -f 2 -d ' ')
+ case $fstype in
+ vfat)
+ # do nothing
+ ;;
+ ntfs)
+ sudo ntfsfix /dev/$part &>/dev/null
+ ;;
+ ext*)
+ sudo mount /dev/$part $MNT_DIR &>/dev/null
+ if [ $? -eq 0 ]; then
+ sudo touch $MNT_DIR/forcefsck &>/dev/null
+ fi
+ sudo umount $MNT_DIR &>/dev/null
+ ;;
+ esac
+ done
+ done
+}
+
+# restore dialog: restores one or more disks with saved backups
+restore()
+{
+ # mount store
+ mount_store
+ if [ $? -ne 0 ]; then
+ # show error
+ no_store
+
+ return
+ fi
+
+ # fill variables
+ local config_file=$MNT_DIR/backup_$user.conf
+ local disks=($(cat $config_file 2>/dev/null | cut -f 1 -d '='))
+ local arch_names=($(cat $config_file 2>/dev/null | sed -e 's/.*backup_//g' -e 's/\.img//g'))
+ unset disks[${#disks[@]}-1] &> /dev/null
+ unset arch_names[${#arch_names[@]}-1] &> /dev/null
+
+ if ! [ -e $config_file ]; then
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Wiederherstellen" --title " Fehler " --colors\
+ --ok-label "Abbrechen" --hfile help.txt --exit-label "Schließen" --msgbox "\nEs ist keine Sicherung vorhanden."`
+ `" Bitte erstellen Sie erste eine." 8 40
+ fi
+
+ unset entries
+ declare -a entries
+ for i in $(seq 0 $((${#disks[@]}-1))); do
+ local entries=(${entries[@]} ${disks[$i]} "${arch_names[$i]}" off)
+ done
+
+ # show dialog
+ while true; do
+ # show dialog
+ eval dialog --backtitle "\"RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Wiederherstellen\"" --hfile help.txt\
+ --title "\" Wiederherstellung \"" --exit-label "Schließen" --colors --nocancel --ok-label "Weiter"\
+ --extra-button --extra-label "Abbrechen" --checklist "\"Wählen Sie einen oder mehrere Datenträger aus, die Sie"`
+ `" wiederherstellen wollen.\n\Z1Achtung:\Zn Alle Daten des/der Laufwerke/s werden überschrieben!\""\
+ 14 50 4 ${entries[@]} 2>$OUT
+
+ # save choice result
+ local res=$?
+ local restore_choice="$(cat $OUT)"
+
+ if ! [ $res -eq $DIALOG_OK ]; then
+ unmount_store
+ return
+ fi
+
+ if [ -z "$restore_choice" ]; then
+ # show error
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Wiederherstellen" --title " Fehler " --colors\
+ --ok-label "Weiter" --hfile help.txt --exit-label "Schließen" --msgbox "\nBitte wählen Sie mindestens ein"`
+ `" Laufwerk aus." 8 40
+
+ # show dialog again
+ continue
+ fi
+
+ # end loop
+ break
+ done
+
+ # process each disk
+ i=1
+ count=$(echo $restore_choice | wc -w)
+ for disk in $restore_choice; do
+ # set size and name
+ local psize=$(($(sudo fdisk -l 2>/dev/null | grep "${disk}:" | cut -f 5 -d ' ')/1024))
+ local arch_name="${arch_names[$((i-1))]}"
+
+ # start extraction process
+ echo -n "" > $PROGRESS_FILE &>/dev/null
+ (sudo 7zr e -bd -so $MNT_DIR/backup_$arch_name.img 2>/dev/null | pv -s ${psize}k -n 2>$PROGRESS_FILE |\
+ sudo dd of=/dev/$disk conv=notrunc 2>/dev/null | : | tail -fn0 $PROGRESS_FILE 2>/dev/null |\
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Wiederherstellen" --colors\
+ --title " Wiederherstellung $i/$count " --hfile help.txt --exit-label "Schließen" --gauge "Wiederherstellung"`
+ `" von \Z4${disk}\Zn durch \Z4${store_path}\\backup_$arch_name.img\Zn" 8 60)&
+
+ # supervise extraction process
+ sleep 2
+ while true; do
+ sleep 1
+ local run=$(ps -e | grep 7zr)
+
+ if [ -z "$run" ]; then
+ killall tail &>/dev/null
+ rm -f /tmp/progress &>/dev/null
+ break
+ fi
+ done
+ let 'i=i+1'
+ done
+ unset i
+ unset count
+
+ # unmount store
+ unmount_store
+
+ # marks partition for checking
+ mark4check "$restore_choice"
+
+ # shutdown?
+ if [ "$auto_down" = "ja" ]; then
+ shutdown_computer
+ fi
+}
+
+# shutdown dialog: shutdowns the computer
+shutdown_computer()
+{
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Beenden" --title " Beenden " --nocancel --nook\
+ --hfile help.txt --exit-label "Schließen" --pause "\nSekunden bis der Rechner heruntergefahren wird:" 9 40 5
+
+ # unmount store, shutdown and keeps script waiting for a while
+ unmount_store
+ sudo shutdown now &>/dev/null
+ sleep 60
+}
+
+# examines settings using different dialogs
+# param 1 is the init mode, setting a value turns it on off otherwise
+settings()
+{
+ # USB or network backup/restore
+ br_mode
+
+ # enter username
+ username
+
+ # collect settings according to backup/restore mode
+ if [ "$mode" == "USB" ]; then
+ store_path="$USB_PART"
+ else
+ # enter password
+ password
+
+ # enter domain
+ dom
+
+ # select network interface
+ interface
+
+ # enter backup store
+ store
+ if [ $? -ne 0 ]; then
+ # show error
+ no_store
+ return
+ fi
+ fi
+
+ # choose disk or partition
+ choose wizz
+
+ # clean up method
+ cleanup_method
+
+ # shutdown option
+ shutdown_option
+
+ # save settings
+ save_settings
+}
+
+# reads setting from a file
+read_settings()
+{
+ if ! [ -e $SETTINGS_FILE ]; then
+ welcome
+ settings init
+ else
+ local IFS_saved=$IFS;
+ IFS=$'\n'
+ local content=($(cat $SETTINGS_FILE))
+ IFS=$IFS_saved
+ mode="$(echo ${content[0]} | sed 's/mode=//')"
+ user="$(echo ${content[1]} | sed 's/user=//')"
+ pass="$(echo ${content[2]} | sed 's/pass=//')"
+ domain="$(echo ${content[3]} | sed 's/domain=//')"
+ interface="$(echo ${content[4]} | sed 's/interface=//')"
+ store_path="$(echo ${content[5]} | sed 's/store_path=//')"
+ backup_choice="$(echo ${content[6]} | sed 's/backup_choice=//')"
+ cleanup="$(echo ${content[7]} | sed 's/cleanup=//')"
+ auto_down="$(echo ${content[8]} | sed 's/auto_down=//')"
+ fi
+}
+
+# saves the settings
+save_settings()
+{
+ echo -n "" > $SETTINGS_FILE
+
+ echo "mode=$mode" >> $SETTINGS_FILE
+ echo "user=$user" >> $SETTINGS_FILE
+ echo "pass=$pass" >> $SETTINGS_FILE
+ echo "domain=$domain" >> $SETTINGS_FILE
+ echo "interface=$interface" >> $SETTINGS_FILE
+ echo "store_path=$store_path" >> $SETTINGS_FILE
+ echo "backup_choice=$backup_choice" >> $SETTINGS_FILE
+ echo "cleanup=$cleanup" >> $SETTINGS_FILE
+ echo "auto_down=$auto_down" >> $SETTINGS_FILE
+}
+
+# settings info dialog
+settings_info()
+{
+ local password=$(if [ -z "$pass" ]; then echo "<fehlt>"; else echo "<gesetzt>"; fi)
+
+ if ! [ "$mode" == "USB" ]; then
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Übersicht" --title " Übersicht " --nocancel\
+ --ok-label "Zurück" --hfile help.txt --exit-label "Schließen" --form "Übersicht der Einstellungen:" 16 65 9\
+ "Modus:" 1 2 "$mode" 1 26 -30 30\
+ "Benutzername:" 2 2 "$user" 2 26 -30 30\
+ "Passwort:" 3 2 "$password" 3 26 -30 30\
+ "Domäne:" 4 2 "$domain" 4 26 -30 30\
+ "Netzwerkgerät:" 5 2 "$interface" 5 26 -30 30\
+ "Netzlaufwerk:" 6 2 "$store_path" 6 26 -30 30\
+ "Zu sichernde Laufwerke:" 7 2 "$backup_choice" 7 26 -30 30\
+ "Laufwerke bereinigen:" 8 2 "$cleanup" 8 26 -30 30\
+ "Autom. Herunterfahren:" 9 2 "$auto_down" 9 26 -30 30 2>$OUT
+ else
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü / Übersicht" --title " Übersicht " --nocancel\
+ --ok-label "Zurück" --hfile help.txt --exit-label "Schließen" --form "Übersicht der Einstellungen:" 13 65 6\
+ "Modus:" 1 2 "$mode" 1 26 -30 30\
+ "Benutzername:" 2 2 "$user" 2 26 -30 30\
+ "USB-Laufwerk:" 3 2 "$store_path" 3 26 -30 30\
+ "Zu sichernde Laufwerke:" 4 2 "$backup_choice" 4 26 -30 30\
+ "Laufwerke bereinigen:" 5 2 "$cleanup" 5 26 -30 30\
+ "Autom. Herunterfahren:" 6 2 "$auto_down" 6 26 -30 30 2>$OUT
+ fi
+}
+
+# main menu dialog
+main_menu()
+{
+ while true; do
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe - Hauptmenü " --title " Hauptmenü " --colors --nocancel\
+ --hfile help.txt --exit-label "Schließen" --menu "Bitte Funktion auswählen:" 12 70 5\
+ Sichern "Erstellt eine Sicherung"\
+ Wiederherstellen "Stellt den Zustand aus einer Sicherung her"\
+ Einstellungen "Nimmt notwendige Einstellungen auf"\
+ Übersicht "Zeigt die Einstellung an"\
+ Beenden "Beendet RescueSys" 2>$OUT
+
+ local menuitem=$(cat $OUT)
+ case $menuitem in
+ Sichern)
+ backup
+ ;;
+ Wiederherstellen)
+ restore
+ ;;
+ Einstellungen)
+ settings
+ ;;
+ Übersicht)
+ settings_info
+ ;;
+ Beenden)
+ shutdown_computer
+ ;;
+ esac
+ done
+}
+
+# close dialog: close application after password request
+close()
+{
+ local flag=0
+ while true; do
+ # prepare mode handling
+ local error="\n"
+ if [ $flag -eq 1 ]; then
+ error="\Z1Eingabe ungültig\Zn\n"
+ fi
+
+ # show dialog
+ dialog --backtitle "RescueSys v1.0 - F1 für Hilfe" --title " Applikation schließen " --hfile help.txt --colors\
+ --cancel-label "Abbrechen" --insecure --ok-label "Schließen" --passwordbox "${error}Geben Sie das Passwort ein:"\
+ 9 33 2>$OUT
+
+ local resp=$?
+ local access=$(cat $OUT)
+ if [ $resp -eq 0 ]; then
+ #check password
+ if [ "rescuesys" == $access ]; then
+ sudo umount $MNT_DIR &>/dev/null
+ sudo umount $INSP_DIR &>/dev/null
+ clear
+ exit
+ else
+ flag=1
+ continue
+ fi
+ else
+ break
+ fi
+ done
+}
+
+# trap for interrupt signals such as Ctrl + C
+trap "close" SIGHUP SIGINT SIGTERM
+# disable "screensaver"
+sudo setterm -blank 0
+# avoid kernel messages to appear to console
+sudo bash -c "echo 0 > /proc/sys/kernel/printk"
+
+# read settings
+read_settings
+
+# show main menu
+main_menu