diff mbox

[1/1,v3] package/unscd: new package

Message ID 1444399839-10680-1-git-send-email-rdkehn@yahoo.com
State Superseded
Headers show

Commit Message

Doug Kehn Oct. 9, 2015, 2:10 p.m. UTC
A daemon which handles passwd, group and host lookups for running programs and
caches the results for the next query. You only need this package if you are
using slow Name Services like LDAP, NIS or NIS+.

This particular NSCD is a complete rewrite of the GNU glibc nscd which is a
single threaded server process which offloads all NSS lookups to worker
children; cache hits are handled by the parent, and only cache misses start
worker children, making the parent immune to resource leaks, hangs, and crashes
in NSS libraries.

It should mostly be a drop-in replacement for existing installs using nscd.

Cc: Yann E. MORIN <yann.morin.1998@free.fr>
Signed-off-by: Doug Kehn <rdkehn@yahoo.com>
---
Changes v2 -> v3
  - Remove trailing '/' from UNSCD_SITE.
  - Whitespace cleanup.
Changes v1 -> v2
  - Incorporate feedback/suggestions by Yann (from nss-pam-ldapd patch).

Signed-off-by: Doug Kehn <rdkehn@yahoo.com>
---
 package/Config.in           |  1 +
 package/unscd/Config.in     |  8 +++++++
 package/unscd/S46unscd      | 24 ++++++++++++++++++++
 package/unscd/unscd.hash    |  3 +++
 package/unscd/unscd.mk      | 55 +++++++++++++++++++++++++++++++++++++++++++++
 package/unscd/unscd.service | 11 +++++++++
 6 files changed, 102 insertions(+)
 create mode 100644 package/unscd/Config.in
 create mode 100644 package/unscd/S46unscd
 create mode 100644 package/unscd/unscd.hash
 create mode 100644 package/unscd/unscd.mk
 create mode 100644 package/unscd/unscd.service

Comments

Yann E. MORIN Oct. 10, 2015, 2:50 p.m. UTC | #1
Doug, All,

[CCing Maxime, as he knows systemd better than I do]

On 2015-10-09 09:10 -0500, Doug Kehn spake thusly:
> A daemon which handles passwd, group and host lookups for running programs and
> caches the results for the next query. You only need this package if you are
> using slow Name Services like LDAP, NIS or NIS+.
> 
> This particular NSCD is a complete rewrite of the GNU glibc nscd which is a
> single threaded server process which offloads all NSS lookups to worker
> children; cache hits are handled by the parent, and only cache misses start
> worker children, making the parent immune to resource leaks, hangs, and crashes
> in NSS libraries.
> 
> It should mostly be a drop-in replacement for existing installs using nscd.
> 
> Cc: Yann E. MORIN <yann.morin.1998@free.fr>
> Signed-off-by: Doug Kehn <rdkehn@yahoo.com>
[--SNIP--]
> diff --git a/package/unscd/S46unscd b/package/unscd/S46unscd
> new file mode 100644
> index 0000000..387ab32
> --- /dev/null
> +++ b/package/unscd/S46unscd
> @@ -0,0 +1,24 @@
> +#!/bin/sh
> +
> +NAME="nscd"
> +DAEMON="/usr/sbin/${NAME}"
> +
> +case "$1" in
> +start)
> +        echo -n "Starting ${NAME}: "

We have recently readicated use of 'echo -n' and all other non-POSIX use
of echo. Please, use printf instead.

[--SNIP--]
> diff --git a/package/unscd/unscd.mk b/package/unscd/unscd.mk
> new file mode 100644
> index 0000000..e8cccd3
> --- /dev/null
> +++ b/package/unscd/unscd.mk
> @@ -0,0 +1,55 @@
> +################################################################################
> +#
> +# unscd
> +#
> +################################################################################
> +
> +UNSCD_VERSION = 0.51
> +UNSCD_SOURCE = unscd_$(UNSCD_VERSION).orig.tar.gz
> +UNSCD_SITE = http://snapshot.debian.org/archive/debian/20150519T094547Z/pool/main/u/unscd
> +UNSCD_EXTRA_DOWNLOADS = unscd_$(UNSCD_VERSION)-1.debian.tar.gz
> +UNSCD_LICENSE = GPLv2
> +UNSCD_LICENSE_FILES = debian/copyright
> +
> +define UNSCD_EXTRACT_DEBIAN
> +	gzip -d -c $(BR2_DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) | tar -C $(@D) -xf -

Please use suitable-extractor, like so:

    $(call suitable-extractor,$(UNSCD_EXTRA_DOWNLOADS)) $(DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) \
    |$(TAR) xf -C $(@D) -

> +endef
> +
> +UNSCD_POST_EXTRACT_HOOKS += UNSCD_EXTRACT_DEBIAN
> +
> +define UNSCD_APPLY_DEBIAN_PATCHES
> +	for f in `grep -Ev "^#" $(@D)/debian/patches/series 2> /dev/null`; do \
> +		cat "$(@D)/debian/patches/$${f}" | patch -g0 -p1 -E -d "$(@D)" -t -N; \

Please use apply-patches, like so:

    $(APPLY_PATCHES) $(@D) $(@D)/debian

> +	done
> +endef
> +
> +UNSCD_POST_PATCH_HOOKS += UNSCD_APPLY_DEBIAN_PATCHES
> +
> +define UNSCD_BUILD_CMDS
> +	$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
> +		$(@D)/nscd.c -o $(@D)/nscd
> +endef
> +
> +define UNSCD_INSTALL_TARGET_CMDS
> +	$(INSTALL) -m 755 -D $(@D)/nscd $(TARGET_DIR)/usr/sbin/nscd
> +	$(INSTALL) -m 600 -D $(@D)/debian/nscd.conf $(TARGET_DIR)/etc/nscd.conf
> +endef
> +
> +define UNSCD_INSTALL_INIT_SYSTEMD
> +	$(INSTALL) -m 755 -D package/unscd/unscd.service \
> +		$(TARGET_DIR)/usr/lib/systemd/system/unscd.service
> +	mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants

Not that it matters a lot, but I think using $(INSTALL) to create
directories should be favoured, like so:

    $(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants

> +	ln -fs ../../../../usr/lib/systemd/system/unscd.service \
> +		$(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/unscd.service
> +endef
[--SNIP--]
> diff --git a/package/unscd/unscd.service b/package/unscd/unscd.service
> new file mode 100644
> index 0000000..58dd7eb
> --- /dev/null
> +++ b/package/unscd/unscd.service
> @@ -0,0 +1,11 @@
> +[Unit]
> +Description=Micro Name Service Caching Daemon.
> +After=syslog.target network.target
> +
> +[Service]
> +Type=forking
> +PIDFile=/var/run/nscd/nscd.pid
> +ExecStart=/usr/sbin/nscd
> +
> +[Install]
> +WantedBy=multi-user.target

Maxime, what's your opinion on this systemd unit?

Regards,
Yann E. MORIN.
Maxime Hadjinlian Oct. 12, 2015, 8:34 a.m. UTC | #2
Hello Doug, Yann, all

On Sat, Oct 10, 2015 at 4:50 PM, Yann E. MORIN <yann.morin.1998@free.fr>
wrote:

> Doug, All,
>
> [CCing Maxime, as he knows systemd better than I do]
>
> On 2015-10-09 09:10 -0500, Doug Kehn spake thusly:
> > A daemon which handles passwd, group and host lookups for running
> programs and
> > caches the results for the next query. You only need this package if you
> are
> > using slow Name Services like LDAP, NIS or NIS+.
> >
> > This particular NSCD is a complete rewrite of the GNU glibc nscd which
> is a
> > single threaded server process which offloads all NSS lookups to worker
> > children; cache hits are handled by the parent, and only cache misses
> start
> > worker children, making the parent immune to resource leaks, hangs, and
> crashes
> > in NSS libraries.
> >
> > It should mostly be a drop-in replacement for existing installs using
> nscd.
> >
> > Cc: Yann E. MORIN <yann.morin.1998@free.fr>
> > Signed-off-by: Doug Kehn <rdkehn@yahoo.com>
> [--SNIP--]
> > diff --git a/package/unscd/S46unscd b/package/unscd/S46unscd
> > new file mode 100644
> > index 0000000..387ab32
> > --- /dev/null
> > +++ b/package/unscd/S46unscd
> > @@ -0,0 +1,24 @@
> > +#!/bin/sh
> > +
> > +NAME="nscd"
> > +DAEMON="/usr/sbin/${NAME}"
> > +
> > +case "$1" in
> > +start)
> > +        echo -n "Starting ${NAME}: "
>
> We have recently readicated use of 'echo -n' and all other non-POSIX use
> of echo. Please, use printf instead.
>
> [--SNIP--]
> > diff --git a/package/unscd/unscd.mk b/package/unscd/unscd.mk
> > new file mode 100644
> > index 0000000..e8cccd3
> > --- /dev/null
> > +++ b/package/unscd/unscd.mk
> > @@ -0,0 +1,55 @@
> >
> +################################################################################
> > +#
> > +# unscd
> > +#
> >
> +################################################################################
> > +
> > +UNSCD_VERSION = 0.51
> > +UNSCD_SOURCE = unscd_$(UNSCD_VERSION).orig.tar.gz
> > +UNSCD_SITE =
> http://snapshot.debian.org/archive/debian/20150519T094547Z/pool/main/u/unscd
> > +UNSCD_EXTRA_DOWNLOADS = unscd_$(UNSCD_VERSION)-1.debian.tar.gz
> > +UNSCD_LICENSE = GPLv2
> > +UNSCD_LICENSE_FILES = debian/copyright
> > +
> > +define UNSCD_EXTRACT_DEBIAN
> > +     gzip -d -c $(BR2_DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) | tar -C $(@D)
> -xf -
>
> Please use suitable-extractor, like so:
>
>     $(call suitable-extractor,$(UNSCD_EXTRA_DOWNLOADS))
> $(DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) \
>     |$(TAR) xf -C $(@D) -
>
> > +endef
> > +
> > +UNSCD_POST_EXTRACT_HOOKS += UNSCD_EXTRACT_DEBIAN
> > +
> > +define UNSCD_APPLY_DEBIAN_PATCHES
> > +     for f in `grep -Ev "^#" $(@D)/debian/patches/series 2> /dev/null`;
> do \
> > +             cat "$(@D)/debian/patches/$${f}" | patch -g0 -p1 -E -d
> "$(@D)" -t -N; \
>
> Please use apply-patches, like so:
>
>     $(APPLY_PATCHES) $(@D) $(@D)/debian
>
> > +     done
> > +endef
> > +
> > +UNSCD_POST_PATCH_HOOKS += UNSCD_APPLY_DEBIAN_PATCHES
> > +
> > +define UNSCD_BUILD_CMDS
> > +     $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
> > +             $(@D)/nscd.c -o $(@D)/nscd
> > +endef
> > +
> > +define UNSCD_INSTALL_TARGET_CMDS
> > +     $(INSTALL) -m 755 -D $(@D)/nscd $(TARGET_DIR)/usr/sbin/nscd
> > +     $(INSTALL) -m 600 -D $(@D)/debian/nscd.conf
> $(TARGET_DIR)/etc/nscd.conf
> > +endef
> > +
> > +define UNSCD_INSTALL_INIT_SYSTEMD
> > +     $(INSTALL) -m 755 -D package/unscd/unscd.service \
> > +             $(TARGET_DIR)/usr/lib/systemd/system/unscd.service
> > +     mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
>
> Not that it matters a lot, but I think using $(INSTALL) to create
> directories should be favoured, like so:
>
>     $(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
>
At the moment, I think all the packages that install systemd are using
mkdir -p, so I would keep that so it's coherent, as said in another mail, a
helper is needed to simplify theses few lines.

>
> > +     ln -fs ../../../../usr/lib/systemd/system/unscd.service \
> > +
>  $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/unscd.service
> > +endef
> [--SNIP--]
> > diff --git a/package/unscd/unscd.service b/package/unscd/unscd.service
> > new file mode 100644
> > index 0000000..58dd7eb
> > --- /dev/null
> > +++ b/package/unscd/unscd.service
> > @@ -0,0 +1,11 @@
> > +[Unit]
> > +Description=Micro Name Service Caching Daemon.
> > +After=syslog.target network.target
> > +
> > +[Service]
> > +Type=forking
> > +PIDFile=/var/run/nscd/nscd.pid
> > +ExecStart=/usr/sbin/nscd
> > +
> > +[Install]
> > +WantedBy=multi-user.target
>
> Maxime, what's your opinion on this systemd unit?
>
nscd is a part of glibc, and looking at the code of glibc 2.22, the startup
script and systemd init file are included in the source. So I have a few
questions:

Why is this not a part of the glibc package as an option ?

And I think, we should use the service and init scripts given by upstream,
unless they cause real trouble with a BR rootfs. And since we handle many
versions of glibc, maybe extract them from the latests versions and simply
install them.
For the systemd part, there's much more than the initial service it seems,
from the source I found:

nscd.service and nscd.tmpfiles which will create the /run/nscd directory
with the correct ACL, which doesn't seem to be done by your init script but
it's done by the shipped init script


>
> Regards,
> Yann E. MORIN.
>
> --
>
> .-----------------.--------------------.------------------.--------------------.
> |  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics'
> conspiracy: |
> | +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___
>      |
> | +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There
> is no  |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v
>  conspiracy.  |
>
> '------------------------------^-------^------------------^--------------------'
>
Doug Kehn Oct. 12, 2015, 2:35 p.m. UTC | #3
Hi Maxime, All,

On Mon, Oct 12, 2015 at 10:34:09AM +0200, Maxime Hadjinlian wrote:
> Hello Doug, Yann, all
> 
> On Sat, Oct 10, 2015 at 4:50 PM, Yann E. MORIN <yann.morin.1998@free.fr>
> wrote:
> 
> > Doug, All,
> >
> > [CCing Maxime, as he knows systemd better than I do]
> >
> > On 2015-10-09 09:10 -0500, Doug Kehn spake thusly:
> > > A daemon which handles passwd, group and host lookups for running
> > programs and
> > > caches the results for the next query. You only need this package if you
> > are
> > > using slow Name Services like LDAP, NIS or NIS+.
> > >
> > > This particular NSCD is a complete rewrite of the GNU glibc nscd which
> > is a
> > > single threaded server process which offloads all NSS lookups to worker
> > > children; cache hits are handled by the parent, and only cache misses
> > start
> > > worker children, making the parent immune to resource leaks, hangs, and
> > crashes
> > > in NSS libraries.
> > >
> > > It should mostly be a drop-in replacement for existing installs using
> > nscd.
> > >
> > > Cc: Yann E. MORIN <yann.morin.1998@free.fr>
> > > Signed-off-by: Doug Kehn <rdkehn@yahoo.com>
> > [--SNIP--]
> > > diff --git a/package/unscd/S46unscd b/package/unscd/S46unscd
> > > new file mode 100644
> > > index 0000000..387ab32
> > > --- /dev/null
> > > +++ b/package/unscd/S46unscd
> > > @@ -0,0 +1,24 @@
> > > +#!/bin/sh
> > > +
> > > +NAME="nscd"
> > > +DAEMON="/usr/sbin/${NAME}"
> > > +
> > > +case "$1" in
> > > +start)
> > > +        echo -n "Starting ${NAME}: "
> >
> > We have recently readicated use of 'echo -n' and all other non-POSIX use
> > of echo. Please, use printf instead.
> >
> > [--SNIP--]
> > > diff --git a/package/unscd/unscd.mk b/package/unscd/unscd.mk
> > > new file mode 100644
> > > index 0000000..e8cccd3
> > > --- /dev/null
> > > +++ b/package/unscd/unscd.mk
> > > @@ -0,0 +1,55 @@
> > >
> > +################################################################################
> > > +#
> > > +# unscd
> > > +#
> > >
> > +################################################################################
> > > +
> > > +UNSCD_VERSION = 0.51
> > > +UNSCD_SOURCE = unscd_$(UNSCD_VERSION).orig.tar.gz
> > > +UNSCD_SITE =
> > http://snapshot.debian.org/archive/debian/20150519T094547Z/pool/main/u/unscd
> > > +UNSCD_EXTRA_DOWNLOADS = unscd_$(UNSCD_VERSION)-1.debian.tar.gz
> > > +UNSCD_LICENSE = GPLv2
> > > +UNSCD_LICENSE_FILES = debian/copyright
> > > +
> > > +define UNSCD_EXTRACT_DEBIAN
> > > +     gzip -d -c $(BR2_DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) | tar -C $(@D)
> > -xf -
> >
> > Please use suitable-extractor, like so:
> >
> >     $(call suitable-extractor,$(UNSCD_EXTRA_DOWNLOADS))
> > $(DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) \
> >     |$(TAR) xf -C $(@D) -
> >
> > > +endef
> > > +
> > > +UNSCD_POST_EXTRACT_HOOKS += UNSCD_EXTRACT_DEBIAN
> > > +
> > > +define UNSCD_APPLY_DEBIAN_PATCHES
> > > +     for f in `grep -Ev "^#" $(@D)/debian/patches/series 2> /dev/null`;
> > do \
> > > +             cat "$(@D)/debian/patches/$${f}" | patch -g0 -p1 -E -d
> > "$(@D)" -t -N; \
> >
> > Please use apply-patches, like so:
> >
> >     $(APPLY_PATCHES) $(@D) $(@D)/debian
> >
> > > +     done
> > > +endef
> > > +
> > > +UNSCD_POST_PATCH_HOOKS += UNSCD_APPLY_DEBIAN_PATCHES
> > > +
> > > +define UNSCD_BUILD_CMDS
> > > +     $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
> > > +             $(@D)/nscd.c -o $(@D)/nscd
> > > +endef
> > > +
> > > +define UNSCD_INSTALL_TARGET_CMDS
> > > +     $(INSTALL) -m 755 -D $(@D)/nscd $(TARGET_DIR)/usr/sbin/nscd
> > > +     $(INSTALL) -m 600 -D $(@D)/debian/nscd.conf
> > $(TARGET_DIR)/etc/nscd.conf
> > > +endef
> > > +
> > > +define UNSCD_INSTALL_INIT_SYSTEMD
> > > +     $(INSTALL) -m 755 -D package/unscd/unscd.service \
> > > +             $(TARGET_DIR)/usr/lib/systemd/system/unscd.service
> > > +     mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
> >
> > Not that it matters a lot, but I think using $(INSTALL) to create
> > directories should be favoured, like so:
> >
> >     $(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
> >
> At the moment, I think all the packages that install systemd are using
> mkdir -p, so I would keep that so it's coherent, as said in another mail, a
> helper is needed to simplify theses few lines.
> 
> >
> > > +     ln -fs ../../../../usr/lib/systemd/system/unscd.service \
> > > +
> >  $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/unscd.service
> > > +endef
> > [--SNIP--]
> > > diff --git a/package/unscd/unscd.service b/package/unscd/unscd.service
> > > new file mode 100644
> > > index 0000000..58dd7eb
> > > --- /dev/null
> > > +++ b/package/unscd/unscd.service
> > > @@ -0,0 +1,11 @@
> > > +[Unit]
> > > +Description=Micro Name Service Caching Daemon.
> > > +After=syslog.target network.target
> > > +
> > > +[Service]
> > > +Type=forking
> > > +PIDFile=/var/run/nscd/nscd.pid
> > > +ExecStart=/usr/sbin/nscd
> > > +
> > > +[Install]
> > > +WantedBy=multi-user.target
> >
> > Maxime, what's your opinion on this systemd unit?
> >
> nscd is a part of glibc, and looking at the code of glibc 2.22, the startup
> script and systemd init file are included in the source. So I have a few
> questions:
> 
> Why is this not a part of the glibc package as an option ?

... good point.

I see glibc nscd (I'm using glibc 2.21) is built but not installed.
Is the suggestion to add a nscd configuration option to glibc for
native nscd or unscd?

If unscd is selected, only glibc nscd support files will be
installed.

> 
> And I think, we should use the service and init scripts given by upstream,
> unless they cause real trouble with a BR rootfs. And since we handle many
> versions of glibc, maybe extract them from the latests versions and simply
> install them.

I will test the glibc init script with unscd to see if there are any
issues.

Would using the 'selected' glibc version, versus latest version, of
the support files be okay here?

> For the systemd part, there's much more than the initial service it seems,
> from the source I found:
> 
> nscd.service and nscd.tmpfiles which will create the /run/nscd directory
> with the correct ACL, which doesn't seem to be done by your init script but
> it's done by the shipped init script

I will see what I can do with respect to systemd support.

Regards,
...doug
Yann E. MORIN Oct. 12, 2015, 4:34 p.m. UTC | #4
Maxime, All,

On 2015-10-12 10:34 +0200, Maxime Hadjinlian spake thusly:
> On Sat, Oct 10, 2015 at 4:50 PM, Yann E. MORIN <yann.morin.1998@free.fr>
> wrote:
> > On 2015-10-09 09:10 -0500, Doug Kehn spake thusly:
> > > A daemon which handles passwd, group and host lookups for running
> > programs and
> > > caches the results for the next query. You only need this package if you
> > are
> > > using slow Name Services like LDAP, NIS or NIS+.
> > >
> > > This particular NSCD is a complete rewrite of the GNU glibc nscd which
> > is a
> > > single threaded server process which offloads all NSS lookups to worker
> > > children; cache hits are handled by the parent, and only cache misses
> > start
> > > worker children, making the parent immune to resource leaks, hangs, and
> > crashes
> > > in NSS libraries.
> > >
> > > It should mostly be a drop-in replacement for existing installs using
> > nscd.
[--SNIP--]
> > > +define UNSCD_INSTALL_INIT_SYSTEMD
> > > +     $(INSTALL) -m 755 -D package/unscd/unscd.service \
> > > +             $(TARGET_DIR)/usr/lib/systemd/system/unscd.service
> > > +     mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
> >
> > Not that it matters a lot, but I think using $(INSTALL) to create
> > directories should be favoured, like so:
> >
> >     $(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
> >
> At the moment, I think all the packages that install systemd are using
> mkdir -p, so I would keep that so it's coherent, as said in another mail, a
> helper is needed to simplify theses few lines.

Valid point. Consistence trumps beauty. ;-)

> > > +     ln -fs ../../../../usr/lib/systemd/system/unscd.service \
> > > +
> >  $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/unscd.service
> > > +endef
> > [--SNIP--]
> > > diff --git a/package/unscd/unscd.service b/package/unscd/unscd.service
> > > new file mode 100644
> > > index 0000000..58dd7eb
> > > --- /dev/null
> > > +++ b/package/unscd/unscd.service
> > > @@ -0,0 +1,11 @@
> > > +[Unit]
> > > +Description=Micro Name Service Caching Daemon.
> > > +After=syslog.target network.target
> > > +
> > > +[Service]
> > > +Type=forking
> > > +PIDFile=/var/run/nscd/nscd.pid
> > > +ExecStart=/usr/sbin/nscd
> > > +
> > > +[Install]
> > > +WantedBy=multi-user.target
> >
> > Maxime, what's your opinion on this systemd unit?
> >
> nscd is a part of glibc, and looking at the code of glibc 2.22, the startup
> script and systemd init file are included in the source. So I have a few
> questions:
> 
> Why is this not a part of the glibc package as an option ?

From what I understood, this unscd is a complete *rewrite* of glibc's
nscd.

Where unscd shines is that it can resolve queries in parallel as it
spawns a thread for each query that it has not yet cached, whereas
glibc's nscd is single-threaded, thus serialising uncached queries.

Thus, unscd should be overall "faster" at resolving queries than glibc's
nscd would be.

So, no, unscd is not part of glibc. nscd is, and we could indeed add an
option to install it, of course. But that does not prevent unscd to also
be oferred as a replacement.

> And I think, we should use the service and init scripts given by upstream,
> unless they cause real trouble with a BR rootfs.

I think you meant "we should *not* use the service and init scripts
given by upstream", no?

> And since we handle many
> versions of glibc, maybe extract them from the latests versions and simply
> install them.
> For the systemd part, there's much more than the initial service it seems,
> from the source I found:
> 
> nscd.service and nscd.tmpfiles which will create the /run/nscd directory
> with the correct ACL, which doesn't seem to be done by your init script but
> it's done by the shipped init script

So, if I udnerstand you correctly, the systemd units are fine, but the
startup script is missign some pieces, right?

Regards,
Yann E. MORIN.
Yann E. MORIN Oct. 12, 2015, 4:42 p.m. UTC | #5
Doug, MAxime, All,

On 2015-10-12 09:35 -0500, rdkehn@yahoo.com spake thusly:
> On Mon, Oct 12, 2015 at 10:34:09AM +0200, Maxime Hadjinlian wrote:
[--SNIP--]
> > nscd is a part of glibc, and looking at the code of glibc 2.22, the startup
> > script and systemd init file are included in the source. So I have a few
> > questions:
> > 
> > Why is this not a part of the glibc package as an option ?
> 
> ... good point.
> 
> I see glibc nscd (I'm using glibc 2.21) is built but not installed.
> Is the suggestion to add a nscd configuration option to glibc for
> native nscd or unscd?
> 
> If unscd is selected, only glibc nscd support files will be
> installed.

I would well see something along the lines of:

  - in toolchain/toolchain-common/in, add this:

    config BR2_GLIBC_NSCD
        bool "Install nscd"
        depends on BR2_TOOLCHAIN_USES_GLIBC

  - in package/unscd/Cofnig.in:

    config BR2_PACKAGE_UNSCD
        bool "unscd"
        depends on BR2_TOOLCHAIN_USES_GLIBC
        depends on !BR2_GLIBC_NSCD
        help
          unscd is a blabla replacement blabla...

          http://example.net/home/of/unscd

    comment "unscd needs an (e)glibc toolchain"
        depends on !BR2_TOOLCHAIN_USES_GLIBC

Note that we do not make BR2_GLIBC_NSCD an option of the glibc package,
because we also want to handle external toolchains. So it has to be a
toolchain option, not a package option.

Regards,
Yann E. MORIN.
Yann E. MORIN Oct. 12, 2015, 4:43 p.m. UTC | #6
Maxime, All,

On 2015-10-12 18:34 +0200, Yann E. MORIN spake thusly:
> On 2015-10-12 10:34 +0200, Maxime Hadjinlian spake thusly:
> > On Sat, Oct 10, 2015 at 4:50 PM, Yann E. MORIN <yann.morin.1998@free.fr>
[--SNIP--]
> > And I think, we should use the service and init scripts given by upstream,
> > unless they cause real trouble with a BR rootfs.
> 
> I think you meant "we should *not* use the service and init scripts
> given by upstream", no?

Forget that comment. I misread "unless" as "because".

So, I agree with you.

Sorry for the noise...

Regards,
Yann E. MORIN.
Maxime Hadjinlian Oct. 13, 2015, 7:38 a.m. UTC | #7
On Mon, Oct 12, 2015 at 6:34 PM, Yann E. MORIN <yann.morin.1998@free.fr>
wrote:

> Maxime, All,
>
> On 2015-10-12 10:34 +0200, Maxime Hadjinlian spake thusly:
> > On Sat, Oct 10, 2015 at 4:50 PM, Yann E. MORIN <yann.morin.1998@free.fr>
> > wrote:
> > > On 2015-10-09 09:10 -0500, Doug Kehn spake thusly:
> > > > A daemon which handles passwd, group and host lookups for running
> > > programs and
> > > > caches the results for the next query. You only need this package if
> you
> > > are
> > > > using slow Name Services like LDAP, NIS or NIS+.
> > > >
> > > > This particular NSCD is a complete rewrite of the GNU glibc nscd
> which
> > > is a
> > > > single threaded server process which offloads all NSS lookups to
> worker
> > > > children; cache hits are handled by the parent, and only cache misses
> > > start
> > > > worker children, making the parent immune to resource leaks, hangs,
> and
> > > crashes
> > > > in NSS libraries.
> > > >
> > > > It should mostly be a drop-in replacement for existing installs using
> > > nscd.

 [--SNIP--]

> > nscd is a part of glibc, and looking at the code of glibc 2.22, the
> startup
> > script and systemd init file are included in the source. So I have a few
> > questions:
> >
> > Why is this not a part of the glibc package as an option ?
>
> From what I understood, this unscd is a complete *rewrite* of glibc's
> nscd.
>
> Where unscd shines is that it can resolve queries in parallel as it
> spawns a thread for each query that it has not yet cached, whereas
> glibc's nscd is single-threaded, thus serialising uncached queries.
>
> Thus, unscd should be overall "faster" at resolving queries than glibc's
> nscd would be.
>
> So, no, unscd is not part of glibc. nscd is, and we could indeed add an
> option to install it, of course. But that does not prevent unscd to also
> be oferred as a replacement.
>
Indeed, I misread the name of the package (and with it the intent of the
patch), and so I agree with you, that was a bad idea.

> >
> > nscd.service and nscd.tmpfiles which will create the /run/nscd directory
> > with the correct ACL, which doesn't seem to be done by your init script
> but
> > it's done by the shipped init script
>
> So, if I udnerstand you correctly, the systemd units are fine, but the
> startup script is missign some pieces, right?
>
No, both are missing pieces, that's why I think we should use upstream
files since they should know what they are doing :).

>
> Regards,
> Yann E. MORIN.
>
> --
>
> .-----------------.--------------------.------------------.--------------------.
> |  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics'
> conspiracy: |
> | +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___
>      |
> | +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There
> is no  |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v
>  conspiracy.  |
>
> '------------------------------^-------^------------------^--------------------'
>
diff mbox

Patch

diff --git a/package/Config.in b/package/Config.in
index 3794f44..a4b3b1b 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1520,6 +1520,7 @@  if BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
 	source "package/sysvinit/Config.in"
 	source "package/tar/Config.in"
 endif
+	source "package/unscd/Config.in"
 	source "package/util-linux/Config.in"
 endmenu
 
diff --git a/package/unscd/Config.in b/package/unscd/Config.in
new file mode 100644
index 0000000..937aeb2
--- /dev/null
+++ b/package/unscd/Config.in
@@ -0,0 +1,8 @@ 
+config BR2_PACKAGE_UNSCD
+	bool "unscd"
+	depends on BR2_TOOLCHAIN_USES_GLIBC
+	help
+	  Micro Name Service Caching Daemon
+
+comment "unscd needs an (e)glibc toolchain"
+	depends on !BR2_TOOLCHAIN_USES_GLIBC
diff --git a/package/unscd/S46unscd b/package/unscd/S46unscd
new file mode 100644
index 0000000..387ab32
--- /dev/null
+++ b/package/unscd/S46unscd
@@ -0,0 +1,24 @@ 
+#!/bin/sh
+
+NAME="nscd"
+DAEMON="/usr/sbin/${NAME}"
+
+case "$1" in
+start)
+        echo -n "Starting ${NAME}: "
+        start-stop-daemon -S -x ${DAEMON}
+        [ $? -eq 0 ] && echo "OK" || echo "FAIL"
+        ;;
+stop)
+        echo -n "Stopping ${NAME}: "
+        start-stop-daemon -K -x ${DAEMON}
+        [ $? -eq 0 ] && echo "OK" || echo "FAIL"
+        ;;
+restart|reload)
+        $0 stop
+        $0 start
+        ;;
+*)
+        echo "Usage: $0 {start|stop|restart|reload}"
+        exit 1
+esac
diff --git a/package/unscd/unscd.hash b/package/unscd/unscd.hash
new file mode 100644
index 0000000..f65ebda
--- /dev/null
+++ b/package/unscd/unscd.hash
@@ -0,0 +1,3 @@ 
+# From http://snapshot.debian.org/archive/debian/20150519T094547Z/pool/main/u/unscd/unscd_0.51-1.dsc
+sha256	0dbf717726e1c29af8f4ef7d2d2695e5eedb342320a730a56ae0d56fe32891f8	unscd_0.51.orig.tar.gz
+sha256	8ae16a826afd464639f6c6372fabafee5b93aea9645b3fbf23970296d4961f27	unscd_0.51-1.debian.tar.gz
diff --git a/package/unscd/unscd.mk b/package/unscd/unscd.mk
new file mode 100644
index 0000000..e8cccd3
--- /dev/null
+++ b/package/unscd/unscd.mk
@@ -0,0 +1,55 @@ 
+################################################################################
+#
+# unscd
+#
+################################################################################
+
+UNSCD_VERSION = 0.51
+UNSCD_SOURCE = unscd_$(UNSCD_VERSION).orig.tar.gz
+UNSCD_SITE = http://snapshot.debian.org/archive/debian/20150519T094547Z/pool/main/u/unscd
+UNSCD_EXTRA_DOWNLOADS = unscd_$(UNSCD_VERSION)-1.debian.tar.gz
+UNSCD_LICENSE = GPLv2
+UNSCD_LICENSE_FILES = debian/copyright
+
+define UNSCD_EXTRACT_DEBIAN
+	gzip -d -c $(BR2_DL_DIR)/$(UNSCD_EXTRA_DOWNLOADS) | tar -C $(@D) -xf -
+endef
+
+UNSCD_POST_EXTRACT_HOOKS += UNSCD_EXTRACT_DEBIAN
+
+define UNSCD_APPLY_DEBIAN_PATCHES
+	for f in `grep -Ev "^#" $(@D)/debian/patches/series 2> /dev/null`; do \
+		cat "$(@D)/debian/patches/$${f}" | patch -g0 -p1 -E -d "$(@D)" -t -N; \
+	done
+endef
+
+UNSCD_POST_PATCH_HOOKS += UNSCD_APPLY_DEBIAN_PATCHES
+
+define UNSCD_BUILD_CMDS
+	$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
+		$(@D)/nscd.c -o $(@D)/nscd
+endef
+
+define UNSCD_INSTALL_TARGET_CMDS
+	$(INSTALL) -m 755 -D $(@D)/nscd $(TARGET_DIR)/usr/sbin/nscd
+	$(INSTALL) -m 600 -D $(@D)/debian/nscd.conf $(TARGET_DIR)/etc/nscd.conf
+endef
+
+define UNSCD_INSTALL_INIT_SYSTEMD
+	$(INSTALL) -m 755 -D package/unscd/unscd.service \
+		$(TARGET_DIR)/usr/lib/systemd/system/unscd.service
+	mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
+	ln -fs ../../../../usr/lib/systemd/system/unscd.service \
+		$(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/unscd.service
+endef
+
+define UNSCD_INSTALL_INIT_SYSV
+	$(INSTALL) -m 755 -D package/unscd/S46unscd \
+		$(TARGET_DIR)/etc/init.d/S46unscd
+endef
+
+define UNSCD_USERS
+	unscd -1 unscd -1 * - - - unscd user
+endef
+
+$(eval $(generic-package))
diff --git a/package/unscd/unscd.service b/package/unscd/unscd.service
new file mode 100644
index 0000000..58dd7eb
--- /dev/null
+++ b/package/unscd/unscd.service
@@ -0,0 +1,11 @@ 
+[Unit]
+Description=Micro Name Service Caching Daemon.
+After=syslog.target network.target
+
+[Service]
+Type=forking
+PIDFile=/var/run/nscd/nscd.pid
+ExecStart=/usr/sbin/nscd
+
+[Install]
+WantedBy=multi-user.target