[gelöst] lsusb Informationen innerhalb eines Batch Scriptes auslesen

Begonnen von t1me2die, 11 August 2018, 14:20:42

Vorheriges Thema - Nächstes Thema

t1me2die

Moin liebes Forum,

ich stehe vor der Aufgabe automatisch USB Geräte beim Autostart meines NAS an meine VM durchzureichen.
Ich habe an meinem NAS einen USB Hub, mit mehreren Arduino Nano mit FTDI Chip.

Dummerweise haben alle Arduino Nano's dieselbe vendor-id und product-id und zwar:
vendor-id = 0403
product-id = 6001


[~] # lsusb -d 0403:6001
Bus 001 Device 101: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 100: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC


Mein Ziel soll es sein, alle Arduino's an meine VM durchzureichen (innerhalb meiner VM / FHEM spreche ich alles Arduinos mit dem konkreten Pfad by-id an)

Um einen / alle dieser Arduino Nano's an meine VM durchzureichen benötige ich noch die Bus-Nr und die Device-Nr.

Da sich diese beiden Nummern jedoch immer wieder ändern (bei einem Neustart des NAS oder abziehen des USB Sticks) muss ich zuerst diese Nummern ermitteln und diese in meine .XML-Datei wegschreiben um diese Datei innerhalb meines Autostarts ausführen zu können.

Mein Batch Script führt folgenden Command aus:

virsh attach-device 24104906-bb07-4558-89f6-fcede13817af /share/CACHEDEV1_DATA/VM/.qpkg/autorun/Mount_USB_nanoCUL2.xml


Die XML Datei ist wie folgt aufgebaut:

    <hostdev mode='subsystem' type='usb'>
       <source startupPolicy='optional'>
          <vendor id='0x0403'/>
          <product id='0x6001'/>
  <address bus='1' device='101'/>
       </source>
    </hostdev>


Die vendor-id und product-id ist für die Arduinos immer identisch, jedoch muss ich den "bus"-Nr und die "device"-Nr anpassen, bevor mein Batch Script den o.g. Command ausführt.

Nun ist die Frage, wie bekomme ich die "bus"-Nr und die "device"-Nr aus "lsusb" im vorwege ermittelt und wie schreibe ich diese dann in meine XML-Datei?

Danke für eure Hilfe.

Gruß
Mathze

Wernieman

Kenne Deine VM-Software nicht, aber könntest Du nicht den USB-Hub und damit alle "Slaves" an die VM durchreichen?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

t1me2die

#2
Ich nutze die "Virtualization Station" von QNAP.
Taucht der USB-Hub denn auch unter "lsusb" auf?
Ist mir bisher nicht aufgefallen?!

Also per VM Software kann ich maximal 4 USB Geräte weiterleiten, da ich aber mehr als 4USB Geräte gerne an die VM weiterreichen möchte, mache ich dies via Batch Script.

Gruß
Mathze

Wernieman

Ja ... gucke bitte mal richtig .. und  "Virtualization Station von QNAP" kenne ich nicht. Da ich keine QNAP habe, kann ich Dir auch nicht sagen, was es eigentlich wirklich ist ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

t1me2die

Also der USB Hub taucht auch als USB Device unter dem Namen


Bus 001 Device 099: ID 0bda:5411 Realtek Semiconductor Corp.


auf. Wenn ich dieses Device an die VM weiterreiche, so werden die dort angesteckten USB Geräte leider nicht weitergereicht, diese muss ich explizit auswählen.

Wenn ich es richtig verstanden habe, hat QNAP eine eigene VM Software, diese heißt "Virtualization Station" (https://www.qnap.com/solution/virtualization-station/de-de/)

Was mir aufgefallen ist, wenn ich den USB Hub abziehe vom NAS und ihn erneut anstecke, zählt er augenscheinlich die Device-Nr hoch.

lsusb vor dem abziehen des USB Hub:

[~] # lsusb
Bus 001 Device 112: ID 0403:6001 Future Technology Devices International, Ltd FT  232 USB-Serial (UART) IC
Bus 001 Device 100: ID 0403:6001 Future Technology Devices International, Ltd FT  232 USB-Serial (UART) IC
Bus 001 Device 111: ID 0658:0200 Sigma Designs, Inc.
Bus 001 Device 008: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (  HCI mode)
Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT  232 USB-Serial (UART) IC
Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 007: ID 1005:b155 Apacer Technology, Inc.
Bus 001 Device 099: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power   Supply
Bus 001 Device 003: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 098: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub


Größte Device-Nr = 112

Nach dem ich den Hub abgezogen habe:

Bus 001 Device 111: ID 0658:0200 Sigma Designs, Inc.
Bus 001 Device 008: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 007: ID 1005:b155 Apacer Technology, Inc.
Bus 001 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 003: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 113: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub


Aus Device 098 wurde nun auf einmal 113.
Damit ist die größte Device-Nr = 113

Nun schließe ich den USB Hub wieder an:

[~] # lsusb
Bus 001 Device 116: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 115: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 111: ID 0658:0200 Sigma Designs, Inc.
Bus 001 Device 008: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 007: ID 1005:b155 Apacer Technology, Inc.
Bus 001 Device 114: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 003: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 113: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub


Mein USB Hub ist augenscheinlich Device 114 und die zwei USB Geräte, die daran hängen sind Device-Nr 115 und 116.
Er zählt also augenscheinlich stupide die Device Nummern hoch.

Die Frage ist, was passiert mit den Nummern dazwischen?
Werden die irgendwann wieder freigegeben?

Gruß
Mathze

Wernieman

Habe mich mal versucht schlau zu machen, aber scheinbar ist die Virtualisierung von QNAP deren Eigenentwicklung ... also Support von mir so nicht möglich ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

t1me2die

Trotzdem danke für deine Mühe.
Das eigentliche Problem sind ja die identischen Vendor / Product ID's meiner Arduino Nano's.
Ist es möglich den Arduino Nano's (FTDI Chip) eigene Vendor / Product ID's zu verpassen?

Sobald ich die Arduino's an meine VM weitergereicht habe, kann ich diese ja per
ls -l /dev/serial/by-id/

konkret identifizieren, also kann ich diese innerhalb von FHEM genau ansprechen.

Gruß
Mathze

t1me2die

So, habe es nun hinbekommen.

Zuerst lese ich per "lsusb" die notwendigen Informationen aus in eine externe Datei.
Danach lese ich Zeile für Zeile und parse mir die notwendigen Informationen heraus.
Alles läuft innerhalb einer Schleife und erzeugt automatisch auch die .XML Datei, die ich benötige.

Hier meine Lösung:

# read all Arduino Nano in a .txt file
lsusb -d 0403:6001 > /share/CACHEDEV1_DATA/VM/.qpkg/autorun/arduino.txt

sleep 1

i=0
while read line
do
   # Schreibt die Zeile in die Variable "var"
   var="$line"
   # echo "Zeile einlesen: $var" >> /share/CACHEDEV1_DATA/VM/.qpkg/autorun/logfile.txt
   
   # Substring von Variable "var" ab Stelle 15, drei Stellen lang
   b=${var:15:3}
   # Entfernt führende Nullen
   b=$(echo $b | sed 's/^0*//')
   # echo "$b" >> /share/CACHEDEV1_DATA/VM/.qpkg/autorun/logfile.txt
   
   if (($i == 0)); then
echo -e "<hostdev mode='subsystem' type='usb'> \n   <source startupPolicy='optional'> \n   <vendor id='0x0403'/> \n   <product id='0x6001'/> \n   <address bus='1' device='$b'/> \n   </source> \n</hostdev>" > /share/CACHEDEV1_DATA/VM/.qpkg/autorun/Arduino_Nano0.xml
   elif (($i == 1)); then
echo -e "<hostdev mode='subsystem' type='usb'> \n   <source startupPolicy='optional'> \n   <vendor id='0x0403'/> \n   <product id='0x6001'/> \n   <address bus='1' device='$b'/> \n   </source> \n</hostdev>" > /share/CACHEDEV1_DATA/VM/.qpkg/autorun/Arduino_Nano1.xml
   elif (($i == 2)); then
echo -e "<hostdev mode='subsystem' type='usb'> \n   <source startupPolicy='optional'> \n   <vendor id='0x0403'/> \n   <product id='0x6001'/> \n   <address bus='1' device='$b'/> \n   </source> \n</hostdev>" > /share/CACHEDEV1_DATA/VM/.qpkg/autorun/Arduino_Nano2.xml
   fi
   
   ((i++))
   
done < /share/CACHEDEV1_DATA/VM/.qpkg/autorun/arduino.txt


Gruß
Mathze