[oe] [meta-networking][PATCH v3] dnsmasq: get systemd only working again

Joe MacDonald Joe_MacDonald at mentor.com
Wed Apr 20 19:09:16 UTC 2016


[Re: [oe] [meta-networking][PATCH v3] dnsmasq: get systemd only working again] On 16.04.20 (Wed 14:56) Joe MacDonald wrote:

> Wow this one is kind of thorny, huh?
> 
> How about the attached patch?  I hope it strikes the right balance
> between not duplicating too much and not making things too complex to
> maintain later on.

Or, rather, this one.  :-)

-J.

> 
> -J.
> 
> [Re: [meta-networking][PATCH v3] dnsmasq: get systemd only working again] On 16.04.20 (Wed 10:29) Anders Darander wrote:
> 
> > * Anders Darander <anders at chargestorm.se> [160420 10:24]:
> > 
> > > * Joe MacDonald <joe_macdonald at mentor.com> [160419 17:36]:
> > 
> > > > From: Mark Asselstine <mark.asselstine at windriver.com>
> > 
> > > > The changes made in commit 2497cf2960537152427c99629b2af412787eb6c2
> > > > [dnsmasq: steal resolvconf support from Ubuntu] broke systemd only
> > > > dnsmasq runtime. No sysvinit scripts are included in systemd only
> > > > builds (and should not be) and the dnsmasq executable has not moved to
> > > > /usr/sbin.
> > 
> > > > Reverting to the previous version of the systemd service file. If
> > > > folks want the local dnsmasq instance to be queried before going to
> > > > an external DNS they should add 'nameserver 127.0.0.1' to
> > > > /etc/resolv.conf. Or submit a change which will work with systemd.
> > 
> > > > Signed-off-by: Mark Asselstine <mark.asselstine at windriver.com>
> > > > Signed-off-by: Joe MacDonald <joe_macdonald at mentor.com>
> > > > ---
> > 
> > > > The previous one should've been v2, so I've named this one v3 explicitly.
> > > > After reading more of the systemd documentation I think this approach in
> > > > the service file is the current best option available.  It would certainly
> > > > be cleaner to store the pidfile name in an environment variable but it
> > > > turns out on further inspection that if you pass a varaible to PIDFile,
> > > > you get errors (that you only see when the service is stopped, not while
> > > > it is running) indicating essentially that it is falling back to the
> > > > "guess the MAINPID value" behaviour.  So this seems to be the way we're
> > > > supposed to do this type of thing now.
> > 
> > > > -J.
> > 
> > > >  .../recipes-support/dnsmasq/dnsmasq.inc            |  9 ++--
> > > >  .../dnsmasq/files/dnsmasq-resolvconf-helper        | 62 ++++++++++++++++++++++
> > 
> > > This file, dnsmasq-resolvconf-helper, isn't include in SRC_URI, neither
> > > in do_install(). However it is referenced in the dnsmasq.service, which
> > > leads to:
> > 
> > > Apr 08 11:07:27 ccu dnsmasq[384]: started, version 2.75 cachesize 150
> > > Apr 08 11:07:27 ccu dnsmasq[384]: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth no-DNSSEC loop- detect inotify
> > > Apr 08 11:07:27 ccu dnsmasq-dhcp[384]: DHCP, IP range 192.168.7.1 -- 192.168.7.1, lease time 2m
> > > Apr 08 11:07:27 ccu dnsmasq[384]: [[0;1;39mno servers found in /etc/resolv.conf, will retry[[0m
> > > Apr 08 11:07:27 ccu dnsmasq[384]: read /etc/hosts - 2 addresses Apr 08 11:07:27 ccu systemd[386]: [[0;1;31mdnsmasq.service: Failed at
> > > step EXEC spawning /usr/bin/dnsmasq-resolvconf-helper: No such file or directory[[0m
> > 
> > This is the actual issue, the dnsmasq.service file will unconditionally
> > execute dnsmasq-resolvconf-helper, while it's only installed if the
> > PACKAGECONFIG resolved is set.
> > 
> > Could you add the line 
> > 
> > ExecStartPost=/usr/bin/dnsmasq-resolvconf-helper start
> > 
> > to dnsmasq.service conditionally on the PACKAGECONFIG resolved? (Using sed
> >  is an option).
> > 
> > > Apr 08 11:07:27 ccu systemd[1]: [[0;1;39mdnsmasq.service: Control process exited, code=exited status=203[[0m
> > > Apr 08 11:07:27 ccu systemd[1]: [[0;1;31mFailed to start DNS forwarder and DHCP server.[[0m
> > > Apr 08 11:07:27 ccu systemd[1]: [[0;1;39mdnsmasq.service: Unit entered failed state.[[0m
> > > Apr 08 11:07:27 ccu systemd[1]: [[0;1;39mdnsmasq.service: Failed with result 'exit-code'.[[0m
> > 
> > 
> > > Thus, with the following patch amended, I'm happy with this patch!
> > 
> > No, I was slightly wrong...
> > 
> > > Cheers,
> > > Anders
> > 
> > > diff --git a/meta-networking/recipes-support/dnsmasq/dnsmasq.inc b/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> > > index df58e5c..db54658 100644
> > > --- a/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> > > +++ b/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> > > @@ -11,6 +11,7 @@ SRC_URI = "http://www.thekelleys.org.uk/dnsmasq/${@['archive/', ''][float(d.getV
> > >             file://init \
> > >             file://dnsmasq.conf \
> > >             file://dnsmasq.service \
> > > +           file://dnsmasq-resolvconf-helper \
> > >  "
> > 
> > >  inherit pkgconfig update-rc.d systemd
> > > @@ -54,7 +55,7 @@ do_install () {
> > >      install -m 0644 ${WORKDIR}/dnsmasq.service ${D}${systemd_unitdir}/system
> > 
> > >      install -m 0755 ${S}/contrib/wrt/dhcp_release ${D}${bindir}
> > > -
> > > +    install -m 0755 ${WORKDIR}/dnsmasq-resolvconf-helper ${D}${bindir}/dnsmasq-resolvconf-helper
> > 
> > This line should obviously not be here, as you're actually installing
> > dnsmasq-resolvconf-helper, if the PACKAGECONFIG resolved is set.
> > 
> > >      if [ "${@base_contains('PACKAGECONFIG', 'dbus', 'dbus', '', d)}" != "" ]; then
> > >          install -d ${D}${sysconfdir}/dbus-1/system.d
> > >          install -m 644 dbus/dnsmasq.conf ${D}${sysconfdir}/dbus-1/system.d/
> -- 
> -Joe MacDonald.
> :wq

> From 8247d6d515be338aeef58978f5d52ce08f637adf Mon Sep 17 00:00:00 2001
> From: Mark Asselstine <mark.asselstine at windriver.com>
> Date: Mon, 18 Apr 2016 16:34:36 -0400
> Subject: [PATCH 01/10] dnsmasq: get systemd only working again
> 
> The changes made in commit 2497cf2960537152427c99629b2af412787eb6c2
> [dnsmasq: steal resolvconf support from Ubuntu] broke systemd only
> dnsmasq runtime. No sysvinit scripts are included in systemd only
> builds (and should not be) and the dnsmasq executable has not moved to
> /usr/sbin.
> 
> Reverting to the previous version of the systemd service file. If
> folks want the local dnsmasq instance to be queried before going to
> an external DNS they should add 'nameserver 127.0.0.1' to
> /etc/resolv.conf. Or submit a change which will work with systemd.
> 
> Signed-off-by: Mark Asselstine <mark.asselstine at windriver.com>
> Acked-by: Anders Darander <anders at chargestorm.se>
> Signed-off-by: Martin Jansa <Martin.Jansa at gmail.com>
> Signed-off-by: Joe MacDonald <joe_macdonald at mentor.com>
> ---
>  .../recipes-support/dnsmasq/dnsmasq.inc            | 18 ++++---
>  ...nsmasq.service => dnsmasq-noresolvconf.service} |  7 ++-
>  .../dnsmasq/files/dnsmasq-resolvconf-helper        | 62 ++++++++++++++++++++++
>  .../dnsmasq/files/dnsmasq-resolvconf.service       | 17 ++++++
>  4 files changed, 94 insertions(+), 10 deletions(-)
>  rename meta-networking/recipes-support/dnsmasq/files/{dnsmasq.service => dnsmasq-noresolvconf.service} (49%)
>  create mode 100644 meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf-helper
>  create mode 100644 meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf.service
> 
> diff --git a/meta-networking/recipes-support/dnsmasq/dnsmasq.inc b/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> index 622e630..1f74156 100644
> --- a/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> +++ b/meta-networking/recipes-support/dnsmasq/dnsmasq.inc
> @@ -33,7 +33,7 @@ EXTRA_OEMAKE = "\
>      'LDFLAGS=${LDFLAGS}' \
>  "
>  
> -SRC_URI += "${@bb.utils.contains('PACKAGECONFIG', 'resolvconf', 'file://dnsmasq.resolvconf file://99_dnsmasq', '', d)}"
> +SRC_URI += "${@bb.utils.contains('PACKAGECONFIG', 'resolvconf', 'file://dnsmasq.resolvconf file://99_dnsmasq file://dnsmasq-resolvconf-helper', '', d)}"
>  
>  do_compile_append() {
>      # build dhcp_release
> @@ -51,7 +51,12 @@ do_install () {
>      install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/dnsmasq
>  
>      install -d ${D}${systemd_unitdir}/system
> -    install -m 0644 ${WORKDIR}/dnsmasq.service ${D}${systemd_unitdir}/system
> +
> +    if [ "${@base_contains('PACKAGECONFIG', 'resolvconf', 'resolvconf', '', d)}" != "" ]; then
> +        install -m 0644 ${WORKDIR}/dnsmasq-resolvconf.service ${D}${systemd_unitdir}/system/dnsmasq.service
> +    else
> +        install -m 0644 ${WORKDIR}/dnsmasq-noresolvconf.service ${D}${systemd_unitdir}/system/dnsmasq.service
> +    fi
>  
>      install -m 0755 ${S}/contrib/wrt/dhcp_release ${D}${bindir}
>  
> @@ -60,11 +65,12 @@ do_install () {
>          install -m 644 dbus/dnsmasq.conf ${D}${sysconfdir}/dbus-1/system.d/
>      fi
>      if [ "${@base_contains('PACKAGECONFIG', 'resolvconf', 'resolvconf', '', d)}" != "" ]; then
> -	install -d ${D}${sysconfdir}/resolvconf/update.d/
> -	install -m 0755 ${WORKDIR}/dnsmasq.resolvconf ${D}${sysconfdir}/resolvconf/update.d/dnsmasq
> +        install -d ${D}${sysconfdir}/resolvconf/update.d/
> +        install -m 0755 ${WORKDIR}/dnsmasq.resolvconf ${D}${sysconfdir}/resolvconf/update.d/dnsmasq
>  
> -	install -d ${D}${sysconfdir}/default/volatiles
> -	install -m 0644 ${WORKDIR}/99_dnsmasq ${D}${sysconfdir}/default/volatiles
> +        install -d ${D}${sysconfdir}/default/volatiles
> +        install -m 0644 ${WORKDIR}/99_dnsmasq ${D}${sysconfdir}/default/volatiles
> +        install -m 0755 ${WORKDIR}/dnsmasq-resolvconf-helper ${D}${bindir}
>      fi
>  }
>  
> diff --git a/meta-networking/recipes-support/dnsmasq/files/dnsmasq.service b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-noresolvconf.service
> similarity index 49%
> rename from meta-networking/recipes-support/dnsmasq/files/dnsmasq.service
> rename to meta-networking/recipes-support/dnsmasq/files/dnsmasq-noresolvconf.service
> index c3637e1..cde2244 100644
> --- a/meta-networking/recipes-support/dnsmasq/files/dnsmasq.service
> +++ b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-noresolvconf.service
> @@ -5,10 +5,9 @@ After=network.target
>  [Service]
>  Type=forking
>  PIDFile=/run/dnsmasq.pid
> -ExecStartPre=/usr/sbin/dnsmasq --test
> -ExecStart=/etc/init.d/dnsmasq systemd-exec
> -ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf
> -ExecStopPre=/etc/init.d/dnsmasq systemd-stop-resolvconf
> +ExecStartPre=/usr/bin/dnsmasq --test
> +ExecStart=/usr/bin/dnsmasq -x /run/dnsmasq.pid
> +ExecStop=/bin/kill $MAINPID
>  ExecReload=/bin/kill -HUP $MAINPID
>  
>  [Install]
> diff --git a/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf-helper b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf-helper
> new file mode 100644
> index 0000000..db54d46
> --- /dev/null
> +++ b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf-helper
> @@ -0,0 +1,62 @@
> +#!/bin/bash
> +#
> +# Borrowing heavily from the dnsmasq initscript's version of support for
> +# resolvconf, intended for use in systemd-only configurations.
> +#
> +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
> +DAEMON=/usr/sbin/dnsmasq
> +NAME=dnsmasq
> +
> +# Most configuration options in /etc/default/dnsmasq are deprecated
> +# but still honoured.
> +if [ -r /etc/default/$NAME ]; then
> +   . /etc/default/$NAME
> +fi
> +
> +start_resolvconf()
> +{
> +   # If interface "lo" is explicitly disabled in /etc/default/dnsmasq
> +   # Then dnsmasq won't be providing local DNS, so don't add it to
> +   # the resolvconf server set.
> +   for interface in $DNSMASQ_EXCEPT
> +   do
> +      [ $interface = lo ] && return
> +   done
> +
> +   if [ -x /sbin/resolvconf ] ; then
> +      echo "nameserver 127.0.0.1" |
> +      /sbin/resolvconf -a lo.$NAME
> +   fi
> +   return 0
> +}
> +
> +stop_resolvconf()
> +{
> +   if [ -x /sbin/resolvconf ] ; then
> +      /sbin/resolvconf -d lo.$NAME
> +   fi
> +   return 0
> +}
> +
> +case "$1" in
> +   start)
> +      start_resolvconf
> +      exit 0
> +      ;;
> +   stop)
> +      stop_resolvconf
> +      exit 0
> +      ;;
> +   restart)
> +      stop_resolvconf
> +      start_resolvconf
> +      exit 0
> +      ;;
> +   *)
> +      echo "Usage: /etc/init.d/$NAME {start|stop|restart}" >&2
> +      exit 3
> +      ;;
> +esac
> +
> +exit 0
> +
> diff --git a/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf.service b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf.service
> new file mode 100644
> index 0000000..68b175c
> --- /dev/null
> +++ b/meta-networking/recipes-support/dnsmasq/files/dnsmasq-resolvconf.service
> @@ -0,0 +1,17 @@
> +[Unit]
> +Description=DNS forwarder and DHCP server
> +After=network.target
> +
> +[Service]
> +Type=forking
> +PIDFile=/run/dnsmasq.pid
> +ExecStartPre=/usr/bin/dnsmasq --test
> +ExecStart=/usr/bin/dnsmasq -x /run/dnsmasq.pid
> +ExecStartPost=/usr/bin/dnsmasq-resolvconf-helper start
> +ExecStopPre=/usr/bin/dnsmasq-resolvconf-helper stop
> +ExecStop=/bin/kill $MAINPID
> +ExecReload=/bin/kill -HUP $MAINPID
> +
> +[Install]
> +WantedBy=multi-user.target
> +
> -- 
> 1.9.1
> 




-- 
-Joe MacDonald.
:wq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-dnsmasq-get-systemd-only-working-again.patch
Type: text/x-diff
Size: 7596 bytes
Desc: not available
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20160420/a436e78f/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20160420/a436e78f/attachment-0002.sig>


More information about the Openembedded-devel mailing list