Digitale Bilder, ein Wikibuch/udev
Digitale Bilder, ein Wikibuch: Verzeichnisstruktur - Bilder laden: das Script |
Inhaltsverzeichnis
Einleitung
Das im letzten Kapitel vorgestellte Bashscript automatisiert das Herunterladen und Speichern der Rohbilder. Es wird gestartet mit Hilfe einer Desktop-Datei.
Der Start kann aber auch so gestaltet werden, daß das Script immer dann von alleine losläuft. wenn eine Kamera über USB mit dem PC verbunden und eingeschaltet wird. Sobald die Kamera vom Hotplugging-System des Computers erkannt ist, legt das Downloadscript los.
Dieser Automatismus wird über eine udev-Regel angestossen.
Die udev-Regel
Die Regel
# Wenn´s denn keine Canon ist, Regel beenden ATTR{idVendor} != "04a9", GOTO="foto_end" # Canon EOS 600D SUBSYSTEM=="usb", ACTION=="add", ATTR{idProduct}=="3218", RUN+="/bin/su edgar -c /home/edgar/Scripte/Foto/Herunterladen/aktuell/start_bilder_laden" # Canon EOS 450D SUBSYSTEM=="usb", ACTION=="add", ATTR{idProduct}=="3145", RUN+="/bin/su edgar -c /home/edgar/Scripte/Foto/Herunterladen/aktuell/start_bilder_laden" LABEL="foto_end"
Wohin mit der Regel
Diese Regel wird, z.B. mit kate, in einer Textdatei gespeichert. Sie muß mit root-Rechten in folgendem Verzeichnes erzeugt werden:
/etc/udev/rules.d
Ich habe die Textdatei "20-foto.rules" genannt.
Die Erklärung der Regel
ATTR{idVendor} != "04a9", GOTO="foto_end"
Wenn der Hersteller der angeschlossenen Kamera nicht Canon ist, dann springe direkt zum Ende dieser udev-Regel. Oder anders ausgedrückt: Ich möchte das Download-Script nur dann automatisch starten lassen, wenn der PC eine an den USB-Bus angeschlossene Kamera von Canon erkennt.
SUBSYSTEM=="usb"
Wenn sich auf dem USB-Bus etwas tut
ACTION=="add"
und zwar wenn auf dem Bus ein neu angeschlossenes Gerät erkannt wird
ATTR{idProduct}=="3218"
und wenn dieses Gerät zudem noch auf den Namen "EOS 600D" hört
ATTR{idProduct}=="3145" oder auf den Namen "EOS 450D"
RUN+="..."
dann führe die Anweisung zwischen den Anführungszeichen aus.
/bin/su edgar
Führe diese Anweisung mit den Rechten des Nutzers edgar aus. (Hätte ich meinen Nutzernamen weggelassen, dann würden anstatt meiner Rechte root-Rechte vergeben werden, was ich nicht will. (Es müssen übrigens alle Anweisungen mit vollem Pfadnamen angegeben werden (auch su), sonst tut sich nichts.)
-c /home/edgar/Scripte/Foto/Herunterladen/aktuell/start_bilder_laden"
Die Anweisung lautet, das Start-Script zu starten, welches dann das eigentliche Download-Script anstösst.
Erweiterung der Regel
Diese Regel kann ohne weiteres auf andere Kameras bzw, Hersteller erweitert werden. Notwendig dazu ist jeweils nur die idVendor und die idProduct der hinzuzufügenden Kamera. Der Rest sei der Fantasie des Benutzers überlassen. Diese id´s können übrigens durch ein furchtlos in die Tasten gehacktes:
lsusb -v
ermittelt werden. Das 0x vor der eigentlichen 4stelligen id muß dabei weggelassen werden.
Das Start-Script
Von unserer udev-Regel wird das so genannte Start-Script gestartet (Ein anderer Name ist mir für das Script nicht eingefallen. Aufgabe dieses Scriptes ist nichts anderes, als dem System mitzuteilen, welcher Bildschirm verwendet werden soll, dann das eigentliche Download-Script in einer Konsole als Hintergrundprozeß zu starten und schließlich sich selbst zu beenden.
#!/bin/bash export DISPLAY=:0.0 konsole -e /home/edgar/Scripte/Foto/Herunterladen/aktuell/bilder_laden & exit
Um das ganze nun zum Laufen zu bringen, gibt es ein paar Dinge zu beachten:
Dateirechte
Unsere udev-Regel startet das "Start-Script", welches wiederum das eingentliche "Download-Script" anlaufen lässt. Udev läuft nun mit root-Rechten. Diese Rechte werden an Tochterprozesse weitergegeben (vererbt). Das bedeutet, die von unserem Download-Script heruntergeladenen Bilddateien werden mit einer root-Kennung versehen. Nur der Administrator könnte dann diese Bilder verändern, was ganz gewiss nicht in meinem Sinn ist. Denn ich als user edgar möchte mit diesen Bildern arbeiten, und zwar ohne mich mit Administratorrechten einloggen zu müssen.
Diese Problematik haben wir in der udev-Regel entschärft. Durch das "/bin/su edgar" läuft der gestartete Tochterprozess unter meiner Benutzerkannung. Die heruntergeladenen Photos bekommen meine Kennung und ich kann sie problemlos bearbeiten, verändern, löschen, ganz wie es mir beliebt.
Das Display
Mit /bin/su edgar haben wir das mit den Dateirechten geregelt. Das bedeutet aber noch lange nicht, daß ich als user edgar auch am Bildschirm sehe, ob und was sich da tut. Das möchte ich aber! Die Anweisung
export DISPLAY=:0.0
hilft hier weiter. Nun kann ich alle Meldungen auch auf dem Bildschirm sehen.
Fortschrittsmeldungen
Vor einem Programnm zu sitzen und nicht zu willen, ob es schon arbeitet und wie weit es schon ist mit seiner Arbeit, ist zielmlich ätzend. Deshalb lasse ich das Download-Script in einem Terminal ablaufen und erhalte so alle Meldungen der beteiligten Tools, zum Beispiel der Fortschritt von gphoto2 beim Herunterladen der Bilder. Ich habe das mit folgender Anweisung realisiert:
konsole -e ....
udev freigeben
Das Ganze, was wir bis jetzt kennengelernt haben wird von einer udev-Regel angestossen und läuft deshalb auch als Tochterprozess dieser Regel. Solange dieser Tochterprozess läuft, ist allerdings die udev-Regel für weitere Aktionen lahmgelegt, da sie erst wieder mit dem Beenden des Tochterprozesses freigegeben wird.
Das wird normalerweise kein Problem sein. Wenn ich aber geschätzte 10 Milliarden Rohbilder von der kamera herunterladen will (ja Freunde, die Technik schreitet fort, irgenwann wird´s soweit sein...), könnte das schon mit Unannehmlichkeiten verbunden sein.
Der einfachste Weg ist es, das Hotplugging-System durch das Dazwischenschalten einer , ich habe sie Start-Datei genannt, wieder freizugeben. Dazu genügt ein einziges Zeichen in dieser Datei und natürlich der obligatorisch folgende exit-Befehl:
&
Zusammenfassung
Nochmal im Kurzen, was so alles passiert:
Wir haben eine udev-Regel erzeugt, die immer dann, wenn unsere Kamera erkannt wurde, das Start-Script loslaufen lässt. Dieses Start-Script stösst das eigentliche Download-Script an, beendet sich danach von selbst und gibt damit udev wieder für neue Untaten frei. Das Download-Script schließlich ermittelt selbstständig den Ordner, wo die neuen Bilder hin sollen und läd die Photos in dieses Verzeichnis.
Warnhinweis
Ich möchte ausdrücklich darauf hinweisen, daß das Verändern bzw. Hinzufügen einer udev-Regeln mit gewissen Risiken verbunden ist. Wenn es dumm geht, kann man sein System dadurch so durcheinanderbringen, daß es nicht mehr hochfährt, bzw. die grafische Oberfläche nicht mehr lädt.
Man sollte also genau wissen, was man tut, wenn man hiermit arbeitet. Und man sollte auf keinen Fall irgendwelche Befehle und Regeln gedankenlos auf sein System kopieren. Und wenn tatsächlich einmal etwas schief gelaufen sein sollte, dann solltet ihr euch vorher überlegt haben, wie ihr nötigenfalls gegensteuern könnt.
Die hier von mir vorgestellte Regel ist als Denkansatz gedacht. Sie funktioniert auf meinen System hervorragend. Ich kann und will allerdings nicht garantieren, daß dies auf anderen Systemen ebenso ist. Also seid vorsichtig beim Spielen mit den udev.rules! Alles, was ihr tut, liegt in eurer eigenen Verantwortung.