diff options
Diffstat (limited to 'test')
96 files changed, 0 insertions, 4206 deletions
diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index fd7483da0a..0000000000 --- a/test/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.testdir -test.log -/dev -/run -/sys diff --git a/test/Makefile b/test/Makefile deleted file mode 100644 index 987a32548f..0000000000 --- a/test/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Just a little hook script to easy building when in this directory -.PHONY: all check clean - -all: - $(MAKE) -C .. - -clean: - @for i in TEST-[0-9]*; do \ - [ -d $$i ] || continue ; \ - [ -f $$i/Makefile ] || continue ; \ - make -C $$i clean ; \ - done - -check: - $(MAKE) -C .. all - @for i in TEST-[0-9]*; do \ - [ -d $$i ] || continue ; \ - [ -f $$i/Makefile ] || continue ; \ - make -C $$i all ; \ - done diff --git a/test/README.testsuite b/test/README.testsuite deleted file mode 100644 index 2ae85a2ce1..0000000000 --- a/test/README.testsuite +++ /dev/null @@ -1,48 +0,0 @@ -The extended testsuite only works with uid=0. It contains of several -subdirectories named "test/TEST-??-*", which are run one by one. - -To run the extended testsuite do the following: - -$ make all -$ cd test -$ sudo make clean check -... -make[1]: Entering directory `/mnt/data/harald/git/systemd/test/TEST-01-BASIC' -Making all in . -Making all in po -Making all in docs/libudev -Making all in docs/gudev -TEST: Basic systemd setup [OK] -make[1]: Leaving directory `/mnt/data/harald/git/systemd/test/TEST-01-BASIC' -... - -If one of the tests fails, then $subdir/test.log contains the log file of -the test. - -To debug a special testcase of the testsuite do: - -$ make all -$ cd test/TEST-01-BASIC -$ sudo make clean setup run - -QEMU -==== - -If you want to log in the testsuite virtual machine, you can specify -additional kernel command line parameter with $KERNEL_APPEND. - -$ sudo make KERNEL_APPEND="systemd.unit=multi-user.target" clean setup run - -you can even skip the "clean" and "setup" if you want to run the machine again. - -$ sudo make KERNEL_APPEND="systemd.unit=multi-user.target" run - -You can specify a different kernel and initramfs with $KERNEL_BIN and $INITRD. -(Fedora's default kernel path and initramfs are used by default) - -$ sudo make KERNEL_BIN=/boot/vmlinuz-foo INITRD=/boot/initramfs-bar clean check - -A script will try to find your QEMU binary. If you want to specify a different -one you can use $QEMU_BIN. - -$ sudo make QEMU_BIN=/path/to/qemu/qemu-kvm clean check diff --git a/test/TEST-01-BASIC/Makefile b/test/TEST-01-BASIC/Makefile deleted file mode 100644 index 5e89a29eff..0000000000 --- a/test/TEST-01-BASIC/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -all: - @make -s --no-print-directory -C ../.. all - @basedir=../.. TEST_BASE_DIR=../ ./test.sh --all -setup: - @make --no-print-directory -C ../.. all - @basedir=../.. TEST_BASE_DIR=../ ./test.sh --setup -clean: - @basedir=../.. TEST_BASE_DIR=../ ./test.sh --clean -run: - @basedir=../.. TEST_BASE_DIR=../ ./test.sh --run diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh deleted file mode 100755 index d97fbe24d4..0000000000 --- a/test/TEST-01-BASIC/test.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh -TEST_DESCRIPTION="Basic systemd setup" - -. $TEST_BASE_DIR/test-functions - -check_result_qemu() { - ret=1 - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - [[ -e $TESTDIR/root/testok ]] && ret=0 - [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR - [[ -f $TESTDIR/root/var/log/journal ]] && cp -a $TESTDIR/root/var/log/journal $TESTDIR - umount $TESTDIR/root - [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed - ls -l $TESTDIR/journal/*/*.journal - test -s $TESTDIR/failed && ret=$(($ret+1)) - return $ret -} - -test_run() { - if run_qemu; then - check_result_qemu || return 1 - else - dwarn "can't run QEMU, skipping" - fi - if check_nspawn; then - run_nspawn - check_result_nspawn || return 1 - else - dwarn "can't run systemd-nspawn, skipping" - fi - return 0 -} - -test_setup() { - create_empty_image - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - - # Create what will eventually be our root filesystem onto an overlay - ( - LOG_LEVEL=5 - eval $(udevadm info --export --query=env --name=${LOOPDEV}p2) - - setup_basic_environment - - # setup the testsuite service - cat >$initdir/etc/systemd/system/testsuite.service <<EOF -[Unit] -Description=Testsuite service -After=multi-user.target - -[Service] -ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;' -Type=oneshot -EOF - - setup_testsuite - ) - setup_nspawn_root - - ddebug "umount $TESTDIR/root" - umount $TESTDIR/root -} - -test_cleanup() { - umount $TESTDIR/root 2>/dev/null - [[ $LOOPDEV ]] && losetup -d $LOOPDEV - return 0 -} - -do_test "$@" diff --git a/test/TEST-02-CRYPTSETUP/Makefile b/test/TEST-02-CRYPTSETUP/Makefile deleted file mode 120000 index e9f93b1104..0000000000 --- a/test/TEST-02-CRYPTSETUP/Makefile +++ /dev/null @@ -1 +0,0 @@ -../TEST-01-BASIC/Makefile
\ No newline at end of file diff --git a/test/TEST-02-CRYPTSETUP/test.sh b/test/TEST-02-CRYPTSETUP/test.sh deleted file mode 100755 index 4be2365e2f..0000000000 --- a/test/TEST-02-CRYPTSETUP/test.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh -TEST_DESCRIPTION="cryptsetup systemd setup" - -. $TEST_BASE_DIR/test-functions - -check_result_qemu() { - ret=1 - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - [[ -e $TESTDIR/root/testok ]] && ret=0 - [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR - cryptsetup luksOpen ${LOOPDEV}p2 varcrypt <$TESTDIR/keyfile - mount /dev/mapper/varcrypt $TESTDIR/root/var - [[ -f $TESTDIR/root/var/log/journal ]] && cp -a $TESTDIR/root/var/log/journal $TESTDIR - umount $TESTDIR/root/var - umount $TESTDIR/root - cryptsetup luksClose /dev/mapper/varcrypt - [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed - ls -l $TESTDIR/journal/*/*.journal - test -s $TESTDIR/failed && ret=$(($ret+1)) - return $ret -} - - -test_run() { - if run_qemu; then - check_result_qemu || return 1 - else - dwarn "can't run QEMU, skipping" - fi - return 0 -} - -test_setup() { - create_empty_image - echo -n test >$TESTDIR/keyfile - cryptsetup -q luksFormat ${LOOPDEV}p2 $TESTDIR/keyfile - cryptsetup luksOpen ${LOOPDEV}p2 varcrypt <$TESTDIR/keyfile - mkfs.ext3 -L var /dev/mapper/varcrypt - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - mkdir -p $TESTDIR/root/var - mount /dev/mapper/varcrypt $TESTDIR/root/var - - # Create what will eventually be our root filesystem onto an overlay - ( - LOG_LEVEL=5 - eval $(udevadm info --export --query=env --name=/dev/mapper/varcrypt) - eval $(udevadm info --export --query=env --name=${LOOPDEV}p2) - - setup_basic_environment - - # setup the testsuite service - cat >$initdir/etc/systemd/system/testsuite.service <<EOF -[Unit] -Description=Testsuite service -After=multi-user.target - -[Service] -ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do systemd-cat echo "testsuite service waiting for /var/log/journal" ; echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;' -Type=oneshot -EOF - - setup_testsuite - - install_dmevent - generate_module_dependencies - cat >$initdir/etc/crypttab <<EOF -$DM_NAME UUID=$ID_FS_UUID /etc/varkey -EOF - echo -n test > $initdir/etc/varkey - cat $initdir/etc/crypttab | ddebug - - cat >>$initdir/etc/fstab <<EOF -/dev/mapper/varcrypt /var ext3 defaults 0 1 -EOF - ) - setup_nspawn_root - - ddebug "umount $TESTDIR/root/var" - umount $TESTDIR/root/var - cryptsetup luksClose /dev/mapper/varcrypt - ddebug "umount $TESTDIR/root" - umount $TESTDIR/root -} - -test_cleanup() { - umount $TESTDIR/root/var 2>/dev/null - [[ -b /dev/mapper/varcrypt ]] && cryptsetup luksClose /dev/mapper/varcrypt - umount $TESTDIR/root 2>/dev/null - [[ $LOOPDEV ]] && losetup -d $LOOPDEV - return 0 -} - -do_test "$@" diff --git a/test/TEST-03-JOBS/Makefile b/test/TEST-03-JOBS/Makefile deleted file mode 120000 index e9f93b1104..0000000000 --- a/test/TEST-03-JOBS/Makefile +++ /dev/null @@ -1 +0,0 @@ -../TEST-01-BASIC/Makefile
\ No newline at end of file diff --git a/test/TEST-03-JOBS/test-jobs.sh b/test/TEST-03-JOBS/test-jobs.sh deleted file mode 100755 index 28368b70e4..0000000000 --- a/test/TEST-03-JOBS/test-jobs.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -x - -# Test merging of a --ignore-dependencies job into a previously -# installed job. - -systemctl start --no-block hello-after-sleep.target -# sleep is now running, hello/start is waiting. Verify that: -systemctl list-jobs > /root/list-jobs.txt -grep 'sleep\.service.*running' /root/list-jobs.txt || exit 1 -grep 'hello\.service.*waiting' /root/list-jobs.txt || exit 1 - -# This is supposed to finish quickly, not wait for sleep to finish. -START_SEC=$(date -u '+%s') -systemctl start --ignore-dependencies hello -END_SEC=$(date -u '+%s') -ELAPSED=$(($END_SEC-$START_SEC)) - -[ "$ELAPSED" -lt 3 ] || exit 1 - -# sleep should still be running, hello not. -systemctl list-jobs > /root/list-jobs.txt -grep 'sleep\.service.*running' /root/list-jobs.txt || exit 1 -grep 'hello\.service' /root/list-jobs.txt && exit 1 -systemctl stop sleep.service hello-after-sleep.target || exit 1 - -# Test for a crash when enqueueing a JOB_NOP when other job already exists -systemctl start --no-block hello-after-sleep.target || exit 1 -# hello.service should still be waiting, so these try-restarts will collapse -# into NOPs. -systemctl try-restart --fail hello.service || exit 1 -systemctl try-restart hello.service || exit 1 -systemctl stop hello.service sleep.service hello-after-sleep.target || exit 1 - -# TODO: add more job queueing/merging tests here. - -# Test for irreversible jobs -systemctl start unstoppable.service || exit 1 - -# This is expected to fail with 'job cancelled' -systemctl stop unstoppable.service && exit 1 -# But this should succeed -systemctl stop --irreversible unstoppable.service || exit 1 - -# We're going to shutdown soon. Let's see if it succeeds when -# there's an active service that tries to be unstoppable. -# Shutdown of the container/VM will hang if not. -systemctl start unstoppable.service || exit 1 - -touch /testok -exit 0 diff --git a/test/TEST-03-JOBS/test.sh b/test/TEST-03-JOBS/test.sh deleted file mode 100755 index 41e02e2c8a..0000000000 --- a/test/TEST-03-JOBS/test.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh -TEST_DESCRIPTION="Job-related tests" - -. $TEST_BASE_DIR/test-functions - -check_result_qemu() { - ret=1 - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - [[ -e $TESTDIR/root/testok ]] && ret=0 - [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR - cp -a $TESTDIR/root/var/log/journal $TESTDIR - umount $TESTDIR/root - [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed - ls -l $TESTDIR/journal/*/*.journal - test -s $TESTDIR/failed && ret=$(($ret+1)) - return $ret -} - -test_run() { - if run_qemu; then - check_result_qemu || return 1 - else - dwarn "can't run QEMU, skipping" - fi - if check_nspawn; then - run_nspawn - check_result_nspawn || return 1 - else - dwarn "can't run systemd-nspawn, skipping" - fi - return 0 -} - -test_setup() { - create_empty_image - mkdir -p $TESTDIR/root - mount ${LOOPDEV}p1 $TESTDIR/root - - # Create what will eventually be our root filesystem onto an overlay - ( - LOG_LEVEL=5 - eval $(udevadm info --export --query=env --name=${LOOPDEV}p2) - - setup_basic_environment - - # setup the testsuite service - cat >$initdir/etc/systemd/system/testsuite.service <<EOF -[Unit] -Description=Testsuite service -After=multi-user.target - -[Service] -ExecStart=/test-jobs.sh -Type=oneshot -EOF - - # copy the units used by this test - cp $TEST_BASE_DIR/{hello.service,sleep.service,hello-after-sleep.target,unstoppable.service} \ - $initdir/etc/systemd/system - cp test-jobs.sh $initdir/ - - setup_testsuite - ) - setup_nspawn_root - - ddebug "umount $TESTDIR/root" - umount $TESTDIR/root -} - -test_cleanup() { - umount $TESTDIR/root 2>/dev/null - [[ $LOOPDEV ]] && losetup -d $LOOPDEV - return 0 -} - -do_test "$@" diff --git a/test/a.service b/test/a.service deleted file mode 100644 index 4168d2d051..0000000000 --- a/test/a.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=A -Requires=b.service -Before=b.service - -[Service] -ExecStart=/bin/true diff --git a/test/b.service b/test/b.service deleted file mode 100644 index e03bae36be..0000000000 --- a/test/b.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=B -Wants=f.service - -[Service] -ExecStart=/bin/true diff --git a/test/basic.target b/test/basic.target deleted file mode 120000 index 0612934682..0000000000 --- a/test/basic.target +++ /dev/null @@ -1 +0,0 @@ -../units/basic.target
\ No newline at end of file diff --git a/test/bus-policy/check-own-rules.conf b/test/bus-policy/check-own-rules.conf deleted file mode 100644 index bc2f415fcb..0000000000 --- a/test/bus-policy/check-own-rules.conf +++ /dev/null @@ -1,14 +0,0 @@ -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> -<busconfig> - <user>mybususer</user> - <listen>unix:path=/foo/bar</listen> - <listen>tcp:port=1234</listen> - <servicedir>/usr/share/foo</servicedir> - <policy context="default"> - <allow user="*"/> - <deny own="*"/> - <allow own_prefix="org.freedesktop.ManySystems"/> - </policy> - -</busconfig> diff --git a/test/bus-policy/hello.conf b/test/bus-policy/hello.conf deleted file mode 100644 index af09893de6..0000000000 --- a/test/bus-policy/hello.conf +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0"?> <!--*-nxml-*--> -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - -<busconfig> - - <policy context="default"> - <allow user="*"/> - - <deny user="1"/> - <deny group="1"/> - </policy> - -</busconfig> diff --git a/test/bus-policy/many-rules.conf b/test/bus-policy/many-rules.conf deleted file mode 100644 index 70dd538c11..0000000000 --- a/test/bus-policy/many-rules.conf +++ /dev/null @@ -1,61 +0,0 @@ -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> -<busconfig> - <user>mybususer</user> - <listen>unix:path=/foo/bar</listen> - <listen>tcp:port=1234</listen> - <includedir>basic.d</includedir> - <standard_session_servicedirs /> - <servicedir>/usr/share/foo</servicedir> - <include ignore_missing="yes">nonexistent.conf</include> - <policy context="default"> - <allow user="*"/> - <deny send_interface="org.freedesktop.System" send_member="Reboot"/> - <deny receive_interface="org.freedesktop.System" receive_member="Reboot"/> - <deny send_path="/foo/bar/SystemObjectThing" send_member="Reboot"/> - <deny own="org.freedesktop.System"/> - <deny own_prefix="org.freedesktop.ManySystems"/> - <deny send_destination="org.freedesktop.System"/> - <deny receive_sender="org.freedesktop.System"/> - <deny user="root"/> - <deny group="bin"/> - <allow send_type="error"/> - <allow send_type="method_call"/> - <allow send_type="method_return"/> - <allow send_type="signal"/> - <deny send_destination="org.freedesktop.Bar" send_interface="org.freedesktop.Foo"/> - <deny send_destination="org.freedesktop.Bar" send_interface="org.freedesktop.Foo" send_type="method_call"/> - </policy> - - <policy context="mandatory"> - <allow user="*"/> - <deny send_interface="org.freedesktop.System" send_member="Reboot"/> - <deny receive_interface="org.freedesktop.System" receive_member="Reboot"/> - <deny send_path="/foo/bar/SystemObjectThing" send_member="Reboot"/> - <deny own="org.freedesktop.System"/> - <deny own_prefix="org.freedesktop.ManySystems"/> - <deny send_destination="org.freedesktop.System"/> - <deny receive_sender="org.freedesktop.System"/> - <deny user="root"/> - <deny group="bin"/> - <allow send_type="error"/> - <allow send_type="method_call"/> - <allow send_type="method_return"/> - <allow send_type="signal"/> - <deny send_destination="org.freedesktop.Bar" send_interface="org.freedesktop.Foo"/> - <deny send_destination="org.freedesktop.Bar" send_interface="org.freedesktop.Foo" send_type="method_call"/> - </policy> - - <limit name="max_incoming_bytes">5000</limit> - <limit name="max_outgoing_bytes">5000</limit> - <limit name="max_message_size">300</limit> - <limit name="service_start_timeout">5000</limit> - <limit name="auth_timeout">6000</limit> - <limit name="max_completed_connections">50</limit> - <limit name="max_incomplete_connections">80</limit> - <limit name="max_connections_per_user">64</limit> - <limit name="max_pending_service_starts">64</limit> - <limit name="max_names_per_connection">256</limit> - <limit name="max_match_rules_per_connection">512</limit> - -</busconfig> diff --git a/test/bus-policy/methods.conf b/test/bus-policy/methods.conf deleted file mode 100644 index 4bc38f9151..0000000000 --- a/test/bus-policy/methods.conf +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0"?> <!--*-nxml-*--> -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - -<busconfig> - - <policy context="default"> - <deny send_type="method_call"/> - - <deny send_destination="org.test.test1"/> - <allow send_destination="org.test.test1" send_interface="org.test.int1"/> - <allow send_destination="org.test.test1" send_interface="org.test.int2"/> - - <allow receive_sender="org.test.test3" receive_interface="org.test.int3" receive_member="Member111"/> - </policy> - -</busconfig> diff --git a/test/bus-policy/ownerships.conf b/test/bus-policy/ownerships.conf deleted file mode 100644 index bc3a230a26..0000000000 --- a/test/bus-policy/ownerships.conf +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0"?> <!--*-nxml-*--> -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - -<busconfig> - - <policy context="default"> - <allow own="org.test.test1"/> - </policy> - - <policy context="mandatory"> - <deny own="org.test.test3"/> - </policy> - - <policy user="root"> - <allow own="org.test.test2"/> - <allow own="org.test.test3"/> - </policy> - - <policy user="1"> - <allow own="org.test.test4"/> - </policy> - -</busconfig> diff --git a/test/bus-policy/signals.conf b/test/bus-policy/signals.conf deleted file mode 100644 index 440e3fe6d0..0000000000 --- a/test/bus-policy/signals.conf +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0"?> <!--*-nxml-*--> -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - -<busconfig> - - <policy context="default"> - <allow send_type="signal"/> - </policy> - - <policy user="1"> - <deny send_type="signal"/> - </policy> - -</busconfig> diff --git a/test/bus-policy/test.conf b/test/bus-policy/test.conf deleted file mode 100644 index ee6afcdfbb..0000000000 --- a/test/bus-policy/test.conf +++ /dev/null @@ -1,20 +0,0 @@ -<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> -<busconfig> - <!-- The following demonstrates how to punch holes in a default deny-all - policy so that a particular user can own a service, and other - connections can get messages from it --> - - <!-- Only root can own the FooService service, and - this user can only send the one kind of message --> - <policy user="root"> - <allow own="org.foo.FooService"/> - <allow send_interface="org.foo.FooBroadcastInterface"/> - </policy> - - <!-- Allow any connection to receive the message, but - only if the message is sent by the owner of FooService --> - <policy context="default"> - <allow receive_interface="org.foo.FooBroadcastInterface" receive_sender="org.foo.FooService"/> - </policy> -</busconfig> diff --git a/test/c.service b/test/c.service deleted file mode 100644 index e2f60a8fbf..0000000000 --- a/test/c.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=C -Requires=a.service - -[Service] -ExecStart=/bin/true diff --git a/test/d.service b/test/d.service deleted file mode 100644 index 921fd2ee1b..0000000000 --- a/test/d.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=D:Cyclic -After=b.service -Before=a.service -Requires=a.service - -[Service] -ExecStart=/bin/true diff --git a/test/daughter.service b/test/daughter.service deleted file mode 100644 index aebedca348..0000000000 --- a/test/daughter.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Daughter Service - -[Service] -Slice=parent.slice -Type=oneshot -ExecStart=/bin/true diff --git a/test/e.service b/test/e.service deleted file mode 100644 index 5ba98c7c43..0000000000 --- a/test/e.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=E:Cyclic -After=b.service -Before=a.service -Wants=a.service - -[Service] -ExecStart=/bin/true diff --git a/test/end.service.in b/test/end.service.in deleted file mode 100644 index 4857ffe02b..0000000000 --- a/test/end.service.in +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=End the test -After=testsuite.service - -[Service] -ExecStart=@SYSTEMCTL@ poweroff --no-block diff --git a/test/exec-environment-empty.service b/test/exec-environment-empty.service deleted file mode 100644 index 0219ca4fd7..0000000000 --- a/test/exec-environment-empty.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for Environment - -[Service] -ExecStart=/bin/sh -c 'exit $(test ! "$VAR1" = "word1 word2") && $(test ! "$VAR2" = word3) && $(test ! "$VAR3" = \'$word 5 6\')' -Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" -Environment= diff --git a/test/exec-environment-multiple.service b/test/exec-environment-multiple.service deleted file mode 100644 index 479005a5d8..0000000000 --- a/test/exec-environment-multiple.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for Environment - -[Service] -ExecStart=/bin/sh -c 'exit $(test "$VAR1" = "word1 word2") && $(test "$VAR2" = word3) && $(test "$VAR3" = foobar)' -Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" -Environment="VAR3=foobar" diff --git a/test/exec-environment.service b/test/exec-environment.service deleted file mode 100644 index 4586b4c4a9..0000000000 --- a/test/exec-environment.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for Environment - -[Service] -ExecStart=/bin/sh -c 'exit $(test "$VAR1" = "word1 word2") && $(test "$VAR2" = word3) && $(test "$VAR3" = \'$word 5 6\')' -Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" diff --git a/test/exec-group.service b/test/exec-group.service deleted file mode 100644 index 1aa04b5bd2..0000000000 --- a/test/exec-group.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for Group - -[Service] -ExecStart=/bin/sh -c 'exit $(test $(id -n -g) = nobody)' -Group=nobody diff --git a/test/exec-ignoresigpipe-no.service b/test/exec-ignoresigpipe-no.service deleted file mode 100644 index 69b2e9d8a8..0000000000 --- a/test/exec-ignoresigpipe-no.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for IgnoreSIGPIPE=no - -[Service] -ExecStart=/bin/sh -c 'kill -PIPE 0' -Type=oneshot -IgnoreSIGPIPE=no diff --git a/test/exec-ignoresigpipe-yes.service b/test/exec-ignoresigpipe-yes.service deleted file mode 100644 index 877ec8aed0..0000000000 --- a/test/exec-ignoresigpipe-yes.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for IgnoreSIGPIPE=yes - -[Service] -ExecStart=/bin/sh -c 'kill -PIPE 0' -Type=oneshot -IgnoreSIGPIPE=yes diff --git a/test/exec-personality-x86-64.service b/test/exec-personality-x86-64.service deleted file mode 100644 index 5bb5d910d0..0000000000 --- a/test/exec-personality-x86-64.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for Personality=x86-64 - -[Service] -ExecStart=/bin/sh -c 'echo $(uname -m); exit $(test $(uname -m) = "x86_64")' -Type=oneshot -Personality=x86-64 diff --git a/test/exec-personality-x86.service b/test/exec-personality-x86.service deleted file mode 100644 index 0b370a6480..0000000000 --- a/test/exec-personality-x86.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for Personality=x86 - -[Service] -ExecStart=/bin/sh -c 'echo $(uname -m); exit $(test $(uname -m) = "i686")' -Type=oneshot -Personality=x86 diff --git a/test/exec-privatedevices-no.service b/test/exec-privatedevices-no.service deleted file mode 100644 index cf4f275fb6..0000000000 --- a/test/exec-privatedevices-no.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for PrivateDev=no - -[Service] -ExecStart=/bin/sh -c 'exit $(test -c /dev/mem)' -Type=oneshot -PrivateDevices=no diff --git a/test/exec-privatedevices-yes.service b/test/exec-privatedevices-yes.service deleted file mode 100644 index 85b3f4f981..0000000000 --- a/test/exec-privatedevices-yes.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for PrivateDev=yes - -[Service] -ExecStart=/bin/sh -c 'exit $(test ! -c /dev/mem)' -Type=oneshot -PrivateDevices=yes diff --git a/test/exec-privatetmp-no.service b/test/exec-privatetmp-no.service deleted file mode 100644 index d69e552a63..0000000000 --- a/test/exec-privatetmp-no.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for PrivateTmp=no - -[Service] -ExecStart=/bin/sh -c 'exit $(test -f /tmp/test-exec_privatetmp)' -Type=oneshot -PrivateTmp=no diff --git a/test/exec-privatetmp-yes.service b/test/exec-privatetmp-yes.service deleted file mode 100644 index 881a040b87..0000000000 --- a/test/exec-privatetmp-yes.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for PrivateTmp=yes - -[Service] -ExecStart=/bin/sh -c 'exit $(test ! -f /tmp/test-exec_privatetmp)' -Type=oneshot -PrivateTmp=yes diff --git a/test/exec-systemcallerrornumber.service b/test/exec-systemcallerrornumber.service deleted file mode 100644 index 255a8b231a..0000000000 --- a/test/exec-systemcallerrornumber.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for SystemCallErrorNumber - -[Service] -ExecStart=/usr/bin/uname -a -SystemCallFilter=~uname -SystemCallErrorNumber=EACCES diff --git a/test/exec-systemcallfilter-failing.service b/test/exec-systemcallfilter-failing.service deleted file mode 100644 index c6ce9368c9..0000000000 --- a/test/exec-systemcallfilter-failing.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test for SystemCallFilter - -[Service] -ExecStart=/bin/echo "This should not be seen" -SystemCallFilter=ioperm -SystemCallFilter=~ioperm -SystemCallFilter=ioperm diff --git a/test/exec-systemcallfilter-failing2.service b/test/exec-systemcallfilter-failing2.service deleted file mode 100644 index b7f7c2aff9..0000000000 --- a/test/exec-systemcallfilter-failing2.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for SystemCallFilter - -[Service] -ExecStart=/bin/echo "This should not be seen" -SystemCallFilter=~write open execve exit_group close mmap munmap fstat DONOTEXIST diff --git a/test/exec-systemcallfilter-not-failing.service b/test/exec-systemcallfilter-not-failing.service deleted file mode 100644 index feb206ab6d..0000000000 --- a/test/exec-systemcallfilter-not-failing.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Test for SystemCallFilter - -[Service] -ExecStart=/bin/echo "Foo bar" -SystemCallFilter=~read write open execve ioperm -SystemCallFilter=ioctl -SystemCallFilter=read write open execve -SystemCallFilter=~ioperm diff --git a/test/exec-systemcallfilter-not-failing2.service b/test/exec-systemcallfilter-not-failing2.service deleted file mode 100644 index cca469aa3d..0000000000 --- a/test/exec-systemcallfilter-not-failing2.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for SystemCallFilter - -[Service] -ExecStart=/bin/echo "Foo bar" -SystemCallFilter= diff --git a/test/exec-umask-0177.service b/test/exec-umask-0177.service deleted file mode 100644 index af9295888e..0000000000 --- a/test/exec-umask-0177.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for UMask - -[Service] -ExecStart=/bin/sh -c 'touch /tmp/test-exec-umask; s=$(stat -c %a /tmp/test-exec-umask); echo $s; exit $(test $s = "600")' -UMask=0177 -PrivateTmp=yes diff --git a/test/exec-umask-default.service b/test/exec-umask-default.service deleted file mode 100644 index 41e20a60a1..0000000000 --- a/test/exec-umask-default.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for UMask default - -[Service] -ExecStart=/bin/sh -c 'touch /tmp/test-exec-umask; s=$(stat -c %a /tmp/test-exec-umask); echo $s; exit $(test $s = "644")' -PrivateTmp=yes diff --git a/test/exec-user.service b/test/exec-user.service deleted file mode 100644 index 2ca08ebb42..0000000000 --- a/test/exec-user.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Test for User - -[Service] -ExecStart=/bin/sh -c 'exit $(test "$USER" = nobody)' -User=nobody diff --git a/test/exec-workingdirectory.service b/test/exec-workingdirectory.service deleted file mode 100644 index 10855d682a..0000000000 --- a/test/exec-workingdirectory.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Test for WorkingDirectory - -[Service] -ExecStart=/bin/sh -c 'echo $PWD; exit $(test $PWD = "/tmp/test-exec_workingdirectory")' -Type=oneshot -WorkingDirectory=/tmp/test-exec_workingdirectory diff --git a/test/f.service b/test/f.service deleted file mode 100644 index 7dde681c17..0000000000 --- a/test/f.service +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=F - -[Service] -ExecStart=/bin/true diff --git a/test/g.service b/test/g.service deleted file mode 100644 index cbfa82a454..0000000000 --- a/test/g.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=G -Conflicts=e.service - -[Service] -ExecStart=/bin/true diff --git a/test/grandchild.service b/test/grandchild.service deleted file mode 100644 index ab641300e4..0000000000 --- a/test/grandchild.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Grandchild Service - -[Service] -Slice=parent-deep.slice -Type=oneshot -ExecStart=/bin/true diff --git a/test/h.service b/test/h.service deleted file mode 100644 index 74a7751cad..0000000000 --- a/test/h.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=H -Wants=g.service - -[Service] -ExecStart=/bin/true diff --git a/test/hello-after-sleep.target b/test/hello-after-sleep.target deleted file mode 100644 index 526fbd2a12..0000000000 --- a/test/hello-after-sleep.target +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Sleep for a minute, then say hello. -Wants=sleep.service hello.service -After=sleep.service -Before=hello.service diff --git a/test/hello.service b/test/hello.service deleted file mode 100644 index 82907b64e1..0000000000 --- a/test/hello.service +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Hello World - -[Service] -ExecStart=/bin/echo "Hello World" diff --git a/test/loopy.service b/test/loopy.service deleted file mode 100644 index 9eb645748e..0000000000 --- a/test/loopy.service +++ /dev/null @@ -1,2 +0,0 @@ -[Service] -ExecStart=/bin/true diff --git a/test/loopy.service.d/compat.conf b/test/loopy.service.d/compat.conf deleted file mode 100644 index 51b84b89ed..0000000000 --- a/test/loopy.service.d/compat.conf +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -BindsTo=loopy2.service - -[Install] -Also=loopy2.service diff --git a/test/loopy2.service b/test/loopy2.service deleted file mode 120000 index 961b1fe9bc..0000000000 --- a/test/loopy2.service +++ /dev/null @@ -1 +0,0 @@ -loopy.service
\ No newline at end of file diff --git a/test/loopy3.service b/test/loopy3.service deleted file mode 100644 index 606e26b5da..0000000000 --- a/test/loopy3.service +++ /dev/null @@ -1,5 +0,0 @@ -[Service] -ExecStart=/bin/true - -[Unit] -Conflicts=loopy4.service diff --git a/test/loopy4.service b/test/loopy4.service deleted file mode 120000 index 43e5658bcd..0000000000 --- a/test/loopy4.service +++ /dev/null @@ -1 +0,0 @@ -loopy3.service
\ No newline at end of file diff --git a/test/mocks/fsck b/test/mocks/fsck deleted file mode 100755 index 77b50d7234..0000000000 --- a/test/mocks/fsck +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -fd=0 - -OPTIND=1 -while getopts "C:aTlM" opt; do - case "$opt" in - C) - fd=$OPTARG - ;; - \?);; - esac -done - -shift "$((OPTIND-1))" -device=$1 - -echo "Running fake fsck on $device" - -declare -a maxpass=(30 5 2 30 60) - -for pass in {1..5}; do - maxprogress=${maxpass[$((pass-1))]} - for (( current=0; current<=${maxprogress}; current++)); do - echo "$pass $current $maxprogress $device">&$fd - sleep 0.1 - done -done diff --git a/test/parent-deep.slice b/test/parent-deep.slice deleted file mode 100644 index 79b302f38d..0000000000 --- a/test/parent-deep.slice +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Deeper Parent Slice - -[Slice] -MemoryLimit=3G diff --git a/test/parent.slice b/test/parent.slice deleted file mode 100644 index 0222f8eb47..0000000000 --- a/test/parent.slice +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Parent Slice - -[Slice] -BlockIOWeight=200 diff --git a/test/path-changed.path b/test/path-changed.path deleted file mode 100644 index e58bdd925f..0000000000 --- a/test/path-changed.path +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test PathChanged - -[Path] -PathChanged=/tmp/test-path_changed - -[Install] -WantedBy=multi-user.target diff --git a/test/path-changed.service b/test/path-changed.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-changed.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-directorynotempty.path b/test/path-directorynotempty.path deleted file mode 100644 index 17e599fc0e..0000000000 --- a/test/path-directorynotempty.path +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test DirectoryNotEmpty - -[Path] -DirectoryNotEmpty=/tmp/test-path_directorynotempty/ - -[Install] -WantedBy=multi-user.target diff --git a/test/path-directorynotempty.service b/test/path-directorynotempty.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-directorynotempty.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-exists.path b/test/path-exists.path deleted file mode 100644 index c4c9105af4..0000000000 --- a/test/path-exists.path +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test PathExists - -[Path] -PathExists=/tmp/test-path_exists - -[Install] -WantedBy=multi-user.target diff --git a/test/path-exists.service b/test/path-exists.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-exists.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-existsglob.path b/test/path-existsglob.path deleted file mode 100644 index a058599605..0000000000 --- a/test/path-existsglob.path +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test PathExistsGlob - -[Path] -PathExistsGlob=/tmp/test-path_existsglob* - -[Install] -WantedBy=multi-user.target diff --git a/test/path-existsglob.service b/test/path-existsglob.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-existsglob.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-makedirectory.path b/test/path-makedirectory.path deleted file mode 100644 index 9408479c0f..0000000000 --- a/test/path-makedirectory.path +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Test MakeDirectory & DirectoryMode - -[Path] -DirectoryNotEmpty=/tmp/test-path_makedirectory/ -MakeDirectory=yes -DirectoryMode=0744 - -[Install] -WantedBy=multi-user.target diff --git a/test/path-makedirectory.service b/test/path-makedirectory.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-makedirectory.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-modified.path b/test/path-modified.path deleted file mode 100644 index 18363227ba..0000000000 --- a/test/path-modified.path +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Test PathModified - -[Path] -PathModified=/tmp/test-path_modified - -[Install] -WantedBy=multi-user.target diff --git a/test/path-modified.service b/test/path-modified.service deleted file mode 120000 index 8bdf178830..0000000000 --- a/test/path-modified.service +++ /dev/null @@ -1 +0,0 @@ -path-service.service
\ No newline at end of file diff --git a/test/path-mycustomunit.service b/test/path-mycustomunit.service deleted file mode 100644 index 172ac0d0d5..0000000000 --- a/test/path-mycustomunit.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Service Test Path Unit= - -[Service] -ExecStart=/bin/true -Type=oneshot diff --git a/test/path-service.service b/test/path-service.service deleted file mode 100644 index f8499ec619..0000000000 --- a/test/path-service.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Service Test for Path units - -[Service] -ExecStart=/bin/true -Type=oneshot diff --git a/test/path-unit.path b/test/path-unit.path deleted file mode 100644 index 95e572d6d5..0000000000 --- a/test/path-unit.path +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Test Path Unit= - -[Path] -PathExists=/tmp/test-path_unit -Unit=path-mycustomunit.service - -[Install] -WantedBy=multi-user.target diff --git a/test/paths.target b/test/paths.target deleted file mode 120000 index e9939c9801..0000000000 --- a/test/paths.target +++ /dev/null @@ -1 +0,0 @@ -../units/paths.target
\ No newline at end of file diff --git a/test/rule-syntax-check.py b/test/rule-syntax-check.py deleted file mode 100644 index 80bbe65bea..0000000000 --- a/test/rule-syntax-check.py +++ /dev/null @@ -1,72 +0,0 @@ -# Simple udev rules syntax checker -# -# (C) 2010 Canonical Ltd. -# Author: Martin Pitt <martin.pitt@ubuntu.com> -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. - -# systemd is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with systemd; If not, see <http://www.gnu.org/licenses/>. - -import re -import sys -import os -from glob import glob - -if len(sys.argv) > 1: - # explicit rule file list - rules_files = sys.argv[1:] -else: - # take them from the build dir - root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - rules_dir = os.path.join(os.environ.get('top_srcdir', root_dir), 'rules') - if not os.path.isdir(rules_dir): - sys.stderr.write('No rules files given, and %s does not exist, aborting' % rules_dir) - sys.exit(2) - rules_files = glob(os.path.join(rules_dir, '*.rules')) - -no_args_tests = re.compile('(ACTION|DEVPATH|KERNELS?|NAME|SYMLINK|SUBSYSTEMS?|DRIVERS?|TAG|RESULT|TEST)\s*(?:=|!)=\s*"([^"]*)"$') -args_tests = re.compile('(ATTRS?|ENV|TEST){([a-zA-Z0-9/_.*%-]+)}\s*(?:=|!)=\s*"([^"]*)"$') -no_args_assign = re.compile('(NAME|SYMLINK|OWNER|GROUP|MODE|TAG|PROGRAM|RUN|LABEL|GOTO|WAIT_FOR|OPTIONS|IMPORT)\s*(?:\+=|:=|=)\s*"([^"]*)"$') -args_assign = re.compile('(ATTR|ENV|IMPORT|RUN){([a-zA-Z0-9/_.*%-]+)}\s*(=|\+=)\s*"([^"]*)"$') - -result = 0 -buffer = '' -for path in rules_files: - lineno = 0 - for line in open(path): - lineno += 1 - - # handle line continuation - if line.endswith('\\\n'): - buffer += line[:-2] - continue - else: - line = buffer + line - buffer = '' - - # filter out comments and empty lines - line = line.strip() - if not line or line.startswith('#'): - continue - - for clause in line.split(','): - clause = clause.strip() - if not (no_args_tests.match(clause) or args_tests.match(clause) or - no_args_assign.match(clause) or args_assign.match(clause)): - - print('Invalid line %s:%i: %s' % (path, lineno, line)) - print(' clause: %s' % clause) - print('') - result = 1 - break - -sys.exit(result) diff --git a/test/sched_idle_bad.service b/test/sched_idle_bad.service deleted file mode 100644 index 589a87ccfd..0000000000 --- a/test/sched_idle_bad.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Bad sched priority for Idle - -[Service] -ExecStart=/bin/true -CPUSchedulingPriority=1 diff --git a/test/sched_idle_ok.service b/test/sched_idle_ok.service deleted file mode 100644 index 262ef3e319..0000000000 --- a/test/sched_idle_ok.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Sched idle with prio 0 - -[Service] -ExecStart=/bin/true -CPUSchedulingPriority=0 diff --git a/test/sched_rr_bad.service b/test/sched_rr_bad.service deleted file mode 100644 index 0be534a546..0000000000 --- a/test/sched_rr_bad.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Bad sched priority for RR - -[Service] -ExecStart=/bin/true -CPUSchedulingPolicy=rr -CPUSchedulingPriority=0 -CPUSchedulingPriority=100 diff --git a/test/sched_rr_change.service b/test/sched_rr_change.service deleted file mode 100644 index b3e3a000f8..0000000000 --- a/test/sched_rr_change.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Change prio - -[Service] -ExecStart=/bin/true -CPUSchedulingPolicy=rr -CPUSchedulingPriority=1 -CPUSchedulingPriority=2 -CPUSchedulingPriority=99 diff --git a/test/sched_rr_ok.service b/test/sched_rr_ok.service deleted file mode 100644 index b88adc5434..0000000000 --- a/test/sched_rr_ok.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Default prio for RR - -[Service] -ExecStart=/bin/true -CPUSchedulingPolicy=rr diff --git a/test/shutdown.target b/test/shutdown.target deleted file mode 120000 index 1a3c2eec84..0000000000 --- a/test/shutdown.target +++ /dev/null @@ -1 +0,0 @@ -../units/shutdown.target
\ No newline at end of file diff --git a/test/sleep.service b/test/sleep.service deleted file mode 100644 index 946c44b621..0000000000 --- a/test/sleep.service +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Sleep for 1 minute - -[Service] -Type=oneshot -ExecStart=/bin/sleep 60 diff --git a/test/sockets.target b/test/sockets.target deleted file mode 120000 index 8ff86a0775..0000000000 --- a/test/sockets.target +++ /dev/null @@ -1 +0,0 @@ -../units/sockets.target
\ No newline at end of file diff --git a/test/son.service b/test/son.service deleted file mode 100644 index 50bb96a941..0000000000 --- a/test/son.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Son Service - -[Service] -Slice=parent.slice -Type=oneshot -ExecStart=/bin/true -CPUShares=100 diff --git a/test/splash.bmp b/test/splash.bmp Binary files differdeleted file mode 100644 index 27247f7a22..0000000000 --- a/test/splash.bmp +++ /dev/null diff --git a/test/sys.tar.xz b/test/sys.tar.xz Binary files differdeleted file mode 100644 index 49ee8027b2..0000000000 --- a/test/sys.tar.xz +++ /dev/null diff --git a/test/sysinit.target b/test/sysinit.target deleted file mode 120000 index 3301338185..0000000000 --- a/test/sysinit.target +++ /dev/null @@ -1 +0,0 @@ -../units/sysinit.target
\ No newline at end of file diff --git a/test/sysv-generator-test.py b/test/sysv-generator-test.py deleted file mode 100644 index cf7d467368..0000000000 --- a/test/sysv-generator-test.py +++ /dev/null @@ -1,391 +0,0 @@ -# systemd-sysv-generator integration test -# -# (C) 2015 Canonical Ltd. -# Author: Martin Pitt <martin.pitt@ubuntu.com> -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. - -# systemd is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with systemd; If not, see <http://www.gnu.org/licenses/>. - -import unittest -import sys -import os -import subprocess -import tempfile -import shutil -from glob import glob - -try: - from configparser import RawConfigParser -except ImportError: - # python 2 - from ConfigParser import RawConfigParser - -sysv_generator = os.path.join(os.environ.get('builddir', '.'), 'systemd-sysv-generator') - - -class SysvGeneratorTest(unittest.TestCase): - def setUp(self): - self.workdir = tempfile.mkdtemp(prefix='sysv-gen-test.') - self.init_d_dir = os.path.join(self.workdir, 'init.d') - os.mkdir(self.init_d_dir) - self.rcnd_dir = self.workdir - self.unit_dir = os.path.join(self.workdir, 'systemd') - os.mkdir(self.unit_dir) - self.out_dir = os.path.join(self.workdir, 'output') - os.mkdir(self.out_dir) - - def tearDown(self): - shutil.rmtree(self.workdir) - - # - # Helper methods - # - - def run_generator(self, expect_error=False): - '''Run sysv-generator. - - Fail if stderr contains any "Fail", unless expect_error is True. - Return (stderr, filename -> ConfigParser) pair with ouput to stderr and - parsed generated units. - ''' - env = os.environ.copy() - env['SYSTEMD_LOG_LEVEL'] = 'debug' - env['SYSTEMD_SYSVINIT_PATH'] = self.init_d_dir - env['SYSTEMD_SYSVRCND_PATH'] = self.rcnd_dir - env['SYSTEMD_UNIT_PATH'] = self.unit_dir - gen = subprocess.Popen( - [sysv_generator, 'ignored', 'ignored', self.out_dir], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True, env=env) - (out, err) = gen.communicate() - if not expect_error: - self.assertFalse('Fail' in err, err) - self.assertEqual(gen.returncode, 0, err) - - results = {} - for service in glob(self.out_dir + '/*.service'): - if os.path.islink(service): - continue - cp = RawConfigParser() - cp.optionxform = lambda o: o # don't lower-case option names - with open(service) as f: - cp.readfp(f) - results[os.path.basename(service)] = cp - - return (err, results) - - def add_sysv(self, fname, keys, enable=False, prio=1): - '''Create a SysV init script with the given keys in the LSB header - - There are sensible default values for all fields. - If enable is True, links will be created in the rcN.d dirs. In that - case, the priority can be given with "prio" (default to 1). - - Return path of generated script. - ''' - name_without_sh = fname.endswith('.sh') and fname[:-3] or fname - keys.setdefault('Provides', name_without_sh) - keys.setdefault('Required-Start', '$local_fs') - keys.setdefault('Required-Stop', keys['Required-Start']) - keys.setdefault('Default-Start', '2 3 4 5') - keys.setdefault('Default-Stop', '0 1 6') - keys.setdefault('Short-Description', 'test %s service' % - name_without_sh) - keys.setdefault('Description', 'long description for test %s service' % - name_without_sh) - script = os.path.join(self.init_d_dir, fname) - with open(script, 'w') as f: - f.write('#!/bin/init-d-interpreter\n### BEGIN INIT INFO\n') - for k, v in keys.items(): - if v is not None: - f.write('#%20s %s\n' % (k + ':', v)) - f.write('### END INIT INFO\ncode --goes here\n') - os.chmod(script, 0o755) - - if enable: - def make_link(prefix, runlevel): - d = os.path.join(self.rcnd_dir, 'rc%s.d' % runlevel) - if not os.path.isdir(d): - os.mkdir(d) - os.symlink('../init.d/' + fname, os.path.join(d, prefix + fname)) - - for rl in keys['Default-Start'].split(): - make_link('S%02i' % prio, rl) - for rl in keys['Default-Stop'].split(): - make_link('K%02i' % (99 - prio), rl) - - return script - - def assert_enabled(self, unit, targets): - '''assert that a unit is enabled in precisely the given targets''' - - all_targets = ['multi-user', 'graphical'] - - # should be enabled - for target in all_targets: - link = os.path.join(self.out_dir, '%s.target.wants' % target, unit) - if target in targets: - unit_file = os.readlink(link) - self.assertTrue(os.path.exists(unit_file)) - self.assertEqual(os.path.basename(unit_file), unit) - else: - self.assertFalse(os.path.exists(link), - '%s unexpectedly exists' % link) - - # - # test cases - # - - def test_nothing(self): - '''no input files''' - - results = self.run_generator()[1] - self.assertEqual(results, {}) - self.assertEqual(os.listdir(self.out_dir), []) - - def test_simple_disabled(self): - '''simple service without dependencies, disabled''' - - self.add_sysv('foo', {}, enable=False) - err, results = self.run_generator() - self.assertEqual(len(results), 1) - - # no enablement links or other stuff - self.assertEqual(os.listdir(self.out_dir), ['foo.service']) - - s = results['foo.service'] - self.assertEqual(s.sections(), ['Unit', 'Service']) - self.assertEqual(s.get('Unit', 'Description'), 'LSB: test foo service') - # $local_fs does not need translation, don't expect any dependency - # fields here - self.assertEqual(set(s.options('Unit')), - set(['Documentation', 'SourcePath', 'Description'])) - - self.assertEqual(s.get('Service', 'Type'), 'forking') - init_script = os.path.join(self.init_d_dir, 'foo') - self.assertEqual(s.get('Service', 'ExecStart'), - '%s start' % init_script) - self.assertEqual(s.get('Service', 'ExecStop'), - '%s stop' % init_script) - - self.assertNotIn('Overwriting', err) - - def test_simple_enabled_all(self): - '''simple service without dependencies, enabled in all runlevels''' - - self.add_sysv('foo', {}, enable=True) - err, results = self.run_generator() - self.assertEqual(list(results), ['foo.service']) - self.assert_enabled('foo.service', ['multi-user', 'graphical']) - self.assertNotIn('Overwriting', err) - - def test_simple_enabled_some(self): - '''simple service without dependencies, enabled in some runlevels''' - - self.add_sysv('foo', {'Default-Start': '2 4'}, enable=True) - err, results = self.run_generator() - self.assertEqual(list(results), ['foo.service']) - self.assert_enabled('foo.service', ['multi-user']) - - def test_lsb_macro_dep_single(self): - '''single LSB macro dependency: $network''' - - self.add_sysv('foo', {'Required-Start': '$network'}) - s = self.run_generator()[1]['foo.service'] - self.assertEqual(set(s.options('Unit')), - set(['Documentation', 'SourcePath', 'Description', 'After', 'Wants'])) - self.assertEqual(s.get('Unit', 'After'), 'network-online.target') - self.assertEqual(s.get('Unit', 'Wants'), 'network-online.target') - - def test_lsb_macro_dep_multi(self): - '''multiple LSB macro dependencies''' - - self.add_sysv('foo', {'Required-Start': '$named $portmap'}) - s = self.run_generator()[1]['foo.service'] - self.assertEqual(set(s.options('Unit')), - set(['Documentation', 'SourcePath', 'Description', 'After'])) - self.assertEqual(s.get('Unit', 'After'), 'nss-lookup.target rpcbind.target') - - def test_lsb_deps(self): - '''LSB header dependencies to other services''' - - # also give symlink priorities here; they should be ignored - self.add_sysv('foo', {'Required-Start': 'must1 must2', - 'Should-Start': 'may1 ne_may2'}, - enable=True, prio=40) - self.add_sysv('must1', {}, enable=True, prio=10) - self.add_sysv('must2', {}, enable=True, prio=15) - self.add_sysv('may1', {}, enable=True, prio=20) - # do not create ne_may2 - err, results = self.run_generator() - self.assertEqual(sorted(results), - ['foo.service', 'may1.service', 'must1.service', 'must2.service']) - - # foo should depend on all of them - self.assertEqual(sorted(results['foo.service'].get('Unit', 'After').split()), - ['may1.service', 'must1.service', 'must2.service', 'ne_may2.service']) - - # other services should not depend on each other - self.assertFalse(results['must1.service'].has_option('Unit', 'After')) - self.assertFalse(results['must2.service'].has_option('Unit', 'After')) - self.assertFalse(results['may1.service'].has_option('Unit', 'After')) - - def test_symlink_prio_deps(self): - '''script without LSB headers use rcN.d priority''' - - # create two init.d scripts without LSB header and enable them with - # startup priorities - for prio, name in [(10, 'provider'), (15, 'consumer')]: - with open(os.path.join(self.init_d_dir, name), 'w') as f: - f.write('#!/bin/init-d-interpreter\ncode --goes here\n') - os.fchmod(f.fileno(), 0o755) - - d = os.path.join(self.rcnd_dir, 'rc2.d') - if not os.path.isdir(d): - os.mkdir(d) - os.symlink('../init.d/' + name, os.path.join(d, 'S%02i%s' % (prio, name))) - - err, results = self.run_generator() - self.assertEqual(sorted(results), ['consumer.service', 'provider.service']) - self.assertFalse(results['provider.service'].has_option('Unit', 'After')) - self.assertEqual(results['consumer.service'].get('Unit', 'After'), - 'provider.service') - - def test_multiple_provides(self): - '''multiple Provides: names''' - - self.add_sysv('foo', {'Provides': 'foo bar baz'}) - err, results = self.run_generator() - self.assertEqual(list(results), ['foo.service']) - self.assertEqual(set(results['foo.service'].options('Unit')), - set(['Documentation', 'SourcePath', 'Description'])) - # should create symlinks for the alternative names - for f in ['bar.service', 'baz.service']: - self.assertEqual(os.readlink(os.path.join(self.out_dir, f)), - 'foo.service') - self.assertNotIn('Overwriting', err) - - def test_same_provides_in_multiple_scripts(self): - '''multiple init.d scripts provide the same name''' - - self.add_sysv('foo', {'Provides': 'foo common'}, enable=True, prio=1) - self.add_sysv('bar', {'Provides': 'bar common'}, enable=True, prio=2) - err, results = self.run_generator() - self.assertEqual(sorted(results), ['bar.service', 'foo.service']) - # should create symlink for the alternative name for either unit - self.assertIn(os.readlink(os.path.join(self.out_dir, 'common.service')), - ['foo.service', 'bar.service']) - - def test_provide_other_script(self): - '''init.d scripts provides the name of another init.d script''' - - self.add_sysv('foo', {'Provides': 'foo bar'}, enable=True) - self.add_sysv('bar', {'Provides': 'bar'}, enable=True) - err, results = self.run_generator() - self.assertEqual(sorted(results), ['bar.service', 'foo.service']) - # we do expect an overwrite here, bar.service should overwrite the - # alias link from foo.service - self.assertIn('Overwriting', err) - - def test_nonexecutable_script(self): - '''ignores non-executable init.d script''' - - os.chmod(self.add_sysv('foo', {}), 0o644) - err, results = self.run_generator() - self.assertEqual(results, {}) - - def test_sh_suffix(self): - '''init.d script with .sh suffix''' - - self.add_sysv('foo.sh', {}, enable=True) - err, results = self.run_generator() - s = results['foo.service'] - - self.assertEqual(s.sections(), ['Unit', 'Service']) - # should not have a .sh - self.assertEqual(s.get('Unit', 'Description'), 'LSB: test foo service') - - # calls correct script with .sh - init_script = os.path.join(self.init_d_dir, 'foo.sh') - self.assertEqual(s.get('Service', 'ExecStart'), - '%s start' % init_script) - self.assertEqual(s.get('Service', 'ExecStop'), - '%s stop' % init_script) - - self.assert_enabled('foo.service', ['multi-user', 'graphical']) - - def test_sh_suffix_with_provides(self): - '''init.d script with .sh suffix and Provides:''' - - self.add_sysv('foo.sh', {'Provides': 'foo bar'}) - err, results = self.run_generator() - # ensure we don't try to create a symlink to itself - self.assertNotIn(err, 'itself') - self.assertEqual(list(results), ['foo.service']) - self.assertEqual(results['foo.service'].get('Unit', 'Description'), - 'LSB: test foo service') - - # should create symlink for the alternative name - self.assertEqual(os.readlink(os.path.join(self.out_dir, 'bar.service')), - 'foo.service') - - def test_hidden_files(self): - '''init.d script with hidden file suffix''' - - script = self.add_sysv('foo', {}, enable=True) - # backup files (not enabled in rcN.d/) - shutil.copy(script, script + '.dpkg-new') - shutil.copy(script, script + '.dpkg-dist') - shutil.copy(script, script + '.swp') - shutil.copy(script, script + '.rpmsave') - - err, results = self.run_generator() - self.assertEqual(list(results), ['foo.service']) - - self.assert_enabled('foo.service', ['multi-user', 'graphical']) - - def test_backup_file(self): - '''init.d script with backup file''' - - script = self.add_sysv('foo', {}, enable=True) - # backup files (not enabled in rcN.d/) - shutil.copy(script, script + '.bak') - shutil.copy(script, script + '.old') - - err, results = self.run_generator() - print(err) - self.assertEqual(sorted(results), - ['foo.bak.service', 'foo.old.service', 'foo.service']) - - # ensure we don't try to create a symlink to itself - self.assertNotIn(err, 'itself') - - self.assert_enabled('foo.service', ['multi-user', 'graphical']) - self.assert_enabled('foo.bak.service', []) - self.assert_enabled('foo.old.service', []) - - def test_existing_native_unit(self): - '''existing native unit''' - - with open(os.path.join(self.unit_dir, 'foo.service'), 'w') as f: - f.write('[Unit]\n') - - self.add_sysv('foo.sh', {'Provides': 'foo bar'}, enable=True) - err, results = self.run_generator() - self.assertEqual(list(results), []) - # no enablement or alias links, as native unit is disabled - self.assertEqual(os.listdir(self.out_dir), []) - - -if __name__ == '__main__': - unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2)) diff --git a/test/test-efi-create-disk.sh b/test/test-efi-create-disk.sh deleted file mode 100755 index 56dd09abd7..0000000000 --- a/test/test-efi-create-disk.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -e - -# create GPT table with EFI System Partition -rm -f test-efi-disk.img -dd if=/dev/null of=test-efi-disk.img bs=1M seek=512 count=1 -parted --script test-efi-disk.img "mklabel gpt" "mkpart ESP fat32 1MiB 511MiB" "set 1 boot on" - -# create FAT32 file system -LOOP=$(losetup --show -f -P test-efi-disk.img) -mkfs.vfat -F32 ${LOOP}p1 -mkdir -p mnt -mount ${LOOP}p1 mnt - -mkdir -p mnt/EFI/{Boot,systemd} -cp systemd-bootx64.efi mnt/EFI/Boot/bootx64.efi - -[ -e /boot/shellx64.efi ] && cp /boot/shellx64.efi mnt/ - -mkdir mnt/EFI/Linux -echo -n "foo=yes bar=no root=/dev/fakeroot debug rd.break=initqueue" > mnt/cmdline.txt -objcopy \ - --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \ - --add-section .cmdline=mnt/cmdline.txt --change-section-vma .cmdline=0x30000 \ - --add-section .splash=test/splash.bmp --change-section-vma .splash=0x40000 \ - --add-section .linux=/boot/$(cat /etc/machine-id)/$(uname -r)/linux --change-section-vma .linux=0x2000000 \ - --add-section .initrd=/boot/$(cat /etc/machine-id)/$(uname -r)/initrd --change-section-vma .initrd=0x3000000 \ - linuxx64.efi.stub mnt/EFI/Linux/linux-test.efi - -# install entries -mkdir -p mnt/loader/entries -echo -e "timeout 3\n" > mnt/loader/loader.conf -echo -e "title Test\nefi /test\n" > mnt/loader/entries/test.conf -echo -e "title Test2\nlinux /test2\noptions option=yes word number=1000 more\n" > mnt/loader/entries/test2.conf -echo -e "title Test3\nlinux /test3\n" > mnt/loader/entries/test3.conf -echo -e "title Test4\nlinux /test4\n" > mnt/loader/entries/test4.conf -echo -e "title Test5\nefi /test5\n" > mnt/loader/entries/test5.conf -echo -e "title Test6\nlinux /test6\n" > mnt/loader/entries/test6.conf - -sync -umount mnt -rmdir mnt -losetup -d $LOOP diff --git a/test/test-functions b/test/test-functions deleted file mode 100644 index 901ff48605..0000000000 --- a/test/test-functions +++ /dev/null @@ -1,1186 +0,0 @@ -#!/bin/bash -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh -PATH=/sbin:/bin:/usr/sbin:/usr/bin -export PATH - -KERNEL_VER=${KERNEL_VER-$(uname -r)} -KERNEL_MODS="/lib/modules/$KERNEL_VER/" - -if ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then - echo "WARNING! Cannot determine rootlibdir from pkg-config, assuming /usr/lib/systemd" >&2 - ROOTLIBDIR=/usr/lib/systemd -fi - -BASICTOOLS="sh bash setsid loadkeys setfont login sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe" -DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort hostname" - -function find_qemu_bin() { - # SUSE and Red Hat call the binary qemu-kvm - # Debian and Gentoo call it kvm - [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a kvm qemu-kvm 2>/dev/null | grep '^/' -m1) - - [ "$ARCH" ] || ARCH=$(uname -m) - case $ARCH in - x86_64) - # QEMU's own build system calls it qemu-system-x86_64 - [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-x86_64 2>/dev/null | grep '^/' -m1) - ;; - i*86) - # new i386 version of QEMU - [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-i386 2>/dev/null | grep '^/' -m1) - - # i386 version of QEMU - [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu 2>/dev/null | grep '^/' -m1) - ;; - esac - - if [ ! -e "$QEMU_BIN" ]; then - echo "Could not find a suitable QEMU binary" >&2 - return 1 - fi -} - -run_qemu() { - if [ -f /etc/machine-id ]; then - read MACHINE_ID < /etc/machine-id - [ -z "$INITRD" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/initrd" ] \ - && INITRD="/boot/$MACHINE_ID/$KERNEL_VER/initrd" - [ -z "$KERNEL_BIN" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/linux" ] \ - && KERNEL_BIN="/boot/$MACHINE_ID/$KERNEL_VER/linux" - fi - - [ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER - [ "$INITRD" ] || INITRD=/boot/initramfs-${KERNEL_VER}.img - [ "$QEMU_SMP" ] || QEMU_SMP=1 - - find_qemu_bin || return 1 - - KERNEL_APPEND="root=/dev/sda1 \ -systemd.log_level=debug \ -raid=noautodetect \ -loglevel=2 \ -init=$ROOTLIBDIR/systemd \ -ro \ -console=ttyS0 \ -selinux=0 \ -$KERNEL_APPEND \ -" - - QEMU_OPTIONS="-machine accel=kvm:tcg \ --smp $QEMU_SMP \ --net none \ --m 512M \ --nographic \ --kernel $KERNEL_BIN \ -" - - if [ "$INITRD" ]; then - QEMU_OPTIONS="$QEMU_OPTIONS -initrd $INITRD" - fi - - ( set -x - $QEMU_BIN $QEMU_OPTIONS -append "$KERNEL_APPEND" $TESTDIR/rootdisk.img ) || return 1 -} - -run_nspawn() { - set -x - ../../systemd-nspawn --boot --directory=$TESTDIR/nspawn-root $ROOTLIBDIR/systemd $KERNEL_APPEND -} - -setup_basic_environment() { - # create the basic filesystem layout - setup_basic_dirs - - install_systemd - install_missing_libraries - install_config_files - create_rc_local - install_basic_tools - install_libnss - install_pam - install_dbus - install_fonts - install_keymaps - install_terminfo - install_execs - install_plymouth - install_debug_tools - install_ld_so_conf - strip_binaries - install_depmod_files - generate_module_dependencies - # softlink mtab - ln -fs /proc/self/mounts $initdir/etc/mtab -} - -install_dmevent() { - instmods dm_crypt =crypto - type -P dmeventd >/dev/null && dracut_install dmeventd - inst_libdir_file "libdevmapper-event.so*" - inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules -} - -install_systemd() { - # install compiled files - (cd $TEST_BASE_DIR/..; set -x; make DESTDIR=$initdir install) - # remove unneeded documentation - rm -fr $initdir/usr/share/{man,doc,gtk-doc} - # we strip binaries since debug symbols increase binaries size a lot - # and it could fill the available space - strip_binaries -} - -install_missing_libraries() { - # install possible missing libraries - for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do - inst_libs $i - done -} - -create_empty_image() { - rm -f "$TESTDIR/rootdisk.img" - # Create the blank file to use as a root filesystem - dd if=/dev/null of="$TESTDIR/rootdisk.img" bs=1M seek=300 - LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img) - [ -b "$LOOPDEV" ] || return 1 - echo "LOOPDEV=$LOOPDEV" >> $STATEFILE - sfdisk "$LOOPDEV" <<EOF -,290M -, -EOF - - mkfs.ext3 -L systemd "${LOOPDEV}p1" -} - -check_result_nspawn() { - ret=1 - [[ -e $TESTDIR/nspawn-root/testok ]] && ret=0 - [[ -f $TESTDIR/nspawn-root/failed ]] && cp -a $TESTDIR/nspawn-root/failed $TESTDIR - cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR - [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed - ls -l $TESTDIR/journal/*/*.journal - test -s $TESTDIR/failed && ret=$(($ret+1)) - return $ret -} - -strip_binaries() { - ddebug "Strip binaries" - find "$initdir" -executable -not -path '*/lib/modules/*.ko' -type f | xargs strip --strip-unneeded | ddebug -} - -create_rc_local() { - mkdir -p $initdir/etc/rc.d - cat >$initdir/etc/rc.d/rc.local <<EOF -#!/bin/bash -exit 0 -EOF - chmod 0755 $initdir/etc/rc.d/rc.local -} - -install_execs() { - # install any Execs from the service files - egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \ - | while read i; do - i=${i##Exec*=}; i=${i##-} - inst $i - done -} - -generate_module_dependencies() { - if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \ - ! depmod -a -b "$initdir" $KERNEL_VER; then - dfatal "\"depmod -a $KERNEL_VER\" failed." - exit 1 - fi -} - -install_depmod_files() { - inst /lib/modules/$KERNEL_VER/modules.order - inst /lib/modules/$KERNEL_VER/modules.builtin -} - -install_plymouth() { - # install plymouth, if found... else remove plymouth service files - # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then - # PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \ - # /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir - # dracut_install plymouth plymouthd - # else - rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth* - # fi -} - -install_ld_so_conf() { - cp -a /etc/ld.so.conf* $initdir/etc - ldconfig -r "$initdir" -} - -install_config_files() { - inst /etc/sysconfig/init - inst /etc/passwd - inst /etc/shadow - inst /etc/group - inst /etc/shells - inst /etc/nsswitch.conf - inst /etc/pam.conf - inst /etc/securetty - inst /etc/os-release - inst /etc/localtime - # we want an empty environment - > $initdir/etc/environment - > $initdir/etc/machine-id - # set the hostname - echo systemd-testsuite > $initdir/etc/hostname - # fstab - cat >$initdir/etc/fstab <<EOF -LABEL=systemd / ext3 rw 0 1 -EOF -} - -install_basic_tools() { - [[ $BASICTOOLS ]] && dracut_install $BASICTOOLS - dracut_install -o sushell - # in Debian ldconfig is just a shell script wrapper around ldconfig.real - dracut_install -o ldconfig.real -} - -install_debug_tools() { - [[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS -} - -install_libnss() { - # install libnss_files for login - NSS_LIBS=$(LD_DEBUG=files getent passwd 2>&1 >/dev/null |sed -n '/calling init: .*libnss_/ {s!^.* /!/!; p}') - dracut_install $NSS_LIBS -} - -install_dbus() { - inst $ROOTLIBDIR/system/dbus.socket - inst $ROOTLIBDIR/system/dbus.service - - find \ - /etc/dbus-1 -xtype f \ - | while read file; do - inst $file - done -} - -install_pam() { - find \ - /etc/pam.d \ - /etc/security \ - /lib64/security \ - /lib/security -xtype f \ - | while read file; do - inst $file - done -} - -install_keymaps() { - for i in \ - /usr/lib/kbd/keymaps/include/* \ - /usr/lib/kbd/keymaps/i386/include/* \ - /usr/lib/kbd/keymaps/i386/qwerty/us.*; do - [[ -f $i ]] || continue - inst $i - done -} - -install_fonts() { - for i in \ - /usr/lib/kbd/consolefonts/eurlatgr* \ - /usr/lib/kbd/consolefonts/latarcyrheb-sun16*; do - [[ -f $i ]] || continue - inst $i - done -} - -install_terminfo() { - for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do - [ -f ${_terminfodir}/l/linux ] && break - done - dracut_install -o ${_terminfodir}/l/linux -} - -setup_testsuite() { - cp $TEST_BASE_DIR/testsuite.target $initdir/etc/systemd/system/ - sed "s#@SYSTEMCTL@#$(type -P systemctl)#g" $TEST_BASE_DIR/end.service.in > $initdir/etc/systemd/system/end.service - - mkdir -p $initdir/etc/systemd/system/testsuite.target.wants - ln -fs $TEST_BASE_DIR/testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service - ln -fs $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service - - # make the testsuite the default target - ln -fs testsuite.target $initdir/etc/systemd/system/default.target -} - -setup_nspawn_root() { - rm -fr $TESTDIR/nspawn-root - ddebug "cp -ar $initdir $TESTDIR/nspawn-root" - cp -ar $initdir $TESTDIR/nspawn-root - # we don't mount in the nspawn root - rm -f $TESTDIR/nspawn-root/etc/fstab -} - -setup_basic_dirs() { - mkdir -p $initdir/run - mkdir -p $initdir/etc/systemd/system - mkdir -p $initdir/var/log/journal - - for d in usr/bin usr/sbin bin etc lib "$libdir" sbin tmp usr var var/log dev proc sys sysroot root run run/lock run/initramfs; do - if [ -L "/$d" ]; then - inst_symlink "/$d" - else - inst_dir "/$d" - fi - done - - ln -sfn /run "$initdir/var/run" - ln -sfn /run/lock "$initdir/var/lock" -} - -inst_libs() { - local _bin=$1 - local _so_regex='([^ ]*/lib[^/]*/[^ ]*\.so[^ ]*)' - local _file _line - - LC_ALL=C ldd "$_bin" 2>/dev/null | while read _line; do - [[ $_line = 'not a dynamic executable' ]] && break - - if [[ $_line =~ $_so_regex ]]; then - _file=${BASH_REMATCH[1]} - [[ -e ${initdir}/$_file ]] && continue - inst_library "$_file" - continue - fi - - if [[ $_line =~ not\ found ]]; then - dfatal "Missing a shared library required by $_bin." - dfatal "Run \"ldd $_bin\" to find out what it is." - dfatal "$_line" - dfatal "dracut cannot create an initrd." - exit 1 - fi - done -} - -import_testdir() { - STATEFILE=".testdir" - [[ -e $STATEFILE ]] && . $STATEFILE - if [[ -z "$TESTDIR" ]] || [[ ! -d "$TESTDIR" ]]; then - TESTDIR=$(mktemp --tmpdir=/var/tmp -d -t systemd-test.XXXXXX) - echo "TESTDIR=\"$TESTDIR\"" > $STATEFILE - export TESTDIR - fi -} - -import_initdir() { - initdir=$TESTDIR/root - export initdir -} - -## @brief Converts numeric logging level to the first letter of level name. -# -# @param lvl Numeric logging level in range from 1 to 6. -# @retval 1 if @a lvl is out of range. -# @retval 0 if @a lvl is correct. -# @result Echoes first letter of level name. -_lvl2char() { - case "$1" in - 1) echo F;; - 2) echo E;; - 3) echo W;; - 4) echo I;; - 5) echo D;; - 6) echo T;; - *) return 1;; - esac -} - -## @brief Internal helper function for _do_dlog() -# -# @param lvl Numeric logging level. -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -# -# @note This function is not supposed to be called manually. Please use -# dtrace(), ddebug(), or others instead which wrap this one. -# -# This function calls _do_dlog() either with parameter msg, or if -# none is given, it will read standard input and will use every line as -# a message. -# -# This enables: -# dwarn "This is a warning" -# echo "This is a warning" | dwarn -LOG_LEVEL=4 - -dlog() { - [ -z "$LOG_LEVEL" ] && return 0 - [ $1 -le $LOG_LEVEL ] || return 0 - local lvl="$1"; shift - local lvlc=$(_lvl2char "$lvl") || return 0 - - if [ $# -ge 1 ]; then - echo "$lvlc: $*" - else - while read line; do - echo "$lvlc: " "$line" - done - fi -} - -## @brief Logs message at TRACE level (6) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dtrace() { - set +x - dlog 6 "$@" - [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at DEBUG level (5) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -ddebug() { -# set +x - dlog 5 "$@" -# [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at INFO level (4) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dinfo() { - set +x - dlog 4 "$@" - [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at WARN level (3) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dwarn() { - set +x - dlog 3 "$@" - [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at ERROR level (2) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -derror() { -# set +x - dlog 2 "$@" -# [ -n "$debug" ] && set -x || : -} - -## @brief Logs message at FATAL level (1) -# -# @param msg Message. -# @retval 0 It's always returned, even if logging failed. -dfatal() { - set +x - dlog 1 "$@" - [ -n "$debug" ] && set -x || : -} - - -# Generic substring function. If $2 is in $1, return 0. -strstr() { [ "${1#*$2*}" != "$1" ]; } - -# normalize_path <path> -# Prints the normalized path, where it removes any duplicated -# and trailing slashes. -# Example: -# $ normalize_path ///test/test// -# /test/test -normalize_path() { - shopt -q -s extglob - set -- "${1//+(\/)//}" - shopt -q -u extglob - echo "${1%/}" -} - -# convert_abs_rel <from> <to> -# Prints the relative path, when creating a symlink to <to> from <from>. -# Example: -# $ convert_abs_rel /usr/bin/test /bin/test-2 -# ../../bin/test-2 -# $ ln -s $(convert_abs_rel /usr/bin/test /bin/test-2) /usr/bin/test -convert_abs_rel() { - local __current __absolute __abssize __cursize __newpath - local -i __i __level - - set -- "$(normalize_path "$1")" "$(normalize_path "$2")" - - # corner case #1 - self looping link - [[ "$1" == "$2" ]] && { echo "${1##*/}"; return; } - - # corner case #2 - own dir link - [[ "${1%/*}" == "$2" ]] && { echo "."; return; } - - IFS="/" __current=($1) - IFS="/" __absolute=($2) - - __abssize=${#__absolute[@]} - __cursize=${#__current[@]} - - while [[ ${__absolute[__level]} == ${__current[__level]} ]] - do - (( __level++ )) - if (( __level > __abssize || __level > __cursize )) - then - break - fi - done - - for ((__i = __level; __i < __cursize-1; __i++)) - do - if ((__i > __level)) - then - __newpath=$__newpath"/" - fi - __newpath=$__newpath".." - done - - for ((__i = __level; __i < __abssize; __i++)) - do - if [[ -n $__newpath ]] - then - __newpath=$__newpath"/" - fi - __newpath=$__newpath${__absolute[__i]} - done - - echo "$__newpath" -} - - -# Install a directory, keeping symlinks as on the original system. -# Example: if /lib points to /lib64 on the host, "inst_dir /lib/file" -# will create ${initdir}/lib64, ${initdir}/lib64/file, -# and a symlink ${initdir}/lib -> lib64. -inst_dir() { - [[ -e ${initdir}/"$1" ]] && return 0 # already there - - local _dir="$1" _part="${1%/*}" _file - while [[ "$_part" != "${_part%/*}" ]] && ! [[ -e "${initdir}/${_part}" ]]; do - _dir="$_part $_dir" - _part=${_part%/*} - done - - # iterate over parent directories - for _file in $_dir; do - [[ -e "${initdir}/$_file" ]] && continue - if [[ -L $_file ]]; then - inst_symlink "$_file" - else - # create directory - mkdir -m 0755 -p "${initdir}/$_file" || return 1 - [[ -e "$_file" ]] && chmod --reference="$_file" "${initdir}/$_file" - chmod u+w "${initdir}/$_file" - fi - done -} - -# $1 = file to copy to ramdisk -# $2 (optional) Name for the file on the ramdisk -# Location of the image dir is assumed to be $initdir -# We never overwrite the target if it exists. -inst_simple() { - [[ -f "$1" ]] || return 1 - strstr "$1" "/" || return 1 - - local _src=$1 target="${2:-$1}" - if ! [[ -d ${initdir}/$target ]]; then - [[ -e ${initdir}/$target ]] && return 0 - [[ -L ${initdir}/$target ]] && return 0 - [[ -d "${initdir}/${target%/*}" ]] || inst_dir "${target%/*}" - fi - # install checksum files also - if [[ -e "${_src%/*}/.${_src##*/}.hmac" ]]; then - inst "${_src%/*}/.${_src##*/}.hmac" "${target%/*}/.${target##*/}.hmac" - fi - ddebug "Installing $_src" - cp --sparse=always -pfL "$_src" "${initdir}/$target" -} - -# find symlinks linked to given library file -# $1 = library file -# Function searches for symlinks by stripping version numbers appended to -# library filename, checks if it points to the same target and finally -# prints the list of symlinks to stdout. -# -# Example: -# rev_lib_symlinks libfoo.so.8.1 -# output: libfoo.so.8 libfoo.so -# (Only if libfoo.so.8 and libfoo.so exists on host system.) -rev_lib_symlinks() { - [[ ! $1 ]] && return 0 - - local fn="$1" orig="$(readlink -f "$1")" links='' - - [[ ${fn} =~ .*\.so\..* ]] || return 1 - - until [[ ${fn##*.} == so ]]; do - fn="${fn%.*}" - [[ -L ${fn} && $(readlink -f "${fn}") == ${orig} ]] && links+=" ${fn}" - done - - echo "${links}" -} - -# Same as above, but specialized to handle dynamic libraries. -# It handles making symlinks according to how the original library -# is referenced. -inst_library() { - local _src="$1" _dest=${2:-$1} _lib _reallib _symlink - strstr "$1" "/" || return 1 - [[ -e $initdir/$_dest ]] && return 0 - if [[ -L $_src ]]; then - # install checksum files also - if [[ -e "${_src%/*}/.${_src##*/}.hmac" ]]; then - inst "${_src%/*}/.${_src##*/}.hmac" "${_dest%/*}/.${_dest##*/}.hmac" - fi - _reallib=$(readlink -f "$_src") - inst_simple "$_reallib" "$_reallib" - inst_dir "${_dest%/*}" - [[ -d "${_dest%/*}" ]] && _dest=$(readlink -f "${_dest%/*}")/${_dest##*/} - ln -sfn $(convert_abs_rel "${_dest}" "${_reallib}") "${initdir}/${_dest}" - else - inst_simple "$_src" "$_dest" - fi - - # Create additional symlinks. See rev_symlinks description. - for _symlink in $(rev_lib_symlinks $_src) $(rev_lib_symlinks $_reallib); do - [[ ! -e $initdir/$_symlink ]] && { - ddebug "Creating extra symlink: $_symlink" - inst_symlink $_symlink - } - done -} - -# find a binary. If we were not passed the full path directly, -# search in the usual places to find the binary. -find_binary() { - if [[ -z ${1##/*} ]]; then - if [[ -x $1 ]] || { strstr "$1" ".so" && ldd $1 &>/dev/null; }; then - echo $1 - return 0 - fi - fi - - type -P $1 -} - -# Same as above, but specialized to install binary executables. -# Install binary executable, and all shared library dependencies, if any. -inst_binary() { - local _bin _target - _bin=$(find_binary "$1") || return 1 - _target=${2:-$_bin} - [[ -e $initdir/$_target ]] && return 0 - [[ -L $_bin ]] && inst_symlink $_bin $_target && return 0 - local _file _line - local _so_regex='([^ ]*/lib[^/]*/[^ ]*\.so[^ ]*)' - # I love bash! - LC_ALL=C ldd "$_bin" 2>/dev/null | while read _line; do - [[ $_line = 'not a dynamic executable' ]] && break - - if [[ $_line =~ $_so_regex ]]; then - _file=${BASH_REMATCH[1]} - [[ -e ${initdir}/$_file ]] && continue - inst_library "$_file" - continue - fi - - if [[ $_line =~ not\ found ]]; then - dfatal "Missing a shared library required by $_bin." - dfatal "Run \"ldd $_bin\" to find out what it is." - dfatal "$_line" - dfatal "dracut cannot create an initrd." - exit 1 - fi - done - inst_simple "$_bin" "$_target" -} - -# same as above, except for shell scripts. -# If your shell script does not start with shebang, it is not a shell script. -inst_script() { - local _bin - _bin=$(find_binary "$1") || return 1 - shift - local _line _shebang_regex - read -r -n 80 _line <"$_bin" - # If debug is set, clean unprintable chars to prevent messing up the term - [[ $debug ]] && _line=$(echo -n "$_line" | tr -c -d '[:print:][:space:]') - _shebang_regex='(#! *)(/[^ ]+).*' - [[ $_line =~ $_shebang_regex ]] || return 1 - inst "${BASH_REMATCH[2]}" && inst_simple "$_bin" "$@" -} - -# same as above, but specialized for symlinks -inst_symlink() { - local _src=$1 _target=${2:-$1} _realsrc - strstr "$1" "/" || return 1 - [[ -L $1 ]] || return 1 - [[ -L $initdir/$_target ]] && return 0 - _realsrc=$(readlink -f "$_src") - if ! [[ -e $initdir/$_realsrc ]]; then - if [[ -d $_realsrc ]]; then - inst_dir "$_realsrc" - else - inst "$_realsrc" - fi - fi - [[ ! -e $initdir/${_target%/*} ]] && inst_dir "${_target%/*}" - [[ -d ${_target%/*} ]] && _target=$(readlink -f ${_target%/*})/${_target##*/} - ln -sfn $(convert_abs_rel "${_target}" "${_realsrc}") "$initdir/$_target" -} - -# attempt to install any programs specified in a udev rule -inst_rule_programs() { - local _prog _bin - - if grep -qE 'PROGRAM==?"[^ "]+' "$1"; then - for _prog in $(grep -E 'PROGRAM==?"[^ "]+' "$1" | sed -r 's/.*PROGRAM==?"([^ "]+).*/\1/'); do - if [ -x /lib/udev/$_prog ]; then - _bin=/lib/udev/$_prog - else - _bin=$(find_binary "$_prog") || { - dinfo "Skipping program $_prog using in udev rule $(basename $1) as it cannot be found" - continue; - } - fi - - #dinfo "Installing $_bin due to it's use in the udev rule $(basename $1)" - dracut_install "$_bin" - done - fi -} - -# udev rules always get installed in the same place, so -# create a function to install them to make life simpler. -inst_rules() { - local _target=/etc/udev/rules.d _rule _found - - inst_dir "/lib/udev/rules.d" - inst_dir "$_target" - for _rule in "$@"; do - if [ "${rule#/}" = "$rule" ]; then - for r in /lib/udev/rules.d /etc/udev/rules.d; do - if [[ -f $r/$_rule ]]; then - _found="$r/$_rule" - inst_simple "$_found" - inst_rule_programs "$_found" - fi - done - fi - for r in '' ./ $dracutbasedir/rules.d/; do - if [[ -f ${r}$_rule ]]; then - _found="${r}$_rule" - inst_simple "$_found" "$_target/${_found##*/}" - inst_rule_programs "$_found" - fi - done - [[ $_found ]] || dinfo "Skipping udev rule: $_rule" - done -} - -# general purpose installation function -# Same args as above. -inst() { - local _x - - case $# in - 1) ;; - 2) [[ ! $initdir && -d $2 ]] && export initdir=$2 - [[ $initdir = $2 ]] && set $1;; - 3) [[ -z $initdir ]] && export initdir=$2 - set $1 $3;; - *) dfatal "inst only takes 1 or 2 or 3 arguments" - exit 1;; - esac - for _x in inst_symlink inst_script inst_binary inst_simple; do - $_x "$@" && return 0 - done - return 1 -} - -# install any of listed files -# -# If first argument is '-d' and second some destination path, first accessible -# source is installed into this path, otherwise it will installed in the same -# path as source. If none of listed files was installed, function return 1. -# On first successful installation it returns with 0 status. -# -# Example: -# -# inst_any -d /bin/foo /bin/bar /bin/baz -# -# Lets assume that /bin/baz exists, so it will be installed as /bin/foo in -# initramfs. -inst_any() { - local to f - - [[ $1 = '-d' ]] && to="$2" && shift 2 - - for f in "$@"; do - if [[ -e $f ]]; then - [[ $to ]] && inst "$f" "$to" && return 0 - inst "$f" && return 0 - fi - done - - return 1 -} - -# dracut_install [-o ] <file> [<file> ... ] -# Install <file> to the initramfs image -# -o optionally install the <file> and don't fail, if it is not there -dracut_install() { - local _optional=no - if [[ $1 = '-o' ]]; then - _optional=yes - shift - fi - while (($# > 0)); do - if ! inst "$1" ; then - if [[ $_optional = yes ]]; then - dinfo "Skipping program $1 as it cannot be found and is" \ - "flagged to be optional" - else - dfatal "Failed to install $1" - exit 1 - fi - fi - shift - done -} - -# Install a single kernel module along with any firmware it may require. -# $1 = full path to kernel module to install -install_kmod_with_fw() { - # no need to go further if the module is already installed - - [[ -e "${initdir}/lib/modules/$KERNEL_VER/${1##*/lib/modules/$KERNEL_VER/}" ]] \ - && return 0 - - [[ -e "$initdir/.kernelmodseen/${1##*/}" ]] && return 0 - - if [[ $omit_drivers ]]; then - local _kmod=${1##*/} - _kmod=${_kmod%.ko} - _kmod=${_kmod/-/_} - if [[ "$_kmod" =~ $omit_drivers ]]; then - dinfo "Omitting driver $_kmod" - return 1 - fi - if [[ "${1##*/lib/modules/$KERNEL_VER/}" =~ $omit_drivers ]]; then - dinfo "Omitting driver $_kmod" - return 1 - fi - fi - - [ -d "$initdir/.kernelmodseen" ] && \ - > "$initdir/.kernelmodseen/${1##*/}" - - inst_simple "$1" "/lib/modules/$KERNEL_VER/${1##*/lib/modules/$KERNEL_VER/}" \ - || return $? - - local _modname=${1##*/} _fwdir _found _fw - _modname=${_modname%.ko*} - for _fw in $(modinfo -k $KERNEL_VER -F firmware $1 2>/dev/null); do - _found='' - for _fwdir in $fw_dir; do - if [[ -d $_fwdir && -f $_fwdir/$_fw ]]; then - inst_simple "$_fwdir/$_fw" "/lib/firmware/$_fw" - _found=yes - fi - done - if [[ $_found != yes ]]; then - if ! grep -qe "\<${_modname//-/_}\>" /proc/modules; then - dinfo "Possible missing firmware \"${_fw}\" for kernel module" \ - "\"${_modname}.ko\"" - else - dwarn "Possible missing firmware \"${_fw}\" for kernel module" \ - "\"${_modname}.ko\"" - fi - fi - done - return 0 -} - -# Do something with all the dependencies of a kernel module. -# Note that kernel modules depend on themselves using the technique we use -# $1 = function to call for each dependency we find -# It will be passed the full path to the found kernel module -# $2 = module to get dependencies for -# rest of args = arguments to modprobe -# _fderr specifies FD passed from surrounding scope -for_each_kmod_dep() { - local _func=$1 _kmod=$2 _cmd _modpath _options _found=0 - shift 2 - modprobe "$@" --ignore-install --show-depends $_kmod 2>&${_fderr} | ( - while read _cmd _modpath _options; do - [[ $_cmd = insmod ]] || continue - $_func ${_modpath} || exit $? - _found=1 - done - [[ $_found -eq 0 ]] && exit 1 - exit 0 - ) -} - -# filter kernel modules to install certain modules that meet specific -# requirements. -# $1 = search only in subdirectory of /kernel/$1 -# $2 = function to call with module name to filter. -# This function will be passed the full path to the module to test. -# The behavior of this function can vary depending on whether $hostonly is set. -# If it is, we will only look at modules that are already in memory. -# If it is not, we will look at all kernel modules -# This function returns the full filenames of modules that match $1 -filter_kernel_modules_by_path () ( - local _modname _filtercmd - if ! [[ $hostonly ]]; then - _filtercmd='find "$KERNEL_MODS/kernel/$1" "$KERNEL_MODS/extra"' - _filtercmd+=' "$KERNEL_MODS/weak-updates" -name "*.ko" -o -name "*.ko.gz"' - _filtercmd+=' -o -name "*.ko.xz"' - _filtercmd+=' 2>/dev/null' - else - _filtercmd='cut -d " " -f 1 </proc/modules|xargs modinfo -F filename ' - _filtercmd+='-k $KERNEL_VER 2>/dev/null' - fi - for _modname in $(eval $_filtercmd); do - case $_modname in - *.ko) "$2" "$_modname" && echo "$_modname";; - *.ko.gz) gzip -dc "$_modname" > $initdir/$$.ko - $2 $initdir/$$.ko && echo "$_modname" - rm -f $initdir/$$.ko - ;; - *.ko.xz) xz -dc "$_modname" > $initdir/$$.ko - $2 $initdir/$$.ko && echo "$_modname" - rm -f $initdir/$$.ko - ;; - esac - done -) -find_kernel_modules_by_path () ( - if ! [[ $hostonly ]]; then - find "$KERNEL_MODS/kernel/$1" "$KERNEL_MODS/extra" "$KERNEL_MODS/weak-updates" \ - -name "*.ko" -o -name "*.ko.gz" -o -name "*.ko.xz" 2>/dev/null - else - cut -d " " -f 1 </proc/modules \ - | xargs modinfo -F filename -k $KERNEL_VER 2>/dev/null - fi -) - -filter_kernel_modules () { - filter_kernel_modules_by_path drivers "$1" -} - -find_kernel_modules () { - find_kernel_modules_by_path drivers -} - -# instmods [-c] <kernel module> [<kernel module> ... ] -# instmods [-c] <kernel subsystem> -# install kernel modules along with all their dependencies. -# <kernel subsystem> can be e.g. "=block" or "=drivers/usb/storage" -instmods() { - [[ $no_kernel = yes ]] && return - # called [sub]functions inherit _fderr - local _fderr=9 - local _check=no - if [[ $1 = '-c' ]]; then - _check=yes - shift - fi - - function inst1mod() { - local _ret=0 _mod="$1" - case $_mod in - =*) - if [ -f $KERNEL_MODS/modules.${_mod#=} ]; then - ( [[ "$_mpargs" ]] && echo $_mpargs - cat "${KERNEL_MODS}/modules.${_mod#=}" ) \ - | instmods - else - ( [[ "$_mpargs" ]] && echo $_mpargs - find "$KERNEL_MODS" -path "*/${_mod#=}/*" -printf '%f\n' ) \ - | instmods - fi - ;; - --*) _mpargs+=" $_mod" ;; - i2o_scsi) return ;; # Do not load this diagnostic-only module - *) - _mod=${_mod##*/} - # if we are already installed, skip this module and go on - # to the next one. - [[ -f "$initdir/.kernelmodseen/${_mod%.ko}.ko" ]] && return - - if [[ $omit_drivers ]] && [[ "$1" =~ $omit_drivers ]]; then - dinfo "Omitting driver ${_mod##$KERNEL_MODS}" - return - fi - # If we are building a host-specific initramfs and this - # module is not already loaded, move on to the next one. - [[ $hostonly ]] && ! grep -qe "\<${_mod//-/_}\>" /proc/modules \ - && ! echo $add_drivers | grep -qe "\<${_mod}\>" \ - && return - - # We use '-d' option in modprobe only if modules prefix path - # differs from default '/'. This allows us to use Dracut with - # old version of modprobe which doesn't have '-d' option. - local _moddirname=${KERNEL_MODS%%/lib/modules/*} - [[ -n ${_moddirname} ]] && _moddirname="-d ${_moddirname}/" - - # ok, load the module, all its dependencies, and any firmware - # it may require - for_each_kmod_dep install_kmod_with_fw $_mod \ - --set-version $KERNEL_VER ${_moddirname} $_mpargs - ((_ret+=$?)) - ;; - esac - return $_ret - } - - function instmods_1() { - local _mod _mpargs - if (($# == 0)); then # filenames from stdin - while read _mod; do - inst1mod "${_mod%.ko*}" || { - if [ "$_check" = "yes" ]; then - dfatal "Failed to install $_mod" - return 1 - fi - } - done - fi - while (($# > 0)); do # filenames as arguments - inst1mod ${1%.ko*} || { - if [ "$_check" = "yes" ]; then - dfatal "Failed to install $1" - return 1 - fi - } - shift - done - return 0 - } - - local _ret _filter_not_found='FATAL: Module .* not found.' - set -o pipefail - # Capture all stderr from modprobe to _fderr. We could use {var}>... - # redirections, but that would make dracut require bash4 at least. - eval "( instmods_1 \"\$@\" ) ${_fderr}>&1" \ - | while read line; do [[ "$line" =~ $_filter_not_found ]] && echo $line || echo $line >&2 ;done | derror - _ret=$? - set +o pipefail - return $_ret -} - -# inst_libdir_file [-n <pattern>] <file> [<file>...] -# Install a <file> located on a lib directory to the initramfs image -# -n <pattern> install non-matching files -inst_libdir_file() { - if [[ "$1" == "-n" ]]; then - local _pattern=$1 - shift 2 - for _dir in $libdirs; do - for _i in "$@"; do - for _f in "$_dir"/$_i; do - [[ "$_i" =~ $_pattern ]] || continue - [[ -e "$_i" ]] && dracut_install "$_i" - done - done - done - else - for _dir in $libdirs; do - for _i in "$@"; do - for _f in "$_dir"/$_i; do - [[ -e "$_f" ]] && dracut_install "$_f" - done - done - done - fi -} - -check_nspawn() { - [[ -d /sys/fs/cgroup/systemd ]] -} - - -do_test() { - if [[ $UID != "0" ]]; then - echo "TEST: $TEST_DESCRIPTION [SKIPPED]: not root" >&2 - exit 0 - fi - -# Detect lib paths - [[ $libdir ]] || for libdir in /lib64 /lib; do - [[ -d $libdir ]] && libdirs+=" $libdir" && break - done - - [[ $usrlibdir ]] || for usrlibdir in /usr/lib64 /usr/lib; do - [[ -d $usrlibdir ]] && libdirs+=" $usrlibdir" && break - done - - import_testdir - import_initdir - - while (($# > 0)); do - case $1 in - --run) - echo "TEST RUN: $TEST_DESCRIPTION" - test_run - ret=$? - if [ $ret -eq 0 ]; then - echo "TEST RUN: $TEST_DESCRIPTION [OK]" - else - echo "TEST RUN: $TEST_DESCRIPTION [FAILED]" - fi - exit $ret;; - --setup) - echo "TEST SETUP: $TEST_DESCRIPTION" - test_setup - exit $?;; - --clean) - echo "TEST CLEANUP: $TEST_DESCRIPTION" - test_cleanup - rm -fr "$TESTDIR" - rm -f .testdir - exit $?;; - --all) - echo -n "TEST: $TEST_DESCRIPTION "; - ( - test_setup && test_run - ret=$? - test_cleanup - rm -fr "$TESTDIR" - rm -f .testdir - exit $ret - ) </dev/null >test.log 2>&1 - ret=$? - if [ $ret -eq 0 ]; then - rm test.log - echo "[OK]" - else - echo "[FAILED]" - echo "see $(pwd)/test.log" - fi - exit $ret;; - *) break ;; - esac - shift - done -} diff --git a/test/testsuite.target b/test/testsuite.target deleted file mode 100644 index 1a7e5b371a..0000000000 --- a/test/testsuite.target +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=Testsuite target -Requires=multi-user.target -After=multi-user.target -Conflicts=rescue.target -AllowIsolate=yes diff --git a/test/timers.target b/test/timers.target deleted file mode 120000 index 576d47fed7..0000000000 --- a/test/timers.target +++ /dev/null @@ -1 +0,0 @@ -../units/timers.target
\ No newline at end of file diff --git a/test/udev-test.pl b/test/udev-test.pl deleted file mode 100755 index 64d7f93444..0000000000 --- a/test/udev-test.pl +++ /dev/null @@ -1,1545 +0,0 @@ -#!/usr/bin/perl - -# udev test -# -# 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. -# -# udev parses the rules, looks at the provided sysfs and -# 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. -# -# Copyright (C) 2004-2012 Kay Sievers <kay@vrfy.org> -# Copyright (C) 2004 Leann Ogasawara <ogasawara@osdl.org> - -use warnings; -use strict; - -my $udev_bin = "./test-udev"; -my $valgrind = 0; -my $gdb = 0; -my $udev_bin_valgrind = "valgrind --tool=memcheck --leak-check=yes --track-origins=yes --quiet $udev_bin"; -my $udev_bin_gdb = "gdb --args $udev_bin"; -my $udev_dev = "test/dev"; -my $udev_run = "test/run"; -my $udev_rules_dir = "$udev_run/udev/rules.d"; -my $udev_rules = "$udev_rules_dir/udev-test.rules"; -my $EXIT_TEST_SKIP = 77; - -my @tests = ( - { - 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 -# -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -KERNEL=="ttyACM*", SYMLINK+="modem/%n" -EOF - }, - { - 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 -KERNEL=="*ACM1", SYMLINK+="bad" -KERNEL=="*ACM0", SYMLINK+="modem/%n" -EOF - }, - { - 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 -KERNEL=="ttyACM??*", SYMLINK+="modem/%n-1" -KERNEL=="ttyACM??", SYMLINK+="modem/%n-2" -KERNEL=="ttyACM?", SYMLINK+="modem/%n" -EOF - }, - { - 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 -KERNEL=="ttyACM[A-Z]*", SYMLINK+="modem/%n-1" -KERNEL=="ttyACM?[0-9]", SYMLINK+="modem/%n-2" -KERNEL=="ttyACM[0-9]*", SYMLINK+="modem/%n" -EOF - }, - { - 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 -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -# this is a comment -KERNEL=="ttyACM0", SYMLINK+="modem" - -EOF - }, - { - 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 - # this is a comment with whitespace before the comment -KERNEL=="ttyACM0", SYMLINK+="modem" - -EOF - }, - { - 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 - - - - # this is a comment with whitespace before the comment -KERNEL=="ttyACM0", SYMLINK+="whitespace" - - - -EOF - }, - { - 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 - -KERNEL=="ttyACM0", SYMLINK+="modem" - -EOF - }, - { - 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 -KERNEL=="ttyACM0", \\ -SYMLINK+="modem" - -EOF - }, - { - 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 -KERNEL=="ttyACM0", PROGRAM=="/bin/echo -e \\101", RESULT=="A", SYMLINK+="aaa" -EOF - }, - { - 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 - -# -\\ - -\\ - -#\\ - -KERNEL=="ttyACM0", \\ - SYMLINK+="modem" - -EOF - }, - { - 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 -KERNEL=="ttyACM0", SYMLINK+="sub/direct/ory/modem" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="first_disk%n" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:%M:minor:%m:kernelnumber:%n:id:%b" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", IMPORT{program}="/bin/echo -e \' TEST_KEY=12345678\\n TEST_key2=98765\'", SYMLINK+="node\$env{TEST_KEY}" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="disk-%s{vendor}-%k" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo test", RESULT=="test", SYMLINK+="newline_removed" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n test-%b", RESULT=="test-0:0*", SYMLINK+="%c" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="%c{7}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'echo foo3 foo4 foo5 foo6 foo7 foo8 foo9 | sed s/foo9/bar9/'", KERNEL=="sda5", SYMLINK+="%c{7}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n 'foo3 foo4' 'foo5 foo6 foo7 foo8'", KERNEL=="sda5", SYMLINK+="%c{5}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{7}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{6}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:\$major-minor:\$minor-kernelnumber:\$number-id:\$id" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="Major:\$major-minor:%m-kernelnumber:\$number-id:\$id" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="%M%m%b%n" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major\$minor\$number" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major%m%n\$id" -EOF - }, - { - desc => "non matching SUBSYSTEMS for device with no parent", - devpath => "/devices/virtual/tty/console", - exp_name => "TTY", - rules => <<EOF -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo", RESULT=="foo", SYMLINK+="foo" -KERNEL=="console", SYMLINK+="TTY" -EOF - }, - { - desc => "non matching SUBSYSTEMS", - devpath => "/devices/virtual/tty/console", - exp_name => "TTY" , - rules => <<EOF -SUBSYSTEMS=="foo", ATTRS{dev}=="5:1", SYMLINK+="foo" -KERNEL=="console", SYMLINK+="TTY" -EOF - }, - { - desc => "ATTRS match", - devpath => "/devices/virtual/tty/console", - exp_name => "foo" , - rules => <<EOF -KERNEL=="console", SYMLINK+="TTY" -ATTRS{dev}=="5:1", SYMLINK+="foo" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -ATTRS{idProduct}=="007b", SYMLINK+="modem" -EOF - }, - { - desc => "name test with ! in the name", - devpath => "/devices/virtual/block/fake!blockdev0", - exp_name => "is/a/fake/blockdev0" , - rules => <<EOF -SUBSYSTEMS=="scsi", SYMLINK+="is/not/a/%k" -SUBSYSTEM=="block", SYMLINK+="is/a/%k" -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -KERNEL=="ttyACM0", SYMLINK+="modem" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before" -SUBSYSTEMS=="scsi", KERNELS=="*:0", SYMLINK+="scsi-0:0:0:0" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before" -SUBSYSTEMS=="scsi", KERNELS=="*:0:0:0", SYMLINK+="scsi-0:0:0:0" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", SYMLINK+="driver-is-\$attr{driver}" -EOF - }, - { - 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 -SUBSYSTEMS=="pci", SYMLINK+="driver-is-\$attr{driver}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE", SYMLINK+="ignored" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE ", SYMLINK+="wrong-to-ignore" -SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE SPACE ", SYMLINK+="matched-with-space" -EOF - }, - { - desc => "permissions USER=bad GROUP=name", - devpath => "/devices/virtual/tty/tty33", - exp_name => "tty33", - exp_perms => "0:0:0600", - rules => <<EOF -KERNEL=="tty33", OWNER="bad", GROUP="name" -EOF - }, - { - desc => "permissions OWNER=1", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", - exp_name => "node", - exp_perms => "1::0600", - rules => <<EOF -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="1" -EOF - }, - { - desc => "permissions GROUP=1", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", - exp_name => "node", - exp_perms => ":1:0660", - rules => <<EOF -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", GROUP="1" -EOF - }, - { - 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", - exp_perms => "nobody::0600", - rules => <<EOF -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="nobody" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", GROUP="daemon" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="root", GROUP="mail" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", MODE="0777" -EOF - }, - { - desc => "permissions OWNER=1 GROUP=1 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 => "1:1:0777", - rules => <<EOF -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", OWNER="1", GROUP="1", MODE="0777" -EOF - }, - { - desc => "permissions OWNER to 1", - devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0", - exp_name => "ttyACM0", - exp_perms => "1::", - rules => <<EOF -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", OWNER="1" -EOF - }, - { - desc => "permissions GROUP to 1", - devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0", - exp_name => "ttyACM0", - exp_perms => ":1:0660", - rules => <<EOF -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", GROUP="1" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", MODE="0060" -EOF - }, - { - 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", - exp_perms => "1:1:0777", - rules => <<EOF -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", OWNER="1", GROUP="1", MODE="0777" -EOF - }, - { - desc => "permissions only rule", - devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0", - exp_name => "ttyACM0", - exp_perms => "1:1:0777", - rules => <<EOF -KERNEL=="ttyACM[0-9]*", OWNER="1", GROUP="1", MODE="0777" -KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444" -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n" -EOF - }, - { - 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", - exp_perms => "1:1:0777", - rules => <<EOF -SUBSYSTEM=="tty", OWNER="1" -SUBSYSTEM=="tty", GROUP="1" -SUBSYSTEM=="tty", MODE="0777" -KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444" -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n" -EOF - }, - { - 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", - exp_perms => "1:2:0777", - rules => <<EOF -SUBSYSTEM=="tty", OWNER="1" -SUBSYSTEM=="tty", GROUP="1" -SUBSYSTEM=="tty", MODE="0777" -KERNEL=="ttyUSX[0-9]*", OWNER="2", GROUP="2", MODE="0444" -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", GROUP="2" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node" -EOF - }, - { - desc => "big major number test", - devpath => "/devices/virtual/misc/misc-fake1", - exp_name => "node", - exp_majorminor => "4095:1", - rules => <<EOF -KERNEL=="misc-fake1", SYMLINK+="node" -EOF - }, - { - desc => "big major and big minor number test", - devpath => "/devices/virtual/misc/misc-fake89999", - exp_name => "node", - exp_majorminor => "4095:89999", - rules => <<EOF -KERNEL=="misc-fake89999", SYMLINK+="node" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK="symlink1-%n symlink2-%k symlink3-%b" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK=" one two " -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK="modem%n" -EOF - }, - { - 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 -KERNEL=="ttyACM0", SYMLINK="first-%n second-%n third-%n" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="." -EOF - }, - { - 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 -KERNEL=="tty0", SYMLINK+="tty0" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink%n" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink-%k" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="major-%M:%m" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="symlink-%b" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo test", SYMLINK+="%c" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2}" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2+}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/bin/echo link test this" SYMLINK+="%c{2+}" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="%s{dev}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2", RESULT=="node *", SYMLINK+="%c{2} %c{3}" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2 link3 link4", RESULT=="node *", SYMLINK+="%c{2+}" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match", DRIVERS=="sd-wrong" -SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="node", DRIVERS=="sd" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/usr/bin/test -b %N" SYMLINK+="node" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="%P-part-1" -EOF - }, - { - desc => "udev_root substitution", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1", - exp_name => "start-/dev-end", - rules => <<EOF -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="start-%r-end" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="last", OPTIONS="last_rule" -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="very-last" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL!="sda1", SYMLINK+="matches-but-is-negated" -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before" -SUBSYSTEMS=="scsi", KERNEL!="xsda1", SYMLINK+="match" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", SUBSYSTEM=="block", KERNEL!="sda1", SYMLINK+="matches-but-is-negated" -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before" -SUBSYSTEMS=="scsi", SUBSYSTEM!="anything", SYMLINK+="not-anything" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before" -KERNEL=="sda1", PROGRAM!="/bin/false", SYMLINK+="nonzero-program" -EOF - }, - { - 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 -ENV{ENV_KEY_TEST}="test" -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" -EOF - }, - { - 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 -ENV{ENV_KEY_TEST}="test" -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" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true" -SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="yes", SYMLINK+="no" -SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before" -SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="true", SYMLINK+="true" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true" -SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="absolutely-\$env{ASSIGN}" -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" -EOF - }, - { - 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 -SUBSYSTEM=="block", KERNEL=="*[0-9]", ENV{PARTITION}="true", ENV{MAINDEVICE}="false" -SUBSYSTEM=="block", KERNEL=="*[!0-9]", ENV{PARTITION}="false", ENV{MAINDEVICE}="true" -ENV{MAINDEVICE}=="true", SYMLINK+="disk" -SUBSYSTEM=="block", SYMLINK+="before" -ENV{PARTITION}=="true", SYMLINK+="part" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e name; (/usr/bin/badprogram)", RESULT=="name_ _/usr/bin/badprogram_", SYMLINK+="sane" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xc3\\xbcber" RESULT=="\xc3\xbcber", SYMLINK+="uber" -EOF - }, - { - 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 -SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xef\\xe8garbage", RESULT=="__garbage", SYMLINK+="replaced" -EOF - }, - { - 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 -KERNEL=="ttyACM*", ATTRS{serial}=="?*", SYMLINK+="serial-%s{serial}" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -ACTION=="unknown", KERNEL=="sda", SYMLINK+="unknown-not-ok" -ACTION=="add", KERNEL=="sda", SYMLINK+="ok" -EOF - }, - { - 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 -KERNEL=="sda", GROUP:="tty" -KERNEL=="sda", GROUP="not-ok", MODE="0640", SYMLINK+="ok" -EOF - }, - { - 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 -KERNEL=="sda", GROUP:="tty" -SUBSYSTEM=="block", MODE:="640" -KERNEL=="sda", GROUP="not-ok", MODE="0666", SYMLINK+="ok" -EOF - }, - { - 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 -KERNEL=="sda", MODE="0666", SYMLINK+="node-\$env{ACTION}-me" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="one" -KERNEL=="ttyACM[0-9]*", SYMLINK+="two" -KERNEL=="ttyACM[0-9]*", SYMLINK="three" -EOF - }, - { - 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 -KERNEL=="ttyACM[0-9]*", SYMLINK+="wrong" -KERNEL=="ttyACM[0-9]*", SYMLINK="" -KERNEL=="ttyACM[0-9]*", SYMLINK+="right" -EOF - }, - { - 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 -KERNEL=="ttyACM*", SYMLINK+="before" -KERNEL=="ttyACM*|nothing", SYMLINK+="right" -EOF - }, - { - 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 -KERNEL=="dontknow*|*nothing", SYMLINK+="nomatch" -KERNEL=="ttyACM*", SYMLINK+="before" -KERNEL=="dontknow*|ttyACM*|nothing*", SYMLINK+="right" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -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" -EOF - }, - { - 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 -KERNEL=="sda", IMPORT{program}="/bin/echo -e \'PARENT_KEY=parent_right\\nWRONG_PARENT_KEY=parent_wrong'" -KERNEL=="sda", SYMLINK+="parent" -EOF - }, - { - 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 -KERNEL=="sda1", IMPORT{parent}="PARENT*", SYMLINK+="parentenv-\$env{PARENT_KEY}\$env{WRONG_PARENT_KEY}" -EOF - }, - { - 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 -KERNEL=="sda1", GOTO="TEST" -KERNEL=="sda1", SYMLINK+="wrong" -KERNEL=="sda1", GOTO="BAD" -KERNEL=="sda1", SYMLINK+="", LABEL="NO" -KERNEL=="sda1", SYMLINK+="right", LABEL="TEST", GOTO="end" -KERNEL=="sda1", SYMLINK+="wrong2", LABEL="BAD" -LABEL="end" -EOF - }, - { - 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 -KERNEL=="sda1", GOTO="does-not-exist" -KERNEL=="sda1", SYMLINK+="right", -LABEL="exists" -EOF - }, - { - 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 -KERNEL=="sda1", SYMLINK+="link" -KERNEL=="sda1", SYMLINK=="link*", SYMLINK+="right" -KERNEL=="sda1", SYMLINK=="nolink*", SYMLINK+="wrong" -EOF - }, - { - 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 -KERNEL="sda1", SYMLINK+="no" -KERNEL=="sda1", SYMLINK+="yes" -EOF - }, - { - 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 -KERNEL=="sda", ATTR{test:colon+plus}=="?*", SYMLINK+="yes" -EOF - }, - { - 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 -# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 - # 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -KERNEL=="sda1", SYMLINK+=="no" -KERNEL=="sda1", SYMLINK+="yes" -EOF - }, - { - 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 -KERNEL=="sda", SYMLINK+="\$attr{[net/eth0]address}" -EOF - }, - { - 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 -TEST=="/etc/machine-id", SYMLINK+="there" -TEST!="/etc/machine-id", SYMLINK+="notthere" -EOF - }, - { - 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 -KERNEL=="sda", TEST=="[net/eth0]", SYMLINK+="yes" -EOF - }, - { - 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 -KERNEL=="sda", TEST=="size", SYMLINK+="relative" -EOF - }, - { - 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 -KERNEL=="sda", TEST=="*/nr_requests", SYMLINK+="found-subdir" -EOF - }, - { - 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 -KERNEL=="sda", MODE="0000" -EOF - }, - { - 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", - exp_perms => "1:1:0400", - exp_rem_error => "yes", - rules => <<EOF -KERNEL=="sda", MODE="666" -KERNEL=="sda", PROGRAM=="/bin/echo 1 1 0400", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}" -EOF - }, - { - 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 -KERNEL=="sda", MODE="440" -KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}" -EOF - }, - { - 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 -KERNEL=="sda", PROGRAM="/bin/true create-envp" -KERNEL=="sda", ENV{TESTENV}="change-envp" -KERNEL=="sda", SYMLINK+="%k-%s{[dmi/id]product_name}-end" -EOF - }, - { - 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 -KERNEL=="sda", IMPORT{builtin}="path_id" -KERNEL=="sda", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/\$env{ID_PATH}" -EOF - }, -); - -sub udev { - my ($action, $devpath, $rules) = @_; - - # create temporary rules - system("mkdir", "-p", "$udev_rules_dir"); - open CONF, ">$udev_rules" || die "unable to create rules file: $udev_rules"; - print CONF $$rules; - close CONF; - - if ($valgrind > 0) { - system("$udev_bin_valgrind $action $devpath"); - } elsif ($gdb > 0) { - system("$udev_bin_gdb $action $devpath"); - } else { - system("$udev_bin", "$action", "$devpath"); - } -} - -my $error = 0; - -sub permissions_test { - my($rules, $uid, $gid, $mode) = @_; - - my $wrong = 0; - my $userid; - my $groupid; - - $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); - } -} - -sub major_minor_test { - my($rules, $rdev) = @_; - - my $major = ($rdev >> 8) & 0xfff; - my $minor = ($rdev & 0xff) | (($rdev >> 12) & 0xfff00); - my $wrong = 0; - - $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); - } -} - -sub udev_setup { - system("rm", "-rf", "$udev_dev"); - mkdir($udev_dev) || die "unable to create udev_dev: $udev_dev\n"; - # setting group and mode of udev_dev ensures the tests work - # even if the parent directory has setgid bit enabled. - chown (0, 0, $udev_dev) || die "unable to chown $udev_dev\n"; - chmod (0755, $udev_dev) || die "unable to chmod $udev_dev\n"; - - system("rm", "-rf", "$udev_run"); -} - -sub run_test { - my ($rules, $number) = @_; - - print "TEST $number: $rules->{desc}\n"; - print "device \'$rules->{devpath}\' expecting node/link \'$rules->{exp_name}\'\n"; - - udev("add", $rules->{devpath}, \$rules->{rules}); - if (defined($rules->{not_exp_name})) { - if ((-e "$udev_dev/$rules->{not_exp_name}") || - (-l "$udev_dev/$rules->{not_exp_name}")) { - print "nonexistent: error \'$rules->{not_exp_name}\' not expected to be there\n"; - $error++; - sleep(1); - } - } - - if ((-e "$udev_dev/$rules->{exp_name}") || - (-l "$udev_dev/$rules->{exp_name}")) { - - my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, - $atime, $mtime, $ctime, $blksize, $blocks) = stat("$udev_dev/$rules->{exp_name}"); - - 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"; - system("tree", "$udev_dev"); - print "\n"; - $error++; - sleep(1); - } - } - - if (defined($rules->{option}) && $rules->{option} eq "keep") { - print "\n\n"; - return; - } - - udev("remove", $rules->{devpath}, \$rules->{rules}); - if ((-e "$udev_dev/$rules->{exp_name}") || - (-l "$udev_dev/$rules->{exp_name}")) { - print "remove: error"; - if ($rules->{exp_rem_error}) { - print " as expected\n"; - } else { - print "\n"; - system("tree", "$udev_dev"); - print "\n"; - $error++; - sleep(1); - } - } else { - print "remove: ok\n"; - } - - print "\n"; - - if (defined($rules->{option}) && $rules->{option} eq "clean") { - udev_setup(); - } - -} - -# only run if we have root permissions -# due to mknod restrictions -if (!($<==0)) { - print "Must have root permissions to run properly.\n"; - exit; -} - -# skip the test when running in a container -system("systemd-detect-virt", "-c", "-q"); -if ($? >> 8 == 0) { - print "Running in a container, skipping the test.\n"; - exit($EXIT_TEST_SKIP); -} - -udev_setup(); - -my $test_num = 1; -my @list; - -foreach my $arg (@ARGV) { - if ($arg =~ m/--valgrind/) { - $valgrind = 1; - printf("using valgrind\n"); - } elsif ($arg =~ m/--gdb/) { - $gdb = 1; - printf("using gdb\n"); - } else { - push(@list, $arg); - } -} - -if ($list[0]) { - 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"; - } - } -} else { - # test all - print "\nudev-test will run ".($#tests + 1)." tests:\n\n"; - - foreach my $rules (@tests) { - run_test($rules, $test_num); - $test_num++; - } -} - -print "$error errors occurred\n\n"; - -# cleanup -system("rm", "-rf", "$udev_dev"); -system("rm", "-rf", "$udev_run"); - -if ($error > 0) { - exit(1); -} -exit(0); diff --git a/test/unstoppable.service b/test/unstoppable.service deleted file mode 100644 index 24fb0a25e1..0000000000 --- a/test/unstoppable.service +++ /dev/null @@ -1,5 +0,0 @@ -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=/bin/echo 'I'm unstoppable!' -ExecStop=/bin/systemctl start --no-block unstoppable.service |