[Script] Backup inkl. FTP Upload für RPI

Weil ich gerade hier im Forum etwas über Backups gelesen habe und gerade mein Backup-Script um eine FTP-Upload Funktion erweitert habe - wollte ich mal wieder was an die Community zurückgeben!

Das originale Script ist eigentlich von @Silberstreifen und wurde damals hier Frage an Raspberry 3 Benutzer - #12 von Silberstreifen veröffentlicht!

Ich habe das über all die Jahre immer genutzt und ab und zu etwas angepasst! Das Script lass ich per Ereignis immer nachts um 3 Uhr laufen :slight_smile: In den letzten 5 Jahren hat es vielleicht 3 mal seinen Dienst per Meldung verweigert :innocent:

Ich musste es auch nie wieder zurückspielen - jedenfalls nicht in Gänze, immer nur Teile - und das hat super funktioniert!

Also wer Interesse hat - einfach der Umgebung anpassen (Pfade und FTP Verbindungsdaten) und hoffentlich glücklich sein!

<?php
################################################################################
# Script:   System.Backup.ips.php
# Version:  1.3.20221208
# Author:   Heiko Wilknitz (@Pitti)
#           Original von Silberstreifen V2.0 - 16.10.2016
#
# Erstellt einmal täglich ein Backup von Symcon. 
#
# Einspielen:
#   cd \
#   sudo tar -xvf /<path to backup/var.symcon.<day>.tar
#
# ------------------------------ Changelog ---------------------------------
#
# 17.12.2018 (v1.1) - Option -P zum tar Befehl hinzugefügt
# 06.01.2021 (v1.2) - UTF-8 Umstellung, Vereinheitlichung, Erfolgsmeldung
# 08.12.2022 (v1.3) - FTP Upload zum NAS hinzugefügt
#
# ------------------------------ Konfiguration ---------------------------------
#
# Backup-Verzeichnis festlegen 
# hier das Backupverzeichnis Deines gemounteten NAS eintragen 
$base = '/home/pi/Backup';
$day  = date("N"); 
#
################################################################################

switch (@$_IPS['STEP']) { 
    #---------------------------------------------------------------------------- 
    # Server aufwecken falls Server schläft 
    #---------------------------------------------------------------------------- 
    default: 
        // IPS_LogMessage("Backup", "Backup gestartet"); 
        for ($i=0;$i<10;$i++) { 
            system(" [ -d $base ]", $return_1); 
            if (!$return_1) break; 
            IPS_Sleep(3000); 
        } 
        if ($i >= 10) { 
            IPS_LogMessage("Backup", "Backup konnte nicht gestartet werden!"); 
            return; 
        } 
        IPS_RunScriptEx($_IPS['SELF'], ['STEP' => 1]); 
        return; 
    #---------------------------------------------------------------------------- 
    # Symcon /var/lib-Verzeichnis sichern; Basisdaten zusammenstellen 
    #---------------------------------------------------------------------------- 
    case 1: 
        $target = "/var/lib/symcon/"; 
        $back   = "$base/var.symcon.$day.tar"; 
        $task   = "tar -cPf $back $target"; 
        
        $return_0 = false; 
        if (file_exists ($back)) {
            system("rm $back", $return_0);
        } 
        if ($return_0) { 
            IPS_LogMessage("Backup", "Löschen $back fehlerhaft!"); 
        } 
        // Backup durchführen 
        system($task, $return_0); 
        if ($return_0) { 
            IPS_LogMessage("Backup", "Backup $target fehlerhaft!"); 
        }
        else {
            if(!ftp_upload($base, $back)) {
                IPS_LogMessage("Backup", "FTP Upload von $back fehlerhaft!"); 
            }
        }
        IPS_RunScriptEx($_IPS['SELF'], ['STEP' => 2]); 
        return; 
    #---------------------------------------------------------------------------- 
    # Symcon /usr/share-Verzeichnis sichern; Basisdaten zusammenstellen 
    #---------------------------------------------------------------------------- 
    case 2: 
        $target = "/usr/share/symcon/"; 
        $back   = "$base/usr.symcon.$day.tar"; 
        $task   = "tar -cPf $back $target"; 
        
        $return_0 = false; 
        if (file_exists ($back)) {
            system("rm $back", $return_0);
        }
        if ($return_0){ 
            IPS_LogMessage("Backup", "Löschen $back fehlerhaft!"); 
        } 
        // Backup durchführen 
        system($task, $return_0); 
        if ($return_0) { 
            IPS_LogMessage("Backup", "Backup $target fehlerhaft!"); 
        }
        else {
            if(!ftp_upload($base, $back)) {
                IPS_LogMessage("Backup", "FTP Upload von $back fehlerhaft!"); 
            }
        }
        IPS_RunScriptEx($_IPS['SELF'], ['STEP' => 3]); 
        return; 
    #---------------------------------------------------------------------------- 
    # Symcon Programm sichern; Basisdaten zusammenstellen 
    #---------------------------------------------------------------------------- 
    case 3: 
        $version = IPS_GetLiveUpdateVersion(); 
        $version = explode(",",$version)[0]; 
        $version = IPS_GetKernelVersion()."-".$version; 
        
        $target = "/usr/bin/symcon"; 
        $back   = "$base/symcon.$version.tar"; 
        $task   = "tar -cPf $back $target"; 
        // Backup durchführen 
        if (file_exists ($back)){ 
            // IPS_LogMessage("Backup","Backup $back existiert bereits ;-)"); 
            IPS_LogMessage("Backup","Backup erfolgreich!"); 
        }
        else { 
            system($task, $return_0); 
            if ($return_0){ 
                IPS_LogMessage("Backup","Backup $target fehlerhaft!"); 
            }
            else{ 
                if(!ftp_upload($base, $back)) {
                    IPS_LogMessage("Backup", "FTP Upload von $back fehlerhaft!"); 
                }
                else {
                IPS_LogMessage("Backup","Backup erfolgreich!"); 
                }
            } 
        } 
        return; 
} 

function ftp_upload($base, $file)
{
    $remote = str_replace($base, '/Backup/symcon', $file);
    $server = "ftpserver"; // HIER Server eintragen (Name oder IP)
    $uname  = "ftpuser"; // HIER FTP User eintragen
    $passwd = "ftppasswd"; // HIER FTP Kennwort eintragen
    // set up basic connection
    $con = ftp_connect($server);
    // login with username and password
    $res = ftp_login($con, $uname, $passwd);
    // upload a file
    if (ftp_put($con, $remote, $file, FTP_BINARY)) {
        $res = true;
    } else {
        $res = false;
    }
    // close the connection
    ftp_close($con);
    // return result
    return $res;
} 

################################################################################
?>

Gruß Heiko

1 „Gefällt mir“

Hallo,

hast aber ziemlich aufwendig gebaut finde ich, aber wenns funktioniert.

Mein Backup des Linux-Containers ist eine 5-Zeiler:

  • symcon stoppen
  • tar der /var/lib/symcon - Verzeichnisses in eine lokales Verzeichniss
  • symcon starten
  • rsync auf meine NAS
  • find um alle Dateinen aus dem lokalen Verzeichniss älter x Tage zu löschen.

Software-Verzeichniss sichere ich nicht, die sind durch Neuinstallation schneller und sauber wieder aufzugebaut.

Ist etwas abgewandelt aus dem Vorschlag aus der Symcon-Doku.

Habe das Script probiert. Es erstellt die 3 Dateien,

jedoch bekomme ich eine Fehlermeldung.

Mein NAS ist eine NTFS-Platte an einer Fritzbox gemountet mit:

mount -t cifs -o user=EG-HWR-HA-RPI-Symcon-1-L,password=Passwort#,rw,file_mode=0777,dir_mode=0777,vers=3.0,noserverino //192.168.4.1/EG-WZ-NW-AP-AVM-L-W /mnt/NAS

Mit freundlichen Grüßen
Peter

Der Grund steht in der zweiten Zeile „Permission denied“, vermuttlich hat der User, mit dem du ftp machen will die die notwendigen Rechte die Datei zu lesen oder aufs Zielsystem zu schreiben.

So habe ich das auch verstanden. Jedoch kommt die Meldung NACHDEM die Dateien auf das NAS geschrieben wurden. Diese sind auch vollständig.

Oder meinst du noch was Anderes?

Mit freundlichen Grüßen
Peter

Kann ich dir aus der ferne nicht sagen, was da schief läuft.
Zeile 144 im Script ist ftp_put und irgentwas passt da nicht mit den Rechten. Vielleicht können die Dateien nicht überschrieben werden.

Ich habe jetzt mal das originale Script von @Silberstreifen probiert und das funktioniert fehlerfrei.
Der Unterschied ist meiner Meinung nach, dass @pitty die Funktion „function ftp_upload“ hinzu gefügt hat, jedoch verstehe ich nicht warum.

Wenn ich die Dateien in /mnt/NAS/… schreibe, sind die schon auf der Platte, da muss doch im Nachhinein nichts mehr per ftp machen…

eigentlich nicht, aber FTP ist so eine Sache für sich, war schon immer etwas eigenartig.
Wundert mich, das noch jemand es heute nutzt :slight_smile:

Ich ziehe rsync vor, gepaart mit Publickey und dann brauch ich auch keine Passwörter in Scripten usw.

Ein Beitrag wurde in ein existierendes Thema verschoben: [Modul] Backup (FTP/FTPS/SFTP)