examples: support DHCPv6 NTP servers in NM dispatcher script

Latest NetworkManager code provides NTP servers from the DHCPv6 NTP
option (RFC 5908) in the DHCP6_DHCP6_NTP_SERVERS variable to dispatcher
scripts.

Check for invalid characters (which can come from the FQDN suboption)
and include the servers in the interface-specific sources file.
This commit is contained in:
Miroslav Lichvar 2022-02-07 13:27:25 +01:00
parent 759580aa6f
commit 5bd13c8d59

View file

@ -1,8 +1,7 @@
#!/bin/sh #!/bin/sh
# This is a NetworkManager dispatcher script for chronyd to update # This is a NetworkManager dispatcher script for chronyd to update
# its NTP sources passed from DHCP options. Note that this script is # its NTP sources with servers from DHCP options passed by NetworkManager
# specific to NetworkManager-dispatcher due to use of the # in the DHCP4_NTP_SERVERS and DHCP6_DHCP6_NTP_SERVERS environment variables.
# DHCP4_NTP_SERVERS environment variable.
export LC_ALL=C export LC_ALL=C
@ -10,17 +9,19 @@ interface=$1
action=$2 action=$2
chronyc=/usr/bin/chronyc chronyc=/usr/bin/chronyc
default_server_options=iburst server_options=iburst
server_dir=/var/run/chrony-dhcp server_dir=/var/run/chrony-dhcp
dhcp_server_file=$server_dir/$interface.sources dhcp_server_file=$server_dir/$interface.sources
# DHCP4_NTP_SERVERS is passed from DHCP options by NetworkManager. dhcp_ntp_servers="$DHCP4_NTP_SERVERS $DHCP6_DHCP6_NTP_SERVERS"
nm_dhcp_servers=$DHCP4_NTP_SERVERS
add_servers_from_dhcp() { add_servers_from_dhcp() {
rm -f "$dhcp_server_file" rm -f "$dhcp_server_file"
for server in $nm_dhcp_servers; do for server in $dhcp_ntp_servers; do
echo "server $server $default_server_options" >> "$dhcp_server_file" # Check for invalid characters (from the DHCPv6 NTP FQDN suboption)
printf '%s\n' "$server" | grep -E -q '^[-A-Za-z0-9:.]{1,255}$' || continue
printf 'server %s %s\n' "$server" "$server_options" >> "$dhcp_server_file"
done done
$chronyc reload sources > /dev/null 2>&1 || : $chronyc reload sources > /dev/null 2>&1 || :
} }
@ -34,10 +35,11 @@ clear_servers_from_dhcp() {
mkdir -p $server_dir mkdir -p $server_dir
if [ "$action" = "up" ] || [ "$action" = "dhcp4-change" ]; then case "$action" in
add_servers_from_dhcp up|dhcp4-change|dhcp6-change)
elif [ "$action" = "down" ]; then add_servers_from_dhcp;;
clear_servers_from_dhcp down)
fi clear_servers_from_dhcp;;
esac
exit 0 exit 0