*gelöst* [udev] USB-Stick anmeldung/abmeldung loggen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

*gelöst* [udev] USB-Stick anmeldung/abmeldung loggen

Beitrag von alex0801 » 23.03.2012 11:43:33

Hallo zusammen,

ich habe eine ähnliche Frage wie hier: http://debianforum.de/forum/viewtopic.php?f=34&t=135180

Nur sind meine Anforderungen etwas anders:

1) Wenn ein USB-Stick eingesteckt wird, soll ein Script aufgerufen werden das USB VendorId, ProductId, sowie Manufacturer, Product und Serial als Parameter mitbekommt.
2) Wenn ein USB-Stick abgezogen wird, soll ein zweites Script, aber mit gleichen Parametern wie das erste aufgerufen werden
3) Vom Einstecken/Abziehen bis zum Aufruf des Scripts sollte es nicht länger als 1,5sek dauern.

Ich hab schon etwas gebastelt und bin nun hier angelangt:

Ich habe eine UDEV Regel eingerichtet die wie folgt aussieht:

Code: Alles auswählen

ACTION=="add", SUBSYSTEMS=="usb", DRIVERS=="usb", RUN+="/etc/udev/scripts/test.sh '$attr{idVendor}' '$attr{idProduct}' '$attr{manufacturer}' '$attr{product}' '$attr{serial}'"
test.sh script:

Code: Alles auswählen

#!/bin/bash
(
    flock -e 200
    TIMESTAMP=`date`
    echo "$TIMESTAMP --- VendorId: [$1] ProductId: [$2] Manufacturer: [$3] Product: [$4] Serial: [$5]" >> /tmp/usb-found
) 200>/tmp/usb-busy.lockfile
flock -u /tmp/usb-busy.lockfile
Das Script wird auch brav aufgerufen. Doch leider mehrfach. Das Script erzeugt testweise folgenden Output in eine Logfile:
Fri Mar 23 11:21:42 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:42 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:42 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:42 CET 2012 --- VendorId: [] ProductId: [] Manufacturer: [] Product: [] Serial: []
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [] ProductId: [] Manufacturer: [] Product: [] Serial: []
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [] ProductId: [] Manufacturer: [] Product: [] Serial: []
Fri Mar 23 11:21:47 CET 2012 --- VendorId: [] ProductId: [] Manufacturer: [] Product: [] Serial: []
Die ersten 4 Zeilen kommen quasi sofort beim einstecken. Passt also. Nur wäre eine einzige Zeile ausreichend. Die restlichen Zeilen stören. Ich tippe mal darauf dass ich meine UDEV Regel weiter eingrenzen muss. Aber mir gehen die Ideen aus. Ich will ind er UDEV Regel mich nicht auf ein spezielles Device festlegen. Ich will einfach von jedem eingesteckten USB-Speicherstick die oben genannten Parameter haben (soweit vorhanden). Und das beim einstecken und auch abziehen.

Hintergrund:

Ich habe eine Anwendung die über USB-Sticks verschiedene Aktionen triggern soll. Dazu soll die Anwendung von außen über eingesteckte und abgezogene Sticks informiert werden. Die Anwendung entscheidet dann selbst welcher Stick beim einstecken und/oder abziehen welche Aktion auslöst.

Nun ergeben sich zwei Fragen:

1) Wie muss ich die UDEV Regel weiter einschränken ohne mich gleich auf einen Stick festzulegen?
2) Falls zu 1) keine Antwort bekannt ist. Mit "udevadm monitor" kann ich UDEV monitoren. Aber leider gibt's da keinen Output mit brauchbaren Informationen wie ich die UDEV Regel weiter einschränken kann. Gibt's eine Möglichkeit etwas detailierter zu monitoren? Evtl. mit einer UDEV Regel die alle Parameter und Attribute über ein run-Script loggt?!

Gruß
Alex
Zuletzt geändert von alex0801 am 23.03.2012 13:37:49, insgesamt 1-mal geändert.

alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

Re: [udev] USB-Stick anmeldung/abmeldung loggen

Beitrag von alex0801 » 23.03.2012 13:37:17

Ich konnte mir beides doch selbst beantworten...

1) Weiter einschränken geht offenbar nicht, ohne gleich an die Attribute des Sticks mit "ATTR{}" ranzugehen.
2) "udevadm monitor --property" liefert mehr Infos. Nach einigem googeln bin ich drauf gekommen, dass die Attribute und noch einige andere Infos zum Device in Umgebungsvariablen gespeichert werden, welche auch im Script zur verfügung stehen.

Hier also die komplette Lösung im testaufbau (benachrichtigung der Anwendung hab ich jetzt mal durch einfaches Logging ersetzt, vielleicht kanns ja jemand gebrauchen):

/etc/udev/rules/10-usb-activity-log.rules

Code: Alles auswählen

# log usb activity with help of script
SUBSYSTEMS=="usb", DRIVERS=="usb", RUN+="/etc/udev/scripts/usb-activity-log.sh"
/etc/udev/scripts/usb-activity-log.sh

Code: Alles auswählen

#!/bin/bash
# Script to log attaching/detaching of USB (memory) sticks
# (c) 2012, alex0801<alex@root1.de>
LOG_FILE="/tmp/usb-activity.log"
LOCK_FILE="/tmp/usb-activity.lock"
DEBUG=0
TIMESTAMP=`date`

# sync file access to $LOG_FILE
(
    flock -e 200
    E=`env`
    if [ "$DEVTYPE" == "usb_device" -a "$ID_BUS" == "usb" -a "$SUBSYSTEM" == "usb" ]; then
        echo "$TIMESTAMP --- Action: [$ACTION] VendorId: [$ID_VENDOR_ID] ProductId: [$ID_MODEL_ID] Manufacturer: [$ID_VENDOR] Product: [$ID_MODEL] Serial: [$ID_SERIAL_SHORT]" >> $LOG_FILE
    fi
#    if [ $DEBUG -eq 1 ]; then
#        echo "ENVIRONMENT Vars:" >> $LOG_FILE
#        echo "$E" >> $LOG_FILE
#        echo "------------------------------------------------------------------------------" >> $LOG_FILE
#    fi
) 200>$LOCK_FILE

# unlock
flock -u $LOCK_FILE
Ausgabe mit zwei verschieden USB-Sticks:
Fri Mar 23 13:29:26 CET 2012 --- Action: [add] VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano_Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 13:29:27 CET 2012 --- Action: [remove] VendorId: [0718] ProductId: [063e] Manufacturer: [Imation] Product: [Nano_Pro] Serial: [07B60D03F92D55C5]
Fri Mar 23 13:33:56 CET 2012 --- Action: [add] VendorId: [1307] ProductId: [0163] Manufacturer: [USBest_Technology] Product: [USB_Mass_Storage_Device] Serial: [00000000000085]
Fri Mar 23 13:33:57 CET 2012 --- Action: [remove] VendorId: [1307] ProductId: [0163] Manufacturer: [USBest_Technology] Product: [USB_Mass_Storage_Device] Serial: [00000000000085]
Der Trick an der Sache war nun letztendlich der, dass man in der UDEV Regel nur ganz grib einschränkt (nämlich auf das USB Subsystem und Treiber), und das restliche Filtern dem Script überlässt. Und da hat das debuggen der Environmentvariablen gezeigt dass DEVTYPE, ID_BUS und SUBSYSTEM ausreicht um nur je eine Meldung zum einstecken und abziehen eines USB-Sticks zu erhalten und dennoch an die gewünschten Stick-Infos zu kommen.

Soweit so gut, danke für's mitlesen ;-)

Gruß
Alex

Antworten