#!/bin/bash # This script configures running chronyd to use NTP servers obtained from # DHCP and _ntp._udp DNS SRV records. Files with servers from DHCP are managed # externally (e.g. by a dhclient script). Files with servers from DNS SRV # records are updated here using the dig utility. The script can also list # and set static sources in the chronyd configuration file. chronyc=/usr/bin/chronyc chrony_conf=/etc/chrony.conf chrony_service=chronyd.service helper_dir=/var/run/chrony-helper added_servers_file=$helper_dir/added_servers network_sysconfig_file=/etc/sysconfig/network dhclient_servers_files=/var/lib/dhclient/chrony.servers.* dnssrv_servers_files=$helper_dir/dnssrv@* dnssrv_timer_prefix=chrony-dnssrv@ chrony_command() { $chronyc -a -n -m "$1" } is_running() { chrony_command "tracking" &> /dev/null } is_update_needed() { for file in $dhclient_servers_files $dnssrv_servers_files \ $added_servers_file; do [ -e "$file" ] && return 0 done return 1 } update_daemon() { local all_servers_with_args all_servers added_servers if ! is_running; then rm -f $added_servers_file return 0 fi all_servers_with_args=$( cat $dhclient_servers_files $dnssrv_servers_files 2> /dev/null) all_servers=$( echo "$all_servers_with_args" | while read server serverargs; do echo "$server" done | sort -u) added_servers=$( ( cat $added_servers_file 2> /dev/null echo "$all_servers_with_args" | while read server serverargs; do [ -z "$server" ] && continue chrony_command "add server $server $serverargs" &> /dev/null && echo "$server" done) | sort -u) comm -23 <(echo -n "$added_servers") <(echo -n "$all_servers") | while read server; do chrony_command "delete $server" &> /dev/null done added_servers=$(comm -12 <(echo -n "$added_servers") <(echo -n "$all_servers")) [ -n "$added_servers" ] && echo "$added_servers" > $added_servers_file || rm -f $added_servers_file } get_dnssrv_servers() { local name=$1 if ! command -v dig &> /dev/null; then echo "Missing dig (DNS lookup utility)" >&2 return 1 fi ( . $network_sysconfig_file &> /dev/null output=$(dig "$name" srv +short +ndots=2 +search 2> /dev/null) [ $? -ne 0 ] && return 0 echo "$output" | while read prio weight port target; do server=${target%.} [ -z "$server" ] && continue echo "$server port $port ${NTPSERVERARGS:-iburst}" done ) } check_dnssrv_name() { local name=$1 if [ -z "$name" ]; then echo "No DNS SRV name specified" >&2 return 1 fi if [ "${name:0:9}" != _ntp._udp ]; then echo "DNS SRV name $name doesn't start with _ntp._udp" >&2 return 1 fi } update_dnssrv_servers() { local name=$1 local srv_file=$helper_dir/dnssrv@$name servers check_dnssrv_name "$name" || return 1 servers=$(get_dnssrv_servers "$name") [ -n "$servers" ] && echo "$servers" > "$srv_file" || rm -f "$srv_file" } set_dnssrv_timer() { local state=$1 name=$2 local srv_file=$helper_dir/dnssrv@$name servers local timer=$dnssrv_timer_prefix$(systemd-escape "$name").timer check_dnssrv_name "$name" || return 1 if [ "$state" = enable ]; then systemctl enable "$timer" systemctl start "$timer" elif [ "$state" = disable ]; then systemctl stop "$timer" systemctl disable "$timer" rm -f "$srv_file" fi } list_dnssrv_timers() { systemctl --all --full -t timer list-units | grep "^$dnssrv_timer_prefix" | \ sed "s|^$dnssrv_timer_prefix\(.*\)\.timer.*|\1|" | while read -r name; do systemd-escape --unescape "$name" done } prepare_helper_dir() { mkdir -p $helper_dir exec 100> $helper_dir/lock if ! flock -w 20 100; then echo "Failed to lock $helper_dir" >&2 return 1 fi } is_source_line() { local pattern="^[ \t]*(server|pool|peer|refclock)[ \t]+[^ \t]+" [[ "$1" =~ $pattern ]] } list_static_sources() { while read line; do is_source_line "$line" && echo "$line" || : done < $chrony_conf } set_static_sources() { local new_config tmp_conf new_config=$( sources=$( while read line; do is_source_line "$line" && echo "$line" done) while read line; do if ! is_source_line "$line"; then echo "$line" continue fi tmp_sources=$( local removed=0 echo "$sources" | while read line2; do [ "$removed" -ne 0 -o "$line" != "$line2" ] && \ echo "$line2" || removed=1 done) [ "$sources" == "$tmp_sources" ] && continue sources=$tmp_sources echo "$line" done < $chrony_conf echo "$sources" ) tmp_conf=${chrony_conf}.tmp cp -a $chrony_conf $tmp_conf && echo "$new_config" > $tmp_conf && mv $tmp_conf $chrony_conf || return 1 systemctl try-restart $chrony_service } print_help() { echo "Usage: $0 COMMAND" echo echo "Commands:" echo " update-daemon" echo " update-dnssrv-servers NAME" echo " enable-dnssrv NAME" echo " disable-dnssrv NAME" echo " list-dnssrv" echo " list-static-sources" echo " set-static-sources < sources.list" echo " is-running" echo " command CHRONYC-COMMAND" } case "$1" in update-daemon|add-dhclient-servers|remove-dhclient-servers) is_update_needed || exit 0 prepare_helper_dir && update_daemon ;; update-dnssrv-servers) prepare_helper_dir && update_dnssrv_servers "$2" && update_daemon ;; enable-dnssrv) set_dnssrv_timer enable "$2" ;; disable-dnssrv) set_dnssrv_timer disable "$2" && prepare_helper_dir && update_daemon ;; list-dnssrv) list_dnssrv_timers ;; list-static-sources) list_static_sources ;; set-static-sources) set_static_sources ;; is-running) is_running ;; command|forced-command) chrony_command "$2" ;; *) print_help exit 2 esac exit $?
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
awk | Folder | 0755 |
|
|
coreutils | Folder | 0755 |
|
|
dbus-1 | Folder | 0755 |
|
|
dovecot | Folder | 0755 |
|
|
gcc | Folder | 0755 |
|
|
getconf | Folder | 0755 |
|
|
git-core | Folder | 0755 |
|
|
grubby | Folder | 0755 |
|
|
imunify-notifier | Folder | 0755 |
|
|
initscripts | Folder | 0755 |
|
|
kcare | Folder | 0755 |
|
|
linux-boot-probes | Folder | 0755 |
|
|
man-db | Folder | 0755 |
|
|
microcode_ctl | Folder | 0755 |
|
|
openldap | Folder | 0755 |
|
|
openssh | Folder | 0755 |
|
|
os-probes | Folder | 0755 |
|
|
p11-kit | Folder | 0755 |
|
|
plymouth | Folder | 0755 |
|
|
selinux | Folder | 0755 |
|
|
smartmontools | Folder | 0755 |
|
|
sudo | Folder | 0755 |
|
|
tuned | Folder | 0755 |
|
|
utempter | Folder | 0755 |
|
|
chrony-helper | File | 6.37 KB | 0755 |
|
ebtables | File | 1.66 KB | 0755 |
|
exim.daemon | File | 758 B | 0755 |
|
gam_server | File | 90.73 KB | 0755 |
|
generate-rndc-key.sh | File | 546 B | 0755 |
|
glib-pacrunner | File | 15.73 KB | 0755 |
|
gnupg-pcsc-wrapper | File | 19.3 KB | 0755 |
|
gpg-check-pattern | File | 102.95 KB | 0755 |
|
gpg-preset-passphrase | File | 86.39 KB | 0755 |
|
gpg-protect-tool | File | 185.57 KB | 0755 |
|
gpg2keys_curl | File | 44.81 KB | 0755 |
|
gpg2keys_finger | File | 61.34 KB | 0755 |
|
gpg2keys_hkp | File | 53 KB | 0755 |
|
gpg2keys_ldap | File | 61.02 KB | 0755 |
|
grepconf.sh | File | 253 B | 0755 |
|
mlx4-setup.sh | File | 2.48 KB | 0755 |
|
newns | File | 7.03 KB | 0755 |
|
nm-dhcp-helper | File | 15.12 KB | 0755 |
|
nm-dispatcher | File | 47.7 KB | 0755 |
|
nm-iface-helper | File | 839.36 KB | 0755 |
|
nm-ifdown | File | 155 B | 0755 |
|
nm-ifup | File | 153 B | 0755 |
|
platform-python | File | 6.98 KB | 0755 |
|
rdma-init-kernel | File | 5.59 KB | 0755 |
|
rdma-set-sriov-vf | File | 3.05 KB | 0755 |
|
report-command-error | File | 7.29 MB | 0755 |
|
run-with-intensity | File | 9.14 MB | 0755 |
|
tcawmgr.cgi | File | 19.56 KB | 0755 |
|
truescale-serdes.cmds | File | 8.5 KB | 0755 |
|
urlgrabber-ext-down | File | 2.54 KB | 0755 |
|
virt-what-cpuid-helper | File | 7.02 KB | 0755 |
|