Mensajes: 843
Viernes, 29 Enero 2010, 15:56
PUBLIC SUB Form_Open()
Dim Arbol as new treeview(me)
DIM FTemp AS String, Var AS String
me.arrangement=arrange.fill
FTemp = Temp 'crear un nombre de archivo temporal
SHELL ("lsusb >" & fTemp) wait 'Llenar FTemp con la información requerida
LlenarArbol(fTemp,Arbol) 'Llenar el arbol
KILL FTemp 'borrar el archivo temporal
END
Y luego la rutina LlenarArbol
PRIVATE SUB LlenarArbol(ftemp AS String, Arbol as treeview)
DIM F AS file, Linea AS String, Partes AS String[], Clave AS String, Dev AS String, Nombre AS String
arbol.Add("Bus 0", System.Host, Stock["16/home"]) 'poner el valor raíz
f = OPEN (ftemp) FOR READ
f.EndOfLine = gb.Unix
DO WHILE NOT Eof(f)
LINE INPUT #f, linea 'leer la línea entera
partes = Split(linea, ":") 'dividirla en tres partes por el :
clave = Left(partes[0], 7) 'la clave será algo como 'Bus 1'
insertarbus(clave,Arbol) 'insertar la el bus en el arbol con padre raíz
Dev = Right(partes[0], 3) 'obtener el dev nº
Nombre = Mid(partes[2], 5) 'obtener el nombre del dispositivo
insertardev(dev, nombre, clave,Arbol) 'insertar dispositivo en arbol
LOOP
END
PRIVATE SUB insertarbus(Clave AS String, Arbol as treeview)
TRY arbol.Add(clave, Clave, Stock["16/connect"], "Bus 0")
FINALLY
CATCH
END
PRIVATE SUB insertardev(dev AS String, nombre AS String, padre AS String, Arbol as treeview)
TRY arbol.Add(padre & "/" & dev, dev & ": " & nombre, Stock["16/attach"], padre)
TRY arbol.item.EnsureVisible
FINALLY
CATCH
END
Ya te dije que solo le faltaba un wait porque si no salía nada era por tiempo.
Y en cuanto a lo de udev una línea de lsusb es esta:
Citar:
Bus 006 Device 003: ID 03f0:3e17 Hewlett-Packard
Y de ahí sabemos que 03f0 es el vendor y que 3E17 es el idProduct de manera que solo por ver esta línea tenemos subsystem="USB, Vendor="03F0" e IdProduct 3E17 con lo cual se puede obtener la información que se quiera sobre ello entre ella el atributo renovable que será 1 si es renovable y 0 si no lo es. Supongo que la opción mas sencilla si quieres mas información que la que sale del lsusb es mediante udevinfo. También hay información sobre el tamaño del dispositivo y no se cuantas cosas mas.
No estoy nada ducho en eso de reglas udev así que es probable que haya opciones mejores. En cualquier caso toma esto como ejemplo de volcar un comando linux a un archivo y extraer lo que conviene. Ese treeview está sacada únicamente de lo que se ve en un usb. Si luego te quieres ir con esa información a buscar el dispositivo en Udev tendrás toda la información que tenga linux sobre él.
Un ejemplo de interrogar a udev por su lugar
udevinfo -a -n /dev/sdb
Eso así sin mas te sacará toda la información que tenga de ese dispositivo y luego se irá a su dispositivo padre y hará igual y luego al abuelo, ..., etc hasta llegar al dispositivo de la placa que gestiona USB de manera que por poder incluso puedes hacer que al pinchar el usb te salga su dispositivo padre con todos sus datos y al pinchar en él la info del abuelo, ..., etc.
[Edito para no responderme a mi mismo]
He estado mirando como encontrar toda la info de un usb interrogando a udev y tal y he llegado a la siguiente conclusión:
1. Averiguar que dispositivos de almacenamiento están montados
Citar:
ls /dev/disk/by-uuid -la | grep /sd
Pongamos que de alli he sacado tres líneas como estas
Citar:
lrwxrwxrwx 1 root root 10 ene 29 21:49 1A608B95608B7673 -> ../../sda1
lrwxrwxrwx 1 root root 10 ene 29 21:49 1d31438e-599e-4d5e-9c48-0d6d76d6ffed -> ../../sda2
lrwxrwxrwx 1 root root 10 ene 29 21:49 4A73-4A71 -> ../../sdb1
Ahora interrogo a udev sobre esos dispositivos (sda1 y sda2 forman parte del dispositivo sda pero probablemente cuesta menos que haga los dos a que quite letra y examine el dispositivo sda que es el que interesa
Citar:
udevinfo -a -n /dev/sda1 'para obtener información de /dev/sda1
udevinfo -a -n /dev/sda2 'para obtener información de /dev/sda2
udevinfo -a -n /dev/sdb1 'para obtener información de /dev/sdb1
Pongo el resultado de examinar /dev/sdb1
Citar:
Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sdb/sdb1':
KERNEL=="sdb1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{start}=="8064"
ATTR{size}=="7815296"
ATTR{stat}==" 51 103 987 204 0 0 0 0 0 148 204"
looking at parent device '/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{removable}=="1"
ATTRS{size}=="7823360"
ATTRS{capability}=="13"
ATTRS{stat}==" 76 205 2003 308 0 0 0 0 0 196 308"
Es mucho mas largo porque sale desde sdb1 a su padre que es sdb a su abuelo que será el host usb en placa, el bisabuelo que será otro dispositivo en placa, ..., etc, pero los que nos importan son estos dos. El primero es sdb1 y su padre es sdb que es el dispositivo en sí mismo. Allí está la propiedad "removable" que en este caso es 1 con lo que se que estoy ante un dispositivo usb removible y montado.
Si quisiera saber mas podría mirar en /etc/mtab o en /proc/mounts donde habrá una línea como esta
Citar:
/dev/sdb1 /home/casa/m vfat rw 0 0
de la que obtengo el sistema de ficheros con que está montado el dispositivo y en que directorio está montado, con lo que ya tengo toda la información que el sistema tiene sobre ese dispositivo.
Un poco lioso pero desde el punto de vista informático fácil porque para los humanos andar buscando strings es una lata pero para una máquina es un momento así que todo es volcar esos comandos a un archivo o string y luego buscar la string adecuada. Suena complicado cuando se lee, pero para un ordenador no es nada.
Hay otra forma de hacer esto a traves del vendor e idproduct y también a traves del serial, pero todos vienen a hacer lo mismo porque la información está repartida de esa forma.
Ha estado entretenido esto je je je
[/editado]