GNU Shepherd 1.0.4 released

Ludovic Courtès <[email protected]> Wed, 16 Apr 2025 12:36:21 +0200
Newsgroups gmane.lisp.guile.user,gmane.comp.gnu.guix.devel,gmane.lisp.guile.sources
Message-ID <[email protected]>
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

We are glad to announce version 1.0.4 of the Shepherd, the next
bug-fix release in the 1.0.x series.

Check out the web site to learn more about the Shepherd 1.0.x series:

  https://gnu.org/software/shepherd/news/2024/12/the-shepherd-1.0.0-release=
d/

=E2=80=A2 About

  The Shepherd is a service manager written in Guile that looks after
  the herd of daemons running on the system.  It can be used as an
  =E2=80=9Cinit=E2=80=9D system (PID 1) and also by unprivileged users to m=
anage
  per-user daemons=E2=80=94e.g., gpg-agent, tor, privoxy.  It supports seve=
ral
  daemon startup mechanisms, including inetd, systemd-style socket
  activation, and timers.  The Shepherd is configured in Guile Scheme
  and can be extended in the same language.  It builds on a simple
  memory-safe and callback-free programming model.

  The Shepherd is developed jointly with the Guix project; it is used as
  the init system of Guix System and service manager of Guix Home.

  https://www.gnu.org/software/shepherd/

=E2=80=A2 Download

  Here are the compressed sources and a GPG detached signature:
    https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.4.tar.gz
    https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.4.tar.gz.sig

  Here are the SHA1 and SHA256 checksums:

    3572630eaa1401c2ec4df697d2a3c9fef79015e5  shepherd-1.0.4.tar.gz
    13306a6b56dfe252464e84a23c23a7234338cc752c565e1b865f7cbf8a03f0cf  sheph=
erd-1.0.4.tar.gz

  Authenticate the code by downloading the corresponding .sig file:

    gpg --verify shepherd-1.0.4.tar.gz.sig

  The signing key can be retrieved with:

    gpg --recv-keys 3CE464558A84FDC69DB40CFB090B11993D9AEBB5

  As a last resort to find the key, you can try the official GNU
  keyring:

    wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
    gpg --keyring gnu-keyring.gpg --verify shepherd-1.0.4.tar.gz.sig

  It is bit-for-bit reproducible from a checkout of the =E2=80=98v1.0.4=E2=
=80=99 tag of
  the Git repository.


=E2=80=A2 Changes since version 1.0.3

  ** =E2=80=98herd status=E2=80=99 displays the command of socket-activated=
 and inetd services

  When a systemd-style or inetd-style service is started and not yet spawne=
d,
  =E2=80=98herd status SERVICE=E2=80=99 now displays its command in additio=
n to the endpoint(s)
  it is listening on.

  ** =E2=80=98restart=E2=80=99 action passes extra arguments to the service=
=E2=80=99s constructor
     (<https://issues.guix.gnu.org/77109>)

  Until now, extra arguments passed to the =E2=80=98restart=E2=80=99 action=
 would be ignored.
  Thus, =E2=80=9Cherd restart SERVICE a b c=E2=80=9D would restart SERVICE =
but silently ignore
  the arguments =E2=80=9Ca b c=E2=80=9D.  The behavior is now to pass those=
 extra arguments to
  the =E2=80=98start=E2=80=99 method of the service.

  Incidentally, this also means that mistakenly running =E2=80=9Cherd resta=
rt SERVICE1
  SERVICE2=E2=80=9D now results in an error because SERVICE2 is interpreted=
 as an
  argument to SERVICE1 and not as a second service to restart.

  ** Starting a one-shot service concurrently no longer reports failure
     (<https://issues.guix.gnu.org/77274>)

  It used to be that, when trying to start a one-shot service that was alre=
ady
  starting, =E2=80=98herd start=E2=80=99 would wrongfully report failure to=
 start.  This is no
  longer the case.

  ** Fix potential deadlock with built-in service logger
     (<https://issues.guix.gnu.org/77373>)

  The built-in service logger (the one used when constructors are not given=
 a
  #:log-file argument) could deadlock under some conditions when the servic=
e it
  was logging has just stopped.  The problem was known to manifest in some =
cases
  on Guix System upon =E2=80=98herd stop nginx=E2=80=99.  This is now fixed.

  ** =E2=80=98log-rotation=E2=80=99 does not compressed already-compressed =
log files

  Programs such as nginx can compress log files as they write them.  The
  =E2=80=98log-rotation=E2=80=99 service no longer re-compresses such log f=
iles.

  ** Timers correctly handle winter-to-summer DST change
     (<https://issues.guix.gnu.org/77401>)

  This is a followup to an incomplete fix in
  <https://issues.guix.gnu.org/75622>: during the summer-to-winter daylight
  saving time (DST) change, for example from CET (UTC+1) to CEST (UTC+2) on=
 30
  March 2025 in Western Europe, the interval between consecutive calendar e=
vents
  would be incorrectly calculated when the event would fall between 02:00am=
 and
  03:00am, leading the timer to trigger many times in a row, unless it had
  #:wait-for-termination? #true.  This is now fixed; next year will be bett=
er!

  ** System log no longer crashes on some Unicode input
     (<https://issues.guix.gnu.org/77283>)

  Due to a bug in Guile=E2=80=99s (ice-9 regex) module, the =E2=80=98system=
-log=E2=80=99 service could
  crash on certain inputs containing non-ASCII Unicode characters, when
  =E2=80=98shepherd=E2=80=99 is running in a non-Unicode capable locale (wh=
ich is usually the
  case for PID 1).  This is now fixed by sidestepping the regexp bug entire=
ly.

  ** =E2=80=98make-systemd-constructor=E2=80=99 no longer passes O_NONBLOCK=
 sockets
     (<https://issues.guix.gnu.org/77610>)

  The =E2=80=98make-systemd-constructor=E2=80=99 procedure used to pass soc=
kets marked as
  non-blocking (O_NONBLOCK) to the process it spawns, except when using
  #:lazy-start? #f.  It now systematically passes blocking sockets.

  This bug would manifest on GNU/Hurd where accept(2) in this child process
  would return EAGAIN, which some daemons did not correctly handle.

  ** =E2=80=98system*=E2=80=99 and =E2=80=98system=E2=80=99 replacements ho=
nor current directory
     (<https://issues.guix.gnu.org/77707>)

  The =E2=80=98system*=E2=80=99 and =E2=80=98system=E2=80=99 replacements i=
n the =E2=80=98shepherd=E2=80=99 process now run the
  given command in the current directory rather than under
  (default-service-directory).

  ** Refuse to start when another shepherd is listening on the socket
     (<https://issues.guix.gnu.org/76998>)

  Starting an additional =E2=80=98shepherd=E2=80=99 as a user used to lead =
it to take control of
  the socket (by default /run/user/UID/shepherd/socket) even though another
  instance was already running and listening to that socket.  Since that
  behavior is undesirable, =E2=80=98shepherd=E2=80=99 now refuses to start =
in this situation.

  ** Fixed a couple of test suite failures on the Hurd
     (<https://issues.guix.gnu.org/77634>)

  A couple of tests that used to fail on GNU/Hurd (i586-gnu) have been fixe=
d.

  ** Translations

  This version is fully translated in German, Romanian, Swedish, and Ukrain=
ian;
  it is partially translated in eight other languages.  Check out
  https://translationproject.org/domain/shepherd.html to help translate it =
into
  your language!



Please report bugs to [email protected].
Join [email protected] for discussions.

Many thanks to everyone who reported bugs or contributed patches!

Ludovic, on behalf of the Shepherd herd.

--=-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQJBBAEBCgArFiEEPORkVYqE/cadtAz7CQsRmT2a67UFAmf/iCUNHGx1ZG9AZ251
Lm9yZwAKCRAJCxGZPZrrtc9xEACydNZZLx7M2vg8sX38KJJnF9kAboCG5cxM8aUy
3N+1ny2/g2ADA3j9Uao2xx8oFd/Tli8cvceBSHLRNXAZzSXua3JKODCJESUzgVmg
MRasAi+kEpMzlrQc4BH6m0IP0qWRhh2H3dfQEW+R560E6U6a8N2wD4N0OYxi1AfJ
eN0ZjBuEalc8H/Nuk+h4w4ZTsedrMwZs1FfRQLshEcfDzpBiv4PMlDe3r1Hc2GZ4
SghXC2RKWXjTHGM4Omcgcp05esTMGw0bz3IptuMaqzE+o6fxO7Xde4rWsAfLa2RK
Lw4XpDd65097uk7Ev4HVlemCEahfWjQQ1wekH/ljWRfMlucclRY5wNTeN4d1ulP6
yXqLpGl8pOBiqx6e5+pQlRIvJQLunO53ER1LardxVKOx3St8WOVxP5VeQm01pUUu
qNIv+buOZjOysmb4WMBMotxCNjxqGsM3zEgCzZWuUXCMT47oKGgrYWXsBL2nU2SS
WCstN6uiXQBFaFHcQCKbbrY6e9OCtpacL5wbHMqDdY981424IulLQ2YPW6lDRtdU
ctL2fjBoPCSoUOxC4eCGgjEbdrAA+Dipdh7/Gu67+O92EdvEEE5qm/aQb1yleitL
7dnQhiEI08Z92Szdcl1ajwNCUPtGwr6RXaAhbZnUvqE/JzbDYSxJzPsxhmOilku8
Qa0J7Q==
=jLDv
-----END PGP SIGNATURE-----
--=-=-=--