#!/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 [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network [ -f /etc/sysconfig/network-scripts/ifcfg-"${interface}" ] && \ . /etc/sysconfig/network-scripts/ifcfg-"${interface}" chronyc=/usr/bin/chronyc server_options=${NTPSERVERARGS:-iburst} server_dir=/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" # Don't add NTP servers if PEERNTP=no specified; return early. [ "$PEERNTP" = "no" ] && return 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