186 lines
5 KiB
Bash
Executable file
186 lines
5 KiB
Bash
Executable file
#!/bin/sh
|
|
set -e
|
|
|
|
. `dirname $0`/assert.sh
|
|
|
|
ORIG_TZ=`readlink /etc/localtime | sed 's#^.*zoneinfo/##'`
|
|
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"
|
|
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"
|
|
|
|
# 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 $MONPID 2>/dev/null || true
|
|
}
|
|
|
|
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
|