go-udev

command module
v0.9.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 21, 2025 License: GPL-3.0 Imports: 10 Imported by: 0

README

go-udev GitHub Repo stars

Go Report Card Build Status Linters Status Coverage Status GoDoc Release License

Simple udev implementation in Golang developed from scratch. This library allow to listen and manage Linux-kernel (since version 2.6.10) Netlink messages to user space (ie: NETLINK_KOBJECT_UEVENT).

Like udev you will be able to monitor, display and manage devices plug to the system.

How to

Get sources
go get github.com/pilebones/go-udev
Unit test
go test ./...
Compile
go build
Usage
./go-udev -<mode> [-file=<absolute_path>]

Allowed mode: info or monitor File should contains matcher rules (see: "Advanced usage" section)

Info Mode

Crawl /sys/devices uevent struct to detect plugged devices:

./go-udev -info
Monitor Mode

Handle all kernel message to detect change about plugged or unplugged devices:

./go-udev -monitor
Examples

Example of output when a USB storage is plugged:

2017/10/20 23:47:23 Handle netlink.UEvent{
    Action: "add",
    KObj:   "/devices/pci0000:00/0000:00:14.0/usb1/1-1",
    Env:    {"PRODUCT":"58f/6387/10b", "TYPE":"0/0/0", "BUSNUM":"001", "DEVNUM":"005", "SEQNUM":"2511", "DEVNAME":"bus/usb/001/005", "DEVPATH":"/devices/pci0000:00/0000:00:14.0/usb1/1-1", "SUBSYSTEM":"usb", "MAJOR":"189", "MINOR":"4", "DEVTYPE":"usb_device", "ACTION":"add"},
}
2017/10/20 23:47:23 Handle netlink.UEvent{
    Action: "add",
    KObj:   "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0",
    Env:    {"SUBSYSTEM":"usb", "TYPE":"0/0/0", "INTERFACE":"8/6/80", "MODALIAS":"usb:v058Fp6387d010Bdc00dsc00dp00ic08isc06ip50in00", "SEQNUM":"2512", "DEVPATH":"/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0", "DEVTYPE":"usb_interface", "PRODUCT":"58f/6387/10b", "ACTION":"add"},
}
2017/10/20 23:47:23 Handle netlink.UEvent{
    Action: "add",
    KObj:   "/module/usb_storage",
    Env:    {"SEQNUM":"2513", "ACTION":"add", "DEVPATH":"/module/usb_storage", "SUBSYSTEM":"module"},
}
[...]

Example of output when a USB storage is unplugged:

[...]
2017/10/20 23:47:29 Handle netlink.UEvent{
    Action: "remove",
    KObj:   "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb",
    Env:    {"SUBSYSTEM":"block", "MAJOR":"8", "MINOR":"16", "DEVNAME":"sdb", "DEVTYPE":"disk", "SEQNUM":"2543", "ACTION":"remove", "DEVPATH":"/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb"},
}
[...]
2017/10/20 23:47:29 Handle netlink.UEvent{
    Action: "remove",
    KObj:   "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0",
    Env:    {"ACTION":"remove", "SUBSYSTEM":"usb", "DEVTYPE":"usb_interface", "SEQNUM":"2548", "MODALIAS":"usb:v058Fp6387d010Bdc00dsc00dp00ic08isc06ip50in00", "DEVPATH":"/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0", "PRODUCT":"58f/6387/10b", "TYPE":"0/0/0", "INTERFACE":"8/6/80"},
}
2017/10/20 23:47:29 Handle netlink.UEvent{
    Action: "remove",
    KObj:   "/devices/pci0000:00/0000:00:14.0/usb1/1-1",
    Env:    {"PRODUCT":"58f/6387/10b", "TYPE":"0/0/0", "DEVNUM":"005", "SEQNUM":"2549", "ACTION":"remove", "DEVPATH":"/devices/pci0000:00/0000:00:14.0/usb1/1-1", "SUBSYSTEM":"usb", "MAJOR":"189", "MINOR":"4", "DEVNAME":"bus/usb/001/005", "DEVTYPE":"usb_device", "BUSNUM":"001"},
}

Note: To implement your own monitoring system, please see main.go as a simple example.

Advanced usage

Is it possible to filter uevents/devices with a Matcher.

A Matcher is a list of your own rules to match only relevant uevent kernel message (see: matcher.sample).

You could pass this file using for both mode:

./go-udev -file  matcher.sample [...]

Docker usage

How to build docker image
docker build . -f Dockfile.multistage -t go-udev
How to execute go-udev -info using docker image
docker run -rm -t go-udev -info
How to execute go-udev -monitor using docker image
docker run --rm -v=/dev:/dev -v /run/udev:/run/udev:ro --net=host -t go-udev -monitor

Warning: unsafe method because we share host /dev directory to the container.

TODO: unsafe and -monitor is not fully functional in docker, fix working in progress...

Throubleshooting

Don't hesitate to notice if you detect a problem with this tool or library.

Documentation

License

go-udev is available under the GNU GPL v3 - Clause License.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL