2023-05-12 18:39:41 +03:00
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
# shellcheck disable=SC2016
set -eux
set -o pipefail
2023-05-17 20:10:55 +03:00
# shellcheck source=test/units/util.sh
. " $( dirname " $0 " ) " /util.sh
2023-05-12 18:39:41 +03:00
2023-05-17 20:10:55 +03:00
export PAGER =
2023-05-12 18:39:41 +03:00
at_exit( ) {
set +e
machinectl status long-running >/dev/null && machinectl kill --signal= KILL long-running
2023-09-06 15:51:07 +03:00
mountpoint -q /var/lib/machines && timeout 10 sh -c "until umount /var/lib/machines; do sleep .5; done"
2023-05-12 18:59:54 +03:00
[ [ -n " ${ NSPAWN_FRAGMENT :- } " ] ] && rm -f " /etc/systemd/nspawn/ $NSPAWN_FRAGMENT " " /var/lib/machines/ $NSPAWN_FRAGMENT "
2023-05-17 22:49:20 +03:00
rm -f /run/systemd/nspawn/*.nspawn
2023-05-12 18:39:41 +03:00
}
trap at_exit EXIT
2024-02-24 00:50:30 +03:00
systemctl service-log-level systemd-machined debug
systemctl service-log-level systemd-importd debug
2024-02-13 15:48:26 +03:00
# Mount temporary directory over /var/lib/machines to not pollute the image
2023-05-12 18:39:41 +03:00
mkdir -p /var/lib/machines
2024-02-13 15:48:26 +03:00
mount --bind " $( mktemp --tmpdir= /var/tmp -d) " /var/lib/machines
2023-05-12 18:39:41 +03:00
# Create a couple of containers we can refer to in tests
for i in { 0..4} ; do
2023-05-17 20:10:55 +03:00
create_dummy_container " /var/lib/machines/container $i "
2023-05-12 18:39:41 +03:00
machinectl start " container $i "
done
# Create one "long running" container with some basic signal handling
2023-05-17 20:10:55 +03:00
create_dummy_container /var/lib/machines/long-running
2023-05-12 18:39:41 +03:00
cat >/var/lib/machines/long-running/sbin/init <<\E OF
2024-05-17 08:14:00 +03:00
#!/usr/bin/bash
2023-05-17 20:10:55 +03:00
2023-05-12 18:39:41 +03:00
PID = 0
2023-05-17 20:10:55 +03:00
trap "touch /poweroff" RTMIN+4
2023-05-12 18:39:41 +03:00
trap "touch /reboot" INT
trap "touch /trap" TRAP
trap 'kill $PID' EXIT
# We need to wait for the sleep process asynchronously in order to allow
# bash to process signals
sleep infinity &
PID = $!
while :; do
wait || :
done
EOF
machinectl start long-running
machinectl
machinectl --no-pager --help
machinectl --version
machinectl list
machinectl list --no-legend --no-ask-password
machinectl status long-running long-running long-running
machinectl status --full long-running
machinectl status --quiet --lines= 1 long-running
machinectl status --lines= 0 --max-addresses= 0 long-running
machinectl status --machine= testuser@.host long-running
machinectl status --output= help long-running
while read -r output; do
machinectl status --output= " $output " long-running
done < <( machinectl --output= help )
machinectl show
machinectl show --all
machinectl show --all --machine= root@
machinectl show --all --machine= testuser@
[ [ " $( machinectl show --property= PoolPath --value) " = = "/var/lib/machines" ] ]
machinectl show long-running
machinectl show long-running long-running long-running --all
[ [ " $( machinectl show --property= RootDirectory --value long-running) " = = "/var/lib/machines/long-running" ] ]
machinectl enable long-running
test -L /etc/systemd/system/machines.target.wants/systemd-nspawn@long-running.service
machinectl enable long-running long-running long-running container1
machinectl disable long-running
test ! -L /etc/systemd/system/machines.target.wants/systemd-nspawn@long-running.service
machinectl disable long-running long-running long-running container1
2023-05-17 20:10:55 +03:00
[ [ " $( machinectl shell testuser@ /usr/bin/bash -c 'echo -ne $FOO' ) " = = "" ] ]
[ [ " $( machinectl shell --setenv= FOO = bar testuser@ /usr/bin/bash -c 'echo -ne $FOO' ) " = = "bar" ] ]
2023-05-12 18:39:41 +03:00
[ [ " $( machinectl show --property= State --value long-running) " = = "running" ] ]
# Equivalent to machinectl kill --signal=SIGRTMIN+4 --kill-whom=leader
rm -f /var/lib/machines/long-running/poweroff
machinectl poweroff long-running
2023-09-06 15:51:07 +03:00
timeout 10 bash -c "until test -e /var/lib/machines/long-running/poweroff; do sleep .5; done"
2023-05-12 18:39:41 +03:00
# Equivalent to machinectl kill --signal=SIGINT --kill-whom=leader
rm -f /var/lib/machines/long-running/reboot
machinectl reboot long-running
2023-09-06 15:51:07 +03:00
timeout 10 bash -c "until test -e /var/lib/machines/long-running/reboot; do sleep .5; done"
2023-05-12 18:39:41 +03:00
# Skip machinectl terminate for now, as it doesn't play well with our "init"
rm -f /var/lib/machines/long-running/trap
machinectl kill --signal= SIGTRAP --kill-whom= leader long-running
2023-09-06 15:51:07 +03:00
timeout 10 bash -c "until test -e /var/lib/machines/long-running/trap; do sleep .5; done"
2023-07-10 11:39:00 +03:00
# Multiple machines at once
machinectl poweroff long-running long-running long-running
machinectl reboot long-running long-running long-running
2023-05-12 18:39:41 +03:00
machinectl kill --signal= SIGTRAP --kill-whom= leader long-running long-running long-running
# All used signals should've been caught by a handler
[ [ " $( machinectl show --property= State --value long-running) " = = "running" ] ]
cp /etc/machine-id /tmp/foo
machinectl copy-to long-running /tmp/foo /root/foo
test -f /var/lib/machines/long-running/root/foo
machinectl copy-from long-running /root/foo /tmp/bar
diff /tmp/foo /tmp/bar
rm -f /tmp/{ foo,bar}
# machinectl bind is covered by testcase_check_machinectl_bind() in nspawn tests
machinectl list-images
machinectl list-images --no-legend
machinectl image-status
machinectl image-status container1
machinectl image-status container1 container1 container{ 0..4}
machinectl show-image
machinectl show-image container1
machinectl show-image container1 container1 container{ 0..4}
machinectl clone container1 clone1
machinectl show-image clone1
machinectl rename clone1 clone2
( ! machinectl show-image clone1)
machinectl show-image clone2
2024-05-21 16:08:07 +03:00
# `machinectl read-only` uses chattr (ioctl(FS_IOC_SETFLAGS)) when the container is backed by a directory,
# and this operation might not be implemented on certain filesystems (i.e. tmpfs on older kernels), so check
# if we have chattr support before running following tests
2023-05-12 18:39:41 +03:00
if lsattr -d /var/lib/machines >/dev/null; then
[ [ " $( machinectl show-image --property= ReadOnly --value clone2) " = = no ] ]
machinectl read-only clone2 yes
[ [ " $( machinectl show-image --property= ReadOnly --value clone2) " = = yes ] ]
machinectl read-only clone2 no
[ [ " $( machinectl show-image --property= ReadOnly --value clone2) " = = no ] ]
fi
machinectl remove clone2
for i in { 0..4} ; do
machinectl clone container1 " clone $i "
done
machinectl remove clone{ 0..4}
for i in { 0..4} ; do
machinectl clone container1 " .hidden $i "
done
machinectl list-images --all
test -d /var/lib/machines/.hidden1
machinectl clean
test ! -d /var/lib/machines/.hidden1
# Prepare a simple raw container
mkdir -p /tmp/mnt
2024-02-13 15:48:26 +03:00
dd if = /dev/zero of = /var/tmp/container.raw bs = 1M count = 256
mkfs.ext4 /var/tmp/container.raw
mount -o loop /var/tmp/container.raw /tmp/mnt
2023-05-12 18:39:41 +03:00
cp -r /var/lib/machines/container1/* /tmp/mnt
umount /tmp/mnt
# Try to import it, run it, export it, and re-import it
2024-02-13 15:48:26 +03:00
machinectl import-raw /var/tmp/container.raw container-raw
2023-05-12 18:39:41 +03:00
[ [ " $( machinectl show-image --property= Type --value container-raw) " = = "raw" ] ]
machinectl start container-raw
2024-02-13 15:48:26 +03:00
machinectl export-raw container-raw /var/tmp/container-export.raw
machinectl import-raw /var/tmp/container-export.raw container-raw-reimport
2023-05-12 18:39:41 +03:00
[ [ " $( machinectl show-image --property= Type --value container-raw-reimport) " = = "raw" ] ]
2024-02-13 15:48:26 +03:00
rm -f /var/tmp/container{ ,-export} .raw
2023-05-12 18:39:41 +03:00
# Prepare a simple tar.gz container
2024-02-13 15:48:26 +03:00
tar -pczf /var/tmp/container.tar.gz -C /var/lib/machines/container1 .
2023-05-12 18:39:41 +03:00
# Try to import it, run it, export it, and re-import it
2024-02-13 15:48:26 +03:00
machinectl import-tar /var/tmp/container.tar.gz container-tar
[ [ " $( machinectl show-image --property= Type --value container-tar) " = ~ directory| subvolume ] ]
2023-05-12 18:39:41 +03:00
machinectl start container-tar
2024-02-13 15:48:26 +03:00
machinectl export-tar container-tar /var/tmp/container-export.tar.gz
machinectl import-tar /var/tmp/container-export.tar.gz container-tar-reimport
[ [ " $( machinectl show-image --property= Type --value container-tar-reimport) " = ~ directory| subvolume ] ]
rm -f /var/tmp/container{ ,-export} .tar.gz
2023-05-12 18:39:41 +03:00
# Try to import a container directory & run it
2024-02-13 15:48:26 +03:00
cp -r /var/lib/machines/container1 /var/tmp/container.dir
machinectl import-fs /var/tmp/container.dir container-dir
[ [ " $( machinectl show-image --property= Type --value container-dir) " = ~ directory| subvolume ] ]
2023-05-12 18:39:41 +03:00
machinectl start container-dir
2024-02-13 15:48:26 +03:00
rm -fr /var/tmp/container.dir
2023-05-12 18:39:41 +03:00
2023-09-06 15:51:07 +03:00
timeout 10 bash -c "until machinectl clean --all; do sleep .5; done"
2023-05-12 18:39:41 +03:00
2023-05-12 18:59:54 +03:00
NSPAWN_FRAGMENT = " machinectl-test- $RANDOM .nspawn "
cat >" /var/lib/machines/ $NSPAWN_FRAGMENT " <<EOF
[ Exec]
Boot = true
EOF
machinectl cat " $NSPAWN_FRAGMENT "
EDITOR = true script -qec " machinectl edit $NSPAWN_FRAGMENT " /dev/null
test -f " /etc/systemd/nspawn/ $NSPAWN_FRAGMENT "
diff " /var/lib/machines/ $NSPAWN_FRAGMENT " " /etc/systemd/nspawn/ $NSPAWN_FRAGMENT "
cat >/tmp/fragment.nspawn <<EOF
[ Exec]
Boot = false
EOF
machinectl cat /tmp/fragment.nspawn
EDITOR = "cp /tmp/fragment.nspawn" script -qec " machinectl edit $NSPAWN_FRAGMENT " /dev/null
diff /tmp/fragment.nspawn " /etc/systemd/nspawn/ $NSPAWN_FRAGMENT "
2023-05-12 18:39:41 +03:00
for opt in format lines machine max-addresses output setenv verify; do
( ! machinectl status " -- $opt = " long-running)
( ! machinectl status " -- $opt =-1 " long-running)
( ! machinectl status " -- $opt ='' " long-running)
done
( ! machinectl show "" )
( ! machinectl enable )
( ! machinectl enable "" )
( ! machinectl disable)
( ! machinectl disable "" )
( ! machinectl read-only container1 "" )
( ! machinectl read-only container1 foo)
( ! machinectl read-only container1 -- -1)