Automator: autom. FTP Upload, wenn Ordner gefüllt wird - nur wie?

applefischi

applefischi

Mitglied
Thread Starter
Dabei seit
20.04.2007
Beiträge
87
Reaktionspunkte
3
Hallo Leute,

ich brauche mal Hilfe von Automator/AppleScript/Mac OS X Checkern..

Ich suche eine Lösung, um PDF Dateien von einem Lokalen Ordner auf ein FTP Ziel im Internet automatisiert hochladen zu lassen, sobald eine PDF Datei dort abgelegt wird.

Übertragungsmethode erfolgt Authentifiziert mit Username + Passwort, aber soweit ich weiß nicht als SFTP.
Hintergrund: Jeder x-Beliebige hochwertigere Multifunktionsdrucker kann Scan2FTP. Allerdings habe ich hier einige Multifunktionsdrucker, die keine Scan2FTP Funktion implementiert haben, sondern nur Scan2SMB.

Unter Windows habe ich ein Programm (DropIt) gefunden, welches diese Aufgabe erledigt. Dort wird alle 10sec geprüft ob PDF Dateien in einem vorher definierten Ordner vorhanden sind. Wenn ja, werden diese anschließend auf das FTP Ziel kopiert und nach erfolgreicher Übertragung Lokal gelöscht. (also keine Synchronisation!)
Dies muss auch nur in eine Richtung erfolgen - von Lokal zu FTP Ziel.

Leider habe ich für Mac OS X noch kein solches Programm gefunden.
Kann mir jemand helfen so etwas evtl. mit dem Automator zu lösen?

Vielen Dank schon mal im Vorraus.
 
Man kann mit launchd Verzeichnisse überwachen:

Angenommen, du willst das Verzeichnis "Drucker0815" in deinem Benutzerordner überwachen.
Im Folgenden hat der Drucker die IP 192.168.1.100, der Zielpfad dort ist /wohin/es/muss/.


FTP (ungetestet):
Kopiere dieses Skript in den Skript-Editor, passe die Variablen dir und drucker an, und sichere es z.B. als /Users/applefischi/bin/ftp0815.scpt
Code:
on run
    set dir to "/Users/applefischi/Drucker0815/*.pdf"
    set drucker to "user:passwort@192.168.1.100:/wohin/es/muss/"

    try
        set out to do shell script "/usr/bin/ftp -u " & drucker & " " & dir & " 2>&1"
    on error eStr number eNum
        set theMSG to eStr & return & eNum & return & out
        display notification theMSG with title ("FTP Fehler") subtitle ("Drucker0815")
        return
    end try

    -- Verzeichnis leeren
    do shell script "/bin/rm -f " & dir & "*.pdf"

end run

Als nächstes in einen Editor deiner Wahl folgendes kopieren, unter ProgramArguments den Namen des obigen Skripts und unter WatchPaths den Pfad des zu überwachenden Ordners anpassen, und z.B. unter /Users/applefischi/Library/LaunchAgents/local.ftp0815.job.plist speichern (Der Pfad ist allerdings vorgegeben):
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.ftp0815.job</string>
    <key>Program</key>
    <string>/usr/bin/osascript</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/applefischi/bin/ftp0815.scpt</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>StandardErrorPath</key>
    <string>/tmp/local.ftp0815.job.plist.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/local.ftp0815.job.plist.stdout</string>
    <key>WatchPaths</key>
    <array>
        <string>/Users/applefischi/Drucker0815/</string>
    </array>
</dict>
</plist>

Dann noch im Terminal die plist laden:
Code:
launchctl load ~/Library/LaunchAgents/local.ftp0815.job.plist

Jetzt sollten alle pdf Dateien, die nach /Users/applefischi/Drucker0815/ kopiert werden, per ftp auf den Drucker übertragen und danach gelöscht werden. Die plist wird jedesmal, wenn du dich anmeldest, automatisch geladen.


sftp (getestet):

Der sftp benötigt eine Steuerdatei. Kopiere folgendes in eine Datei, z.B. /Users/applefischi/sftp0815batch und passe den zu überwachenden Ordner an:
Code:
put /Users/applefischi/Drucker0815/*.pdf
!rm -f /Users/applefischi/Drucker0815/*.pdf
quit

Als nächstes in einen Editor deiner Wahl folgendes kopieren, unter ProgramArguments den Namen der obigen Datei sowie den Drucker und unter WatchPaths den Pfad des zu überwachenden Ordners anpassen, und z.B. unter /Users/applefischi/Library/LaunchAgents/local.ftp0815.job.plist speichern:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.ftp0815.job</string>
    <key>Program</key>
    <string>/usr/bin/sftp</string>
    <key>ProgramArguments</key>
    <array>
        <string>-q</string>
        <string>-b</string>
        <string>/Users/applefischi/sftp0815batch</string>
        <string>user:passwort@192.168.1.100:/wohin/es/muss/</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>StandardErrorPath</key>
    <string>/tmp/local.ftp0815.job.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/local.ftp0815.job.stdout</string>
    <key>WatchPaths</key>
    <array>
        <string>/Users/applefischi/Drucker0815/</string>
    </array>
</dict>
</plist>

Dann noch im Terminal die plist laden:
Code:
launchctl load ~/Library/LaunchAgents/local.ftp0815.job.plist


Anmerkungen:
In dem Applescript beim ftp bzw. in der plist des sftp stehen Benutzer und Passwort für den Drucker. Da sollte man sich noch Gedanken zu machen, je nachdem in welcher Umgebung (eigener Rechner / Firmen Rechner) das laufen soll.

Die launchd plist lassen sich hervorragend mit dem Programm launchctl erstellen / testen / laden. Das kostet Geld, lässt sich aber voll funktionstüchtig als "Shareware" mit homebrew installieren (es fragt beim beenden, ob man kaufen will). Der Autor unterhält auch mit http://launchd.info/ eine sehr gute Informationsseite zum Thema. Dort kannst du auch nachlesen, was zu tun ist, wenn das für alle Benutzer funktionieren soll.

Zur Fehlersuche folgendes:
einmal im Terminal den Exit Code der letzten Ausführung abfragen:
Code:
launchctl list | grep "local.ftp0815.job.plist"
-    0    local.ftp0815.job.plist
Die 0 steht für erfolgreich, eine (positive) Zahl für einen Fehler. (siehe auch http://launchd.info/)
Dann sind da noch die Dateien /tmp/local.ftp0815.job.stderr und /tmp/local.ftp0815.job.stdout, in die die Jobs ihren Output schreiben.
 
Sieh dir mal Synany an -> https://www.syncany.org

Das hat nicht nur eine schöne GUI, es kann auch echten bidirektionalen Sync (nicht dieses Master-Slave-Sync wie bei den ganzen auf rsync basierenden Tools), hat eine Vielzahl an Sync-Zielen (von FTP, SFTP über Dropbox & Co bis hin zu beliebigen webDAV-Servern) und verschlüsselt die Daten lokal _bevor_ sie auf einen externen Dienst hochgeladen / gesynct werden.

Die Version 0.4.7 kann beim Starten unter unglücklichen Umständen mal hängen bleiben, dass kannst du aber ganz einfach selbst wiedergegeben. Wenn du es nutzen willst, sag Bescheid, dann poste ich die Lösung hier.
 
sync hat er ja ausgeschlossen.
ich würde mir da ein simples shellscript mit ftp upload && rm bauen, verpackt in ein on-idle-applescript.
---
in den beispielen in #3 fehlt process locking, wenn launchd mit watchpaths benutzt werden soll.
wildcard-löschen ist eine ganz schlechte idee - während des uploads können doch neue dateien eintreffen.
auch sftp braucht keine steuerdatei:
Code:
# upload
sftp user@host:remote_dir <<< 'put local_file'
# virtual batch file
sftp -b <(echo ls -al) user@host:remote_dir
meistens geht auch scp, statt sftp.
 
Zuletzt bearbeitet:
Zurück
Oben Unten