The hardware-observe interface

What a great idea!

@degville a potential rewrite.

My one concern is maintainability, although hardware_observe.go sees very limited action.


Hidden rewrite to save vertical space

The hardware-observe interface allows for getting hardware information from the system.

hardware-observe grants read-only access to many files and directories, primarily in /sys and /proc. Additionally, it provides access to many utility files and binaries such as lspci, lsusb, and hwinfo.

hardware-observe is a more general and broad interface. If more specific hardware access is required, such as for GPIO or I2C devices, See the gpio and i2c interfaces.

Interface documentation:

See Interface management and Supported interfaces for further details on how interfaces are used.


Developer details

Auto-connect: no

Path access

hardware-observe grants read access to the following paths:

  • For tools like hwinfo --short to get hardware information:
    /proc/ioports
    /proc/dma
    /proc/tty/driver/{,*}
    /proc/sys/dev/cdrom/info

  • For tools like lshw -quiet to get hardware information:
    /proc/devices
    /proc/ide/{,**}
    /proc/scsi/{,**}
    /proc/device-tree/{,**}
    /sys/kernel/debug/usb/devices
    /proc/sys/abi/{,*}

  • For tools like lspci -A linux-sysfs to get information on files in /sys:
    /sys/{block,bus,class,devices,firmware}/{,**}

  • For tools like lspci -A linux-proc to get information on /proc:
    /bus/pci/{,**} /{,usr/}lib/modprobe.d/{,*}

  • For tools like lspci -k to get information on loaded modules:
    Examples: /etc/modprobe.d/{,*},

  • For tools like lsusb to get USB information:
    /var/lib/usbutils/usb.ids
    /dev/
    /dev/bus/usb/{,**/}
    /etc/udev/udev.conf
    Note: lsusb and its database have to be shipped in the snap if not on classic

  • For tools like sensors to get sensor information:
    /etc/sensors3.conf
    /etc/sensors.d/{,*}

  • For tools like udevadm to get device information:
    /run/udev/data/**

  • For hugepage and transparent_hugepage statuses (but not the pages themselves):
    /sys/kernel/mm/{hugepages,transparent_hugepage}/{,**}

  • For information on available input devices:
    /proc/bus/input/devices

  • For power information:
    /sys/power/{,**}
    /run/udev/data/+power_supply:*

  • For interrupts:
    /proc/interrupts

  • For loaded kernel module information:
    /proc/modules

  • For VM information:
    /proc/cpuinfo
    /proc/sysinfo
    /proc/xen/capabilities
    /proc/1/sched
    /sys/hypervisor/properties/features
    /sys/hypervisor/type

  • For container information:
    /run/systemd/container

Binary access

hardware-observe grants executable access to the following binaries:

  • For tools provided by util-linux:
    /{,usr/}bin/lsblk
    /{,usr/}bin/lscpu
    /{,usr/}bin/lsmem

  • For tools like lsusb:
    /{,usr/}bin/lsusb

  • For tools like systemd-detect-virt:
    /{,usr/}bin/systemd-detect-virt

Capability access

hardware-observe grants the following capabilities:

  • For tools like lscpu and lspci -A to inspect specific PCI access methods:
    capability sys_rawio
    capability sys_admin

Socket access

hardware-observe grants the following socket access:

  • For udevadm to read netlink:
    network netlink raw

The test code for the interface is in the snapd repository: https://github.com/canonical/snapd/blob/master/interfaces/builtin/hardware_observe_test.go

The source code for the interface is in the snapd repository: https://github.com/canonical/snapd/blob/master/interfaces/builtin/hardware_observe.go

1 Like