UNIXwork

WebDAV Locks

2017-12-20 18:19:48.0

WebDAV kennt zwei Arten von Locks: Exclusive und Shared Locks. Ein Exclusive Lock wird vom Server pro Resource immer nur einem User gestattet. Dies verhindert effektiv, dass andere User eine Ressource überschreiben. Shared Locks hingegen können von mehreren Usern gleichzeitig erhalten werden. Damit sind Shared Locks kein Schutz davor, dass andere eine Ressource überschreiben, sondern sind eher da, um andere Clients zu informieren, dass die Datei gerade in Bearbeitung ist.

Ein Lock bezieht sich entweder auf eine einzelne Ressource, oder auf ganze Collection. Bei letzterem hat man auch die Wahl, ob nur alle direkten Kind-Ressourcen gelockt werden sollen, oder alles was sich unterhalb der gelockten Collection befindet.

Kann ein Client einen Exclusive Lock erfolgreich erstellen, erhält er vom Server ein Locktoken. Dieses Locktoken muss bei allen Schreiboperationen auf die gelockte Resource angegeben werden.

In dav werden bisher nur Exclusive Locks unterstützt. Hierfür gibt es für das Tool dav die Befehle lock und unlock, um Resourcen zu sperren oder zu entsperren. Das Tool dav-sync kann bei Bedarf auch die ganze Collection locken, in dem man die passende Option angibt oder in der Konfigurationsdatei Locking aktiviert.

Um mit dav eine Ressource zu sperren benutzt man den Befehl lock und übergibt die URL der Ressource. Optional kann auch ein Lock-Timeout angegeben werden. Wenn die Ressource erfolgreich gelockt werden konnte, wird auf stdout das Locktoken ausgegeben.

$ dav lock myserv/file.txt
opaquelocktoken:cde48dcb-c860-0512-a770-x38b4f980dbc

Das Locktoken muss man unbedingt irgendwo speichern oder es muss im Terminal zumindestens in Sichtweite bleiben. Denn verliert man das Locktoken ist vor Ablauf des Timeouts kein Schreibzugriff auf die Ressource mehr möglich, was ungünstig bei einem unendlichen Timeout ist. In diesem Fall müsste der Serveradministrator im Webserver den Lock entfernen.

Hat man nun das Locktoken, kann dies bei allen dav-Befehlen, die Schreibvorgänge ausführen, angeben. Also z.B. um eine gelockte Ressource zu überschreiben, gibt man mit der -L Option das Locktoken an:

$ dav put -L opaquelocktoken:cde48dcb-c860-0512-a770-x38b4f980dbc myserv/file.txt localfile.txt

Eine Ressource unlocken kann man mit dem unlock Befehl. Dabei muss auch das Locktoken angegeben werden. Falls nicht mit der -L Option angegeben wird, liest dav von stdin das Locktoken.

$ dav unlock -L opaquelocktoken:cde48dcb-c860-0512-a770-x38b4f980dbc myserv/file.txt

Es ist empfehlenswert, das Locktoken direkt in einer Datei zu speichern.

$ dav lock myserv/file.txt > locktoken
$ dav put -L `cat locktoken` myserv/file.txt uploadthisfile.txt
$ dav unlock myserv/file.txt < locktoken

Um in dav-sync WebDAV-Locks zu nutzen, kann man entweder bei den Synchronisationskommandos (pull, push, archive) die Option -l angeben, oder man aktiviert standardmäßig Locking für das Sync-Verzeichniss, in dem man in der Datei $HOME/.dav/sync.xml innerhalb eines <directory>-Elements folgendes einfügt:

<directory>
    ...
    <!-- enable lock for pull command -->
    <lock-pull>true</lock-pull>

    <!-- enable lock for push/archive command -->
    <lock-push>true</lock-push>
</directory>

Natürlich ist es auch möglich, nur pull oder nur push mit Lock zu nutzen.

Wenn dav-sync die Collection lockt, wird im Verzeichnis $HOME/.dav temporär eine Datei (locktoken-$syncdir.txt) angelegt, die das Locktoken enthält. Sollte dav-sync unerwartet beendet werden, kann man somit noch manuell die Collection unlocken. Wenn dav-sync sauber terminiert, wird automatisch die Collection entsperrt und die temporäre Datei entfernt.

Autor: Olaf | 0 Kommentare | Tags: dav, webdav

dav 1.1 veröffentlicht

2017-10-07 11:32:07.0

Es ist an der Zeit für ein dav Minor-Update. Dieses beinhalt hauptsächlich kleine neue Features sowie ein paar Detailänderungen und einen kritischen Bugfix.

Neu bei dav-sync ist, dass der Synchronisationsvorgang mit SIGINT (Ctrl+C) sauber abgebrochen werden kann. Die aktuelle Datei wird noch zuende gedownloadet bzw geuploadet und danach das Programm beendet. Beim nächsten pull/push wird dann der Rest synchronisiert.

Desweiteren gibt es jetzt für dav-sync das archive Kommando, was nur geänderte oder neue Dateien auf den Server uploadet, jedoch keine Dateien auf dem Server löscht.

Neu bei dav ist das remove-property Kommando. Um den Umgang mit Properties zu erleichtern können nun auch XML-Namespaces in der config.xml Datei mit dem neuen <namespace>-Element konfiguriert werden, so dass man bei den Befehlen nur noch einen benutzerdefinierten Prefix angeben muss.

Sowohl dav als auch dav-sync können jetzt auch WebDAV-Locks mit Timeout erstellen.

Eine vollstände Liste der Änderung gibt es in der CHANGELOG-Datei.

Downloads gibt es hier oder auf Sourceforge. Die Dokumentation liegt dem Quellcode bei und ist auch online verfügbar.

Autor: Olaf | 0 Kommentare | Tags: dav, webdav, sync

dav Properties

2017-09-10 19:36:49.0

WebDAV-Properties sind Metadaten, die jede Resource haben kann. Da WebDAV XML-basiert ist, hat der Name einer Property immer einen XML-Namespace, und der Inhalt kann beliebige XML-Daten enthalten. Man unterscheidet zwischen Live-Properties, die vom Server berechnet werden oder eine vorgeschriebene Syntax haben, und Dead-Properties, die beliebige Daten enthalten können. Beispiele für Live-Properties sind der Etag (getetag) oder das Änderungsdatum (getlastmodified).

Nicht alle Server unterstützen das Speichern von Dead-Properties. Mit Apache funktioniert es jedoch problemlos. Auch OwnCloud bzw NextCloud unterstützen es und lighttpd auch, falls das entsprechende Feature mitkompiliert wurde.

Für den Zugriff auf Properties hat dav mehrere Befehle. Mit dav info können alle Properties einer Resource aufgelistet werden.

$ dav info myserver/file.txt
name: file.txt
path: /file.txt
url:  https://myserver/file.txt
type: resource
size: 72 KiB

namespace: DAV:
  creationdate: 2015-10-11T16:22:09Z
  getcontentlength: 73921
  getcontenttype: text/plain
  getetag: "120c1-521d69d4d6397"
  getlastmodified: Sun, 11 Oct 2015 16:22:09 GMT
  supportedlock: 

namespace: http://apache.org/dav/props/
  executable: F

namespace: http://example.com/ns
  myprop: Hello World

Für den Zugriff auf einzelne Properties gibt es die Befehle get-property, um den Inhalt einer Property anzuzeigen, und set-property, um den Inhalt zu ändern.

set-property verlangt als Argumente eine URL, den Property-Namen. Als drittes Argument kann auch der Wert angegeben werden, der dieser Property zugewiesen werden soll. Wird jedoch keiner angegeben, liest dav diesen von stdin. Desweiteren sollte auch mit der -n Option ein Namespace-URI angegeben werden, falls nicht der Default-Namespace DAV: verwendet werden soll.

Das folgende Beispiel setzt für eine Resource die Property myprop im Namespace http://example.com/ns mit dem Value Hello World.

$ dav set-property -n http://example.com/ns myserver/file.txt myprop "Hello World!"

Den Inhalt anzeigen kann man dann mit get-property. Die Argumente sind genau wie bei set-property, nur dass kein Value angegeben wird.

$ dav get-property -n http://example.com/ns myserver/file.txt myprop
Hello World

Aktuell hat dav noch die Limitierung, dass keine XML-Values bei Properties unterstützt werden. Sollte also eine Property nicht nur einfachen Text, sondern XML-Daten enthalten, wird der Inhalt nicht angezeigt.

Autor: Olaf | 0 Kommentare | Tags: dav, webdav

dav 1.0 veröffentlicht

2017-08-13 13:19:45.0

Nach langer Entwicklungszeit kann ich jetzt endlich dav 1.0 veröffentlichen. Dabei handelt es sich um einen Kommandozeilen-WebDAV-Client. Mit dabei ist auch das Tool dav-sync, welches lokale Verzeichnisse mit WebDAV-Server synchronisieren kann.

Neben der Grundfunktionalität wie Dateien up- und downloaden, Collections zu durchsuchen und was man sonst noch so mit WebDAV anstellen kann, bietet dav zwei besondere Features.

Das erste ist, dass man in einer Konfigurationsdatei die Zugriffsinformationen für seine WebDAV-Server, auf die man oft zugreifen will, hinterlegen kann. Das klingt zwar trivial, ich wollte es allerdings erwähnen, da es einen das Leben deutlich vereinfacht. Statt langen URLs muss man dann nur noch den Server-Alias und optional einen Pfad angeben.

Das eigentliche Killer-Feature ist jedoch die integrierte clientseitige AES-Verschlüsselung. Dateien können on-the-fly beim uploaden verschlüsselt werden und beim downloaden werden diese Dateien auch automatisch entschlüsselt. Neben den Dateiinhalten kann auch der Dateiname verschlüsselt werden. Die Benutzung von dav mit aktivierter Verschlüsselung unterscheidet sich dabei kaum.

Das zweite Programm ist dav-sync, für bidirektionale Dateisynchronisation. Ein häufiges Problem von Synctools ist Datenverlust, daher lag mein Fokus darauf genau das zu verhindern. Falls Dateien auf beiden Seiten verändert wurden, wird dies selbstverständlich beim Synchronisieren erkannt. Für zusätzliche Sicherheit sorgt aber ein Trash-Verzeichnis. Wann immer dav-sync Dateien löschen möchte, werden diese dann in dieses Verzeichnis verschoben. Optional können auch Dateien, bevor sie mit einer Version vom Server überschrieben werden, dorthin verschoben werden.

Genau wie dav unterstützt auch dav-sync clientseitige Verschlüsselung. Dateisynchronisierung über einen fremden Cloud-Server ist somit sicher.

Beide Programme kommen in einem Paket und können hier oder auf SourceForge gedownloadet werden. Auf SourceForge gibt es auch Windows Binaries.

Die Dokumentation liegt dem Quellcode bei und ist auch online verfügbar.

Autor: Olaf | 1 Kommentare | Tags: dav, webdav, curl, shell