Funkenstrahlen Podcasting, Netzpolitik, App-Entwicklung

Dropbox Backup auf der Shell

Update: Achtung! Das Skript bricht an allen Ecken und Enden wegen Encoding Fuckups. Ich habe deshalb alles nochmal in Python neu gebaut. Damit ihr euch nicht herumärgert habe ich das alte Skript komplett aus Github herausgeworfen. Zum neuen Skript hier entlang bitte…

Ich habe schon lange die Idee gehabt mal ein regelmäßiges Dropbox Backup anzulegen. Da ich meinen Raspberry Pi als “die Kiste die eben durchläuft” betreibe, sah ich es als ideal, wenn dort einfach nachts die Dropbox weggesichert werden könnte.

Ich musste dann aber relativ schnell feststellen, dass sich die Dropbox Software ohne grafische Oberfläche nicht nutzen lässt und habe mich nach Alternativen umgesehen. Ich habe dabei dann die Dropbox Rest-API entdeckt und auf Github nach Implementierungen dafür gesucht, die sich irgendwie skripten lassen.

Endeckt habe ich dann den Dropbox-Uploader auf Github. Mit diesem Shellskript kann man Dateien aus der Dropbox herunterladen und auch hochladen. Allerdings immer nur eine Datei auf einmal. Ich habe dann beschlossen das Skript ein wenig zu erweitern und einen rekursiven Download der ganzen Dropbox zu implementieren. Die nötigen API-Request waren ja schon vorhanden.

Das fertige Skript findet ihr nun als Fork bei mir auf Github. Wenn ihr das Skript zum ersten Mal ausführt, müsst ihr zunächst einen API Key für die Applikation auf der Dropbox Webseite einrichten:

Dann könnt ihr das Skript mit folgenden Optionen nutzen:

Usage: ./dropbox.sh COMMAND [PARAMETERS]...

Commands:
         upload   [LOCAL_FILE]  <REMOTE_FILE>
         download [REMOTE_FILE] <LOCAL_FILE>
         delete   [REMOTE_FILE]
         list     <REMOTE_DIR>
         backup
         info
         unlink

Nach einigen Bugs mit dem Encoding scheint das Skript jetzt soweit zu funktionieren. Allerdings habe ich bei großen Verzeichnissen das Problem, dass Dropbox sich mit einem “Bad Gateway 501” meldet. Wenn ich den Request, der zum Abbruch des Backups geführt hat dann aber noch einmal manuell ausführe, dann funktioniert das. Vielleicht ein API-Limit von Dropbox? Kennt jemand das Problem bzw. tritt das auch bei euch auf, wenn ihr das Skript ausführt? Ich muss auch dazu sagen, dass über die Uni recht große geteilte Verzeichnisse entstanden sind mit mehreren tausend Dateien. Wäre also gut möglich, dass das Problem bei kleineren Dropboxen nicht auftritt. Bei Problemen könnt ihr im Skript ganz oben DEBUG=0 einfach mal auf DEBUG=1 ändern. Dann lässt sich der Fehler besser eingrenzen.

tl;dr Es hat wohl noch Bugs. Helft mit sie zu finden und sie alle zu knechten.