Seite 1 von 1

Menü im Terminal

Verfasst: Mittwoch 14. Juni 2017, 12:41
von Amber
Moin,

nach meinen Script-Dateien möchte ich nun ein Menü vorstellen was alle diese scripte beinhaltet und eine .desktop Datei zum starten.
Dies ist alles auf Plasma 5 getestet, einzig die .desktop müßte evtl angepasst werden.

Hier wird mit Funktionen innerhalb des Script gearbeitet um ein springen zu ermöglichen. Einige Variablen sind als erstes benannt andere erst nach der Auswahl, dann kommen die Fukktionen, zu erkennen an test() {hier steht dann was passieren soll}. Zuletzt steht das eigendliche Menü mit den entsprechenden Untermenüs. Am Ende wird eine Funktion aufgerufen. 

Wichtig ist, dass die Werte der Variablen angepasst werden insbesondere die für backup/restore sonst stimmen die Pfade nicht.
Ich hatte zuerst daran gedacht dieses zu automatisieren. Das funktioniert aber nur durch die UUID des Sicherungsträgers welche im script
eingetragen werden muss. Das war mir dann doch für viele zu kompleziert und Fehlerträchtig, weshalb ich davon Abstand genommen habe.

Vorhanden sind Sicherung und Wiederherstellung sowie Systemupdate mit verheriger Snapshoterstellung und Sicherung der vorherigen. Es ist also auch auf BTRFS ausgelegt, durch auskommentieren dieser Snapshot-Möglichkeit aber auch für andere Filesysteme geeignet.

Weiter gibt es eine Sicherung auf rsync auf externe Datenträger. Wahlweise für /home / oder beides. Speicherung erfolgt getrennt und mit Hardlinks, womit Speicherplatz gespart wird.

Mit der menu.desktop Datei startet mat ein Terminal welches man durch das Menü wieder sauber beenden kann. Wie geschrieben die .desktop habe ich nur auf plasma5 getestet.

Dieser Abschnitt im script ist für die Zerlegung div Zeilen zuständig nur um ein oder zwei Informationen herauszuholen.

Code: Alles auswählen

LASTVAR=$(sudo readlink $rziel/last_backup | cut -d "/" -f5-)
            PFADVAR=$(sudo find -P $rziel/$LASTVAR -name $name | xargs -i ls -tr {} | cut -d" " -f10-)  
            COPYVAR=$(sudo ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f5-)
            ORIGINALVAR=$(sudo ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f7-)
Diskussionen und Verbesserungsvorschläge in einen extra - Thread erwünscht.
Diesen Thread, sowie meine anderen auch, werde ich immer wieder anpassen oder Verbesserungen einbauen.

Viel Spass - have fun!

Die menu.desktop Datei:

Code: Alles auswählen

[Desktop Entry]
Comment[de_DE]=
Comment=
Exec=\s/bin/./menue.sh
GenericName[de_DE]=
GenericName=
Icon=kcmdevices
MimeType=
Name[de_DE]=
Name=
Path=
StartupNotify=true
Terminal=true
TerminalOptions=
Type=Application
X-DBUS-ServiceName=
X-DBUS-StartupType=
X-KDE-SubstituteUID=false
X-KDE-Username=
Hier der menu.sh script

Code: Alles auswählen

#! /bin/sh

## Menü für Backup / Restore und 
## Systemupdate

## Variablen
## Datensicherung Root Variable-Funktion
func_rovar() {
rquelle=/
rziel=/media/Backup/system/
rexcludes=${rziel}.exclude-liste
}

## Datensicherung Home Variable-Funktion
func_hovar() {
uquelle=/home/$USER
uziel=/media/Backup/home/    
uexcludes=${uziel}.exclude-liste
}

## Datensicherung Allgemein Variable-Funktion
func_allgvar() {
medium=/media/Backup
datum=$(date +%d-%m-%Y-%H%M%S)
hosts=$(hostname | tail)
}

## Systemupdate Variable-Funktion
func_upvar() {
BTRFS=/usr/bin/btrfs
PACMAN=/usr/bin/pacman
MV=/usr/bin/mv
CP=/usr/bin/cp
REFLECTOR=/usr/bin/reflector
up=$(checkupdates)
}

## Funktionen

## Informationsmeldungen
func_backInfo() {
echo "Backup- HDD ist eingehängt", sleep 5
}

func_backFailed() {
echo "Kein Medium eingehängt, Backup beendet"; sleep 5
}

## Datensicherung Root-System
func_bakRo() {
cd /
if [[ -d $medium ]]; then
    func_backInfo
    cd /
    sudo rsync -avlR --progress --exclude-from="$rexcludes" "${rquelle}"  "${rziel}${hosts}-${datum}/" --link-dest="${rziel}last_backup/"
    ln -nsf "${rziel}${hosts}-${datum}" "${rziel}last_backup"
    sync
else
    func_backFailed
fi
}

## Datensicherung Home - System
func_bakHo() {
cd /
if [[ -d $medium ]]; then
    func_backInfo
    cd /
    rsync -avlR --progress --exclude-from="$uexcludes" "${uquelle}"  "${uziel}${hosts}-${datum}/" --link-dest="${uziel}last_backup/"
    ln -nsf "${uziel}${hosts}-${datum}" "${uziel}last_backup"
    sync
else
    func_backFailed
fi
}

## Rücksicherung Root - System
func_restRo() {
cd /
echo -n "Dateinamen eingeben (Beispiel mkinitcpio.conf): "; read name
    if [[ -d $medium ]]; then
        if [ -z "$name" ]; then
            echo "Bitte einen Dateinamen angeben, z. B. restore.sh irgendwas.txt"
            func_Menu
        else
            LASTVAR=$(sudo readlink $rziel/last_backup | cut -d "/" -f5-)
            PFADVAR=$(sudo find -P $rziel/$LASTVAR -name $name | xargs -i ls -tr {} | cut -d" " -f10-)  
            COPYVAR=$(sudo ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f5-)
            ORIGINALVAR=$(sudo ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f7-)
            
        fi
    fi
}

## Rücksicherung Home - System
func_restHo() {
cd /
echo -n "Dateinamen eingeben (Beispiel datei.txt): "; read name
    if [[ -d $medium ]]; then
        if [ -z "$name" ]; then
            echo "Bitte einen Dateinamen angeben, z. B. restore.sh irgendwas.txt"
            func_Menu;
        else
            LASTVAR=$(readlink $uziel/last_backup | cut -d "/" -f5-)
            PFADVAR=$(find -P $uziel/$LASTVAR -name $name | xargs -i ls -tr {} | cut -d" " -f10-)  
            COPYVAR=$(ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f5-)
            ORIGINALVAR=$(ls -tl $PFADVAR | cut -d" " -f9 | head -n1 | cut -d "/" -f7-)
        fi
    fi
}

## Rücksicherung kpl manuell
func_restComp() {
echo ""
echo -n "Quelle eingeben kpl. Pfad!: "; read q
echo -n "Ziel eingeben kpl. Pfad!: "; read z
echo -n "Der Quell und Zielpfad lautet: "$q $z "weiter? (j), sonst (n)"; read jn
if [ "$jn" = "j" ]; then
    sudo cp -R $q $z
elif [ "$jn" = "n" ]; then
    func_Menu;
fi
}

## System - Update
func_sysUp() {
# sudo -u $USER DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "$(echo $up)" -t 50000
echo sudo $(date +%d-%m-%y/%H:%M:%S) $up >> /var/log/update/update.log
unset up

# ----- Snapshot System -----
# ---------------------------
sudo $BTRFS subvolume delete /.snapshots/OLDSTABLE
sudo $MV /.snapshots/STABLE /.snapshots/OLDSTABLE
sudo $BTRFS subvolume snapshot / /.snapshots/STABLE
sudo $CP /.snapshots/fstab.bak /.snapshots/STABLE/etc/fstab
sudo $CP /boot/vmlinuz-linux /boot/vmlinuz-linux-stable
sudo $CP /boot/initramfs-linux.img /boot/initramfs-linux-stable.img

# ----- Update System -------
# ---------------------------
sudo $REFLECTOR --country 'Germany' -l 25 -p https --sort rate --save /etc/pacman.d/mirrorlist
sudo $PACMAN -Syyu  ## --noconfirm
sudo $PACMAN -Sc    ## --noconfirm

#    Balance Filesystem
# --------------------------
sudo $BTRFS balance start -dusage=55 /
}

## Menü
func_Menu() {
while true; do
    clear
    echo ""
    echo ""
    echo ""
    echo "(1) Datensicherung"
    echo "(2) Datei zurückschreiben"
    echo "(3) System Update durchführen"
    echo "(4) Programm beenden"
    echo ""
    echo -n "Funktion auswählen: "; read f
        if [ "$f" = "1" ]; then
            while true; do
                clear
                echo ""
                echo ""
                echo ""
                echo "(1) Datensicherung Root - Dateisystem"
                echo "(2) Datensicherung User - Dateisystem"
                echo "(3) Datensicherung Root & User Dateisystem"
                echo "(4) Hauptmenü"
                echo -n "Funktion auswählen: "; read f
                    if [ "$f" = "1" ]; then
                        func_rovar;
                        func_allgvar;
                        func_bakRo;
                        func_Menu;
                    elif [ "$f" = "2" ]; then
                        func_hovar;
                        func_allgvar;
                        func_bakHo;
                        func_menu;
                    elif [ "$f" = "3" ]; then
                        func_rovar;
                        func_hovar;
                        func_allgvar;
                        func_bakHo;
                        func_bakRo;
                        func_Menu;
                    elif [ "$f" = "4" ]; then
                        func_Menu;
                    fi
            done
        elif [ "$f" = "2" ]; then
            while true; do
                clear
                echo ""
                echo ""
                echo ""
                echo "Achte auf einen korrekten Zielpfad, falls über ein Live-System"
                echo "gearbeitet wird manuelle Pfad-Eingabe nutzen."
                echo ""
                echo ""
                echo "(1) Rücksicherung einer Datei im Root - Dateisystem"
                echo "(2) Rücksicherung einer Datei im User - Dateisystem"
                echo "(3) Rücksicherung des kompletten Systemes"
                echo "(4) zurück"
                echo -n "Funktion auswählen: "; read f
                    if [ "$f" = "1" ]; then
                        while true; do
                            clear
                            echo ""
                            echo "(1) Datei zurück kopieren"
                            echo "(2) Anderen Pfad eingeben"
                            echo "(3) Abrechen"
                            echo " "
                            echo -n "Funktion auswählen: "; read f
                            func_rovar;
                            func_allgvar;
                                if [ "$f" = "1" ]; then
                                    func_restRo;
                                    echo $rziel$COPYVAR $ORIGINALVAR" wird kopiert"
                                    sudo cp $rziel$COPYVAR $ORIGINALVAR
                                    func_Menu;
                                elif [ "$f" = "2" ]; then
                                    func_restRo;
                                    echo -n "Bitte vollständigen Pfad angeben: "; read c
                                    echo $rziel$COPYVAR $c "wird kopiert"
                                    sudo cp $rziel$COPYVAR $c
                                    func_Menu;
                                elif [ "$f" = "3" ]; then
                                    func_Menu;
                                fi
                        done
                    
                    elif [ "$f" = "2" ]; then
                        while true; do
                            clear
                            echo "(1) Datei zurück kopieren"
                            echo "(2) Anderen Pfad eingeben"
                            echo "(3) Hauptmenü"
                            echo " "
                            echo -n "Funktion auswählen: "; read f
                            func_hovar;
                            func_allgvar;
                                if [ "$f" = "1" ]; then
                                    func_restHo;
                                    echo $uziel$COPYVAR $ORIGINALVAR" wird kopiert"
                                    cp $uziel$COPYVAR $ORIGINALVAR
                                    func_Menu;
                                elif [ "$f" = "2" ]; then
                                    func_restHo;
                                    echo -n "Bitte vollständigen Pfad angeben: "; read c
                                    echo $uziel$COPYVAR $c "wird kopiert"
                                    cp $uziel$COPYVAR $c
                                elif [ "$f" = "3" ]; then
                                    func_Menu;
                                fi
                        done
                    
                    elif [ "$f" = "3" ]; then
                        while true; do
                            clear
                            echo "Eine einwandfrei Rücksicherung ist nur möglich"
                            echo "wenn ein externes System (Live-System) gestartet"
                            echo "wird. Andernfalls kann es zum System-Ausfall führen!"
                            echo "Zielpfad muss auf jedem Fall manuell angegeben werden!"
                            echo ""
                            echo ""
                            echo "(1) Trotzdem starten?"
                            echo "(2) Hauptmenue"
                            echo -n "Funktion auswählen: "; read a
                            func_rovar;
                            func_hovar;
                            func_allgvar;
                                if [ "$a" = "1" ]; then
                                    func_restComp;
                                    func_Menu;
                                elif [ "$a" = "2" ]; then
                                    func_Menu;
                                fi
                        done
                    
                    elif [ "$f" = "4" ]; then
                        func_Menu;       
                    fi    
            done    
        
        elif [ "$f" = "3" ]; then
            func_upvar;
            if [ -z "$up" ]; then
                clear
                echo ""
                echo ""
                echo ""
                echo "Kein Update vorhanden"
                echo "(1) Beenden"
                echo "(2) Zurück"
                echo -n "Funktion wählen"; read e
                    if [ "$e" = "1" ]; then
                        id=$(echo $$)
                        exit $id
                    elif [ "$e" = "2" ]; then
                        func_Menu;
                    fi
            else
                        func_sysUp;
            fi
        elif [ "$f" = "4" ]; then
        id=$(echo $$)
        exit $id                   
        fi    
done
}

func_Menu;
Â