Dateisynchronisierung mit Filen-CLI auf macOS
Filen ist ein »verschlüsselter Cloud-Speicher für
Privatpersonen«. Ich plane, pCloud durch Filen zu ersetzen.
Leider ist die Zero-Knowledge-macOS-App von Filen knapp 800
Megabyte groß. Aber es gibt ja noch filen-cli.
Und das will ich mir als einfachen Hintergrundprozess
einrichten.
In GitHub sowie über die Docs steht Filen-CLI als Download zur Verfügung.1 Wie die Authentifizierung funktioniert und Sync-Paare und Backups angelegt werden können, ist in der Dokumentation sehr gut mit Beispielen beschrieben.
Inhalt
- AppleScript trifft Filen-CLI
- Quasi im Hintergrund
- Die Skripte
- Vorteile und Nachteile dieser Methode
- Bonus: Einfacher Upload
AppleScript trifft Filen-CLI
Als Sync-Paare habe ich sowohl ein paar iCloud-Ordner als
cloudToLocal angelegt sowie ein Verzeichnis, das
ich als twoWay so verwenden möchte, wie vorher
den pCloud-Sync.
Nun gilt es, Filen-CLI so zu starten, dass ich es später jederzeit wieder beenden kann – beides durch Skripte, die ich über das Skriptmenü aufrufe.2
Die Theorie: filen sync --continuous
in AppleScript durch do shell script starten und
laufen lassen. Ganz einfach.
Die Praxis: do shell script wartet,
bis die Ausführung beendet ist. Das heißt, das Skript hängt,
da in diesem Fall die Ausführung kontinuierlich läuft und nie
endet.
Quasi im Hintergrund
In Bash können mit dem Zusatz
> /dev/null 2>&1 & sämtliche
Ausgaben und Fehlermeldungen ins Nichts geleitet werden. So
blockiert der Befehl nicht die Shell. Allerdings lässt er sich
nun auch nicht mehr einfach so beenden.
Um den Prozess später beenden zu können, muss er erstmal
wiedergefunden werden. Dabei hilft ps. Mit dem
Argument aux werden alle Prozesse (a) mit und (x)
ohne Terminal des (u) aktuellen Users gelistet. Um Filen zu
finden, kann die Ausgabe der Prozessliste mit
grep durchsucht werden.
Die folgende Suche
grep '[f]ilen sync --continuous' fördert dann den
Filen-Prozess zutage – sofern er läuft.3 Der Komplette Aufruf
lautet dann
ps aux | grep '[f]ilen sync --continuous'. Ist
das Ergebnis 0 bzw. leer, dann läuft Filen-CLI nicht.
Andernfalls wird ein Text mit der Bezeichnung des Prozesses
zurückgegeben.
In AppleScript muss also nur mittels try
versucht werden, das Ergebnis des Aufrufs einer Variable
zuzuweisen. Schlägt dies fehl, ist der Prozess nicht
aktiv.
Wird der Prozess gefunden, so kann er mit
killall filen beendet werden. Fertig.
Mit diesen Erkenntnissen lassen sich einfache Skripte schreiben, die den Filen-Sync starten und beenden können.
Im Ordner /Users/username/Library/Scripts
abgelegt, stehen die Skripte dann im Skriptmenü zur Verfügung.
Möchte man den Sync automatisch beim Login starten, so kann
das Start-Skript in den Systemeinstellungen als Anmeldeobjekt
eingerichtet werden.
Die Skripte
Hier folgen nun die beiden Skripte. Diese können Wahlweise
als Text (.applescript) oder als Skript
(.scpt) gespeichert werden. Beides funktioniert
sowohl im Skriptmenü als auch in den Anmeldeobjekten beim
Login.
Starten von Filen-CLI
on run
try
-- Läuft Filen bereits?
set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
display dialog "Filen läuft bereits." with title "Filen"
on error errTxt number errNum
-- Nein. Jetzt starten.
do shell script "/usr/local/bin/filen sync --continuous > /dev/null 2>&1 &"
try
-- Testen, ob Filen läuft und Meldung ausgeben.
set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
display dialog "Filen sync gestartet." with title "Filen"
end try
end try
end run
Beenden von Filen-CLI
on run
try
-- Läuft Filen?
set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
display dialog "Filen sync läuft. Jetzt beenden?" with title "Filen" buttons {"Abbrechen", "Beenden"} default button 1
set theresult to button returned of the result
-- Soll Filen beendet werden?
if theresult is "Beenden" then
do shell script "killall filen"
try
set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
display dialog "Fehler beim Beenden." with title "Filen"
on error errTxt number errNum
-- Filen wurde erfolgreich beendet.
display dialog "Filen sync beendet." with title "Filen"
end try
end if
end try
end run
Vorteile und Nachteile dieser Methode
Es ist eine einfache Lösung, die für meinen Anwendungsfall völlig ausreicht. Darum benötige ich auch nur rudimentäre Fehlerprüfungen.
Also Zero-Knowledge-Ansatz taugt die Lösung nicht.
Es ist nicht sichtbar, ob der Sync-Prozess läuft. Die Nutzung
von killall ohne Prozess-ID birgt außerdem das
Risiko, dass ein anderer Filen-Prozess beendet wird. Eleganter
wäre es natürlich, über die API von Filen zu gehen und selbst
einen Filen-Client zu schreiben. Aber, wer weiß, vielleicht
ist das eine Aufgabe für langweilige und verregnete
Herbstabende.
Bonus: Einfacher Upload
Nachdem die Synchronisierung und die Backups im täglichen Betrieb mit den Skripten gut funktionieren, hat mir doch noch eine einfache Upload-Möglichkeit für Dateien und Ordner gefehlt.
Dazu braucht es nur Automator mit einem kurzen Bash-Skript – und fertig ist die Schnellaktion für den Finder.
In Automator einen neuen Workflow erstellen. Unter Utilities das Modul Run Shell Script wählen und festlegen, dass der Workflow Dateien und Ordner akzeptiert, und zwar im Finder. So kann später eine beliebige Datei oder ein Ordner gewählt und im Kontextmenü dann über die Schnellaktion Filen-Upload hochgeladen werden.
Das Shell-Skript-Modul muss Eingaben als Argumente
akzeptieren. Das Argument wird dann im Skript als
$1 verarbeitet. – Das heißt, hier wird immer nur
eine Datei oder ein einzelner Ordner akzeptiert.
Die folgenden Zeilen sind das gesamte Shell-Skript. Es wird geprüft, ob ein Ordner oder eine Datei ausgewählt wurde. Ist es ein Ordner, wird zuerst ein neuer Ordner in Filen angelegt und dann alles dorthin hochgeladen. Ist es eine Datei, so wird diese direkt hochgeladen.
Bei mir habe ich dazu in Filen den Ordner
/upload eingerichtet, in dem dann alles abgelegt
wird.
if [[ -d $1 ]]; then
/usr/local/bin/filen mkdir /upload/$(basename $1)
/usr/local/bin/filen upload $1 /upload/$(basename $1)/
else
/usr/local/bin/filen upload $1 /upload/
fiSpeichern. Fertig.
Bevor ich es in
/usr/local/binkopieren und nutzen konnte, musste ich mittelsxattr -rcmacOS’ Sicherheitsbedenken zerstreuen und es durchchmod +xausführbar machen.↩︎Das Skriptmenü lässt sich über die Einstellungen im AppleScript Editor aktivieren.↩︎
In verschiedenen Beispielen wird die Verwendung der eckigen Klammern empfohlen, damit
grepsich nicht selbst in den Ergebnissen finden kann.↩︎
Das Artikelbild wurde mit folgendem ChatGPT-Prompt generiert: »I need the photographic image of a black cat with yellow eyes. The cat is sitting on the keyboard of a MacBook Air M2 right in front of the display. The cat stares directly at the camera. It’s a cozy home office at night with warm ambient lighting, bookshelves, and a softly blurred city skyline through a window.«