Nein, ist er nicht, da noch keine 3 Leute Ihre Scripts eingereicht haben.
Vermute aber auch, dass das hier wohl nie nen Ende nimmt, deswegen zieh ich vermutlich meinen Beitrag zurück und veröffentliche den bei mir selbst.
Nein, ist er nicht, da noch keine 3 Leute Ihre Scripts eingereicht haben.
Vermute aber auch, dass das hier wohl nie nen Ende nimmt, deswegen zieh ich vermutlich meinen Beitrag zurück und veröffentliche den bei mir selbst.
Ahjo dann geh ich demnaechst mal basteln
Dann hab ich mich auch mal rangesetzt und ein simples Script entworfen.
Dieses Script packt die Ordner in ein tar.gz Archiv und kontrolliert dann per MD5 Hash, ob das Archiv auf den Backup-Server identisch ist. Ist dieser identisch, wird das Archiv nicht hochgeladen. Sollte es nicht identisch sein, wird das Archiv hochgeladen.
Hier das Script:
ZitatAlles anzeigen<?php
// FTP Daten vom Backup Server
$ftp['host']="HOST";
$ftp['user']="USER";
$ftp['pass']="PASSWORT";
// Wo sollen die tar.gz's und MD5 Dateien gespeichert werden?
$tmp="/tmp/";
// WICHTIG: Beim ersten Paket muss immer statt $i++ $i=0 stehen!
// So in etwa (Beispiel):
$i=0;
$tar[$i]['name']="config.tar.gz";
$tar[$i]['dir'][]="/etc/postfix";
$tar[$i]['dir'][]="/etc/courier";
$tar[$i]['dir'][]="/etc/spamassassin";
$tar[$i]['dir'][]="/etc/apache2";
$tar[$i]['dir'][]="/etc/bind";
$tar[$i]['dir'][]="/etc/dovecot";
$tar[$i]['dir'][]="/etc/proftpd";
$tar[$i]['par'][]="";
$i++;
$tar[$i]['name']="var.tar.gz";
$tar[$i]['dir'][]="/var";
$tar[$i]['par'][]="--exclude=/downloads/";
//////////////////////////////////////////////////////////////////
function md5_dir($dir) {
if (!is_dir($dir)) {
return @md5_file($dir);
}
$filemd5s = array();
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if ($entry != '.' && $entry != '..') {
if (is_dir($dir.'/'.$entry)) {
$filemd5s[] = MD5_DIR($dir.'/'.$entry);
} else {
$filemd5s[] = md5_file($dir.'/'.$entry);
}
}
}
$d->close();
return md5(implode('', $filemd5s));
}
for($i=0;$i<count($tar);$i++) {
echo "creating ".$tar[$i]['name']."... ";
$directory="";
$md5list=array();
foreach($tar[$i]['dir'] as $dir) {
$directory.=" ".$dir;
$md5list[]=md5_dir($dir);
}
shell_exec("tar cfz ".$tmp.$tar[$i]['name'].$directory." ".$tmp.$tar[$i]['par']." &> /dev/null");
echo "done.\n";
echo " calculating MD5: ";
$tar[$i]['md5'] = md5(implode('', $md5list));
echo $tar[$i]['md5']."\n";
}
echo "\n";
echo "connecting to ftp server... ";
$ftp['conn'] = @ftp_connect($ftp['host']);
if($ftp['conn']) {
echo"done.\n";
echo"logging in... ";
} else {
die("error.\n");
}
$login = ftp_login($ftp['conn'], $ftp['user'], $ftp['pass']);
if($login) {
echo"done.\n";
} else {
die("error.\n");
}
echo "\n";
for($i=0;$i<count($tar);$i++) {
echo "trying to get '".$tar[$i]['name'].".md5'... ";
$result = @ftp_get($ftp['conn'],$tmp.$tar[$i]['name'].".md5","md5/".$tar[$i]['name'].".md5",FTP_ASCII);
if($result) {
echo"done.\n";
$md5=file_get_contents($tmp.$tar[$i]['name'].".md5");
if($md5 == $tar[$i]['md5']) {
$upload=false;
echo" MD5 match (".$md5.")\n";
} else {
$upload=true;
echo" MD5 missmatch (".$md5." != ".$tar[$i]['md5'].")\n";
}
} else {
echo"error.\n";
$upload=true;
}
if ($upload) {
echo "uploading '".$tar[$i]['name']."'... (".round((filesize($tmp.$tar[$i]['name']) / 1024 / 1024),2)." MB) ";
ftp_put($ftp['conn'],"$tar[$i]['name'],$tmp.$tar[$i]['name'],FTP_BINARY);
echo "done.\n";
echo "uploading '".$tar[$i]['name'].".md5'... ";
$fp=fopen($tmp.$tar[$i]['name'].".md5","w");
fwrite($fp,$tar[$i]['md5']);
fclose($fp);
ftp_put($ftp['conn'],"md5/".$tar[$i]['name'].".md5",$tmp.$tar[$i]['name'].".md5",FTP_BINARY);
echo "done.\n";
}
}
ftp_close($ftp['conn']);
echo"\n";
echo"ready.\n";
echo"\n";
?>
Das einzige was zusätzlich noch benötigt wird, ist ein Ordner am FTP-Server namens "md5". Dort werden die md5 Hashes des vorigen Archives gespeichert und von dort abgeglichen.
Getestet und funktioniert. Verwende es selber
Hier noch ein anderer Vorschlag für ein Shell-Backup-Script, wobei dieses spontan mal herunter geschrieben wurde(!!).
Meine wenigen Tests zeigten jedoch, dass es so funktionieren sollte.
Funktionen:
* MySQL-Datenbanken werden bis zu 7 Tage in die Vergangenheit gespeichert (Speichername: <datenbank>.<datum>.<tag>.tar.gz)
* Systemdateien werden gespeichert und, sofern noch nicht im Backupverzeichnis vorhanden und Dateien verändert wurden, in dieses verschoben (Speichername: <sektionsname>.tar.gz). Sektion wird aus der Config-Datei gezogen...
Zitat von backup.shAlles anzeigen
#!/bin/sh
###########################################################
### DE: Bitte Arbeitsverzeichnisse und Dateien anpassen ###
### EN: Please set working-directories and files ###
BACKUPDIR='.'
TMPDIR='/tmp'
INIFILE='./config.ini'
###########################################################
DATE=`date +%Y-%m-%d_%Hh%Mm`
DOW=`date +%A`
parse_ini_file() {
INI_FILE="$1"
INI_SECTION="$2"
if [ '$INI_SECTION' = 'mysql' ]
[ '$INI_SECTION' = 'directories' ]; then
sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/;.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\'']*\)$/\1=\"\2\"/" \
< $INI_FILE \
| sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}" \
| sed -e "s/^\(.*\)='\(.*\)'$/\2/g"
else
sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/;.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\'']*\)$/\1=\"\2\"/" \
< $INI_FILE \
| sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}"
fi
}
### parse MYSQL-Block
for i in $(parse_ini_file $INIFILE mysql); do
for x in $(parse_ini_file $INIFILE $i); do
eval $x
done
eval rm -fv "$BACKUPDIR/*.*.$DOW.*" #.tar.gz
mysqldump --user=$username --password=$password --host=$hostname $database > $TMPDIR/sql.tmp
tar cvzf $BACKUPDIR/$database.$DATE.$DOW.tar.gz $TMPDIR/sql.tmp
rm $TMPDIR/sql.tmp
done
### parse DIRECTORIES-Block
for i in $(parse_ini_file config.ini directories); do
DIRS=""
for x in $(parse_ini_file config.ini $i); do
eval ${x//*=/pfad=}
DIRS="$DIRS $pfad"
done
tar cvzf $TMPDIR/$i.tar.gz $DIRS
TRANSFER=1 # 1=true
if [ -f $BACKUPDIR/$i.tar.gz ];
then
#md5sum -b $BACKUPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md51.tmp
#md5sum -b $TMPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md52.tmp
wc -c $BACKUPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md51.tmp
wc -c $TMPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md52.tmp
md5C=$(diff $TMPDIR/md51.tmp $TMPDIR/md52.tmp)
if [ '$md5C' = '' ];
then
TRANSFER=0
fi
rm -f $TMPDIR/md51.tmp $TMPDIR/md52.tmp
fi
if [ '$TRANSFER' = '1' ]; then
mv $TMPDIR/$i.tar.gz $BACKUPDIR/$i.tar.gz
else
rm $TMPDIR/$i.tar.gz
fi
done
Und hier die Config-Datei:
Zitat von config.iniAlles anzeigen
; Dies ist ein Beispiel für eine Konfigurationsdatei
; Kommentare beginnen wie in der php.ini mit ';'
[code=sql]
part1 = 'mysql1'
;part2 = 'directories'
[directories]
dir1 = 'dir1'
[mysql1]
hostname = 'localhost'
username = 'username'
password = 'userpassword'
database = 'database'
[dir1]
server = '/home/user/directory1'
xyy = '/home/user/directory2'
Zur Config-Datei ist zu sagen: Die Sektionen [code=sql] und [directories] dürfen nicht in ihrem Namen verändert werden und diese geben hinter dem Gleichheitszeichen an, welche anderen Sektionen als mySQL-Backup oder File-Directory geparst und gebackuped werden sollen.
In den MySQL-Serverdefinitionen (hier z.b. die Sektion [mysql1]) müssen die Schlüsselnamen erhalten bleiben! In den Directory-Sektionen spielen die Schlüsselnamen wiederrum keinerlei rolle. Die Pfadangaben sind interessant.
Ich hoffe das Script ist als Idee für den Wettbewerb als (3.?) Vorschlag auch genehmigt und zugelassen?
// Edit:
Hab grad gesehen, dass der Backupspace gar nicht auf den eigenen Server geschaltet wird und man da via FTP rauf soll/muss/darf ?!?
Eine Unwissenheit zum Produkt steht bei mir etwas im Raum. Wenn dem so ist, dann müsste das Skript wie folgt angepasst werden:
* "Inkrimitätscheck": Entfernte Dateigröße muss via WGET geholt werden (bei großer Datengröße doof) oder man loggt sich via FTP auf dem System ein und holt sich via FTP-Kommando SIZE(file), sofern in FTP-Software auf entfernten System verfügbar, die Dateigröße. Alternative wär die Dateigröße in einem Hilfsordner des Backupskriptes auf dem lokalen Server wegzuspeichern. Ziel war es jedoch die Hilfsdateien gering zu halten. Man muss ja keinen "Datenmüll" produzieren, wenn man sich die Daten auch dynamisch holen kann.
* Datei speichern: Hier darf nicht mehr lokal gespeichert, sondern muss die Datei auf ein entferntes System geschrieben werden, mittels z.B. FTP-Konnektion oder WPUT.
Also alles kein Zauberwerk - die Ergänzungen. Aber als Ideenvorschlag, wie es funktionieren kann, ist hier das Skript.
Steht ja auch nicht wirklich in der Wettbewerbsausschreibung dabei, dass es sich um ein entferntes FTP-System handelt (außer eben wenn man mal auf den Link zum Blogeintrag klickt).
Dann ist der Wettbewerb jetzt wohl vorbei?
Grüße
Gibts hier eigentlich mal ne Rückmeldung seitens Netcup?!
Leider ist das Thema etwas im Sande verlaufen.
Alle die hier eine Anleitung gepostet haben (mehr als drei sind es ja leider nicht), können sich beim Support den versprochenen Gewinn abholen.
Vielen Dank für die guten Anleitungen!
Zitat von [netcup] Felix;21834Ja, dahinter stehen wieder komplexe Vereinbarungen mit unseren Versicherungen. Unsere Haftpflicht setzt als Bedingung voraus, dass alles auf unseren Websites (Forum ausgeschlossen), unser Eigentum ist. Auch Überwacht ein Rechtsanwalt unser geistiges Eigentum.
Dann spraeche ja prinzipiell nix gegen eine Auftragsarbeit fuer Netcup, welche dann seitens Netcup unter der GPL veroeffentlicht wuerde.
Nur meine 2 Cent...
hallo.
hier noch ein backup script primär für froxlor installationen.
nix weltbewegendes aber es tut bei mir auf meinen servern ganz gut seine dienste
grüße
#!/bin/bash
###############################################
# Froxlor Backupscript v1.0 #
# (c) 2011 dominic1134 #
# released under the w00t r00t lulz - #
# do what ever the f4k you want - license #
###############################################
#Use at your own risk! No warranty! #
# Depencies: tar, bzip2, mysqldump, gpg, ftp #
###############################################
# Mysql settings
# zum Backupen der DBs
mysql_host="localhost"
mysql_user="root"
mysql_pass="pass"
# Backup-ftp settings
ftp_host="backup.myftp.com"
ftp_user="root"
ftp_pass="w00t"
# Backup-Dirs: Verzeichnisse die gesichert werden sollen
# Achtung auf die Schreibweise ohne Slashes --> Um beispielsweis den Ordner und alle Dateien u. Unterordner unter /home/somebody/ zu sichern --> home/somebody
backupdirs="etc var/www var/customers tmp/backup/sqlbackups" # den pfad tmp/backup/sqlbackups nur entfernen, wenn keine sql backups gesichert werden sollen
# Ausnahmen: Verzeichnisse/Dateien oder Filetypes die beim Sichern nicht berücksichtigt bzw. bewusst ausgelassen werden
# Auch hier Achtung auf die Schreibweise, ebenfalls keine führenden Slashs (/) , einzelne Filetypes werden mit --exclude=*.txt und ganze Ordner mit --exclude 'some/dir' exkludiert.
excludedirs="--exclude 'var/www/cp/packages' --exclude 'var/www/cp/temp' --exclude 'var/customers/logs' --exclude 'var/customers/tmp' --exclude=*.log --exclude=*.tmp --exclude=*.cache"
# GPG Einstellungen
# Um die Backups via GPG zu verschlüsseln, muss der gewünschte
# Public Key der zur Verschlüsselung verwendet werden soll erst via gpg --import
# importiert und via gpg --edit-key ge-signed werden
gpgencrypt="0"# GPG Verschlüsselung der Backups aktivieren/deaktivieren
gpgencryptkey="8E8E5700"# Die ID des Pubkeys, z.B. 8E8E5700..
# etc
tmpbkpath="/tmp/backup"# Temporärer Ordner für Backup (wird nach jedem Backupvorgang gelöscht)
logfile="/root/backup.log"# Pdaf zum Logfile welches angelegt wird
keepbkps="3"# Backups älter als 3 Tage automatisch vom Backup-FTP löschen
# variablen
# (nur bearbeiten wenn man weiß was man tut)
bkpfile=""$(date +%d_%m_%Y)"_"$(hostname)".tar.bz2"
oldbkpfile=""$(date --date="$keepbkps days ago" +%d_%m_%Y)"_"$(hostname)".tar.bz2"
timestap="[$(date +%d.%m.%Y" "%H:%M:%S)]"
###############################################
############ STARING BACKUP TASKS #############
###############################################
# Logentry start
echo "$timestap Starting new backup job $bkpfile" >> $logfile
# Create a tempdir
echo -ne "$timestap *** Creating temporary backup directory... " >> $logfile
if [ -d "$tmpbkpath" ];
then rm -rf $tmpbkpath && mkdir $tmpbkpath && echo "OK" >> $logfile
else mkdir $tmpbkpath && echo "OK" >> $logfile
fi
###############################################
############# EXPORT MYSQL DUMPS ##############
###############################################
# Dump MySQL databases
echo -ne "$timestap *** Dumping Mysql-databases... " >> $logfile
mkdir $tmpbkpath/sqlbackups
dbsc="$(mysql -u $mysql_user -h $mysql_host -p$mysql_pass -Bse 'show databases')"
for db in $dbsc
do
if [ "$db" != "information_schema" ];
then mysqldump -u $mysql_user -h $mysql_host -p$mysql_pass $db > $tmpbkpath/sqlbackups/$db.sql
fi
done
# Check if we have some dumps
if [ $(ls $tmpbkpath/sqlbackups -1 | wc -l) != 0 ];
then echo "OK" >> $logfile
else echo "FAILED! Aborting backup!" >> $logfile && rm -rf $tmpbkpath && echo "$timestap Backup task $bkpfile FAILED!" >> $logfile
fi
###############################################
##### ARCHIVING, COMPRESSING AND CHECKING #####
###############################################
# Archiving and compressing
echo -ne "$timestap *** Compressing Backup archive file... " >> $logfile
tar cfj $tmpbkpath/$bkpfile -C / $backupdirs $excludedirs
if [ "$?" = "0" ];
then echo "OK" >> $logfile
else echo "FAILED! Aborting backup!" >> $logfile && rm -rf $tmpbkpath && echo "$timestap Backup task $bkpfile FAILED!" >> $logfile
fi
# Archive consistency check
bzip2 -t $tmpbkpath/$bkpfile
if [ "$?" = "0" ];
then echo "$timestap *** Checking backupfile for consistency... OK" >> $logfile
else echo "FAILED! Aborting backup!" >> $logfile && rm -rf $tmpbkpath && echo "$timestap Backup task $bkpfile FAILED!" >> $logfile
fi
###############################################
############ GPG FILE ENCRYPION ###############
###############################################
# Encrypt backup only if gpgencrypt is enabled in the settings
if [ "$gpgencrypt" = "1" ]; then
echo -ne "$timestap *** Encrypting the Backup file with GPG... " >> $logfile
gpg -r $gpgencryptkey -o $tmpbkpath/$bkpfile.gpg -e $tmpbkpath/$bkpfile
if [ "$?" = "0" ];
then echo "OK" >> $logfile && rm -f $tmpbkpath/$bkpfile && bkpfile=$bkpfile.gpg
else echo "FAILED! Aborting backup!" >> $logfile && rm -rf $tmpbkpath && echo "$timestap Backup task $bkpfile FAILED!" >> $logfile
fi
fi
###############################################
############## FTP FILE TRANFER ###############
###############################################
echo -ne "$timestap *** Transfering backupfile via ftp to $ftp_host... " >> $logfile
ftp -n $ftp_host <<XYZ
quote USER $ftp_user
quote PASS $ftp_pass
binary
lcd $tmpbkpath
del $oldbkpfile
put $bkpfile
quit
XYZ
if [ "$?" = "0" ];
then echo "OK" >> $logfile
else echo "FAILED! Aborting backup!" >> $logfile && rm -rf $tmpbkpath && echo "$timestap Backup task $bkpfile FAILED!" >> $logfile
fi
###############################################
################ CLEANUP ######################
###############################################
# Cleanup
echo -ne "$timestap *** Cleaning up temporary directory... " >> $logfile
rm -rf $tmpbkpath
if [ -d "$tmpbkpath" ];
then echo "FAILED!" >> $logfile
else echo "OK" >> $logfile
fi
# Exit
echo "$timestap Backup task $bkpfile finished" >> $logfile
echo "" >> $logfile
exit
Alles anzeigen
Ich teste das gerade mal aus.
Ich hab auch ein Backup-Script, das werde ich bald möglichst mal passend hier herrichten und hier posten.