summaryrefslogtreecommitdiffstats
path: root/modules.d/slx-clock/hooks/s3-ntp-sync.sh
blob: 7bbcd14a2f7f0dbc39962173e488bf3ad7322915 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/ash
# Sync time via network

. /etc/openslx

# Try to merge with servers from DHCP. Prefer DHCP, skip duplicates
for SERVER in $SLX_NTP_SERVER; do
	if ! echo "$SLX_DHCP_NTP" | grep -wq "$SERVER"; then
		SLX_DHCP_NTP="$SLX_DHCP_NTP $SERVER"
	fi
done
SUCCESS=
for SERVER in $SLX_DHCP_NTP; do
	if timeout 3 ntpd -q -n -p "$SERVER"; then
		echo "Successfully queried $SERVER for time."
		if [ "$SLX_BIOS_CLOCK" = "local" ]; then
			usleep 100000
			hwclock -l -w || echo "... but could not set BIOS clock to localtime"
		elif [ "$SLX_BIOS_CLOCK" = "utc" ]; then
			usleep 100000
			hwclock -u -w || echo "... but could not set BIOS clock to UTC"
		fi
		SUCCESS=1
		break
	fi
	echo "Error querying $SERVER for current time."
done
if [ -z "$SUCCESS" ]; then
	echo "No NTP server reachable"
	# See if we have a timestamp in our server-config - should only be a few seconds off by now
	if [ -n "$SLX_NOW" ] && [ "$SLX_NOW" -gt 1234567890 ]; then
		TTS="$SLX_NOW"
		CONFIG_DOWNLOAD_TIME=$( cat /tmp/config-download-time 2> /dev/null )
		if [ -n "$CONFIG_DOWNLOAD_TIME" ]; then
			# times are in centiseconds
			NOW_TIME=$(sed -r 's/^([0-9]+)\.([0-9][0-9]).*$/\1\2/' /proc/uptime)
			if [ "$CONFIG_DOWNLOAD_TIME" -gt 0 ] && [ "$NOW_TIME" -gt 0 ]; then
				TTS=$(( TTS + ( NOW_TIME - CONFIG_DOWNLOAD_TIME ) / 100 ))
			fi
		fi
		echo "Setting time to SLX_NOW ($SLX_NOW, corrected $TTS)"
		date -s "@$TTS"
	else
		echo "No fallback option for timesync available, relying on correct RTC setup"
		if [ "$SLX_BIOS_CLOCK" = "local" ]; then
			# Linux defaults to RTC = UTC, so read again in this case
			hwclock -l -s
		fi
	fi
fi

echo "Timesync finished"
exit 0