BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT

Sonntag, 19. Juli 2015

Samba-Freigaben eines Linux-Servers auf den NAS325 von Zyxel sichern.

Es waren einmal....

Windows-Clients und ein Linux-Server mit einem vermeintlich sicheren RAID-Verbund... und die Erkenntnis über geographische Sicherheit.


Jeder der einen Server mit gespiegelten Festplatten betreibt, würde sicherlich erst einmal auf die Frage "Wie sicher sind eigentlich die Daten auf deinem RAID?" sagen: "Total sicher".

Ein Blitzschlag im ziemlich nahe gelegenen Nachbarhaus brachte mir allerdings näher, dass ein Blitz meist die phänomenale Eigenschaft besitzt, gleich alle Festplatten in einem Server auf einmal zu "grillen" zu können... und einem die Versicherung und selbst ein Datenwiederherstellungsdienst wie Firma Kroll-Ontrack auch gegen den "Einwurf kleiner Münzen" hier nicht mehr all zu viel Material hätte, welches sie überhaupt retten könnte.

Und nun... was tun?

Ein zweites Backup an einem geographisch entfernten Ort muss her -
und zwar schnell! Und natürlich günstig!

Ein alter NAS325 von Zyxel fand sich in meiner "Hardware-Restekiste" wieder.
Das könnte doch die Lösung sein -
so lange ich diesen weit genug entfernt aufstelle.

Und wie bekomme ich dort nun die Daten hin?
rsync wäre sicherlich eine Möglichkeit -
mag das System aber anscheinend nicht.
Und der liebe Strom? Wie schalte ich das Gerät ein? Und wieder aus?
.....

Eine Stunde herum scripten - und das Problem war nun gelöst.
Vielleicht kann jemand den Ansatz gebrauchen. :-)

Viele Grüße,



Oliver   [Zum vollen Artikel samt Script.]


#!/bin/bash
#
# Kleines Cronjob-Script zum Backup auf den NAS
#
# 2015-07-19 Oliver Lenz
#
# Die folgenden Parameter müssen ggf. angepasst werden.
#
quelle="/home/**"
ziel="//nsa325/sicherung/"
wakeupmac="1a:2b:3c:4d:5e:6f"
wakeupzeit=600
landevice="eth0"
zeitverbrauch_minimum=5
log="/var/log/backup.log"
tme="/var/log/backup.tme"
mountpoint="/media/backupmount/"
benutzer="admin-benutzer vom NAS325"
kennwort="hier ist dann ein ganz geheimes Kennwort vom NAS-Share vom Benutzer admin"
#
# Ändere hinter dieser Linie lieber nichts, wenn du dir nicht ganz sicher bist, was du da tun willst. :-)
#
if [ ! -e "$log" ]; then
        touch "$log"
        chmod 700 "$log"
else
        chmod 700 "$log"
        echo "############################################" >> "$log"
fi
echo "Beginne Backup. $( date "+%Y-%m-%d %H:%M:%S" )" | tee -a "$log"
start=$(date "+%s")
fehler=""
warnung=""
# mountpoint erstellen und prüfen
umount -f "$ziel"  2> /dev/null
mkdir "$mountpoint" 2> /dev/null
chmod 700 "$mountpoint" 2>/dev/null
if [ ! -d "$mountpoint" ] || [ "$( ls -al "$mountpoint" | grep " .$" | cut -d"." -f1 )" == "drwx------" ]; then
        echo "Der Mountpoint konnte nicht erstellt werden oder die gesetzten Rechte sind nicht korrekt." | tee -a "$log"
        fehler=1
else
        echo "Der Mointpoint \"$mountpoint\" besteht mit passenden Rechten." | tee -a "$log"
        zielip=$(echo "$ziel" | cut -d"/" -f3 | nslookup 2>&1 | grep "Address:" | grep -v "#" | cut -d" " -f2 )
        echo "Das Ziel \"${ziel}\" hat die IP ${zielip}" | tee -a "$log"
        # wakup des Ziels, sofern eine Waceupmac vermerkt wurde
        # und noch nicht wach ist.
        echo "Es wird versucht das Ziel ${zielip} zu erreichen."
        ping -c 1 "${zielip}" 2>&1 >/dev/null
        if [ ! "$?" == "0" ]; then
                if [ -n "$wakeupmac" ]; then
                        echo "Das Ziel ist nicht erreichbar." | tee -a "$log"
                        echo "Sende einen WakeUp an Zielip ${zielip} (${wakeupmac}) via ${landevice}." | tee -a "$log"
                        ether-wake -i $landevice ${wakeupmac} 2>/dev/null
                        echo "Es wird nun ${wakeupzeit} Sekunden gewartet." | tee -a "$log"
                        sleep $wakeupzeit
                        ping -c 1 "$zielip" 2>&1 >/dev/null
                        if [ "$?" == "0" ]; then
                                ziel_erreicht=1
                        fi
                fi
        else
                ziel_erreicht=1
                wakeup_differenz=1
        fi
        if [ ! "$ziel_erreicht" == "1" ]; then
                echo "Ziel ${zielip} nicht erreichbar." | tee -a "$log"
                fehler=1
        else
                # mounten des Ziels
                echo "Ziel ${zielip} ist erreichbar." | tee -a "$log"
                mount -t cifs -o username=$benutzer,password=$kennwort "${ziel}" "${mountpoint}" 2> /dev/null
                if [ ! "$( mount | grep "$(dirname "${mountpoint}.")" | wc -l | xargs echo )" == "1" ]; then
                        echo "Konnte das Ziel ${ziel} nicht nach ${mountpoint} mounten." | tee -a "$log"
                        fehler=1
                else
                        # copy... Gewisse Fehler ausblenden; z.B. Dateien und Verzeichnisse mit ":" oder Symbolische Links.
                        echo "Beginne das Kopieren von ${quelle} nach ${ziel}." | tee -a "$log"
                        cp -rup ${quelle} ${mountpoint} 2>&1 | while read zeile; do
                                case "$zeile" in
                                        *"cannot create symbolic link"*)
                                                # nothing to do
                                        ;;
                                        *"cannot create regular file"*)
                                                p=$(    echo $zeile | sed 's/.*`//g' | sed "s/': No such file.*//g" | grep -v ":" )
                                                if [ -n "$p" ]; then
                                                        echo "Problem: $zeile" | tee -a "$log"
                                                        fehler=1
                                                fi
                                        ;;
                                        *"cannot create directory"*)
                                                p=$(    echo $zeile | sed 's/.*`//g' | sed "s/': No such file.*//g" | grep -v ":" )
                                                if [ -n "$p"  ]; then
                                                        echo "Problem: $zeile" | tee -a "$log"
                                                        fehler=1
                                                fi
                                        ;;
                                        *)
                                                echo "Ein Problem ist aufgetreten: $zeile" | tee -a "$log"
                                                fehler=1
                                        ;;
                                esac
                        done
                        # diskstatistik
                        statistik=$(df -h | grep "$ziel" | sed '1,$s/ * / /g')
                        gesamt=$(echo $statistik | cut -d" " -f2 )
                        genutzt=$(echo $statistik | cut -d" " -f3 )
                        frei=$(echo $statistik | cut -d" " -f4 )
                        genutzt_p=$(echo $statistik | cut -d" " -f5 | cut -d"%" -f1 )
                        frei_p=$(bc <<< "100-${genutzt_p}")
                        echo "Copyjob beendet." | tee -a "$log"
                        echo "Diskstatistik: Platz: $gesamt (100%) Genutzt: ${genutzt} (${genutzt_p}%) Frei: ${frei} (${frei_p}%)" | tee -a "$log"
                        # unmount
                        sync
                        umount "$mountpoint" | tee -a "$log"
                        # rmdir -f "$mountpoint"
                        # SMB-Server / NAS herunter fahren
                        # Version 1: Abschalten über den Apache
                        #       wget -T 5  http://$zielip/abschalten.php --output-document=/tmp/dummy.txt
                        #        rm -f /tmp/dummy.tmp
                        # Version 2: Abschalten über RPC
                        #       net rpc shutdown -f -t 120 -C „Das System wird herunter gefahren“ -I $zielip  -U $benutzer%$kennwort# net rpc shutdown -f -t 120 -C „Das System wird herunter gefahren“ -I $zielip  -U $benutzer%$kennwort
                        # Version 3: Abschalten via SSH mit expect/spawn/send
                        #       Nicht vergessen: Das  Paket "expect" installieren und ssh auf dem NAS einschalten :-)
                        echo "Schalte Zielsystem ab." | tee -a "$log"
                        expect -c "
                                set timeout 10
                                spawn ssh root@${zielip}
                                expect {
                                        \"*continue connecting (yes/no)?*\"    {
                                                send yes\r
                                                exp_continue
                                        }
                                        \"*assword:*\" {
                                                send $kennwort\r
                                                exp_continue
                                        }
                                        \"~ # \" {
                                                send poweroff\r
                                                expect  \"*Connection to ${zielip} closed.*\" {
                                                        exit
                                                }
                                        }
                                }
                        " 2>&1 > /dev/null
                        #Zeitdelta berechnen, sofern Referenz vorhanden
                        zeitverbrauch=$(expr $(date "+%s") \- $start)
                        if [ -n "$wakeup_differenz" ]; then
                                zeitverbrauch=$(expr $zeitverbrauch \+ $wakeupzeit )
                        fi
                        if [ -e "$tme" ]; then
                                zeitverbrauch_delta=$( expr ${zeitverbrauch} \- $(cat ${tme}) )
                        fi
                        echo ${zeitverbrauch} > "$tme"
                fi
        fi
fi
diff=$(expr $(date "+%s") \- $start)
sekunden=$(($diff%60))
minuten=$(($diff/60%60))
stunden=$(($diff/60/60%24))
tage=$(($diff/60/60/24%7))
echo "Dauer: ${tage}d ${stunden}h ${minuten}m ${sekunden}s" | tee -a "$log"
echo "Beende Backup. $( date "+%Y-%m-%d %H:%M:%S" )" | tee -a "$log"
if [ -n "${fehler}" ]; then
        echo -e "\nFEHLER: ES SIND FEHLER AUFGETRETEN. \n" | tee -a "$log"
        exit 2
else
        if [ -n "$zeitverbrauch_delta" ] && [ $zeitverbrauch_delta -lt $zeitverbrauch_minimum ]; then
                echo -e "\nWARNUNG: Das Zeitdelta zum letzten Backup beträgt lediglich $zeitverbrauch_delta Sekunden.\n" | tee -a "$log"
                exit 1
        else
                echo -e "\nOK: Das Backup scheint fehlerfrei durchgelaufen zu sein. Zeitdelta: ${zeitverbrauch_delta} Sekunden.\n" | tee -a "$log"
                exit 0
        fi
fi

Nachsatz: die IP sollte im dns bzw. unter /etc/hosts gepflegt sein!
Und ggf. muss für einen automatischen Cronjob auch die Variable "PATH" ordentlich gesetzt sein.

Keine Kommentare:

Aktuelles