mirror of
https://git.proxmox.com/git/systemd
synced 2026-01-23 16:25:43 +00:00
is-active return code isn't the correct way to verify a service is fully stopped; instead use show --property=ActiveState to verify it is 'inactive' This also could use the text output of is-active, but (per manpage) the show command is "intended to be used whenever computer-parsable output is required." systemctl is-active returns non-zero even while the service is 'deactivating', but not actually stopped, which allows the testcase to fail intermittently on slow machines, if the service hasn't actually stopped before reaching the check to verify the service stopped. For example: $ systemctl is-active systemd-timesyncd active $ timedatectl set-ntp false ; systemctl is-active systemd-timesyncd ; echo $? deactivating 3 So the test code which does: $ while systemctl is-active --quiet systemd-timesyncd; do sleep 1; done will never actually perform that sleep.
189 lines
5.1 KiB
Bash
Executable File
189 lines
5.1 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
. `dirname $0`/assert.sh
|
|
|
|
ORIG_TZ=`grep -v '^#' /etc/timezone`
|
|
echo "original tz: $ORIG_TZ"
|
|
|
|
echo 'timedatectl works'
|
|
assert_in "Local time:" "`timedatectl --no-pager`"
|
|
|
|
echo 'change timezone'
|
|
assert_eq "`timedatectl --no-pager set-timezone Europe/Moscow 2>&1`" ""
|
|
assert_eq "`readlink /etc/localtime | sed 's#^.*zoneinfo/##'`" "Europe/Moscow"
|
|
[ -n "$TEST_UPSTREAM" ] || assert_eq "`cat /etc/timezone`" "Europe/Moscow"
|
|
assert_in "Time.*zone: Europe/Moscow (MSK, +" "`timedatectl --no-pager`"
|
|
|
|
echo 'reset timezone to original'
|
|
assert_eq "`timedatectl --no-pager set-timezone $ORIG_TZ 2>&1`" ""
|
|
assert_eq "`readlink /etc/localtime | sed 's#^.*zoneinfo/##'`" "$ORIG_TZ"
|
|
[ -n "$TEST_UPSTREAM" ] || assert_eq "`cat /etc/timezone`" "$ORIG_TZ"
|
|
|
|
# test setting UTC vs. LOCAL in /etc/adjtime
|
|
if [ -e /etc/adjtime ]; then
|
|
ORIG_ADJTIME=`cat /etc/adjtime`
|
|
trap "echo '$ORIG_ADJTIME' > /etc/adjtime" EXIT INT QUIT PIPE
|
|
else
|
|
trap "rm -f /etc/adjtime" EXIT INT QUIT PIPE
|
|
fi
|
|
|
|
echo 'no adjtime file'
|
|
rm -f /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
|
|
echo 'UTC set in adjtime file'
|
|
printf '0.0 0 0\n0\nUTC\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
UTC"
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'non-zero values in adjtime file'
|
|
printf '0.1 123 0\n0\nLOCAL\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_eq "`cat /etc/adjtime`" "0.1 123 0
|
|
0
|
|
UTC"
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.1 123 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'fourth line adjtime file'
|
|
printf '0.0 0 0\n0\nLOCAL\nsomethingelse\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
UTC
|
|
somethingelse"
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL
|
|
somethingelse"
|
|
|
|
echo 'no final newline in adjtime file'
|
|
printf '0.0 0 0\n0\nUTC' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0\n0\nUTC' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'only one line in adjtime file'
|
|
printf '0.0 0 0\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'only one line in adjtime file, no final newline'
|
|
printf '0.0 0 0' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'only two lines in adjtime file'
|
|
printf '0.0 0 0\n0\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0\n0\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
|
|
echo 'only two lines in adjtime file, no final newline'
|
|
printf '0.0 0 0\n0' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0\n0' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
echo 'unknown value in 3rd line of adjtime file'
|
|
printf '0.0 0 0\n0\nFOO\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 0
|
|
assert_true '[ ! -e /etc/adjtime ]'
|
|
printf '0.0 0 0\n0\nFOO\n' > /etc/adjtime
|
|
timedatectl set-local-rtc 1
|
|
assert_eq "`cat /etc/adjtime`" "0.0 0 0
|
|
0
|
|
LOCAL"
|
|
|
|
# timesyncd has ConditionVirtualization=!container by default; drop/mock that for testing
|
|
if systemd-detect-virt --container --quiet; then
|
|
systemctl disable --quiet --now systemd-timesyncd
|
|
mkdir -p /run/systemd/system/systemd-timesyncd.service.d
|
|
printf '[Unit]\nConditionVirtualization=\n[Service]\nType=simple\nAmbientCapabilities=\nExecStart=\nExecStart=/bin/sleep infinity' > /run/systemd/system/systemd-timesyncd.service.d/container.conf
|
|
systemctl daemon-reload
|
|
fi
|
|
|
|
mon=$(mktemp -t dbusmon.XXXXXX)
|
|
trap "rm -f $mon" EXIT INT QUIT PIPE
|
|
|
|
assert_ntp() {
|
|
V=$(busctl get-property org.freedesktop.timedate1 /org/freedesktop/timedate1 org.freedesktop.timedate1 NTP)
|
|
assert_eq "$V" "b $1"
|
|
}
|
|
|
|
start_mon() {
|
|
dbus-monitor --system "type='signal', member='PropertiesChanged', path='/org/freedesktop/timedate1'" > $mon &
|
|
MONPID=$!
|
|
}
|
|
|
|
wait_mon() {
|
|
for retry in $(seq 10); do
|
|
grep -q "$1" $mon && break
|
|
sleep 1
|
|
done
|
|
assert_in "$2" "$(cat $mon)"
|
|
kill $MONPID
|
|
wait
|
|
}
|
|
|
|
echo 'disable NTP'
|
|
timedatectl set-ntp false
|
|
while [ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" != "ActiveState=inactive" ]; do sleep 1; done
|
|
assert_ntp false
|
|
assert_rc 3 systemctl is-active --quiet systemd-timesyncd
|
|
|
|
echo 'enable NTP'
|
|
start_mon
|
|
timedatectl set-ntp true
|
|
wait_mon "NTP" "boolean true"
|
|
assert_ntp true
|
|
while [ "$(systemctl --no-pager show systemd-timesyncd --property ActiveState)" != "ActiveState=active" ]; do sleep 1; done
|
|
assert_rc 0 systemctl is-active --quiet systemd-timesyncd
|
|
|
|
echo 're-disable NTP'
|
|
start_mon
|
|
timedatectl set-ntp false
|
|
wait_mon "NTP" "boolean false"
|
|
assert_ntp false
|
|
assert_rc 3 systemctl is-active --quiet systemd-timesyncd
|