2017-12-19 10:13:34 +00:00
|
|
|
#!/usr/bin/env perl
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2008-09-29 00:00:17 +00:00
|
|
|
# udev test
|
2003-11-23 13:47:28 +00:00
|
|
|
#
|
|
|
|
# Provides automated testing of the udev binary.
|
|
|
|
# The whole test is self contained in this file, except the matching sysfs tree.
|
|
|
|
# Simply extend the @tests array, to add a new test variant.
|
|
|
|
#
|
|
|
|
# Every test is driven by its own temporary config file.
|
|
|
|
# This program prepares the environment, creates the config and calls udev.
|
|
|
|
#
|
2005-03-26 23:10:03 +00:00
|
|
|
# udev parses the rules, looks at the provided sysfs and
|
2003-11-23 13:47:28 +00:00
|
|
|
# first creates and then removes the device node.
|
|
|
|
# After creation and removal the result is checked against the
|
|
|
|
# expected value and the result is printed.
|
|
|
|
#
|
2018-06-12 15:15:23 +00:00
|
|
|
# Copyright © 2004 Leann Ogasawara <ogasawara@osdl.org>
|
2003-11-23 13:47:28 +00:00
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
|
2012-04-13 13:57:13 +00:00
|
|
|
my $udev_bin = "./test-udev";
|
2012-01-10 00:34:15 +00:00
|
|
|
my $valgrind = 0;
|
2015-03-25 11:28:15 +00:00
|
|
|
my $gdb = 0;
|
2016-02-22 17:15:17 +00:00
|
|
|
my $strace = 0;
|
2015-04-03 15:27:45 +00:00
|
|
|
my $udev_bin_valgrind = "valgrind --tool=memcheck --leak-check=yes --track-origins=yes --quiet $udev_bin";
|
2015-03-25 11:28:15 +00:00
|
|
|
my $udev_bin_gdb = "gdb --args $udev_bin";
|
2016-02-22 17:15:17 +00:00
|
|
|
my $udev_bin_strace = "strace -efile $udev_bin";
|
2012-04-16 15:21:22 +00:00
|
|
|
my $udev_run = "test/run";
|
2016-04-05 06:13:41 +00:00
|
|
|
my $udev_tmpfs = "test/tmpfs";
|
2016-04-06 03:04:27 +00:00
|
|
|
my $udev_sys = "${udev_tmpfs}/sys";
|
|
|
|
my $udev_dev = "${udev_tmpfs}/dev";
|
2012-04-16 15:21:22 +00:00
|
|
|
my $udev_rules_dir = "$udev_run/udev/rules.d";
|
|
|
|
my $udev_rules = "$udev_rules_dir/udev-test.rules";
|
2014-12-10 09:20:11 +00:00
|
|
|
my $EXIT_TEST_SKIP = 77;
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2016-04-06 21:18:06 +00:00
|
|
|
my $rules_10k_tags = "";
|
|
|
|
for (my $i = 1; $i <= 10000; ++$i) {
|
2016-08-19 14:01:17 +00:00
|
|
|
$rules_10k_tags .= 'KERNEL=="sda", TAG+="test' . $i . "\"\n";
|
2016-04-06 21:18:06 +00:00
|
|
|
}
|
|
|
|
|
2003-11-23 13:47:28 +00:00
|
|
|
my @tests = (
|
2012-01-10 00:34:15 +00:00
|
|
|
{
|
|
|
|
desc => "no rules",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "sda" ,
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
#
|
2008-11-12 04:50:05 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of scsi disc",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "boot_disk" ,
|
|
|
|
rules => <<EOF
|
2012-02-19 23:41:58 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2006-08-20 17:11:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of scsi disc",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "boot_disk" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
|
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2006-08-20 17:11:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of scsi disc",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "boot_disk" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
|
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-11-23 13:47:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of scsi partition",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "boot_disk1" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
|
2003-12-05 03:21:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of pattern match",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "boot_disk1" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="?ATA", SYMLINK+="boot_disk%n-1"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA?", SYMLINK+="boot_disk%n-2"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="A??", SYMLINK+="boot_disk%n"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATAS", SYMLINK+="boot_disk%n-3"
|
2003-12-23 06:32:06 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of multiple sysfs files",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "boot_disk1" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS X ", SYMLINK+="boot_diskX%n"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", SYMLINK+="boot_disk%n"
|
2003-12-23 06:32:06 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "label test of max sysfs files (skip invalid rule)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "boot_disk1" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", ATTRS{scsi_level}=="6", ATTRS{rev}=="4.06", ATTRS{type}=="0", ATTRS{queue_depth}=="32", SYMLINK+="boot_diskXX%n"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", ATTRS{scsi_level}=="6", ATTRS{rev}=="4.06", ATTRS{type}=="0", SYMLINK+="boot_disk%n"
|
2003-12-03 01:52:26 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "catch device by *",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem/0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM*", SYMLINK+="modem/%n"
|
2004-02-12 08:49:52 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "catch device by * - take 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem/0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="*ACM1", SYMLINK+="bad"
|
|
|
|
KERNEL=="*ACM0", SYMLINK+="modem/%n"
|
2003-12-03 14:22:53 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "catch device by ?",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem/0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM??*", SYMLINK+="modem/%n-1"
|
|
|
|
KERNEL=="ttyACM??", SYMLINK+="modem/%n-2"
|
|
|
|
KERNEL=="ttyACM?", SYMLINK+="modem/%n"
|
2003-12-03 14:22:53 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "catch device by character class",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem/0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[A-Z]*", SYMLINK+="modem/%n-1"
|
|
|
|
KERNEL=="ttyACM?[0-9]", SYMLINK+="modem/%n-2"
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="modem/%n"
|
2003-11-23 13:47:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "replace kernel name",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-12-18 02:28:05 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle comment lines in config file (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2003-12-18 02:28:05 +00:00
|
|
|
# this is a comment
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-12-18 02:28:05 +00:00
|
|
|
|
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle comment lines in config file with whitespace (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
# this is a comment with whitespace before the comment
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-12-18 02:28:05 +00:00
|
|
|
|
2004-09-15 00:45:48 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle whitespace only lines (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "whitespace" ,
|
|
|
|
rules => <<EOF
|
2004-09-15 00:45:48 +00:00
|
|
|
|
|
|
|
|
2012-01-06 13:34:40 +00:00
|
|
|
|
|
|
|
# this is a comment with whitespace before the comment
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="whitespace"
|
2004-09-15 00:45:48 +00:00
|
|
|
|
2012-01-06 13:34:40 +00:00
|
|
|
|
2004-09-15 00:45:48 +00:00
|
|
|
|
2003-12-18 02:28:05 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle empty lines in config file (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2003-12-18 02:28:05 +00:00
|
|
|
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-12-18 02:28:05 +00:00
|
|
|
|
2004-12-20 06:38:33 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle backslashed multi lines in config file (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2008-09-29 02:12:44 +00:00
|
|
|
KERNEL=="ttyACM0", \\
|
2010-01-27 08:30:48 +00:00
|
|
|
SYMLINK+="modem"
|
2004-12-20 06:38:33 +00:00
|
|
|
|
2005-02-26 01:52:04 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "preserve backslashes, if they are not for a newline",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "aaa",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="ttyACM0", PROGRAM=="/bin/echo -e \\101", RESULT=="A", SYMLINK+="aaa"
|
2004-12-20 06:38:33 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "Handle stupid backslashed multi lines in config file (and replace kernel name)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2004-12-20 06:38:33 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
\\
|
|
|
|
|
2008-10-17 11:54:50 +00:00
|
|
|
\\
|
2004-12-20 06:38:33 +00:00
|
|
|
|
|
|
|
#\\
|
|
|
|
|
2008-09-29 02:12:44 +00:00
|
|
|
KERNEL=="ttyACM0", \\
|
2012-01-10 00:34:15 +00:00
|
|
|
SYMLINK+="modem"
|
2004-12-20 06:38:33 +00:00
|
|
|
|
2003-11-25 06:27:23 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "subdirectory handling",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "sub/direct/ory/modem" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="sub/direct/ory/modem"
|
2003-11-23 13:47:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "parent device name match of scsi partition",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "first_disk5" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="first_disk%n"
|
2006-08-20 17:11:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution chars",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "Major:8:minor:5:kernelnumber:5:id:0:0:0:0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:%M:minor:%m:kernelnumber:%n:id:%b"
|
2005-06-25 16:58:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "import of shell-value returned from program",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node12345678",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", IMPORT{program}="/bin/echo -e \' TEST_KEY=12345678\\n TEST_key2=98765\'", SYMLINK+="node\$env{TEST_KEY}"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 05:36:34 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "sustitution of sysfs value (%s{file})",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "disk-ATA-sda" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="disk-%s{vendor}-%k"
|
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2003-11-23 13:47:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program result substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "special-device-5" ,
|
|
|
|
not_exp_name => "not" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n special-device", RESULT=="-special-*", SYMLINK+="not"
|
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n special-device", RESULT=="special-*", SYMLINK+="%c-%n"
|
[PATCH] netdev - udevdb+dev.d changes
Here is a patch to change the netdev handling in the database and for
the dev.d/ calls. I applies on top of the udevd.patch, cause klibc has
no sysinfo().
o netdev's are also put into our database now. I want this for the
udevruler gui to get a list of all handled devices.
All devices in the db are stamped with the system uptime value at
the creation time. 'udevinfo -d' prints it.
o the DEVPATH value is the key for udevdb, but if we rename
a netdev, the name is replaced in the kernel, so we add
the changed name to the db to match with the remove event.
NOTE: The dev.d/ scripts still get the original name from the
hotplug call. Should we replace DEVPATH with the new name too?
o We now only add a device to the db, if we have successfully created
the main node or successfully renamed a netdev. This is the main part
of the patch, cause I needed to clean the retval passing trough all
the functions used for node creation.
o DEVNODE sounds a bit ugly for netdev's so I exported DEVNAME too.
Can we change the name?
o I've added a UDEV_NO_DEVD to possibly skip the script execution
and used it in udev-test.pl.
udevstart is the same horror now, if you have scripts with logging
statements in dev.d/ it takes minutes to finish, can we skip the
scripts here too?
o The get_device_type() function is changed to be more strict, cause
'udevinfo -a -p /block/' gets a class device for it and tries to
print the major/minor values.
o bugfix, the RESULT value has now a working newline removal and a test
for this case.
2004-04-01 07:12:57 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program result substitution (newline removal)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "newline_removed" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo test", RESULT=="test", SYMLINK+="newline_removed"
|
2003-11-24 06:25:13 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program result substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "test-0:0:0:0" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n test-%b", RESULT=="test-0:0*", SYMLINK+="%c"
|
2004-02-27 05:29:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program with lots of arguments",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "foo9" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="%c{7}"
|
2004-03-11 09:36:12 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program with subshell",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "bar9" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'echo foo3 foo4 foo5 foo6 foo7 foo8 foo9 | sed s/foo9/bar9/'", KERNEL=="sda5", SYMLINK+="%c{7}"
|
2004-03-11 09:36:12 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program arguments combined with apostrophes",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "foo7" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n 'foo3 foo4' 'foo5 foo6 foo7 foo8'", KERNEL=="sda5", SYMLINK+="%c{5}"
|
2017-09-28 06:53:46 +00:00
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program arguments combined with escaped double quotes, part 1",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "foo2" ,
|
|
|
|
rules => <<EOF
|
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'printf %%s \\\"foo1 foo2\\\" | grep \\\"foo1 foo2\\\"'", KERNEL=="sda5", SYMLINK+="%c{2}"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program arguments combined with escaped double quotes, part 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "foo2" ,
|
|
|
|
rules => <<EOF
|
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c \\\"printf %%s 'foo1 foo2' | grep 'foo1 foo2'\\\"", KERNEL=="sda5", SYMLINK+="%c{2}"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program arguments combined with escaped double quotes, part 3",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "foo2" ,
|
|
|
|
rules => <<EOF
|
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'printf \\\"%%s %%s\\\" \\\"foo1 foo2\\\" \\\"foo3\\\"| grep \\\"foo1 foo2\\\"'", KERNEL=="sda5", SYMLINK+="%c{2}"
|
2004-03-04 08:55:22 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "characters before the %c{N} substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "my-foo9" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{7}"
|
2004-03-04 08:55:22 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "substitute the second to last argument",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "my-foo8" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{6}"
|
2005-06-19 22:29:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution by variable name",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "Major:8-minor:5-kernelnumber:5-id:0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:\$major-minor:\$minor-kernelnumber:\$number-id:\$id"
|
2005-06-19 22:29:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution by variable name 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "Major:8-minor:5-kernelnumber:5-id:0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="Major:\$major-minor:%m-kernelnumber:\$number-id:\$id"
|
2005-06-19 22:29:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution by variable name 3",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "850:0:0:05" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="%M%m%b%n"
|
2005-06-19 22:29:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution by variable name 4",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "855" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major\$minor\$number"
|
2005-06-19 22:29:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test substitution by variable name 5",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "8550:0:0:0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major%m%n\$id"
|
2003-12-25 07:56:54 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "non matching SUBSYSTEMS for device with no parent",
|
|
|
|
devpath => "/devices/virtual/tty/console",
|
|
|
|
exp_name => "TTY",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo", RESULT=="foo", SYMLINK+="foo"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="console", SYMLINK+="TTY"
|
2003-12-25 08:05:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "non matching SUBSYSTEMS",
|
|
|
|
devpath => "/devices/virtual/tty/console",
|
|
|
|
exp_name => "TTY" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="foo", ATTRS{dev}=="5:1", SYMLINK+="foo"
|
|
|
|
KERNEL=="console", SYMLINK+="TTY"
|
2003-12-25 08:33:56 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ATTRS match",
|
|
|
|
devpath => "/devices/virtual/tty/console",
|
|
|
|
exp_name => "foo" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="console", SYMLINK+="TTY"
|
|
|
|
ATTRS{dev}=="5:1", SYMLINK+="foo"
|
2009-02-05 11:40:15 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ATTR (empty file)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "empty" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", ATTR{test_empty_file}=="?*", SYMLINK+="something"
|
|
|
|
KERNEL=="sda", ATTR{test_empty_file}!="", SYMLINK+="not-empty"
|
|
|
|
KERNEL=="sda", ATTR{test_empty_file}=="", SYMLINK+="empty"
|
|
|
|
KERNEL=="sda", ATTR{test_empty_file}!="?*", SYMLINK+="not-something"
|
2009-02-05 11:40:15 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ATTR (non-existent file)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "non-existent" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", ATTR{nofile}=="?*", SYMLINK+="something"
|
|
|
|
KERNEL=="sda", ATTR{nofile}!="", SYMLINK+="not-empty"
|
|
|
|
KERNEL=="sda", ATTR{nofile}=="", SYMLINK+="empty"
|
|
|
|
KERNEL=="sda", ATTR{nofile}!="?*", SYMLINK+="not-something"
|
|
|
|
KERNEL=="sda", TEST!="nofile", SYMLINK+="non-existent"
|
|
|
|
KERNEL=="sda", SYMLINK+="wrong"
|
2003-11-27 01:45:26 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program and bus type match",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "scsi-0:0:0:0" ,
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="usb", PROGRAM=="/bin/echo -n usb-%b", SYMLINK+="%c"
|
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n scsi-%b", SYMLINK+="%c"
|
|
|
|
SUBSYSTEMS=="foo", PROGRAM=="/bin/echo -n foo-%b", SYMLINK+="%c"
|
2004-02-17 05:44:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "sysfs parent hierarchy",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
ATTRS{idProduct}=="007b", SYMLINK+="modem"
|
2004-02-12 07:34:21 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "name test with ! in the name",
|
|
|
|
devpath => "/devices/virtual/block/fake!blockdev0",
|
|
|
|
exp_name => "is/a/fake/blockdev0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", SYMLINK+="is/not/a/%k"
|
|
|
|
SUBSYSTEM=="block", SYMLINK+="is/a/%k"
|
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2004-02-17 02:25:01 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "name test with ! in the name, but no matching rule",
|
|
|
|
devpath => "/devices/virtual/block/fake!blockdev0",
|
|
|
|
exp_name => "fake/blockdev0" ,
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK+="modem"
|
2004-02-17 06:00:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "KERNELS rule",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "scsi-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="usb", KERNELS=="0:0:0:0", SYMLINK+="not-scsi"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:1", SYMLINK+="no-match"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS==":0", SYMLINK+="short-id"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="/0:0:0:0", SYMLINK+="no-match"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="scsi-0:0:0:0"
|
2004-02-17 06:00:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "KERNELS wildcard all",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "scsi-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*:1", SYMLINK+="no-match"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*:0:1", SYMLINK+="no-match"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*:0:0:1", SYMLINK+="no-match"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="0:0:0:0", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*", SYMLINK+="scsi-0:0:0:0"
|
2004-02-17 06:00:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "KERNELS wildcard partial",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "scsi-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*:0", SYMLINK+="scsi-0:0:0:0"
|
2004-02-17 06:00:38 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "KERNELS wildcard partial 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "scsi-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNELS=="*:0:0:0", SYMLINK+="scsi-0:0:0:0"
|
2006-09-05 00:18:06 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "substitute attr with link target value (first match)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "driver-is-sd",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", SYMLINK+="driver-is-\$attr{driver}"
|
2006-09-05 00:18:06 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "substitute attr with link target value (currently selected device)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "driver-is-ahci",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="pci", SYMLINK+="driver-is-\$attr{driver}"
|
2004-03-05 02:59:13 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ignore ATTRS attribute whitespace",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "ignored",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE", SYMLINK+="ignored"
|
2004-03-05 02:59:13 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "do not ignore ATTRS attribute whitespace",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "matched-with-space",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE ", SYMLINK+="wrong-to-ignore"
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE ", SYMLINK+="matched-with-space"
|
2004-03-11 09:39:53 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions USER=bad GROUP=name",
|
|
|
|
devpath => "/devices/virtual/tty/tty33",
|
|
|
|
exp_name => "tty33",
|
|
|
|
exp_perms => "0:0:0600",
|
|
|
|
rules => <<EOF
|
2012-04-16 15:21:22 +00:00
|
|
|
KERNEL=="tty33", OWNER="bad", GROUP="name"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
2014-09-20 16:12:53 +00:00
|
|
|
desc => "permissions OWNER=1",
|
2012-01-10 00:34:15 +00:00
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1::0600",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="1"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
2014-09-20 16:12:53 +00:00
|
|
|
desc => "permissions GROUP=1",
|
2012-01-10 00:34:15 +00:00
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => ":1:0660",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", GROUP="1"
|
2005-03-18 22:52:41 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "textual user id",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
2018-02-21 07:34:42 +00:00
|
|
|
exp_perms => "daemon::0600",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2018-02-21 07:34:42 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="daemon"
|
2005-03-18 22:52:41 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "textual group id",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
exp_perms => ":daemon:0660",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", GROUP="daemon"
|
2005-03-19 00:45:03 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "textual user/group id",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
exp_perms => "root:mail:0660",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="root", GROUP="mail"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions MODE=0777",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
exp_perms => "::0777",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", MODE="0777"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
2014-09-20 16:12:53 +00:00
|
|
|
desc => "permissions OWNER=1 GROUP=1 MODE=0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:1:0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="1", GROUP="1", MODE="0777"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
2014-09-20 16:12:53 +00:00
|
|
|
desc => "permissions OWNER to 1",
|
2012-01-10 00:34:15 +00:00
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1::",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", OWNER="1"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
2014-09-20 16:12:53 +00:00
|
|
|
desc => "permissions GROUP to 1",
|
2012-01-10 00:34:15 +00:00
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => ":1:0660",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", GROUP="1"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions MODE to 0060",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
|
|
|
exp_perms => "::0060",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", MODE="0060"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions OWNER, GROUP, MODE",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:1:0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", OWNER="1", GROUP="1", MODE="0777"
|
2004-12-20 22:44:57 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions only rule",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:1:0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", OWNER="1", GROUP="1", MODE="0777"
|
|
|
|
KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n"
|
2004-12-20 23:19:34 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "multiple permissions only rule",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:1:0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
SUBSYSTEM=="tty", OWNER="1"
|
|
|
|
SUBSYSTEM=="tty", GROUP="1"
|
2005-03-13 04:46:31 +00:00
|
|
|
SUBSYSTEM=="tty", MODE="0777"
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n"
|
2004-12-20 23:19:34 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "permissions only rule with override at SYMLINK+ rule",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "ttyACM0",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:2:0777",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2014-09-20 16:12:53 +00:00
|
|
|
SUBSYSTEM=="tty", OWNER="1"
|
|
|
|
SUBSYSTEM=="tty", GROUP="1"
|
2005-03-13 04:46:31 +00:00
|
|
|
SUBSYSTEM=="tty", MODE="0777"
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444"
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", GROUP="2"
|
2004-03-13 01:13:59 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "major/minor number test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
exp_majorminor => "8:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node"
|
2004-03-13 02:00:39 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "big major number test",
|
|
|
|
devpath => "/devices/virtual/misc/misc-fake1",
|
|
|
|
exp_name => "node",
|
2016-04-06 03:04:27 +00:00
|
|
|
exp_majorminor => "4095:1",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="misc-fake1", SYMLINK+="node"
|
2004-03-13 02:00:39 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "big major and big minor number test",
|
|
|
|
devpath => "/devices/virtual/misc/misc-fake89999",
|
|
|
|
exp_name => "node",
|
2016-04-06 03:04:27 +00:00
|
|
|
exp_majorminor => "4095:89999",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="misc-fake89999", SYMLINK+="node"
|
2004-10-30 11:29:52 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "multiple symlinks with format char",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "symlink2-ttyACM0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK="symlink1-%n symlink2-%k symlink3-%b"
|
2005-07-07 21:43:13 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "multiple symlinks with a lot of s p a c e s",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "one",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK=" one two "
|
2017-01-26 01:24:52 +00:00
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with spaces in substituted variable",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}="one two three"
|
|
|
|
SYMLINK="name-\$env{WITH_WS}-end"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with leading space in substituted variable",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three"
|
|
|
|
SYMLINK="name-\$env{WITH_WS}-end"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with trailing space in substituted variable",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}="one two three "
|
|
|
|
SYMLINK="name-\$env{WITH_WS}-end"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with lots of space in substituted variable",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three "
|
|
|
|
SYMLINK="name-\$env{WITH_WS}-end"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with multiple spaces in substituted variable",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three "
|
|
|
|
SYMLINK="name-\$env{WITH_WS}-end"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with space and var with space, part 1",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "first",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three "
|
|
|
|
SYMLINK=" first name-\$env{WITH_WS}-end another_symlink a b c "
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with space and var with space, part 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "name-one_two_three-end",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three "
|
|
|
|
SYMLINK=" first name-\$env{WITH_WS}-end another_symlink a b c "
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink with space and var with space, part 3",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "another_symlink",
|
|
|
|
not_exp_name => " ",
|
|
|
|
rules => <<EOF
|
|
|
|
ENV{WITH_WS}=" one two three "
|
|
|
|
SYMLINK=" first name-\$env{WITH_WS}-end another_symlink a b c "
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink creation (same directory)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "modem0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK="modem%n"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "multiple symlinks",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "second-0" ,
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM0", SYMLINK="first-%n second-%n third-%n"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink name '.'",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => ".",
|
|
|
|
exp_add_error => "yes",
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="."
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink node to itself",
|
|
|
|
devpath => "/devices/virtual/tty/tty0",
|
|
|
|
exp_name => "link",
|
|
|
|
exp_add_error => "yes",
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
option => "clean",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="tty0", SYMLINK+="tty0"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %n substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "symlink0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink%n"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %k substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "symlink-ttyACM0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink-%k"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %M:%m substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "major-166:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="major-%M:%m"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %b substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "symlink-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2012-01-01 03:21:15 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="symlink-%b"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %c substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "test",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo test", SYMLINK+="%c"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %c{N} substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "test",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2}"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %c{N+} substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "this",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2+}"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink only rule with %c{N+}",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "test",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/bin/echo link test this" SYMLINK+="%c{2+}"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "symlink %s{filename} substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "166:0",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="%s{dev}"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program result substitution (numbered part of)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "link1",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2", RESULT=="node *", SYMLINK+="%c{2} %c{3}"
|
2004-04-16 06:14:49 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "program result substitution (numbered part of+)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
|
|
|
|
exp_name => "link4",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2 link3 link4", RESULT=="node *", SYMLINK+="%c{2+}"
|
2004-11-13 13:43:24 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "SUBSYSTEM match test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match", SUBSYSTEM=="vc"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", SUBSYSTEM=="block"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match2", SUBSYSTEM=="vc"
|
2004-11-13 04:21:12 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "DRIVERS match test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match", DRIVERS=="sd-wrong"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", DRIVERS=="sd"
|
2005-02-09 03:37:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "devnode substitution test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node",
|
|
|
|
rules => <<EOF
|
2012-01-01 03:21:15 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/usr/bin/test -b %N" SYMLINK+="node"
|
2005-02-10 08:03:55 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "parent node name substitution test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "sda-part-1",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="%P-part-1"
|
2005-02-10 08:03:55 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "udev_root substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
2012-07-15 20:10:46 +00:00
|
|
|
exp_name => "start-/dev-end",
|
2012-01-10 00:34:15 +00:00
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="start-%r-end"
|
2005-03-12 21:55:08 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "last_rule option",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "last",
|
|
|
|
rules => <<EOF
|
2006-08-20 17:11:32 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="last", OPTIONS="last_rule"
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="very-last"
|
2005-03-13 04:46:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "negation KERNEL!=",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "match",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL!="sda1", SYMLINK+="matches-but-is-negated"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL!="xsda1", SYMLINK+="match"
|
2005-03-13 04:46:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "negation SUBSYSTEM!=",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "not-anything",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", SUBSYSTEM=="block", KERNEL!="sda1", SYMLINK+="matches-but-is-negated"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", SUBSYSTEM!="anything", SYMLINK+="not-anything"
|
2005-03-13 04:46:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "negation PROGRAM!= exit code",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "nonzero-program",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="sda1", PROGRAM!="/bin/false", SYMLINK+="nonzero-program"
|
2005-03-13 10:40:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ENV{} test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "true",
|
|
|
|
rules => <<EOF
|
2008-10-14 17:55:57 +00:00
|
|
|
ENV{ENV_KEY_TEST}="test"
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="go", SYMLINK+="wrong"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="test", SYMLINK+="true"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="bad", SYMLINK+="bad"
|
2005-03-13 10:40:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ENV{} test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "true",
|
|
|
|
rules => <<EOF
|
2008-10-14 17:55:57 +00:00
|
|
|
ENV{ENV_KEY_TEST}="test"
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="go", SYMLINK+="wrong"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="yes", ENV{ACTION}=="add", ENV{DEVPATH}=="*/block/sda/sdax1", SYMLINK+="no"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="test", ENV{ACTION}=="add", ENV{DEVPATH}=="*/block/sda/sda1", SYMLINK+="true"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="bad", SYMLINK+="bad"
|
2005-08-16 02:25:20 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ENV{} test (assign)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "true",
|
|
|
|
rules => <<EOF
|
2006-08-20 17:11:32 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true"
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="yes", SYMLINK+="no"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="true", SYMLINK+="true"
|
2006-09-04 22:50:25 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ENV{} test (assign 2 times)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "true",
|
|
|
|
rules => <<EOF
|
2006-09-04 22:50:25 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="absolutely-\$env{ASSIGN}"
|
2010-01-27 08:30:48 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="yes", SYMLINK+="no"
|
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="absolutely-true", SYMLINK+="true"
|
2005-08-16 02:25:20 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "ENV{} test (assign2)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "part",
|
|
|
|
rules => <<EOF
|
2006-04-24 17:25:55 +00:00
|
|
|
SUBSYSTEM=="block", KERNEL=="*[0-9]", ENV{PARTITION}="true", ENV{MAINDEVICE}="false"
|
|
|
|
SUBSYSTEM=="block", KERNEL=="*[!0-9]", ENV{PARTITION}="false", ENV{MAINDEVICE}="true"
|
2010-01-27 08:30:48 +00:00
|
|
|
ENV{MAINDEVICE}=="true", SYMLINK+="disk"
|
|
|
|
SUBSYSTEM=="block", SYMLINK+="before"
|
|
|
|
ENV{PARTITION}=="true", SYMLINK+="part"
|
2005-03-26 23:15:07 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "untrusted string sanitize",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "sane",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e name; (/usr/bin/badprogram)", RESULT=="name_ _/usr/bin/badprogram_", SYMLINK+="sane"
|
2005-08-28 13:55:58 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "untrusted string sanitize (don't replace utf8)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "uber",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xc3\\xbcber" RESULT=="\xc3\xbcber", SYMLINK+="uber"
|
2005-08-28 13:55:58 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "untrusted string sanitize (replace invalid utf8)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "replaced",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xef\\xe8garbage", RESULT=="__garbage", SYMLINK+="replaced"
|
2005-03-28 09:22:17 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "read sysfs value from parent device",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "serial-354172020305000",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM*", ATTRS{serial}=="?*", SYMLINK+="serial-%s{serial}"
|
2005-03-28 10:20:05 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "match against empty key string",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "ok",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", ATTRS{nothing}!="", SYMLINK+="not-1-ok"
|
|
|
|
KERNEL=="sda", ATTRS{nothing}=="", SYMLINK+="not-2-ok"
|
|
|
|
KERNEL=="sda", ATTRS{vendor}!="", SYMLINK+="ok"
|
|
|
|
KERNEL=="sda", ATTRS{vendor}=="", SYMLINK+="not-3-ok"
|
2005-04-02 15:45:35 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "check ACTION value",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "ok",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
ACTION=="unknown", KERNEL=="sda", SYMLINK+="unknown-not-ok"
|
|
|
|
ACTION=="add", KERNEL=="sda", SYMLINK+="ok"
|
2005-06-05 02:57:03 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "final assignment",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "ok",
|
|
|
|
exp_perms => "root:tty:0640",
|
|
|
|
rules => <<EOF
|
2008-10-17 11:54:50 +00:00
|
|
|
KERNEL=="sda", GROUP:="tty"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", GROUP="not-ok", MODE="0640", SYMLINK+="ok"
|
2005-06-05 02:57:03 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "final assignment 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "ok",
|
|
|
|
exp_perms => "root:tty:0640",
|
|
|
|
rules => <<EOF
|
2008-10-17 11:54:50 +00:00
|
|
|
KERNEL=="sda", GROUP:="tty"
|
2005-06-05 02:57:03 +00:00
|
|
|
SUBSYSTEM=="block", MODE:="640"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", GROUP="not-ok", MODE="0666", SYMLINK+="ok"
|
2005-06-25 11:10:16 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "env substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "node-add-me",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", MODE="0666", SYMLINK+="node-\$env{ACTION}-me"
|
2005-06-05 03:13:33 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "reset list to current value",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "three",
|
|
|
|
not_exp_name => "two",
|
|
|
|
rules => <<EOF
|
2008-09-29 02:12:44 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="one"
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="two"
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK="three"
|
2009-01-30 02:53:09 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test empty SYMLINK+ (empty override)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "right",
|
|
|
|
not_exp_name => "wrong",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="wrong"
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK=""
|
|
|
|
KERNEL=="ttyACM[0-9]*", SYMLINK+="right"
|
2005-07-12 10:52:56 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test multi matches",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="ttyACM*", SYMLINK+="before"
|
|
|
|
KERNEL=="ttyACM*|nothing", SYMLINK+="right"
|
2005-07-12 10:52:56 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test multi matches 2",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="dontknow*|*nothing", SYMLINK+="nomatch"
|
|
|
|
KERNEL=="ttyACM*", SYMLINK+="before"
|
|
|
|
KERNEL=="dontknow*|ttyACM*|nothing*", SYMLINK+="right"
|
2008-10-25 01:00:03 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test multi matches 3",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="dontknow|nothing", SYMLINK+="nomatch"
|
|
|
|
KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", SYMLINK+="wrong1"
|
|
|
|
KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", SYMLINK+="wrong2"
|
|
|
|
KERNEL=="dontknow|ttyACM0|nothing", SYMLINK+="right"
|
2008-10-25 01:00:03 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "test multi matches 4",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="dontknow|nothing", SYMLINK+="nomatch"
|
|
|
|
KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", SYMLINK+="wrong1"
|
|
|
|
KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", SYMLINK+="wrong2"
|
|
|
|
KERNEL=="all|dontknow|ttyACM0", SYMLINK+="right"
|
|
|
|
KERNEL=="ttyACM0a|nothing", SYMLINK+="wrong3"
|
2005-07-12 12:46:36 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "IMPORT parent test sequence 1/2 (keep)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "parent",
|
|
|
|
option => "keep",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="sda", IMPORT{program}="/bin/echo -e \'PARENT_KEY=parent_right\\nWRONG_PARENT_KEY=parent_wrong'"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", SYMLINK+="parent"
|
2005-07-12 12:46:36 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "IMPORT parent test sequence 2/2 (keep)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "parentenv-parent_right",
|
|
|
|
option => "clean",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", IMPORT{parent}="PARENT*", SYMLINK+="parentenv-\$env{PARENT_KEY}\$env{WRONG_PARENT_KEY}"
|
2005-07-16 05:46:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "GOTO test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2005-07-16 05:46:31 +00:00
|
|
|
KERNEL=="sda1", GOTO="TEST"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", SYMLINK+="wrong"
|
2008-10-22 22:13:59 +00:00
|
|
|
KERNEL=="sda1", GOTO="BAD"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", SYMLINK+="", LABEL="NO"
|
|
|
|
KERNEL=="sda1", SYMLINK+="right", LABEL="TEST", GOTO="end"
|
|
|
|
KERNEL=="sda1", SYMLINK+="wrong2", LABEL="BAD"
|
2009-09-06 14:55:00 +00:00
|
|
|
LABEL="end"
|
2009-05-13 16:01:32 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "GOTO label does not exist",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "right",
|
|
|
|
rules => <<EOF
|
2009-05-13 16:01:32 +00:00
|
|
|
KERNEL=="sda1", GOTO="does-not-exist"
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", SYMLINK+="right",
|
2009-05-13 16:01:32 +00:00
|
|
|
LABEL="exists"
|
2006-04-24 17:25:55 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "SYMLINK+ compare test",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "right",
|
|
|
|
not_exp_name => "wrong",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", SYMLINK+="link"
|
|
|
|
KERNEL=="sda1", SYMLINK=="link*", SYMLINK+="right"
|
|
|
|
KERNEL=="sda1", SYMLINK=="nolink*", SYMLINK+="wrong"
|
2006-04-24 17:25:55 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "invalid key operation",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL="sda1", SYMLINK+="no"
|
|
|
|
KERNEL=="sda1", SYMLINK+="yes"
|
2007-02-25 00:06:20 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "operator chars in attribute",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", ATTR{test:colon+plus}=="?*", SYMLINK+="yes"
|
2006-08-13 02:23:16 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "overlong comment line",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
|
|
|
|
exp_name => "yes",
|
|
|
|
rules => <<EOF
|
2006-08-13 02:23:16 +00:00
|
|
|
# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
|
2008-10-17 11:54:50 +00:00
|
|
|
# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda1", SYMLINK+=="no"
|
|
|
|
KERNEL=="sda1", SYMLINK+="yes"
|
2007-06-03 10:29:46 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "magic subsys/kernel lookup",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "00:16:41:e2:8d:ff",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", SYMLINK+="\$attr{[net/eth0]address}"
|
2007-08-16 10:45:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST absolute path",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "there",
|
|
|
|
rules => <<EOF
|
2014-12-11 13:17:35 +00:00
|
|
|
TEST=="/etc/machine-id", SYMLINK+="there"
|
|
|
|
TEST!="/etc/machine-id", SYMLINK+="notthere"
|
2007-08-16 10:45:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST subsys/kernel lookup",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "yes",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", TEST=="[net/eth0]", SYMLINK+="yes"
|
2007-08-16 10:45:31 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST relative path",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "relative",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", TEST=="size", SYMLINK+="relative"
|
2008-03-14 22:40:06 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST wildcard substitution (find queue/nr_requests)",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "found-subdir",
|
|
|
|
rules => <<EOF
|
2010-01-27 08:30:48 +00:00
|
|
|
KERNEL=="sda", TEST=="*/nr_requests", SYMLINK+="found-subdir"
|
2008-04-18 19:07:29 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST MODE=0000",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "sda",
|
|
|
|
exp_perms => "0:0:0000",
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2008-04-18 19:07:29 +00:00
|
|
|
KERNEL=="sda", MODE="0000"
|
2003-11-23 13:47:28 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST PROGRAM feeds OWNER, GROUP, MODE",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "sda",
|
2014-09-20 16:12:53 +00:00
|
|
|
exp_perms => "1:1:0400",
|
2012-01-10 00:34:15 +00:00
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2008-10-22 22:13:59 +00:00
|
|
|
KERNEL=="sda", MODE="666"
|
2014-09-20 16:12:53 +00:00
|
|
|
KERNEL=="sda", PROGRAM=="/bin/echo 1 1 0400", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
|
2008-05-19 07:05:20 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "TEST PROGRAM feeds MODE with overflow",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "sda",
|
|
|
|
exp_perms => "0:0:0440",
|
|
|
|
exp_rem_error => "yes",
|
|
|
|
rules => <<EOF
|
2008-10-22 22:13:59 +00:00
|
|
|
KERNEL=="sda", MODE="440"
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
|
2008-10-26 01:48:14 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "magic [subsys/sysname] attribute substitution",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "sda-8741C4G-end",
|
|
|
|
exp_perms => "0:0:0600",
|
|
|
|
rules => <<EOF
|
2012-01-06 13:34:40 +00:00
|
|
|
KERNEL=="sda", PROGRAM="/bin/true create-envp"
|
2008-10-26 13:31:46 +00:00
|
|
|
KERNEL=="sda", ENV{TESTENV}="change-envp"
|
2012-02-19 23:41:58 +00:00
|
|
|
KERNEL=="sda", SYMLINK+="%k-%s{[dmi/id]product_name}-end"
|
2011-08-05 00:00:30 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "builtin path_id",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0",
|
|
|
|
rules => <<EOF
|
2011-08-05 00:00:30 +00:00
|
|
|
KERNEL=="sda", IMPORT{builtin}="path_id"
|
|
|
|
KERNEL=="sda", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/\$env{ID_PATH}"
|
2016-04-06 21:18:06 +00:00
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "add and match tag",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "found",
|
|
|
|
not_exp_name => "bad" ,
|
|
|
|
rules => <<EOF
|
|
|
|
SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", TAG+="green"
|
|
|
|
TAGS=="green", SYMLINK+="found"
|
|
|
|
TAGS=="blue", SYMLINK+="bad"
|
|
|
|
EOF
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc => "don't crash with lots of tags",
|
|
|
|
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
|
|
|
|
exp_name => "found",
|
|
|
|
rules => $rules_10k_tags . <<EOF
|
|
|
|
TAGS=="test1", TAGS=="test500", TAGS=="test1234", TAGS=="test9999", TAGS=="test10000", SYMLINK+="found"
|
2008-05-19 07:05:20 +00:00
|
|
|
EOF
|
2012-01-10 00:34:15 +00:00
|
|
|
},
|
2003-11-23 13:47:28 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
sub udev {
|
2012-01-10 00:34:15 +00:00
|
|
|
my ($action, $devpath, $rules) = @_;
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
# create temporary rules
|
2012-04-16 15:21:22 +00:00
|
|
|
system("mkdir", "-p", "$udev_rules_dir");
|
2012-01-10 00:34:15 +00:00
|
|
|
open CONF, ">$udev_rules" || die "unable to create rules file: $udev_rules";
|
|
|
|
print CONF $$rules;
|
|
|
|
close CONF;
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
if ($valgrind > 0) {
|
2016-04-06 21:17:46 +00:00
|
|
|
return system("$udev_bin_valgrind $action $devpath");
|
2015-03-25 11:28:15 +00:00
|
|
|
} elsif ($gdb > 0) {
|
2016-04-06 21:17:46 +00:00
|
|
|
return system("$udev_bin_gdb $action $devpath");
|
2016-02-22 17:15:17 +00:00
|
|
|
} elsif ($strace > 0) {
|
2016-04-06 21:17:46 +00:00
|
|
|
return system("$udev_bin_strace $action $devpath");
|
2012-01-10 00:34:15 +00:00
|
|
|
} else {
|
2016-04-06 21:17:46 +00:00
|
|
|
return system("$udev_bin", "$action", "$devpath");
|
2012-01-10 00:34:15 +00:00
|
|
|
}
|
2003-11-23 13:47:28 +00:00
|
|
|
}
|
|
|
|
|
2003-11-24 05:17:34 +00:00
|
|
|
my $error = 0;
|
2003-12-03 16:13:53 +00:00
|
|
|
|
2004-04-16 06:14:49 +00:00
|
|
|
sub permissions_test {
|
2012-01-10 00:34:15 +00:00
|
|
|
my($rules, $uid, $gid, $mode) = @_;
|
2004-04-16 06:14:49 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
my $wrong = 0;
|
|
|
|
my $userid;
|
|
|
|
my $groupid;
|
2005-03-18 22:52:41 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
$rules->{exp_perms} =~ m/^(.*):(.*):(.*)$/;
|
|
|
|
if ($1 ne "") {
|
|
|
|
if (defined(getpwnam($1))) {
|
|
|
|
$userid = int(getpwnam($1));
|
|
|
|
} else {
|
|
|
|
$userid = $1;
|
|
|
|
}
|
|
|
|
if ($uid != $userid) { $wrong = 1; }
|
|
|
|
}
|
|
|
|
if ($2 ne "") {
|
|
|
|
if (defined(getgrnam($2))) {
|
|
|
|
$groupid = int(getgrnam($2));
|
|
|
|
} else {
|
|
|
|
$groupid = $2;
|
|
|
|
}
|
|
|
|
if ($gid != $groupid) { $wrong = 1; }
|
|
|
|
}
|
|
|
|
if ($3 ne "") {
|
|
|
|
if (($mode & 07777) != oct($3)) { $wrong = 1; };
|
|
|
|
}
|
|
|
|
if ($wrong == 0) {
|
|
|
|
print "permissions: ok\n";
|
|
|
|
} else {
|
|
|
|
printf " expected permissions are: %s:%s:%#o\n", $1, $2, oct($3);
|
|
|
|
printf " created permissions are : %i:%i:%#o\n", $uid, $gid, $mode & 07777;
|
|
|
|
print "permissions: error\n";
|
|
|
|
$error++;
|
|
|
|
sleep(1);
|
|
|
|
}
|
2004-04-16 06:14:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub major_minor_test {
|
2012-01-10 00:34:15 +00:00
|
|
|
my($rules, $rdev) = @_;
|
2004-04-16 06:14:49 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
my $major = ($rdev >> 8) & 0xfff;
|
|
|
|
my $minor = ($rdev & 0xff) | (($rdev >> 12) & 0xfff00);
|
|
|
|
my $wrong = 0;
|
2004-04-16 06:14:49 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
$rules->{exp_majorminor} =~ m/^(.*):(.*)$/;
|
|
|
|
if ($1 ne "") {
|
|
|
|
if ($major != $1) { $wrong = 1; };
|
|
|
|
}
|
|
|
|
if ($2 ne "") {
|
|
|
|
if ($minor != $2) { $wrong = 1; };
|
|
|
|
}
|
|
|
|
if ($wrong == 0) {
|
|
|
|
print "major:minor: ok\n";
|
|
|
|
} else {
|
|
|
|
printf " expected major:minor is: %i:%i\n", $1, $2;
|
|
|
|
printf " created major:minor is : %i:%i\n", $major, $minor;
|
|
|
|
print "major:minor: error\n";
|
|
|
|
$error++;
|
|
|
|
sleep(1);
|
|
|
|
}
|
2004-04-16 06:14:49 +00:00
|
|
|
}
|
|
|
|
|
2012-04-16 15:21:22 +00:00
|
|
|
sub udev_setup {
|
2016-04-06 03:04:27 +00:00
|
|
|
system("umount", $udev_tmpfs);
|
|
|
|
rmdir($udev_tmpfs);
|
|
|
|
mkdir($udev_tmpfs) || die "unable to create udev_tmpfs: $udev_tmpfs\n";
|
2018-10-22 22:23:01 +00:00
|
|
|
system("mount", "-o", "rw,mode=755,nosuid,noexec", "-t", "tmpfs", "tmpfs", $udev_tmpfs) && die "unable to mount tmpfs";
|
2016-04-06 03:04:27 +00:00
|
|
|
|
2012-04-16 15:21:22 +00:00
|
|
|
mkdir($udev_dev) || die "unable to create udev_dev: $udev_dev\n";
|
|
|
|
# setting group and mode of udev_dev ensures the tests work
|
2012-01-10 00:34:15 +00:00
|
|
|
# even if the parent directory has setgid bit enabled.
|
2012-04-16 15:21:22 +00:00
|
|
|
chown (0, 0, $udev_dev) || die "unable to chown $udev_dev\n";
|
|
|
|
chmod (0755, $udev_dev) || die "unable to chmod $udev_dev\n";
|
2018-10-22 22:23:01 +00:00
|
|
|
system("mknod", $udev_dev . "/null", "c", "1", "3") && "unable to create $udev_dev/null";
|
2012-04-16 15:21:22 +00:00
|
|
|
|
2016-04-06 03:04:27 +00:00
|
|
|
system("cp", "-r", "test/sys/", $udev_sys) && die "unable to copy test/sys";
|
2016-04-05 06:13:41 +00:00
|
|
|
|
2012-04-16 15:21:22 +00:00
|
|
|
system("rm", "-rf", "$udev_run");
|
2008-05-19 07:05:20 +00:00
|
|
|
}
|
|
|
|
|
2004-02-12 08:49:52 +00:00
|
|
|
sub run_test {
|
2012-01-10 00:34:15 +00:00
|
|
|
my ($rules, $number) = @_;
|
2016-04-06 21:17:46 +00:00
|
|
|
my $rc;
|
2004-03-13 01:13:59 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
print "TEST $number: $rules->{desc}\n";
|
|
|
|
print "device \'$rules->{devpath}\' expecting node/link \'$rules->{exp_name}\'\n";
|
2004-04-16 06:14:49 +00:00
|
|
|
|
2016-04-06 21:17:46 +00:00
|
|
|
$rc = udev("add", $rules->{devpath}, \$rules->{rules});
|
|
|
|
if ($rc != 0) {
|
|
|
|
print "$udev_bin add failed with code $rc\n";
|
|
|
|
$error++;
|
|
|
|
}
|
2012-01-10 00:34:15 +00:00
|
|
|
if (defined($rules->{not_exp_name})) {
|
2012-04-16 15:21:22 +00:00
|
|
|
if ((-e "$udev_dev/$rules->{not_exp_name}") ||
|
|
|
|
(-l "$udev_dev/$rules->{not_exp_name}")) {
|
2012-01-10 00:34:15 +00:00
|
|
|
print "nonexistent: error \'$rules->{not_exp_name}\' not expected to be there\n";
|
|
|
|
$error++;
|
|
|
|
sleep(1);
|
|
|
|
}
|
|
|
|
}
|
2009-01-30 02:53:09 +00:00
|
|
|
|
2012-04-16 15:21:22 +00:00
|
|
|
if ((-e "$udev_dev/$rules->{exp_name}") ||
|
|
|
|
(-l "$udev_dev/$rules->{exp_name}")) {
|
2004-03-13 01:13:59 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
|
2012-04-16 15:21:22 +00:00
|
|
|
$atime, $mtime, $ctime, $blksize, $blocks) = stat("$udev_dev/$rules->{exp_name}");
|
2004-03-13 01:13:59 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
if (defined($rules->{exp_perms})) {
|
|
|
|
permissions_test($rules, $uid, $gid, $mode);
|
|
|
|
}
|
|
|
|
if (defined($rules->{exp_majorminor})) {
|
|
|
|
major_minor_test($rules, $rdev);
|
|
|
|
}
|
|
|
|
print "add: ok\n";
|
|
|
|
} else {
|
|
|
|
print "add: error";
|
|
|
|
if ($rules->{exp_add_error}) {
|
|
|
|
print " as expected\n";
|
|
|
|
} else {
|
|
|
|
print "\n";
|
2012-04-16 15:21:22 +00:00
|
|
|
system("tree", "$udev_dev");
|
2012-01-10 00:34:15 +00:00
|
|
|
print "\n";
|
|
|
|
$error++;
|
|
|
|
sleep(1);
|
|
|
|
}
|
|
|
|
}
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
if (defined($rules->{option}) && $rules->{option} eq "keep") {
|
|
|
|
print "\n\n";
|
|
|
|
return;
|
|
|
|
}
|
[PATCH] add enum tests
On Fri, Sep 10, 2004 at 01:09:07PM -0700, Greg KH wrote:
> On Tue, Sep 07, 2004 at 01:19:34PM +0200, David Zeuthen wrote:
> >
> > KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
> > KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
> >
> > New patch is attached.
>
> Nice, I've applied this.
>
> How about sending a patch for the test/udev-test.pl script that adds a
> test for this new paramater, so we make sure to not break it in the
> future.
Here are the tests for the enumeration character %e. I've added a option
string to be able to do a whole sequence of tests without node removal,
so we can skip the "remove" event and get an increasing number to append
to the name. After the sequence test the whole directory is cleaned for
the next tests.
2004-09-15 04:44:55 +00:00
|
|
|
|
2016-04-06 21:17:46 +00:00
|
|
|
$rc = udev("remove", $rules->{devpath}, \$rules->{rules});
|
|
|
|
if ($rc != 0) {
|
|
|
|
print "$udev_bin remove failed with code $rc\n";
|
|
|
|
$error++;
|
|
|
|
}
|
2012-04-16 15:21:22 +00:00
|
|
|
if ((-e "$udev_dev/$rules->{exp_name}") ||
|
|
|
|
(-l "$udev_dev/$rules->{exp_name}")) {
|
2012-01-10 00:34:15 +00:00
|
|
|
print "remove: error";
|
|
|
|
if ($rules->{exp_rem_error}) {
|
|
|
|
print " as expected\n";
|
|
|
|
} else {
|
|
|
|
print "\n";
|
2012-04-16 15:21:22 +00:00
|
|
|
system("tree", "$udev_dev");
|
2012-01-10 00:34:15 +00:00
|
|
|
print "\n";
|
|
|
|
$error++;
|
|
|
|
sleep(1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
print "remove: ok\n";
|
|
|
|
}
|
[PATCH] add enum tests
On Fri, Sep 10, 2004 at 01:09:07PM -0700, Greg KH wrote:
> On Tue, Sep 07, 2004 at 01:19:34PM +0200, David Zeuthen wrote:
> >
> > KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
> > KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
> >
> > New patch is attached.
>
> Nice, I've applied this.
>
> How about sending a patch for the test/udev-test.pl script that adds a
> test for this new paramater, so we make sure to not break it in the
> future.
Here are the tests for the enumeration character %e. I've added a option
string to be able to do a whole sequence of tests without node removal,
so we can skip the "remove" event and get an increasing number to append
to the name. After the sequence test the whole directory is cleaned for
the next tests.
2004-09-15 04:44:55 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
print "\n";
|
2005-03-18 22:52:41 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
if (defined($rules->{option}) && $rules->{option} eq "clean") {
|
2012-04-16 15:21:22 +00:00
|
|
|
udev_setup();
|
2012-01-10 00:34:15 +00:00
|
|
|
}
|
[PATCH] add enum tests
On Fri, Sep 10, 2004 at 01:09:07PM -0700, Greg KH wrote:
> On Tue, Sep 07, 2004 at 01:19:34PM +0200, David Zeuthen wrote:
> >
> > KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
> > KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
> >
> > New patch is attached.
>
> Nice, I've applied this.
>
> How about sending a patch for the test/udev-test.pl script that adds a
> test for this new paramater, so we make sure to not break it in the
> future.
Here are the tests for the enumeration character %e. I've added a option
string to be able to do a whole sequence of tests without node removal,
so we can skip the "remove" event and get an increasing number to append
to the name. After the sequence test the whole directory is cleaned for
the next tests.
2004-09-15 04:44:55 +00:00
|
|
|
|
2003-11-23 13:47:28 +00:00
|
|
|
}
|
|
|
|
|
2004-11-11 02:11:00 +00:00
|
|
|
# only run if we have root permissions
|
|
|
|
# due to mknod restrictions
|
|
|
|
if (!($<==0)) {
|
2012-01-10 00:34:15 +00:00
|
|
|
print "Must have root permissions to run properly.\n";
|
2015-08-31 05:10:30 +00:00
|
|
|
exit($EXIT_TEST_SKIP);
|
2004-11-11 02:11:00 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 21:17:52 +00:00
|
|
|
# skip the test when running in a chroot
|
|
|
|
system("systemd-detect-virt", "-r", "-q");
|
|
|
|
if ($? >> 8 == 0) {
|
2016-08-01 02:01:43 +00:00
|
|
|
print "Running in a chroot, skipping the test.\n";
|
|
|
|
exit($EXIT_TEST_SKIP);
|
2016-07-27 21:17:52 +00:00
|
|
|
}
|
|
|
|
|
2014-12-10 09:20:11 +00:00
|
|
|
# skip the test when running in a container
|
|
|
|
system("systemd-detect-virt", "-c", "-q");
|
|
|
|
if ($? >> 8 == 0) {
|
2016-08-01 02:01:43 +00:00
|
|
|
print "Running in a container, skipping the test.\n";
|
|
|
|
exit($EXIT_TEST_SKIP);
|
2014-12-10 09:20:11 +00:00
|
|
|
}
|
|
|
|
|
2012-04-16 15:21:22 +00:00
|
|
|
udev_setup();
|
2004-02-12 08:49:52 +00:00
|
|
|
|
|
|
|
my $test_num = 1;
|
2008-09-01 14:20:06 +00:00
|
|
|
my @list;
|
2004-02-12 08:49:52 +00:00
|
|
|
|
2008-09-01 14:20:06 +00:00
|
|
|
foreach my $arg (@ARGV) {
|
2012-01-10 00:34:15 +00:00
|
|
|
if ($arg =~ m/--valgrind/) {
|
|
|
|
$valgrind = 1;
|
|
|
|
printf("using valgrind\n");
|
2015-03-25 11:28:15 +00:00
|
|
|
} elsif ($arg =~ m/--gdb/) {
|
|
|
|
$gdb = 1;
|
|
|
|
printf("using gdb\n");
|
2016-02-22 17:15:17 +00:00
|
|
|
} elsif ($arg =~ m/--strace/) {
|
|
|
|
$strace = 1;
|
|
|
|
printf("using strace\n");
|
2012-01-10 00:34:15 +00:00
|
|
|
} else {
|
|
|
|
push(@list, $arg);
|
|
|
|
}
|
2008-09-01 14:20:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($list[0]) {
|
2012-01-10 00:34:15 +00:00
|
|
|
foreach my $arg (@list) {
|
|
|
|
if (defined($tests[$arg-1]->{desc})) {
|
|
|
|
print "udev-test will run test number $arg:\n\n";
|
|
|
|
run_test($tests[$arg-1], $arg);
|
|
|
|
} else {
|
|
|
|
print "test does not exist.\n";
|
|
|
|
}
|
|
|
|
}
|
2004-02-12 08:49:52 +00:00
|
|
|
} else {
|
2012-01-10 00:34:15 +00:00
|
|
|
# test all
|
|
|
|
print "\nudev-test will run ".($#tests + 1)." tests:\n\n";
|
2004-02-12 08:49:52 +00:00
|
|
|
|
2012-01-10 00:34:15 +00:00
|
|
|
foreach my $rules (@tests) {
|
|
|
|
run_test($rules, $test_num);
|
|
|
|
$test_num++;
|
|
|
|
}
|
2004-02-12 08:49:52 +00:00
|
|
|
}
|
|
|
|
|
2013-04-15 02:37:54 +00:00
|
|
|
print "$error errors occurred\n\n";
|
2003-11-23 13:47:28 +00:00
|
|
|
|
|
|
|
# cleanup
|
2012-04-16 15:21:22 +00:00
|
|
|
system("rm", "-rf", "$udev_run");
|
2016-04-05 06:13:41 +00:00
|
|
|
system("umount", "$udev_tmpfs");
|
2016-04-06 03:04:27 +00:00
|
|
|
rmdir($udev_tmpfs);
|
2003-11-23 13:47:28 +00:00
|
|
|
|
2008-09-16 17:03:42 +00:00
|
|
|
if ($error > 0) {
|
2016-08-19 14:01:17 +00:00
|
|
|
exit(1);
|
2008-09-16 17:03:42 +00:00
|
|
|
}
|
|
|
|
exit(0);
|