The Isenkram
system provide a practical and easy way to figure out which
packages support the hardware in a given machine. The command line
tool isenkram-lookup and the tasksel options provide a
convenient way to list and install packages relevant for the current
hardware during system installation, both user space packages and
firmware packages. The GUI background daemon on the other hand provide
a pop-up proposing to install packages when a new dongle is inserted
while using the computer. For example, if you plug in a smart card
reader, the system will ask if you want to install pcscd if
that package isn't already installed, and if you plug in a USB video
camera the system will ask if you want to install cheese if
cheese is currently missing. This already work just fine.
But Isenkram depend on a database mapping from hardware IDs to
package names. When I started no such database existed in Debian, so
I made my own data set and included it with the isenkram package and
made isenkram fetch the latest version of this database from git using
http. This way the isenkram users would get updated package proposals
as soon as I learned more about hardware related packages.
The hardware is identified using modalias strings. The modalias
design is from the Linux kernel where most hardware descriptors are
made available as a strings that can be matched using filename style
globbing. It handle USB, PCI, DMI and a lot of other hardware related
identifiers.
The downside to the Isenkram specific database is that there is no
information about relevant distribution / Debian version, making
isenkram propose obsolete packages too. But along came AppStream, a
cross distribution mechanism to store and collect metadata about
software packages. When I heard about the proposal, I contacted the
people involved and suggested to add a hardware matching rule using
modalias strings in the specification, to be able to use AppStream for
mapping hardware to packages. This idea was accepted and AppStream is
now a great way for a package to announce the hardware it support in a
distribution neutral way. I wrote
a
recipe on how to add such meta-information in a blog post last
December. If you have a hardware related package in Debian, please
announce the relevant hardware IDs using AppStream.
In Debian, almost all packages that can talk to a LEGO Mindestorms
RCX or NXT unit, announce this support using AppStream. The effect is
that when you insert such LEGO robot controller into your Debian
machine, Isenkram will propose to install the packages needed to get
it working. The intention is that this should allow the local user to
start programming his robot controller right away without having to
guess what packages to use or which permissions to fix.
But when I sat down with my son the other day to program our NXT
unit using his Debian Stretch computer, I discovered something
annoying. The local console user (ie my son) did not get access to
the USB device for programming the unit. This used to work, but no
longer in Jessie and Stretch. After some investigation and asking
around on #debian-devel, I discovered that this was because udev had
changed the mechanism used to grant access to local devices. The
ConsoleKit mechanism from /lib/udev/rules.d/70-udev-acl.rules
no longer applied, because LDAP users no longer was added to the
plugdev group during login. Michael Biebl told me that this method
was obsolete and the new method used ACLs instead. This was good
news, as the plugdev mechanism is a mess when using a remote user
directory like LDAP. Using ACLs would make sure a user lost device
access when she logged out, even if the user left behind a background
process which would retain the plugdev membership with the ConsoleKit
setup. Armed with this knowledge I moved on to fix the access problem
for the LEGO Mindstorms related packages.
The new system uses a udev tag, 'uaccess'. It can either be
applied directly for a device, or is applied in
/lib/udev/rules.d/70-uaccess.rules for classes of devices. As the
LEGO Mindstorms udev rules did not have a class, I decided to add the
tag directly in the udev rules files included in the packages. Here
is one example. For the nqc C compiler for the RCX, the
/lib/udev/rules.d/60-nqc.rules file now look like this:
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0694", ATTR{idProduct}=="0001", \
SYMLINK+="rcx-%k", TAG+="uaccess"
The key part is the 'TAG+="uaccess"' at the end. I suspect all
packages using plugdev in their /lib/udev/rules.d/ files should be
changed to use this tag (either directly or indirectly via
70-uaccess.rules). Perhaps a lintian check should be created
to detect this?
I've been unable to find good documentation on the uaccess feature.
It is unclear to me if the uaccess tag is an internal implementation
detail like the udev-acl tag used by
/lib/udev/rules.d/70-udev-acl.rules. If it is, I guess the
indirect method is the preferred way. Michael
asked for more
documentation from the systemd project and I hope it will make
this clearer. For now I use the generic classes when they exist and
is already handled by 70-uaccess.rules, and add the tag
directly if no such class exist.
To learn more about the isenkram system, please check out
my
blog posts tagged isenkram.
To help out making life for LEGO constructors in Debian easier,
please join us on our IRC channel
#debian-lego and join
the Debian
LEGO team in the Alioth project we created yesterday. A mailing
list is not yet created, but we are working on it. :)
As usual, if you use Bitcoin and want to show your support of my
activities, please send Bitcoin donations to my address
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b.