[OpenWrt-Devel] [PATCH] busybox: sysntpd - use NTP servers received via DHCP
Amine Aouled Hamed
amine.ahd at gmail.com
Fri Jan 22 08:12:46 EST 2016
Hi,
I tried this method the first time but it does nothing.
I just tried it again now and the same thing happens (added a log message
to logread in case it is restarted).
Thats why I went to the hotplug script, add to it the fact that we cant
choose specific interfaces to listen to using this method.
On Wed, Jan 20, 2016 at 1:51 PM, Felix Fietkau <nbd at openwrt.org> wrote:
> On 2016-01-20 13:34, amine ahd wrote:
> > The current state of NTP is to load the list of NTP servers
> > from the static file /etc/config/system.
> > This patch allows ntpd to get NTP servers from DHCP.
> >
> >
> > Changes from V1:
> > -Users could choose not to use DHCP by setting "use_dhcp" to 0 in
> /etc/config/system under the ntp section.
> > -Users could specify which interfaces to use to get NTP servers
> from.
> > -Sysntpd will exit if no servers are specified in the static list
> and the DHCP option is disabled.
> > -Sysntpd will restart only if all of the following conditions are
> met:
> > *The user allowed DHCP to be used for NTP.
> > *The iface action is UP.
> > *The iface is specified in the list.
> > *The protocol in use is either DHCP or DHCPv6.
> > -Code improvements.
> >
> > Signed-off-by: amine hamed <amine.ahd at gmail.com>
> > ---
> > package/utils/busybox/Makefile | 3 ++
> > package/utils/busybox/files/sysntpd | 31 +++++++++++++++--
> > package/utils/busybox/files/sysntpd.hotplug | 54
> +++++++++++++++++++++++++++++
> > 3 files changed, 85 insertions(+), 3 deletions(-)
> > create mode 100644 package/utils/busybox/files/sysntpd.hotplug
> >
> > diff --git a/package/utils/busybox/files/sysntpd.hotplug
> b/package/utils/busybox/files/sysntpd.hotplug
> > new file mode 100644
> > index 0000000..34a2f7a
> > --- /dev/null
> > +++ b/package/utils/busybox/files/sysntpd.hotplug
> > @@ -0,0 +1,54 @@
> > +#!/bin/sh
> > +
> > +. /lib/functions.sh
> > +. /usr/share/libubox/jshn.sh
> > +
> > +is_valid_interface() {
> > + local list="$(uci get system.ntp.dhcp_ifaces)"
> > + [ -z "$list" ] && return 0
> > +
> > + case " $list " in
> > + *" $INTERFACE "*)
> > + return 0
> > + ;;
> > + *)
> > + return 1
> > + ;;
> > + esac
> > +}
> > +
> > +config_load system
> > +local proto="$(uci get network.$INTERFACE.proto)"
> > +config_get_bool "use_dhcp" "ntp" "use_dhcp"
> > +[ "$use_dhcp" = 1 ] && [ "$ACTION" = ifup ] && is_valid_interface && [
> "$proto" = dhcp -o "$proto" = dhcp6 ] || exit 0
> > +
> > +handle_default_ntp_servers() {
> > + local server="$1"
> > + new_ntp_servers="$new_ntp_servers $server"
> > +}
> > +
> > +local dhcp_ntp_servers iface status ntpserver dump
> > +local dhcp_ifaces="$(uci -q get system.ntp.dhcp_ifaces)"
> > +if [ -z "$dhcp_ifaces" ]; then
> > + dump="$(ubus call network.interface dump)"
> > + dhcp_ntp_servers=$(jsonfilter -s "$dump" -e
> '$["interface"][*]["data"]["ntpserver"]')
> > +else
> > + for iface in $dhcp_ifaces; do
> > + status="$(ubus call network.interface.$iface status)"
> > + ntpserver=$(jsonfilter -s "$status" -e
> '$["data"]["ntpserver"]')
> > + [ -n "$ntpserver" ] && \
> > + dhcp_ntp_servers="$dhcp_ntp_servers $ntpserver"
> > + done
> > +fi
> > +
> > +new_ntp_servers="$dhcp_ntp_servers"
> > +#get the default list of ntp servers from the config file and append it
> to the new list
> > +config_list_foreach "ntp" "server" handle_default_ntp_servers
> > +
> > +#get the current list of ntp servers in the running instance
> > +local current_ntp_servers=$(ubus call service list '{"name":"sysntpd",
> "verbose":true}' | jsonfilter -e
> '$["sysntpd"]["instances"][*]["data"]["ntp_servers"]')
> > +#if its an up action, the iface uses DHCP and the new list of ntp
> servers is different from the old, restart sysntpd
> > +[ "$current_ntp_servers" != "$new_ntp_servers" ] || exit 0
> > +
> > +logger -t sysntpd "Reloading sysntpd due to $ACTION of interface
> $INTERFACE and a change of NTP servers"
> > +/etc/init.d/sysntpd enabled && /etc/init.d/sysntpd reload
> This is all way more complex than it needs to be. There's a simple
> solution -
> just replace the sysntpd init script service_triggers function with this:
>
> service_triggers() {
> local script=$(readlink "$initscript")
> local name=$(basename ${script:-$initscript})
>
> procd_open_trigger
> procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload
> procd_close_trigger
>
> procd_add_reload_trigger "system"
> procd_add_validation validate_ntp_section
> }
>
> You can drop the hotplug script entirely.
> What this will do is it will instruct procd to run the init script,
> whenever an interface up/down event arrives (waiting for up to 2 seconds
> before starting the script instead of starting it once for every single
> event). procd will ensure that the sysntpd daemon is only restarted if
> the command line actually changed, so you don't have to add any code
> to compare the old and the new ntp server list.
>
> - Felix
>
--
Amine Hamed | Software Engineer
Ocedo GmbH | Hirschstrasse 7 | 76133 Karlsruhe | Germany
Email ahamed at ocedo.com
<ahamed at ocedo.com>
REGISTERED OFFICE: KARLSRUHE | DISTRICT COURT: MANNHEIM | REGISTER NUMBER:
HRB 717873
MANAGING DIRECTOR: MARKUS HENNIG|JAN HICHERT
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20160122/2b06d41f/attachment.htm>
-------------- next part --------------
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list