Der offizielle Dropbox Client unter Linux hat ja ein paar kleine Speicherprobleme (und auch andere Probleme), daher hab ich mich nach einer anderen Lösung umgesehen, meine Backups in die Dropbox zu schieben. Den ersten Ansatz habe ich auf der Seite von Andrea Fabrizi gefunden: Dort gibt es ein Script, mit dem Uploads in die Dropbox auch ohne Client möglich sind.
Das Script lädt die Datei mit cURL über die offzielle Website hoch. Nicht wirklich eine saubere Lösung, funktioniert aber perfekt. Naja, fast: Über die Website sind nur Uploads bis 150MB möglich, meine Backup-Zips sind aber inzwischen schon 188MB groß (ich blogge zu viel ;)). Daher habe ich mir ein kleines Script gebastelt, das die Dateien durchgeht, und alle die größer als 100MB sind, mit Hilfe von split in Teile á 100MB schneidet. Dabei wird dann einfach ein fortlaufender Buchstabe an den Dateinamen angehängt. Dazu habe ich das Upload Script noch so modifiziert, das es Dateien, die größer als 100MB sind, gar nicht erst hoch lädt (da sie eh nicht verarbeitet werden).
Als drittes im Bunde habe ich dann noch ein kleines Script das einen Dump der Datenbank erstellt, und zu guter Letzt noch ein Script, das alle die kleinen anderen Scripte der Reihe nach aufruft (und dabei noch ein VERBOSE Option zum testen durchreicht).
Mit diesem System habe ich jetzt meine Backups hoffentlich im Griff 😀 Bash-Scripting ist nicht wirklich mein Lieblingsthema… Aber ich hatte jetzt auch keine Lust das in C++ zu machen 😛
Soviel zur Theorie, hier sind die ganzen Skripte:
Der Dump der Datenbank:
/usr/bin/mysqldump --all-databases --user=backup --password=verratichnicht > /var/backup/sqldump/backup_full_`date "+%y_%m_%d"`.sql
Das Zerteilen der Dateien in kleine Stücke:
#!/bin/bash function split_dir { for i in *; do if [ -f "$i" ]; then FILESIZE=$(stat -c%s "$i") if [ $FILESIZE -gt "104857600" ]; then if [ $VERBOSE -eq 1 ]; then echo "$1 is too big, splitting" fi split -a 1 -b 100M $i `basename $i`_ fi fi if [ -d "$i" ]; then local OLD_PWD=$(pwd) cd "$i" split_dir "$1/$i" cd "$OLD_PWD" fi done } cd $1 split_dir $1
Mein modifizierter Dropbox-Uploader: (Nur als Diff, sonst ist das ewig viel Text, das Original gibst hier)
26,27c26,27 < LOGIN_EMAIL="ich@ich.de" < LOGIN_PASSWD="supergeheim" --- > LOGIN_EMAIL="" > LOGIN_PASSWD="" 90c90 < --- > 101,107c101,102 < FILESIZE=$(stat -c%s "$UPLOAD_FILE") < < if [ $FILESIZE -gt 104857800 ]; then #file to big for upload (slighly more than 100M < print "$UPLOAD_FILE is too big, ignoring." < else < curl $CURL_PARAMETERS -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DEST_FOLDER" -F "t=$TOKEN" -F "file=@$UPLOAD_FILE" "$UPLOAD_URL" < grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null --- > curl $CURL_PARAMETERS -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DEST_FOLDER" -F "t=$TOKEN" -F "file=@$UPLOAD_FILE" "$UPLOAD_URL" > grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null 109,116c104,108 < if [ $? -ne 0 ]; then < print " Failed!n" < if [ $END_ON_UPLOAD_ERROR -eq 1 ]; then < remove_temp_files < exit 1 < fi < else < print " OKn" --- > if [ $? -ne 0 ]; then > print " Failed!n" > if [ $END_ON_UPLOAD_ERROR -eq 1 ]; then > remove_temp_files > exit 1 117a110,111 > else > print " OKn"
Und jetzt noch das eigentliche Skript, das alle aufruft, und dabei die -v Option durchreicht:
#!/bin/bash #Helper scripts that calls all the backupscripts. #-dumps all MySQL DBs #-split big zip files in /backup #-uploads all to dropbox VERBOSE=0 #if the first argument is -v, the verbose mode for this scritp, and all scripts called is enable if [ "$1" == "-v" ]; then VERBOSE=1 fi #create the MySQL dump if [ $VERBOSE -eq 1 ]; then echo "Doing DB Dump..." fi ./backup_db.sh #split big files if [ $VERBOSE -eq 1 ]; then echo "Splitting files..." fi env VERBOSE=$VERBOSE ./split_files.sh /var/backup #upload all if [ $VERBOSE -eq 1 ]; then echo "Starting upload..." ./dropbox_uploader.sh -f /var/backup -d /ServerBackup -v else ./dropbox_uploader.sh -f /var/backup -d /ServerBackup fi #done if [ $VERBOSE -eq 1 ]; then echo "Done!" fi
Die Krönung wäre jetzt noch ein kleines Programm, das die Dateien auf meinem Rechner erkennt, wieder zusammensetzt, und in die Dropbox schiebt. Aber das kann ich immer noch machen, wenn ich das Backup mal brauche 🙂
Mal sehen, wie sich mein Sammelsurium von Skripten so macht!