#!/bin/sh # This is a NetworkManager dispatcher script for chronyd to update # its NTP sources with servers from DHCP options passed by NetworkManager # in the DHCP4_NTP_SERVERS and DHCP6_DHCP6_NTP_SERVERS environment variables. export LC_ALL=C interface=$1 action=$2 chronyc=/usr/bin/chronyc server_options=iburst server_dir=/var/run/chrony-dhcp dhcp_server_file=$server_dir/$interface.sources dhcp_ntp_servers="$DHCP4_NTP_SERVERS $DHCP6_DHCP6_NTP_SERVERS" add_servers_from_dhcp() { rm -f "$dhcp_server_file" for server in $dhcp_ntp_servers; do # 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 $chronyc reload sources > /dev/null 2>&1 || : } clear_servers_from_dhcp() { if [ -f "$dhcp_server_file" ]; then rm -f "$dhcp_server_file" $chronyc reload sources > /dev/null 2>&1 || : fi } mkdir -p $server_dir case "$action" in up|dhcp4-change|dhcp6-change) add_servers_from_dhcp;; down) clear_servers_from_dhcp;; esac exit 0