Dropbox-Backup ohne Client

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert