[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