From 0fbcb34f71501accea355c715ed4bfd57fc05353 Mon Sep 17 00:00:00 2001 From: Jens Erat Date: Sat, 31 Oct 2026 13:27:25 +0100 Subject: [PATCH] usb: add collector for USB devices and controllers Add a new collector, disabled by default, exposing: - node_usb_info with the device identity, device class, bcdDevice and bcdUSB version. One series per device, keyed by devpath: the sysfs entry name, which embeds the bus number and is therefore unique on a host. serial is kept as a join key to other collectors. - node_usb_speed_bytes, node_usb_removable, node_usb_max_current_milliamps, node_usb_power_info, node_usb_autosuspend_delay_seconds, node_usb_urbnum_total, node_usb_num_interfaces and node_usb_num_configurations per device. - node_usb_interface_info with the configuration and interface number as well as class/subclass/protocol and the bound driver. This is the only place where the UAS vs BOT decision of a mass storage bridge is visible. - node_usb_controller_info, node_usb_controller_speed_bytes and node_usb_controller_maxchild per root hub. Descriptor strings are sanitised for label use: invalid UTF-8 is replaced and control characters are stripped. The collector returns ErrNoData when /sys/bus/usb/devices is not available. Signed-off-by: Jens Erat --- CHANGELOG.md | 1 + README.md | 1 + collector/fixtures/e2e-output.txt | 116 +++ collector/fixtures/sys.ttar | 1202 +++++++++++++++++++++++++++++ collector/fixtures/usb-output.txt | 127 +++ collector/usb_linux.go | 277 +++++++ collector/usb_linux_test.go | 95 +++ end-to-end-test.sh | 1 + 8 files changed, 1820 insertions(+) create mode 100644 collector/fixtures/usb-output.txt create mode 100644 collector/usb_linux.go create mode 100644 collector/usb_linux_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index bd4f978795..cb54d5a19e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## master / unreleased * [CHANGE] edac: Fix no data results #3863 +* [FEATURE] usb: Add new collector for USB devices and controllers #3881 ## 1.12.1 / 2026-07-14 diff --git a/README.md b/README.md index 673ad34153..0962c89c79 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ swap | Expose swap information from `/proc/swaps`. | Linux systemd | Exposes service and system status from [systemd](http://www.freedesktop.org/wiki/Software/systemd/). | Linux tainted | Exposes kernel taint flags from `/proc/sys/kernel/tainted`. | Linux tcpstat | Exposes TCP connection status information from `/proc/net/tcp` and `/proc/net/tcp6`. (Warning: the current version has potential performance issues in high load situations.) | Linux +usb | Exposes USB device and controller information from `/sys/bus/usb/devices`, including interface drivers (e.g. `usb-storage` vs `uas`) and power management state. | Linux wifi | Exposes WiFi device and station statistics. | Linux xfrm | Exposes statistics from `/proc/net/xfrm_stat` | Linux zoneinfo | Exposes NUMA memory zone metrics. | Linux diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 4dd448d5c6..c6b1acd166 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -3823,6 +3823,7 @@ node_scrape_collector_success{collector="textfile"} 1 node_scrape_collector_success{collector="thermal_zone"} 1 node_scrape_collector_success{collector="time"} 1 node_scrape_collector_success{collector="udp_queues"} 1 +node_scrape_collector_success{collector="usb"} 1 node_scrape_collector_success{collector="vmstat"} 1 node_scrape_collector_success{collector="watchdog"} 1 node_scrape_collector_success{collector="wifi"} 1 @@ -4077,6 +4078,121 @@ node_time_clocksource_current_info{clocksource="tsc",device="0"} 1 # TYPE node_udp_queues gauge node_udp_queues{ip="v4",queue="rx"} 0 node_udp_queues{ip="v4",queue="tx"} 21 +# HELP node_usb_autosuspend_delay_seconds USB device autosuspend delay in seconds. +# TYPE node_usb_autosuspend_delay_seconds gauge +node_usb_autosuspend_delay_seconds{devpath="1-2",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="1-3",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="4-2",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="4-3",serial="7ba268d87336"} 2 +node_usb_autosuspend_delay_seconds{devpath="4-4",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="6-2",serial="0001"} 2 +# HELP node_usb_controller_info Info about USB controllers. +# TYPE node_usb_controller_info gauge +node_usb_controller_info{bus="1",version="2.00"} 1 +node_usb_controller_info{bus="2",version="3.10"} 1 +node_usb_controller_info{bus="3",version="2.00"} 1 +node_usb_controller_info{bus="4",version="2.00"} 1 +node_usb_controller_info{bus="5",version="3.10"} 1 +node_usb_controller_info{bus="6",version="2.00"} 1 +node_usb_controller_info{bus="7",version="3.00"} 1 +# HELP node_usb_controller_maxchild USB controller maximum number of child ports. +# TYPE node_usb_controller_maxchild gauge +node_usb_controller_maxchild{bus="1"} 4 +node_usb_controller_maxchild{bus="2"} 2 +node_usb_controller_maxchild{bus="3"} 1 +node_usb_controller_maxchild{bus="4"} 4 +node_usb_controller_maxchild{bus="5"} 2 +node_usb_controller_maxchild{bus="6"} 2 +node_usb_controller_maxchild{bus="7"} 2 +# HELP node_usb_controller_speed_bytes USB controller speed in bytes per second. +# TYPE node_usb_controller_speed_bytes gauge +node_usb_controller_speed_bytes{bus="1"} 6e+07 +node_usb_controller_speed_bytes{bus="2"} 1.25e+09 +node_usb_controller_speed_bytes{bus="3"} 6e+07 +node_usb_controller_speed_bytes{bus="4"} 6e+07 +node_usb_controller_speed_bytes{bus="5"} 1.25e+09 +node_usb_controller_speed_bytes{bus="6"} 6e+07 +node_usb_controller_speed_bytes{bus="7"} 6.25e+08 +# HELP node_usb_info Info about USB devices. +# TYPE node_usb_info gauge +node_usb_info{bcd_device="0000",device_class="02",device_protocol="00",device_subclass="00",devpath="1-2",id_product="0200",id_vendor="0658",manufacturer="",product="",serial="",version="2.00"} 1 +node_usb_info{bcd_device="0000",device_class="ff",device_protocol="ff",device_subclass="10",devpath="4-3",id_product="00bd",id_vendor="06cb",manufacturer="",product="",serial="7ba268d87336",version="2.00"} 1 +node_usb_info{bcd_device="0001",device_class="e0",device_protocol="01",device_subclass="01",devpath="4-4",id_product="0029",id_vendor="8087",manufacturer="",product="",serial="",version="2.01"} 1 +node_usb_info{bcd_device="0120",device_class="00",device_protocol="00",device_subclass="00",devpath="1-3",id_product="9540",id_vendor="058f",manufacturer="Generic",product="EMV Smartcard Reader",serial="",version="2.01"} 1 +node_usb_info{bcd_device="0426",device_class="00",device_protocol="00",device_subclass="00",devpath="4-2",id_product="0407",id_vendor="1050",manufacturer="Yubico",product="Yubikey 4 OTP+U2F+CCID",serial="",version="2.00"} 1 +node_usb_info{bcd_device="5818",device_class="ef",device_protocol="01",device_subclass="02",devpath="6-2",id_product="b6cb",id_vendor="04f2",manufacturer="Chicony Electronics Co.,Ltd.",product="Integrated Camera",serial="0001",version="2.01"} 1 +# HELP node_usb_interface_info Info about USB interfaces. +# TYPE node_usb_interface_info gauge +node_usb_interface_info{binterface_class="02",binterface_protocol="01",binterface_subclass="02",configuration="1",devpath="1-2",driver="cdc_acm",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="03",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-2",driver="usbhid",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="03",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-2",driver="usbhid",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="0a",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="1-2",driver="cdc_acm",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="0b",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="1-3",driver="",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="0b",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-2",driver="usbfs",interface="2",serial=""} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="00",binterface_subclass="01",configuration="1",devpath="6-2",driver="uvcvideo",interface="0",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="00",binterface_subclass="02",configuration="1",devpath="6-2",driver="uvcvideo",interface="1",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="6-2",driver="uvcvideo",interface="2",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="01",binterface_subclass="02",configuration="1",devpath="6-2",driver="uvcvideo",interface="3",serial="0001"} 1 +node_usb_interface_info{binterface_class="e0",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-4",driver="btusb",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="e0",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-4",driver="btusb",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="fe",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="6-2",driver="",interface="4",serial="0001"} 1 +node_usb_interface_info{binterface_class="ff",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-3",driver="",interface="0",serial="7ba268d87336"} 1 +# HELP node_usb_max_current_milliamps USB device maximum current in milliamps. +# TYPE node_usb_max_current_milliamps gauge +node_usb_max_current_milliamps{devpath="1-2",serial=""} 100 +node_usb_max_current_milliamps{devpath="1-3",serial=""} 50 +node_usb_max_current_milliamps{devpath="4-2",serial=""} 30 +node_usb_max_current_milliamps{devpath="4-3",serial="7ba268d87336"} 100 +node_usb_max_current_milliamps{devpath="4-4",serial=""} 100 +node_usb_max_current_milliamps{devpath="6-2",serial="0001"} 500 +# HELP node_usb_num_configurations Number of USB configurations. +# TYPE node_usb_num_configurations gauge +node_usb_num_configurations{devpath="1-2",serial=""} 1 +node_usb_num_configurations{devpath="1-3",serial=""} 1 +node_usb_num_configurations{devpath="4-2",serial=""} 1 +node_usb_num_configurations{devpath="4-3",serial="7ba268d87336"} 1 +node_usb_num_configurations{devpath="4-4",serial=""} 1 +node_usb_num_configurations{devpath="6-2",serial="0001"} 1 +# HELP node_usb_num_interfaces Number of USB interfaces. +# TYPE node_usb_num_interfaces gauge +node_usb_num_interfaces{devpath="1-2",serial=""} 2 +node_usb_num_interfaces{devpath="1-3",serial=""} 1 +node_usb_num_interfaces{devpath="4-2",serial=""} 3 +node_usb_num_interfaces{devpath="4-3",serial="7ba268d87336"} 1 +node_usb_num_interfaces{devpath="4-4",serial=""} 2 +node_usb_num_interfaces{devpath="6-2",serial="0001"} 5 +# HELP node_usb_power_info USB device power information. +# TYPE node_usb_power_info gauge +node_usb_power_info{control="auto",devpath="1-3",runtime_status="suspended",serial=""} 1 +node_usb_power_info{control="auto",devpath="4-2",runtime_status="active",serial=""} 1 +node_usb_power_info{control="auto",devpath="4-3",runtime_status="suspended",serial="7ba268d87336"} 1 +node_usb_power_info{control="auto",devpath="4-4",runtime_status="suspended",serial=""} 1 +node_usb_power_info{control="auto",devpath="6-2",runtime_status="suspended",serial="0001"} 1 +node_usb_power_info{control="on",devpath="1-2",runtime_status="active",serial=""} 1 +# HELP node_usb_removable USB device removable state (1 = removable). +# TYPE node_usb_removable gauge +node_usb_removable{devpath="1-2",serial=""} 1 +node_usb_removable{devpath="1-3",serial=""} 0 +node_usb_removable{devpath="4-2",serial=""} 1 +node_usb_removable{devpath="4-3",serial="7ba268d87336"} 0 +node_usb_removable{devpath="4-4",serial=""} 0 +node_usb_removable{devpath="6-2",serial="0001"} 0 +# HELP node_usb_speed_bytes USB device speed in bytes per second. +# TYPE node_usb_speed_bytes gauge +node_usb_speed_bytes{devpath="1-2",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="1-3",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="4-2",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="4-3",serial="7ba268d87336"} 1.5e+06 +node_usb_speed_bytes{devpath="4-4",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="6-2",serial="0001"} 6e+07 +# HELP node_usb_urbnum_total Total number of USB request blocks. +# TYPE node_usb_urbnum_total counter +node_usb_urbnum_total{devpath="1-2",serial=""} 9 +node_usb_urbnum_total{devpath="1-3",serial=""} 2977 +node_usb_urbnum_total{devpath="4-2",serial=""} 13724 +node_usb_urbnum_total{devpath="4-3",serial="7ba268d87336"} 35 +node_usb_urbnum_total{devpath="4-4",serial=""} 33505 +node_usb_urbnum_total{devpath="6-2",serial="0001"} 804 # HELP node_vmstat_oom_kill /proc/vmstat information field oom_kill. # TYPE node_vmstat_oom_kill untyped node_vmstat_oom_kill 0 diff --git a/collector/fixtures/sys.ttar b/collector/fixtures/sys.ttar index 5c4388faec..386e31993d 100644 --- a/collector/fixtures/sys.ttar +++ b/collector/fixtures/sys.ttar @@ -1087,6 +1087,1208 @@ SymlinkTo: ../../../devices/pci0000:00/0000:00:02.1/0000:01:00.0 Path: sys/bus/pci/devices/0000:45:00.0 SymlinkTo: ../../../devices/pci0000:40/0000:40:01.3/0000:45:00.0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-2 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-2/1-2:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/bInterfaceClass +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/bInterfaceNumber +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/bInterfaceSubClass +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/bNumEndpoints +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.0/driver +SymlinkTo: ../drivers/cdc_acm +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-2/1-2:1.1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/bInterfaceClass +Lines: 1 +0a +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/bInterfaceNumber +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/bInterfaceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/bNumEndpoints +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/1-2:1.1/driver +SymlinkTo: ../drivers/cdc_acm +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/authorized +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bDeviceClass +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bDeviceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bDeviceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bMaxPower +Lines: 1 +100mA +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bNumConfigurations +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bNumInterfaces +Lines: 1 + 2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/bcdDevice +Lines: 1 +0000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/busnum +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/devnum +Lines: 1 +14 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/devpath +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/idProduct +Lines: 1 +0200 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/idVendor +Lines: 1 +0658 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-2/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/power/control +Lines: 1 +on +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/power/runtime_status +Lines: 1 +active +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/removable +Lines: 1 +removable +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/speed +Lines: 1 +12 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/urbnum +Lines: 1 +9 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-2:1.0 +SymlinkTo: 1-2/1-2:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-3/1-3:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/1-3:1.0/bInterfaceClass +Lines: 1 +0b +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/1-3:1.0/bInterfaceNumber +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/1-3:1.0/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/1-3:1.0/bInterfaceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/authorized +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bDeviceClass +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bDeviceProtocol +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bDeviceSubClass +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bMaxPower +Lines: 1 +50mA +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bNumConfigurations +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bNumInterfaces +Lines: 1 + 1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/bcdDevice +Lines: 1 +0120 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/busnum +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/devnum +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/devpath +Lines: 1 +3 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/idProduct +Lines: 1 +9540 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/idVendor +Lines: 1 +058f +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/manufacturer +Lines: 1 +Generic +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/1-3/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/power/control +Lines: 1 +auto +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/power/runtime_status +Lines: 1 +suspended +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/product +Lines: 1 +EMV Smartcard Reader +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/removable +Lines: 1 +fixed +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/speed +Lines: 1 +12 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/urbnum +Lines: 1 +2977 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3/version +Lines: 1 + 2.01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/1-3:1.0 +SymlinkTo: 1-3/1-3:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-2/4-2:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.0/bInterfaceClass +Lines: 1 +03 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.0/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.0/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.0/driver +SymlinkTo: ../drivers/usbhid +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-2/4-2:1.1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.1/bInterfaceClass +Lines: 1 +03 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.1/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.1/bInterfaceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.1/driver +SymlinkTo: ../drivers/usbhid +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-2/4-2:1.2 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.2/bInterfaceClass +Lines: 1 +0b +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.2/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.2/bInterfaceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/4-2:1.2/driver +SymlinkTo: ../drivers/usbfs +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/authorized +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bDeviceClass +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bDeviceProtocol +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bDeviceSubClass +Lines: 1 +00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bMaxPower +Lines: 1 +30mA +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bNumConfigurations +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bNumInterfaces +Lines: 1 + 3 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/bcdDevice +Lines: 1 +0426 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/busnum +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/devnum +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/devpath +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/idProduct +Lines: 1 +0407 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/idVendor +Lines: 1 +1050 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/manufacturer +Lines: 1 +Yubico +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-2/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/power/control +Lines: 1 +auto +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/power/runtime_status +Lines: 1 +active +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/product +Lines: 1 +Yubikey 4 OTP+U2F+CCID +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/removable +Lines: 1 +removable +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/speed +Lines: 1 +12 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/urbnum +Lines: 1 +13724 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2:1.0 +SymlinkTo: 4-2/4-2:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2:1.1 +SymlinkTo: 4-2/4-2:1.1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-2:1.2 +SymlinkTo: 4-2/4-2:1.2 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-3/4-3:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/4-3:1.0/bInterfaceClass +Lines: 1 +ff +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/4-3:1.0/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/4-3:1.0/bInterfaceSubClass +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/authorized +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bDeviceClass +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bDeviceProtocol +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bDeviceSubClass +Lines: 1 +10 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bMaxPower +Lines: 1 +100mA +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bNumConfigurations +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bNumInterfaces +Lines: 1 + 1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/bcdDevice +Lines: 1 +0000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/busnum +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/devnum +Lines: 1 +3 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/devpath +Lines: 1 +3 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/idProduct +Lines: 1 +00bd +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/idVendor +Lines: 1 +06cb +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-3/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/power/control +Lines: 1 +auto +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/power/runtime_status +Lines: 1 +suspended +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/removable +Lines: 1 +fixed +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/serial +Lines: 1 +7ba268d87336 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/speed +Lines: 1 +12 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/urbnum +Lines: 1 +35 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-3:1.0 +SymlinkTo: 4-3/4-3:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-4/4-4:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.0/bInterfaceClass +Lines: 1 +e0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.0/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.0/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.0/driver +SymlinkTo: ../drivers/btusb +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-4/4-4:1.1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.1/bInterfaceClass +Lines: 1 +e0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.1/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.1/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/4-4:1.1/driver +SymlinkTo: ../drivers/btusb +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/authorized +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bDeviceClass +Lines: 1 +e0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bDeviceProtocol +Lines: 1 +01 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bDeviceSubClass +Lines: 1 +01 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bMaxPower +Lines: 1 +100mA +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bNumConfigurations +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bNumInterfaces +Lines: 1 + 2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/bcdDevice +Lines: 1 +0001 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/busnum +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/devnum +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/devpath +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/idProduct +Lines: 1 +0029 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/idVendor +Lines: 1 +8087 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/4-4/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/power/control +Lines: 1 +auto +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/power/runtime_status +Lines: 1 +suspended +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/removable +Lines: 1 +fixed +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/speed +Lines: 1 +12 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/urbnum +Lines: 1 +33505 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4/version +Lines: 1 + 2.01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4:1.0 +SymlinkTo: 4-4/4-4:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/4-4:1.1 +SymlinkTo: 4-4/4-4:1.1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/6-2:1.0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.0/bInterfaceClass +Lines: 1 +0e +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.0/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.0/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.0/driver +SymlinkTo: ../drivers/uvcvideo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/6-2:1.1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.1/bInterfaceClass +Lines: 1 +0e +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.1/bInterfaceProtocol +Lines: 1 +00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.1/bInterfaceSubClass +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.1/driver +SymlinkTo: ../drivers/uvcvideo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/6-2:1.2 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.2/bInterfaceClass +Lines: 1 +0e +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.2/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.2/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.2/driver +SymlinkTo: ../drivers/uvcvideo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/6-2:1.3 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.3/bInterfaceClass +Lines: 1 +0e +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.3/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.3/bInterfaceSubClass +Lines: 1 +02 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.3/driver +SymlinkTo: ../drivers/uvcvideo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/6-2:1.4 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.4/bInterfaceClass +Lines: 1 +fe +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.4/bInterfaceProtocol +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/6-2:1.4/bInterfaceSubClass +Lines: 1 +01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/authorized +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bDeviceClass +Lines: 1 +ef +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bDeviceProtocol +Lines: 1 +01 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bDeviceSubClass +Lines: 1 +02 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bMaxPower +Lines: 1 +500mA +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bNumConfigurations +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bNumInterfaces +Lines: 1 + 5 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/bcdDevice +Lines: 1 +5818 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/busnum +Lines: 1 +6 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/devnum +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/devpath +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/idProduct +Lines: 1 +b6cb +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/idVendor +Lines: 1 +04f2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/manufacturer +Lines: 1 +Chicony Electronics Co.,Ltd. +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/6-2/power +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/power/autosuspend_delay_ms +Lines: 1 +2000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/power/control +Lines: 1 +auto +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/power/runtime_status +Lines: 1 +suspended +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/product +Lines: 1 +Integrated Camera +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/removable +Lines: 1 +fixed +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/serial +Lines: 1 +0001 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/speed +Lines: 1 +480 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/urbnum +Lines: 1 +804 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2/version +Lines: 1 + 2.01 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2:1.0 +SymlinkTo: 6-2/6-2:1.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2:1.1 +SymlinkTo: 6-2/6-2:1.1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2:1.2 +SymlinkTo: 6-2/6-2:1.2 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2:1.3 +SymlinkTo: 6-2/6-2:1.3 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/6-2:1.4 +SymlinkTo: 6-2/6-2:1.4 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/busnum +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/devnum +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/devpath +Lines: 1 +0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/maxchild +Lines: 1 +4 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/speed +Lines: 1 +480 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb1/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb2 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb2/busnum +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb2/maxchild +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb2/speed +Lines: 1 +10000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb2/version +Lines: 1 + 3.10 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb3 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb3/busnum +Lines: 1 +3 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb3/maxchild +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb3/speed +Lines: 1 +480 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb3/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb4 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb4/busnum +Lines: 1 +4 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb4/maxchild +Lines: 1 +4 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb4/speed +Lines: 1 +480 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb4/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb5 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb5/busnum +Lines: 1 +5 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb5/maxchild +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb5/speed +Lines: 1 +10000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb5/version +Lines: 1 + 3.10 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb6 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb6/busnum +Lines: 1 +6 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb6/maxchild +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb6/speed +Lines: 1 +480 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb6/version +Lines: 1 + 2.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: sys/bus/usb/devices/usb7 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb7/busnum +Lines: 1 +7 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb7/maxchild +Lines: 1 +2 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb7/speed +Lines: 1 +5000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: sys/bus/usb/devices/usb7/version +Lines: 1 + 3.00 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: sys/class Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/collector/fixtures/usb-output.txt b/collector/fixtures/usb-output.txt new file mode 100644 index 0000000000..62b8178139 --- /dev/null +++ b/collector/fixtures/usb-output.txt @@ -0,0 +1,127 @@ +# HELP node_usb_autosuspend_delay_seconds USB device autosuspend delay in seconds. +# TYPE node_usb_autosuspend_delay_seconds gauge +node_usb_autosuspend_delay_seconds{devpath="1-2",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="1-3",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="4-2",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="4-3",serial="7ba268d87336"} 2 +node_usb_autosuspend_delay_seconds{devpath="4-4",serial=""} 2 +node_usb_autosuspend_delay_seconds{devpath="6-2",serial="0001"} 2 + +# HELP node_usb_controller_info Info about USB controllers. +# TYPE node_usb_controller_info gauge +node_usb_controller_info{bus="1",version="2.00"} 1 +node_usb_controller_info{bus="2",version="3.10"} 1 +node_usb_controller_info{bus="3",version="2.00"} 1 +node_usb_controller_info{bus="4",version="2.00"} 1 +node_usb_controller_info{bus="5",version="3.10"} 1 +node_usb_controller_info{bus="6",version="2.00"} 1 +node_usb_controller_info{bus="7",version="3.00"} 1 + +# HELP node_usb_controller_maxchild USB controller maximum number of child ports. +# TYPE node_usb_controller_maxchild gauge +node_usb_controller_maxchild{bus="1"} 4 +node_usb_controller_maxchild{bus="2"} 2 +node_usb_controller_maxchild{bus="3"} 1 +node_usb_controller_maxchild{bus="4"} 4 +node_usb_controller_maxchild{bus="5"} 2 +node_usb_controller_maxchild{bus="6"} 2 +node_usb_controller_maxchild{bus="7"} 2 + +# HELP node_usb_controller_speed_bytes USB controller speed in bytes per second. +# TYPE node_usb_controller_speed_bytes gauge +node_usb_controller_speed_bytes{bus="1"} 6e+07 +node_usb_controller_speed_bytes{bus="2"} 1.25e+09 +node_usb_controller_speed_bytes{bus="3"} 6e+07 +node_usb_controller_speed_bytes{bus="4"} 6e+07 +node_usb_controller_speed_bytes{bus="5"} 1.25e+09 +node_usb_controller_speed_bytes{bus="6"} 6e+07 +node_usb_controller_speed_bytes{bus="7"} 6.25e+08 + +# HELP node_usb_info Info about USB devices. +# TYPE node_usb_info gauge +node_usb_info{bcd_device="0000",device_class="02",device_protocol="00",device_subclass="00",devpath="1-2",id_product="0200",id_vendor="0658",manufacturer="",product="",serial="",version="2.00"} 1 +node_usb_info{bcd_device="0000",device_class="ff",device_protocol="ff",device_subclass="10",devpath="4-3",id_product="00bd",id_vendor="06cb",manufacturer="",product="",serial="7ba268d87336",version="2.00"} 1 +node_usb_info{bcd_device="0001",device_class="e0",device_protocol="01",device_subclass="01",devpath="4-4",id_product="0029",id_vendor="8087",manufacturer="",product="",serial="",version="2.01"} 1 +node_usb_info{bcd_device="0120",device_class="00",device_protocol="00",device_subclass="00",devpath="1-3",id_product="9540",id_vendor="058f",manufacturer="Generic",product="EMV Smartcard Reader",serial="",version="2.01"} 1 +node_usb_info{bcd_device="0426",device_class="00",device_protocol="00",device_subclass="00",devpath="4-2",id_product="0407",id_vendor="1050",manufacturer="Yubico",product="Yubikey 4 OTP+U2F+CCID",serial="",version="2.00"} 1 +node_usb_info{bcd_device="5818",device_class="ef",device_protocol="01",device_subclass="02",devpath="6-2",id_product="b6cb",id_vendor="04f2",manufacturer="Chicony Electronics Co.,Ltd.",product="Integrated Camera",serial="0001",version="2.01"} 1 + +# HELP node_usb_interface_info Info about USB interfaces. +# TYPE node_usb_interface_info gauge +node_usb_interface_info{binterface_class="02",binterface_protocol="01",binterface_subclass="02",configuration="1",devpath="1-2",driver="cdc_acm",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="03",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-2",driver="usbhid",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="03",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-2",driver="usbhid",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="0a",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="1-2",driver="cdc_acm",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="0b",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="1-3",driver="",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="0b",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-2",driver="usbfs",interface="2",serial=""} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="00",binterface_subclass="01",configuration="1",devpath="6-2",driver="uvcvideo",interface="0",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="00",binterface_subclass="02",configuration="1",devpath="6-2",driver="uvcvideo",interface="1",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="6-2",driver="uvcvideo",interface="2",serial="0001"} 1 +node_usb_interface_info{binterface_class="0e",binterface_protocol="01",binterface_subclass="02",configuration="1",devpath="6-2",driver="uvcvideo",interface="3",serial="0001"} 1 +node_usb_interface_info{binterface_class="e0",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-4",driver="btusb",interface="0",serial=""} 1 +node_usb_interface_info{binterface_class="e0",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="4-4",driver="btusb",interface="1",serial=""} 1 +node_usb_interface_info{binterface_class="fe",binterface_protocol="01",binterface_subclass="01",configuration="1",devpath="6-2",driver="",interface="4",serial="0001"} 1 +node_usb_interface_info{binterface_class="ff",binterface_protocol="00",binterface_subclass="00",configuration="1",devpath="4-3",driver="",interface="0",serial="7ba268d87336"} 1 + +# HELP node_usb_max_current_milliamps USB device maximum current in milliamps. +# TYPE node_usb_max_current_milliamps gauge +node_usb_max_current_milliamps{devpath="1-2",serial=""} 100 +node_usb_max_current_milliamps{devpath="1-3",serial=""} 50 +node_usb_max_current_milliamps{devpath="4-2",serial=""} 30 +node_usb_max_current_milliamps{devpath="4-3",serial="7ba268d87336"} 100 +node_usb_max_current_milliamps{devpath="4-4",serial=""} 100 +node_usb_max_current_milliamps{devpath="6-2",serial="0001"} 500 + +# HELP node_usb_num_configurations Number of USB configurations. +# TYPE node_usb_num_configurations gauge +node_usb_num_configurations{devpath="1-2",serial=""} 1 +node_usb_num_configurations{devpath="1-3",serial=""} 1 +node_usb_num_configurations{devpath="4-2",serial=""} 1 +node_usb_num_configurations{devpath="4-3",serial="7ba268d87336"} 1 +node_usb_num_configurations{devpath="4-4",serial=""} 1 +node_usb_num_configurations{devpath="6-2",serial="0001"} 1 + +# HELP node_usb_num_interfaces Number of USB interfaces. +# TYPE node_usb_num_interfaces gauge +node_usb_num_interfaces{devpath="1-2",serial=""} 2 +node_usb_num_interfaces{devpath="1-3",serial=""} 1 +node_usb_num_interfaces{devpath="4-2",serial=""} 3 +node_usb_num_interfaces{devpath="4-3",serial="7ba268d87336"} 1 +node_usb_num_interfaces{devpath="4-4",serial=""} 2 +node_usb_num_interfaces{devpath="6-2",serial="0001"} 5 + +# HELP node_usb_power_info USB device power information. +# TYPE node_usb_power_info gauge +node_usb_power_info{control="auto",devpath="1-3",runtime_status="suspended",serial=""} 1 +node_usb_power_info{control="auto",devpath="4-2",runtime_status="active",serial=""} 1 +node_usb_power_info{control="auto",devpath="4-3",runtime_status="suspended",serial="7ba268d87336"} 1 +node_usb_power_info{control="auto",devpath="4-4",runtime_status="suspended",serial=""} 1 +node_usb_power_info{control="auto",devpath="6-2",runtime_status="suspended",serial="0001"} 1 +node_usb_power_info{control="on",devpath="1-2",runtime_status="active",serial=""} 1 + +# HELP node_usb_removable USB device removable state (1 = removable). +# TYPE node_usb_removable gauge +node_usb_removable{devpath="1-2",serial=""} 1 +node_usb_removable{devpath="1-3",serial=""} 0 +node_usb_removable{devpath="4-2",serial=""} 1 +node_usb_removable{devpath="4-3",serial="7ba268d87336"} 0 +node_usb_removable{devpath="4-4",serial=""} 0 +node_usb_removable{devpath="6-2",serial="0001"} 0 + +# HELP node_usb_speed_bytes USB device speed in bytes per second. +# TYPE node_usb_speed_bytes gauge +node_usb_speed_bytes{devpath="1-2",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="1-3",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="4-2",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="4-3",serial="7ba268d87336"} 1.5e+06 +node_usb_speed_bytes{devpath="4-4",serial=""} 1.5e+06 +node_usb_speed_bytes{devpath="6-2",serial="0001"} 6e+07 + +# HELP node_usb_urbnum_total Total number of USB request blocks. +# TYPE node_usb_urbnum_total counter +node_usb_urbnum_total{devpath="1-2",serial=""} 9 +node_usb_urbnum_total{devpath="1-3",serial=""} 2977 +node_usb_urbnum_total{devpath="4-2",serial=""} 13724 +node_usb_urbnum_total{devpath="4-3",serial="7ba268d87336"} 35 +node_usb_urbnum_total{devpath="4-4",serial=""} 33505 +node_usb_urbnum_total{devpath="6-2",serial="0001"} 804 diff --git a/collector/usb_linux.go b/collector/usb_linux.go new file mode 100644 index 0000000000..fcb91fd074 --- /dev/null +++ b/collector/usb_linux.go @@ -0,0 +1,277 @@ +// Copyright 2026 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !nousb + +package collector + +import ( + "errors" + "fmt" + "log/slog" + "os" + "strings" + "unicode" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/procfs/sysfs" +) + +// usbDeviceLabels are the labels shared by all per-device metrics. devpath is +// the sysfs entry name (e.g. "1-3"), which embeds the bus number and is +// therefore unique on a host. serial is a join key to other collectors, e.g. +// node_disk_info; devnum is deliberately not exported as it changes whenever a +// device is re-enumerated. +var usbDeviceLabels = []string{"devpath", "serial"} + +type usbCollector struct { + fs sysfs.FS + + infoDesc *prometheus.Desc + + speedBytesDesc *prometheus.Desc + removableDesc *prometheus.Desc + maxCurrentDesc *prometheus.Desc + powerInfoDesc *prometheus.Desc + autosuspendDelayDesc *prometheus.Desc + urbnumDesc *prometheus.Desc + numInterfacesDesc *prometheus.Desc + numConfigurationsDesc *prometheus.Desc + interfaceInfoDesc *prometheus.Desc + controllerInfoDesc *prometheus.Desc + controllerSpeedDesc *prometheus.Desc + controllerMaxChildDesc *prometheus.Desc +} + +func init() { + registerCollector("usb", defaultDisabled, NewUSBCollector) +} + +// NewUSBCollector returns a new Collector exposing USB device stats. +func NewUSBCollector(_ *slog.Logger) (Collector, error) { + fs, err := sysfs.NewFS(*sysPath) + if err != nil { + return nil, fmt.Errorf("failed to open sysfs: %w", err) + } + + c := &usbCollector{ + fs: fs, + infoDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "info"), + "Info about USB devices.", + []string{"devpath", "serial", "id_vendor", "id_product", "manufacturer", "product", "device_class", "device_subclass", "device_protocol", "bcd_device", "version"}, + nil, + ), + speedBytesDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "speed_bytes"), + "USB device speed in bytes per second.", + usbDeviceLabels, + nil, + ), + removableDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "removable"), + "USB device removable state (1 = removable).", + usbDeviceLabels, + nil, + ), + maxCurrentDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "max_current_milliamps"), + "USB device maximum current in milliamps.", + usbDeviceLabels, + nil, + ), + powerInfoDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "power_info"), + "USB device power information.", + []string{"devpath", "serial", "control", "runtime_status"}, + nil, + ), + autosuspendDelayDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "autosuspend_delay_seconds"), + "USB device autosuspend delay in seconds.", + usbDeviceLabels, + nil, + ), + urbnumDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "urbnum_total"), + "Total number of USB request blocks.", + usbDeviceLabels, + nil, + ), + numInterfacesDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "num_interfaces"), + "Number of USB interfaces.", + usbDeviceLabels, + nil, + ), + numConfigurationsDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "num_configurations"), + "Number of USB configurations.", + usbDeviceLabels, + nil, + ), + interfaceInfoDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "interface_info"), + "Info about USB interfaces.", + []string{"devpath", "serial", "configuration", "interface", "binterface_class", "binterface_subclass", "binterface_protocol", "driver"}, + nil, + ), + controllerInfoDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "controller_info"), + "Info about USB controllers.", + []string{"bus", "version"}, + nil, + ), + controllerSpeedDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "controller_speed_bytes"), + "USB controller speed in bytes per second.", + []string{"bus"}, + nil, + ), + controllerMaxChildDesc: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "usb", "controller_maxchild"), + "USB controller maximum number of child ports.", + []string{"bus"}, + nil, + ), + } + + return c, nil +} + +// sanitizeLabel makes s safe to use as a Prometheus label value: invalid UTF-8 +// sequences are replaced, and control characters such as the newlines some +// devices put into their descriptors are removed. +func sanitizeLabel(s string) string { + s = strings.ToValidUTF8(s, "\uFFFD") + return strings.Map(func(r rune) rune { + if unicode.IsControl(r) { + return -1 + } + return r + }, s) +} + +func (c *usbCollector) Update(ch chan<- prometheus.Metric) error { + devices, err := c.fs.USBDevices() + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return ErrNoData + } + return fmt.Errorf("couldn't get USB devices: %w", err) + } + + controllers, err := c.fs.USBControllers() + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return ErrNoData + } + return fmt.Errorf("couldn't get USB controllers: %w", err) + } + + for _, controller := range controllers { + ch <- prometheus.MustNewConstMetric(c.controllerInfoDesc, prometheus.GaugeValue, 1.0, + controller.BusNum, + controller.BCDUSB, + ) + if controller.Speed > 0 { + speedBytes := float64(controller.Speed) * 1000000.0 / 8.0 + ch <- prometheus.MustNewConstMetric(c.controllerSpeedDesc, prometheus.GaugeValue, speedBytes, + controller.BusNum, + ) + } + ch <- prometheus.MustNewConstMetric(c.controllerMaxChildDesc, prometheus.GaugeValue, float64(controller.MaxChild), + controller.BusNum, + ) + } + + for _, device := range devices { + devpath := sanitizeLabel(device.Name) + serial := sanitizeLabel(device.Serial) + + ch <- prometheus.MustNewConstMetric(c.infoDesc, prometheus.GaugeValue, 1.0, + devpath, + serial, + device.IDVendor, + device.IDProduct, + sanitizeLabel(device.Manufacturer), + sanitizeLabel(device.Product), + device.DeviceClass, + device.DeviceSubClass, + device.DeviceProtocol, + device.BCDDevice, + sanitizeLabel(device.BCDUSB), + ) + + if device.Speed > 0 { + speedBytes := float64(device.Speed) * 1000000.0 / 8.0 + ch <- prometheus.MustNewConstMetric(c.speedBytesDesc, prometheus.GaugeValue, speedBytes, + devpath, serial) + } + + var removable float64 + if device.Removable != nil && *device.Removable == sysfs.USBRemovableRemovable { + removable = 1.0 + } + ch <- prometheus.MustNewConstMetric(c.removableDesc, prometheus.GaugeValue, removable, + devpath, serial) + + if device.BMaxPower > 0 { + ch <- prometheus.MustNewConstMetric(c.maxCurrentDesc, prometheus.GaugeValue, float64(device.BMaxPower), + devpath, serial) + } + + control := sanitizeLabel(device.PowerControl) + runtimeStatus := sanitizeLabel(device.RuntimeStatus) + if control != "" || runtimeStatus != "" { + ch <- prometheus.MustNewConstMetric(c.powerInfoDesc, prometheus.GaugeValue, 1.0, + devpath, serial, control, runtimeStatus) + } + + if device.AutosuspendDelayMillis != nil { + delaySeconds := float64(*device.AutosuspendDelayMillis) / 1000.0 + ch <- prometheus.MustNewConstMetric(c.autosuspendDelayDesc, prometheus.GaugeValue, delaySeconds, + devpath, serial) + } + + if device.URBNum > 0 { + ch <- prometheus.MustNewConstMetric(c.urbnumDesc, prometheus.CounterValue, float64(device.URBNum), + devpath, serial) + } + + if device.NumInterfaces > 0 { + ch <- prometheus.MustNewConstMetric(c.numInterfacesDesc, prometheus.GaugeValue, float64(device.NumInterfaces), + devpath, serial) + } + + if device.NumConfigurations > 0 { + ch <- prometheus.MustNewConstMetric(c.numConfigurationsDesc, prometheus.GaugeValue, float64(device.NumConfigurations), + devpath, serial) + } + + for _, iface := range device.Interfaces { + ch <- prometheus.MustNewConstMetric(c.interfaceInfoDesc, prometheus.GaugeValue, 1.0, + devpath, + serial, + iface.Configuration, + iface.Interface, + iface.Class, + iface.SubClass, + iface.Protocol, + sanitizeLabel(iface.Driver), + ) + } + } + + return nil +} diff --git a/collector/usb_linux_test.go b/collector/usb_linux_test.go new file mode 100644 index 0000000000..41d032700e --- /dev/null +++ b/collector/usb_linux_test.go @@ -0,0 +1,95 @@ +// Copyright 2026 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !nousb + +package collector + +import ( + "errors" + "fmt" + "io" + "log/slog" + "os" + "strings" + "testing" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/testutil" +) + +func TestUSBCollector(t *testing.T) { + *sysPath = "fixtures/sys" + + logger := slog.New(slog.NewTextHandler(io.Discard, nil)) + c, err := NewUSBCollector(logger) + if err != nil { + t.Fatal(err) + } + + reg := prometheus.NewRegistry() + reg.MustRegister(&testUSBCollector{c: c}) + + expectedOutput, err := os.ReadFile("fixtures/usb-output.txt") + if err != nil { + t.Fatal(err) + } + + if err := testutil.GatherAndCompare(reg, strings.NewReader(string(expectedOutput))); err != nil { + t.Fatal(err) + } +} + +func TestUSBCollectorNoDevices(t *testing.T) { + // A checked-in fixture cannot express an absent /sys/bus/usb/devices + // directory, so an empty temporary root is the smallest way to exercise + // the ErrNoData path. + *sysPath = t.TempDir() + + logger := slog.New(slog.NewTextHandler(io.Discard, nil)) + c, err := NewUSBCollector(logger) + if err != nil { + t.Fatal(err) + } + + ch := make(chan prometheus.Metric, 200) + err = c.Update(ch) + close(ch) + + if !errors.Is(err, ErrNoData) { + t.Fatalf("expected ErrNoData, got %v", err) + } +} + +// testUSBCollector wraps the USB collector for testing. +type testUSBCollector struct { + c Collector +} + +func (tc *testUSBCollector) Collect(ch chan<- prometheus.Metric) { + sink := make(chan prometheus.Metric) + go func() { + if err := tc.c.Update(sink); err != nil { + panic(fmt.Errorf("failed to update collector: %s", err)) + } + close(sink) + }() + + for m := range sink { + ch <- m + } +} + +func (tc *testUSBCollector) Describe(_ chan<- *prometheus.Desc) { + // No-op for testing. +} diff --git a/end-to-end-test.sh b/end-to-end-test.sh index c50e746aac..5d95e420c4 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -84,6 +84,7 @@ enabled_collectors=$(cat << COLLECTORS textfile thermal_zone udp_queues + usb vmstat watchdog wifi