Aktionen

Windows:FTP-Verzeichnisse per Batch sichern, in ein Archiv packen und Status mit Logfile per Email versenden

Aus znilwiki

Ich habe mir einen kleinen Heimserver aufgebaut (der im gegensatz zu seinem Vorgänger nun 24x7x365 in Betrieb ist) und wollte auf diesen das znilwiki-Webverzeichnis nun regelmäßig sichern lassen.
Dabei hatte ich die folgenden Ansprüche an diese Sicherung:

  • Regelmäßiges, automatisches herunterladen
    • per Windows Aufgabenplanung / geplante Tasks wäre ok
    • Mein (gekauftes) Backup-Programm konnte es leider nicht direkt
  • Packen des heruntergeladenen Ordners in ein Archiv
    • Alleine diese Webseite besteht zur Zeit aus über 10.000 Dateien in 2.000 Ordnern (ja ja, die ganzen Screenshots und Skripte ...)
    • Robocopy sitzt bei Kopierjobs sonst minutenlang nur an meinen Websicherungen ...
  • Benachrichtigung per Email über Erfolg / Misserfolg mit angehängtem Log
    • Bin ich von BackupExec so gewohnt ...

Herausgekommen ist dabei nachfolgendes Script - Viel Spaß damit :-)
PS: Falls Ihr die ältesten Backup-Archiv-Dateien regelmäßig auch per Batch löschen wollt - schaut mal hier: Dateien die älter sind als X Tage per Skript / Batch löschen


Voraussetzungen

Dieses Script besteht hinterher aus 2 Dateien:

  • dem Script Backup_FTP_Folders.CMD selbst
  • der Datei FTP-Folders.txt in die zu sicherenden FTP-Pfade stehen

Der Pfad zur FTP-Folders.txt kann im Script angepasst werden - oder das Script kann auch auf die Datei verzichten und die Pfade werden direkt im Script hinterlegt. Ihr findet einen entsprechenden Bereich mit Kommentaren im Script.

Es werden die folgenden Hilfsprogramme benötigt:


Im Script könnte ihr an zentraler Stelle die Pfade zu allen .exe Dateien angeben (oder ihr fügt die Pfade wie ich zur globalen %PATH% Variable hinzu).


Installation

Schritt 1: Ladet euch mein Script herunter (Quelltext siehe weiter unten): Backup_ftp_folders.zip
Schritt 2: Archiv in einen Ordner eurer Wahl entpacken
Schritt 3: Falls ihr weder 7-Zip noch WinRAR installiert habt - entscheidet euch für einen von beiden, ladet diesen herunter und Installiert diesen
Schritt 4: Ladet WGET und installiert es
Schritt 5: Ladet sendEmail herunter und entpackt es in ein Verzeichnis eurer Wahl


Konfiguration

  • Bearbeitet die FTP-Folders.txt und tragt eure FTP-Verzeichnisse ein
    • Einen Ordner pro Zeile
    • Keine(!) abschliessende Leerzeile
    • Nehmt zum Testen einen(!) kleinen(!) Ordner - wenn der Rest funktioniert könnt Ihr alle anderen ja nachtragen
    • Es wird immer der komplette Inhalt des Ordners inklusive aller Unterordner gesichert!
C:\Scripts\FTP-Folder.txt

ftp://ftp.domain.local/Ordner1/
ftp://ftp.domain.local/Ordner2/
ftp://ftp.domain.local/Ordner/Ordner3/



  • Bearbeitet (Rechte Maustaste drauf und Bearbeiten) die Backup_FTP_Folders.CMD und passt folgende Abschnitte an:

Benutzernamen und Passwort für FTP-Zugang

REM Benutzername und Passwort für die FTP-Anmeldung
SET FTPBENUTZER=wgetbenutzer
SET FTPPASSWORT=YJFgpfJKx5r58GaRRLpseL


Pfad zur FTP-Folder.txt

Könnt natürlich auch jeden anderen Namen nehmen :-)

REM Welche Textdatei enthält die Namen der FTP-Ordner die gesichert werden sollen?
REM Hinweis: Ein Host + Ordner pro Zeile, keine leeren Zeilen (auch nicht am Ende!)
REM Beispiel: ftp://ftp.meinserver.local/Verzeichnis/
SET FTPFOLDERDATEI=C:\Skripts\ftp_folders.txt


Pfad Arbeitsverzeichnis/Downloadverzeichnis.txt

Wohin werden die Dateien geladen? Ordner kann dort liegen bleiben können und muss nicht in die Datensicherung / Bandsicherung (dazu nehmen wir das Archiv, geht schneller beim Backup)
Wenn er dort liegen bleiben kann, geht der nächste Durchlauf erheblich schneller weil er dann nur noch abgleichen muss - und nicht mehr neu alles kopieren.

REM Wo soll das Arbeitsverzeichnis liegen? Wenn hierfür keine Datum+Uhrzeits gewählt wird, wird das Verzeichnis bei jedem Durchlauf nur abgeglichen (=schneller)
REM Pfad immer ohne Abschliessendes \ !!!! BACKUPPFAD muss Unterverzeichnis sein, nie Laufwerk direkt nehmen
SET BACKUPLAUFWERK=C:
SET BACKUPPFAD=\WEB-BACKUPS


Pfad Archivdateien

Wohin mit den Archiven? An Namen+Pfad hängen wir später automatisch Uhrzeit und Datum.

REM Wie soll das Archiv heissen (inklusive Pfad)?
REM An den Nachfolgenden Pfad und Namen wird dann noch Datum+Uhrzeit (wenn gewählt) + .rar/.7z/.zip angehängt
REM aus M:\WEB-BACKUPS\znil.net wird also M:\WEB-BACKUPS\znil.net-2012-05-11-20-13.rar (oder .7z / .zip)
SET ARCHIVPFADUNDNAME=M:\WEB-BACKUPS\znil.net


Archivtyp

Je nachdem welchen Packer ihr habt könnt Ihr das Format auswählen.

REM Auswahl des Archiv-Packers / Typ
REM 
REM RAR = .rar = WinRar (Pfad zur rar.exe muss im Script angepasst werden oder WinRar-Verzeichnis in Path-Variable aufnehmen)
REM 7z  = .7z  = 7zip   (Pfad zur 7z.exe muss im Script angepasst werden oder 7zip-Verzeichnis in Path-Variable aufnehmen)
REM ZIP = .zip = ZIP    (Pfad zur 7z.exe muss im Script angepasst werden oder 7zip-Verzeichnis in Path-Variable aufnehmen)
SET ARCHIVTYP=7z

Kleine Entscheidungshilfe:

Ordner mit 185MBytes (212MByte auf Datenträger, 10.628 Dateien) als
.7z  :   84,311 MByte
.rar :   98,822 MByte
.zip :  105,618 MByte
auf der jeweils höchstmöglichen Kompressionsstufe


Pfade zu den Hilfsprogrammen

Damit das Skript die auch alle findet. Zur Erinnerung: Ihr braucht WinRar ODER 7-Zip!

REM Pfade zu rar.exe und/oder 7z.exe, sendemail und wget -> nach Bedarf anpassen.
REM Falls die Verzeichnisse in der %PATH% Variablen stehen entfernen sie alles bis auf die eigentliche EXE Datei
SET wgetEXE="C:\Program Files (x86)\GnuWin32\bin\wget.exe"
SET sevenzipEXE="C:\Program Files\7-Zip\7z.exe"
SET rarEXE="C:\Program Files\WinRAR\rar.exe"
SET sendemailEXE="C:\Program Files (x86)\sendEmail-v156\sendemail.exe"


Email-Setup

Bitte beachtet die Hinweise zu IPv6 im Text!

REM Absender und Empfänger der Status-Email,
REM die LOG-Datei und ob es Fehler gab wird per Email versendet
SET MAILFROM=WGET@znil.org
SET MAILLOGTO=bernhard@znil.de

REM wie heisst der SMTP-Server?
REM Achtung, sendemail ist nicht IPv6 fähig - nicht localhost oder 127.0.0.1 verwenden auf Vista/W7/2008(R2)!
SET SMTPSERVER=192.168.1.80


Datum + Uhrzeit

Ich empfehle: Lasst die Einstellungen so wie sie sind - geht beim Abgleich mit dem FTP-Verzeichnissen am schnellsten!
Das Archiv sichern wir dann im Hauptbackup, den Arbeitsordner lassen wir aus Geschwindigkeits- und Platzggründen weg.

REM Soll im Arbeitsverzeichnis ein Ordner pro Sicherung mit Datum/Uhrzeit verwendet werden? Wenn NEIN wird nicht jedesmal alles kopiert sondern der Ordner nur aktualisiert
REM unbedingt empfohlen NEIN zu nehmen!
SET BENUTZE_DATUM_UHRZEIT_BACKUPPFAD=NEIN

REM Sollen für die Archive an die Dateinamen Datum und Uhrzeit angehängt werden?
REM Unbedingt empfohlen JA zu nehmen!
SET BENUTZE_DATUM_UHRZEIT_RARPFAD=JA


Und los geht es

Nun das Speichern nicht vergessen - und los geht es!
Während WGET arbeitet könnt ihr das oben in der Titelleiste des Fensters sehen. Der Text wird in die Log-Datei umgeleitet.

Habt Ihr Fehler - wird es an einem der von euch verstellten Parametern liegen :-) Fehlersuche: Kommentiert das @echo off am Anfang aus und startet das Script in einer Eingabeaufforderung - so könnt ihr mitlesen.
Eventuell kommentiert ihr auch das Löschen der LOG-Dateien aus - in den steht auch was schief gegangen ist.


Script Quellcode

Erst der Download-Link: Backup_ftp_folders.zip

@echo off
REM ##################################################################################################
REM Sichern von FTP-Verzeichnissen per Batch-Datei
REM Dieses Script lädt das komplette Verzeichnis herunter,
REM Packt das heruntergeladene Verzeichnis in ein Archiv,
REM Sendet eine Email mit Status Erfolge oder Fehlgeschlagen + Log-Datei an gewünschten Empfänger
REM 
REM In dr Konfiguration wie hier wird das Arbeitsverzeichnis nicht gelöscht.
REM dadurch muss in jedem Durchgang nicht alles heruntergeladen werden sondern es wird nur abgeglichen.
REM Die Archive enthalten aber immer alle kompletten Daten für den Durchlauf.
REM
REM Diese Script benötigt noch folgende Zusatzprogramme:
REM WGET, WinRar oder 7zip, SendEmail
REM 
REM Weblinks zu den Programmen (Stand 11.05.2012):
REM WGET:       http://www.gnu.org/software/wget/
REM WinRar:     http://www.winrar.de/
REM 7zip:       http://www.7-zip.de/
REM SendEmail:  http://caspian.dotconf.net/menu/Software/SendEmail/

REM Mai 2012 von Bernhard Linz
REM Bernhard@znil.net
REM Bernhard.Linz@datagroup.de
REM veröffentlicht auf znilwiki: http://znil.net
REM ##################################################################################################
REM ##################################################################################################

REM Benutzername und Passwort für die FTP-Anmeldung
SET FTPBENUTZER=wgetbenutzer
SET FTPPASSWORT=YJFgpfJKx5r58GaRRLpseL
REM Welche Textdatei enthält die Namen der FTP-Ordner die gesichert werden sollen?
REM Hinweis: Ein Host + Ordner pro Zeile, keine leeren Zeilen (auch nicht am Ende!)
REM Beispiel: ftp://ftp.meinserver.local/Verzeichnis/
SET FTPFOLDERDATEI=C:\Skripts\ftp_folders.txt
REM ##################################################################################################
REM ##################################################################################################

REM Wo soll das Arbeitsverzeichnis liegen? Wenn hierfür keine Datum+Uhrzeits gewählt wird, wird das Verzeichnis bei jedem Durchlauf nur abgeglichen (=schneller)
REM Pfad immer ohne Abschliessendes \ !!!! BACKUPPFAD muss Unterverzeichnis sein, nie Laufwerk direkt nehmen
SET BACKUPLAUFWERK=C:
SET BACKUPPFAD=\WEB-BACKUPS

REM Wie soll das Archiv heissen (inklusive Pfad)?
REM An den Nachfolgenden Pfad und Namen wird dann noch Datum+Uhrzeit (wenn gewählt) + .rar/.7z/.zip angehängt
REM aus M:\WEB-BACKUPS\znil.net wird also M:\WEB-BACKUPS\znil.net-2012-05-11-20-13.rar (oder .7z / .zip)
SET ARCHIVPFADUNDNAME=M:\WEB-BACKUPS\znil.net

REM Auswahl des Archiv-Packers / Typ
REM 
REM RAR = .rar = WinRar (Pfad zur rar.exe muss im Script angepasst werden oder WinRar-Verzeichnis in Path-Variable aufnehmen)
REM 7z  = .7z  = 7zip   (Pfad zur 7z.exe muss im Script angepasst werden oder 7zip-Verzeichnis in Path-Variable aufnehmen)
REM ZIP = .zip = ZIP    (Pfad zur 7z.exe muss im Script angepasst werden oder 7zip-Verzeichnis in Path-Variable aufnehmen)
SET ARCHIVTYP=7z

REM Pfade zu rar.exe und/oder 7z.exe, sendemail und wget -> nach Bedarf anpassen.
REM Falls die Verzeichnisse in der %PATH% Variablen stehen entfernen sie alles bis auf die eigentliche EXE Datei
SET wgetEXE="C:\Program Files (x86)\GnuWin32\bin\wget.exe"
SET sevenzipEXE="C:\Program Files\7-Zip\7z.exe"
SET rarEXE="C:\Program Files\WinRAR\rar.exe"
SET sendemailEXE="C:\Program Files (x86)\sendEmail-v156\sendemail.exe"
REM wegtEXE=wget.exe
REM sevenzipEXE=7z.exe
REM rarEXE=rar.exe
REM sendemailEXE=sendemail.exe

REM Absender und Empfänger der Status-Email,
REM die LOG-Datei und ob es Fehler gab wird per Email versendet
SET MAILFROM=WGET@znil.org
SET MAILLOGTO=bernhard@znil.de

REM wie heisst der SMTP-Server?
REM Achtung, sendemail ist nicht IPv6 fähig - nicht localhost oder 127.0.0.1 verwenden auf Vista/W7/2008(R2)!
SET SMTPSERVER=192.168.1.80

REM Soll im Arbeitsverzeichnis ein Ordner pro Sicherung mit Datum/Uhrzeit verwendet werden? Wenn NEIN wird nicht jedesmal alles kopiert sondern der Ordner nur aktualisiert
REM unbedingt empfohlen NEIN zu nehmen!
SET BENUTZE_DATUM_UHRZEIT_BACKUPPFAD=NEIN

REM Sollen für die Archive an die Dateinamen Datum und Uhrzeit angehängt werden?
REM Unbedingt empfohlen JA zu nehmen!
SET BENUTZE_DATUM_UHRZEIT_RARPFAD=JA
SET DATUM_ZEIT_BKP=
SET DATUM_ZEIT_ARCHIV=

REM ##################################################################################################
REM ##################################################################################################
REM Begin des eigentlichen Scripts!
REM ##################################################################################################
REM ##################################################################################################
REM Aktuelles Datum / Zeit ermitteln und in eine für Dateinamen passende Form bringen
REM Schreibweise ist jjjj-mm-tt-mm-hh-ss
setlocal enabledelayedexpansion
SET DATUM_ZEIT=%date:~-4%-%date:~-7,2%-%date:~-10,2%-%time:~-11,2%-%time:~-8,2%-%time:~-5,2%
SET DATUM_ZEIT=!DATUM_ZEIT:^ =0!
setlocal disabledelayedexpansion
IF "%BENUTZE_DATUM_UHRZEIT_BACKUPPFAD%" == "JA" SET DATUM_ZEIT_BKP=\%DATUM_ZEIT%
IF "%BENUTZE_DATUM_UHRZEIT_RARPFAD%" == "JA" SET DATUM_ZEIT_ARCHIV=%DATUM_ZEIT%
SET LOGFILE="%TEMP%\WGET-%DATUM_ZEIT%.txt"
SET LOGFILEGEPACKT="%TEMP%\WGET-%DATUM_ZEIT%"
REM Logfile anlegen (im TEMP-Ordner des Benutzers), löschen wir am Ende wieder
ECHO %DATE% - %TIME% >%LOGFILE%

REM Wenn eines der Programme einen Fehler zurückgibt wirde diese Variable auf JA gesetzt.
REM wird beim versenden der Email ausgewertet für den passenden Betreff
SET GABESFEHLER=NEIN

REM **************************************************************************
REM die mit SET FTPFOLDERDATEI=... oben angegebene Textdatei Zeilenweise einlesen und verarbeiten.
for /F "eol=# tokens=1" %%i in (%FTPFOLDERDATEI%) do call :SCHLEIFE %%i

REM Aufruf der Verzeichniss direkt in diesr Batch, ohne externe Datei mit Liste,
REM Dazu oben das for /F .... auskommentieren und hier für jede FTP-Verzeichnis eine Zeile einfügen
REM CALL :SCHLEIFE ftp://ftp.domain.local/znilwiki-webftp/
REM CALL :SCHLEIFE ftp://ftp.domain.local/mysqldumper/
GoTo VERPACKEN

REM **************************************************************************
:SCHLEIFE
%wgetEXE% --user=%FTPBENUTZER% --password=%FTPPASSWORT% -P"%BACKUPLAUFWERK%%BACKUPPFAD%%DATUM_ZEIT_BKP%" -m "%1" >>%LOGFILE% 2>&1
IF NOT ERRORLEVEL 0 SET GABESFEHLER=JA
GOTO :EOF

REM **************************************************************************
:VERPACKEN
REM WinRar Version (Shareware)(im Verzeichnis in das WinRar installiert wurde gibt es die rar.exe für Commandline)
IF "%ARCHIVTYP%" == "RAR" %rarEXE% a %ARCHIVPFADUNDNAME%-%DATUM_ZEIT_ARCHIV%.rar -ri1 -m5 "%BACKUPLAUFWERK%%BACKUPPFAD%%DATUM_ZEIT_BKP%" >>%LOGFILE% 2>&1
REM 7zip Version (Kostenlos)(im Verzeichnis in das 7zip Installiert wurde gibt es die 7z.exe für Commandline, Achtung richte Version für BS installieren (x32 oder x64))
REM 7zip Archiv erzeugen (kleiner und damit besser als .rar und .zip)
IF "%ARCHIVTYP%" == "7z" %sevenzipEXE% a -mx9 -r -t7z %ARCHIVPFADUNDNAME%-%DATUM_ZEIT_ARCHIV%.7z "%BACKUPLAUFWERK%%BACKUPPFAD%%DATUM_ZEIT_BKP%\*.*" >>%LOGFILE% 2>&1
REM normales ZIP Archiv erzeugen (größer als .7zip oder .rar)
IF "%ARCHIVTYP%" == "ZIP" %sevenzipEXE% a -mx9 -r -tzip %ARCHIVPFADUNDNAME%-%DATUM_ZEIT_ARCHIV%.zip "%BACKUPLAUFWERK%%BACKUPPFAD%%DATUM_ZEIT_BKP%\*.*" >>%LOGFILE% 2>&1
REM auf Fehler prüfen (Rückgabewert der EXE-Dateien ungleich 0)
IF NOT ERRORLEVEL 0 SET GABESFEHLER=JA
GoTo ENDE

REM **************************************************************************
:ENDE
REM Logfile packen bevor wir es an die Email anhängen,
REM wird sonst auch oft sehr groß - aber gut zu packen (10MByte auf wenige hundert Kilobyte)
IF "%ARCHIVTYP%" == "RAR" (
	SET LOGFILEGEPACKT=%LOGFILEGEPACKT%.rar
	%rarEXE% a %LOGFILEGEPACKT% -ri1 -m5 %LOGFILE%
) ELSE IF "%ARCHIVTYP%" == "7z" (
	SET LOGFILEGEPACKT=%LOGFILEGEPACKT%.7z
	%sevenzipEXE% a -mx9 -t7z %LOGFILEGEPACKT% %LOGFILE%
) ELSE IF "%ARCHIVTYP%" == "ZIP" (
	SET LOGFILEGEPACKT=%LOGFILEGEPACKT%.zip
	%sevenzipEXE% a -mx9 -tzip %LOGFILEGEPACKT%.zip %LOGFILE%
)
REM Email versenden mit passenden Betreff
IF "%GABESFEHLER%" == "JA" %sendemailEXE% -f %MAILFROM% -t %MAILLOGTO% -u "WGET FTP-Backup - FEHLER!" -m "Fehler siehe Log-Datei im Anhang" -s %SMTPSERVER% -a %LOGFILEGEPACKT%
IF "%GABESFEHLER%" == "NEIN" %sendemailEXE% -f %MAILFROM% -t %MAILLOGTO% -u "WGET FTP-Backup - ERFOLGREICH!" -m "Details siehe Log-Datei im Anhang" -s %SMTPSERVER% -a %LOGFILEGEPACKT%
REM Aufräumen - Logfile löschen
DEL %LOGFILE%
DEL %LOGFILEGEPACKT%



--Bernhard Linz (Diskussion) 01:34, 12. Mai 2012 (CEST)


Loading comments...