Dropbox/Ubuntu One & Co effektiv einsetzen

Schon allein wenn man gerade mal mit 2 Rechner regelmäßig abwechselnd arbeitet, ist es lästig die Konfigurationen beider einigermaßen synchron zu halten. Eine kleine Änderung hier, eine kleine Änderung dort und schon ist es passiert und man hat sich wieder unterschiedliche Einstellungen eingehandelt.

An Hand der Datei .profile welche sich direkt im home-Verzeicnis des Nutzers befindet, möchte ich hier einmal beschreiben wie sich diese Datei über mehrere Linux-Rechner mit Hilfe von Cloud-Diensten wie Dropbox, Ubuntu One & Co synchron halten lässt.

Vorraussetzung für das weitere Vorgehen ist ein fertig eingerichteter Cloud-Dienst (hier Dropbox). Der Dropbox-Ordner lautet im Folgenden ~/Dropbox.

Dropbox synchroniert alle Dateien, die sich innerhalb des Ordners ~/Dropbox befinden. Wir müssen also als erstes die Datei .profile in den Dropbox-Ordner kopieren. Da ich diesen Ordner selbst als Linux-Home-Verzeichnis ansehe, kopiere ich diese Datei direkt nach ~/Dropbox. Die Datei wird jetzt synchronisiert, liegt aber leider nun doppelt auf dem System vor, nämlich in ~/ sowie in ~/Dropbox. Also weg mit der Original-Datei.

Da aber nun das System die Datei, “versteckt” im Dropbox-Ordner nicht mehr finden wird, müssen wir nun noch einen symbolischen Link erstellen mit

ln -s ~/Dropbox/.profile ~/.profile

Jetzt ist die Welt für unser Linux-System wieder in Ordnung – die Datei kann wieder gefunden werden. Auf diese Art und Weise kann man jetzt eine ganze Reihe von Konfigurationsdateien in die Dropbox verschieben. Das ganze ist natürlich genauso mit Ordner möglich.
comments: true

Was mir allerdings noch als sehr umständlich erscheint, ist das manuelle anlegen der einzelnen Links an den Ursprungsort der Dateien. Hierzu habe ich mir ein kleines Skript geschrieben, dass selbst im Ordner ~/Dropbox/Bin liegt und die Links für mich erstellt.

#!/bin/bash
# config file
    linkedFolders=~/Dropbox/Bin/linksToDropbox.txt
    for line in $(less ${linkedFolders})
    do
        # get source for the new link and expand '~'
        source=$(echo ${line} | cut -d ";" -f 1)
        eval source=${source}
        # get target for the new link and expand '~'
        target=$(echo ${line} | cut -d ";" -f 2)
        eval target=${target}
        # do we need sudo?
        owner=$(echo ${line} | cut -d ";" -f 3)
        # file exists 
        if [ -e ${target} ]; then
currentSource=$(readlink ${target})
            if [ "${currentSource}" = "${source}" ]; then
echo "Link from '${source}' to '${target}' is already there!"
            else
read -p "Link points to another source or target is a regular file. Should I update target '${target}' to a new link pointing to '${source}'? [y/n]: " answer
comments: true
if [ "${answer}" = n ]; then
                    continue
                fi
                if [ "${owner}" = "root" ]; then
sudo rm -rf ${target}
                    sudo ln -s ${source} ${target}
                else
rm -rf ${target}
                    ln -s ${source} ${target}
                fi
            fi
        else
echo "Creating new link from '${source}' to '${target}'."
            if [ "${owner}" = "root" ]; then
sudo rm -rf ${target}
                sudo ln -s ${source} ${target}
            else
rm -rf ${target}
                ln -s ${source} ${target}
            fi
        fi
    done

Die Einlesedatei, die alle zu erstellenden Links enthält, sieht dann so aus:

~/Dropbox/Workspace/;~/Workspace
~/Dropbox/Bin/createLinksToDropbox;/usr/local/bin/createLinksToDropbox;root
~/Dropbox/.Xmodmap;~/.Xmodmap
~/Dropbox/.bashrc;~/.bashrc
 ~/Dropbox/.profile;~/.profile

Der Syntax ist einfach gehalten: Eine Zeile der Datei enthält die Informationen Linkquelle;/Linkziel/;(root). Die dritte Spalte zeigt an, dass für die Erstellung des Links root-Rechte gebraucht werden.

Aber nun zum Skript selbst. Nachdem das Skript die Informationen einer Zeile der eben beschriebenen Datei bekommen hat, untersucht es zunächst, ob bereits eine Datei mit den gleichen Namen wie das Linkziel existiert. Ist das der Fall, so untersuchen wir, ob diese Datei auch ein Link ist, der auf die gleiche Linkquelle zeigt, wie die aktuell zu setzende Linkquelle. Wenn dem so ist, existiert der Link bereits und wir sind mit der ersten Zeile der Link-Datei fertig.

Ist das aber nicht der Fall, so bietet das Skript an, die Datei/den Link zu löschen. Anschließend wird der Link, gegebenenfalls mit Hilfe von sudo, erstellt (Erinnerung: 3. Spalte der Konfigurationsdatei).
comments: true

Der letzte Fall ist der einfachste. Ist noch gar nichts vorhanden, so wird einfach alles neu erstellt. Das Skript und die zugehörige Einlesedatei sind bewusst so einfach wie möglich gehalten. Da von diesen Skript selbst auch ein Link nach /usr/bin/local erstellt wird, reicht in Zukunft ein einfaches createLinksToDropbox im Terminal aus und alle Links werden erstellt.
comments: true

Hier nochmal die Vorteile der Lösung im Überblick:

  • Konfigurationen und oft benötigte Ordner leben in der Cloud
  • ein Dienst synchronisiert bei jeder Änderung diese automatisch mit den Server
  • ein kleines Skript setzt die Links im Linux-System
  • alle Links selbst werden zentral in einer einzigen Datei gepflegt, die wiederum in der Wolke lebt

Was haltet ihr von dieser Lösung? Wie arbeitet ihr effizient mit Cloud-Diensten?