Apple OS X: Scripten mit AppleScript

Hi@all! Der Automator unter Mac OS X ist eine schöne Sache – aber kommt auch an Grenzen. Das habe ich recht schnell feststellen müssen, als ich Laufzeitfehler und nervige Fehlermeldungen bezüglich nicht vorhandener Netzlaufwerke erhalten habe. Die Laufwerke waren tatsächlich nicht erreichbar, da das NAS aus war, allerdings ist es mir nicht gelungen, einen Timeout zu setzen, der die Zeit bis zur Fehlermeldung nach Nichterreichen einer Netzwerkressource unter Mac OS X kürzt.

Also habe ich mich etwas mit AppleScript auseinandergesetzt und siehe da: Es funktioniert sogar. Zumindest in einem kleinen, selbst geschriebenen Dienst, der die Konnektivität zum Internet prüft und im Falle eines Ausfalls Alarm schlägt.

Hier mein erstes, kleines Script zum Prüfen, ob die Internetverbindung noch aktiv ist:
on run {input, parameters}
set internetconnect to 1
repeat while internetconnect is 1
try
do shell script “ping -c 4 8.8.8.8”
delay (3)
set internetconnect to 1
on errorset internetconnect to 0
say “You have been disconnected”
delay (10)
set internetconnect to 1
end try
end repeat
return input
end run

Workflow im Automator
In diesem Script werden ICMP-Pakete an Google (IP 8.8.8.8) gesendet, um die Verfügbarkeit zu gewährleisten. Treten dabei Fehler auf, wird die Variable internetconnect dem Wert 0 zugeordnet, was die While-Schleife unterbricht. Aus diesem Grund wird hier eine Audioausgabe mit dem Befehl “say” aufgerufen, um den Nutzer zu informieren, dass die Verbindung nicht mehr aktiv ist. Danach wird der Variable wieder der Wert 1 zugeordnet, damit die Bedingung der While-Schleife erfüllt ist und weitere Pings gen Google abgesetzt werden. Um mein eigentliches, ursprüngliches Problem zu lösen, brauchte ich etwas mehr Zeilen, bin aber dennoch mit dem Ergebnis ganz gut zufrieden. Nun werde ich über eine kurze Benachrichtigung in der Mitteilungszentrale über den Verbindungsstatus informiert – je nach Erfolg des Mountens. Wenn ein Verbindungsaufbau nicht zustande kommt, muss nun nicht mehr ein Timeout per default abgewartet werden – zumindest nicht für jedes Share, sondern nur insgesamt, da im Finder-Aufruf jedes Share einzeln in einer If-Schleife verkettet ist, die nur den Aufruf beinhaltet und nicht die Serverabfrage, die in OS X in dem Mountprozess integriert ist. Das verkürzt die Wartezeit erheblich.

Hier der Quelltext (IP-Adressen und Anmeldeinformationen geändert):

on run {input, parameters}
## Verzögerung von 5 Sekunden nach Start 
## (Entlastung der Startprozesse beim Systemstart)
delay 5
try
## ping Richtung NAS 
set thePing to do shell script “/sbin/ping -o -c 5 192.168.66.6”
## Aufruf der Anwendung Finder
tell application “Finder”
## gemountete Laufwerke werden in mounted_Disks als String aufgeführt
set mounted_Disks to list disks
–display dialog result as string
–set to every disk whose (ejectable is true)
## Der String mounted_Disks wird auf Übereinstimmung mit Shares geprüft
if mounted_Disks does not contain “media” then
mount volume “smb://AnnaNAS/media” as user name “User” with password “usrkey”
end if
if mounted_Disks does not contain “bilder” then
mount volume “smb://AnnaNAS/bilder” as user name “User” with password “usrkey”
end if
if mounted_Disks does not contain “share” then
mount volume “smb://AnnaNAS/share” as user name “User” with password “usrkey”
end if
if mounted_Disks does not contain “daten” then
mount volume “smb://AnnaNAS/daten” as user name “User” with password “usrkey”
end if
if mounted_Disks does not contain “bilder” then
mount volume “smb://AnnaNAS/bilder” as user name “User” with password “usrkey”
end if
if mounted_Disks does not contain “backup” then
mount volume “smb://AnnaNAS/backup” as user name “User” with password “usrkey”
end if
## Benachrichtigung in Mitteilungszentrale mit Text, Titel und Untertitel,
## Verbindung erfolgreich
display notification “Alle eigenen Shares sind jetzt verfügbar.” with title “AnnaNAS verbunden” subtitle “Protokoll: smb User: $user”
end tell
on error
## Benachrichtigung in Mitteilungszentrale mit Text, Titel und Untertitel,
## Verbindung nicht erfolgreich
display notification “AnnaNAS kann nicht verbunden werden.” with title “AnnaNAS verloren” subtitle “Protokoll: ICMP”
end try
return input

end run

Und so sah das Endergebnis aus: Entweder verbunden und eine positive Meldung oder nicht verbunden und eine Info, dass keine Verbindung zum NAS möglich war. Hier seht ihr die positive Benachrichtigung und die eingebundenen Shares.

Erfolgreicher Verbindungsaufbau: Laufwerke gemountet und Benachrichtung in Mitteilungszentrale über den Erfolg. So wünscht man sich das! ©2014 by nugaxstruxi
Andere Lösungsansätze? Schreibt´s in die Kommentare! In der Programmierung gibt es keinen falschen Code, solange er funktioniert. Unterschiede ergeben sich nur in Design, Umfang und  den teils sehr unterschiedlichen Ressourcenanforderungen an die Hardware.

Euer

nugaxstruxi
Eingefügte Screenshots sind vom Autor erstellt und unterliegen dem Copyright. 
© by nugaxstruxi