* [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services
@ 2020-07-17 23:42 Norbert Lange
2020-07-18 21:16 ` Yann E. MORIN
0 siblings, 1 reply; 4+ messages in thread
From: Norbert Lange @ 2020-07-17 23:42 UTC (permalink / raw)
To: buildroot
this adds a new hook and a corresponding variable to add
addirectories and files after installation.
various services need directories in /var when they are started,
and create them if necessary. Creating those before, allows
those services to start even if /var is read-only.
Signed-off-by: Norbert Lange <nolange79@gmail.com>
---
package/systemd/systemd.mk | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/package/systemd/systemd.mk b/package/systemd/systemd.mk
index c202f5be02..b57365872e 100644
--- a/package/systemd/systemd.mk
+++ b/package/systemd/systemd.mk
@@ -317,6 +317,7 @@ endif
ifeq ($(BR2_PACKAGE_SYSTEMD_LOGIND),y)
SYSTEMD_CONF_OPTS += -Dlogind=true
+SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/linger/
else
SYSTEMD_CONF_OPTS += -Dlogind=false
endif
@@ -336,6 +337,7 @@ endif
ifeq ($(BR2_PACKAGE_SYSTEMD_HOMED),y)
SYSTEMD_CONF_OPTS += -Dhomed=true
SYSTEMD_DEPENDENCIES += cryptsetup openssl
+SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/home/
else
SYSTEMD_CONF_OPTS += -Dhomed=false
endif
@@ -380,12 +382,14 @@ endif
ifeq ($(BR2_PACKAGE_SYSTEMD_COREDUMP),y)
SYSTEMD_CONF_OPTS += -Dcoredump=true
SYSTEMD_COREDUMP_USER = systemd-coredump -1 systemd-coredump -1 * - - - systemd core dump processing
+SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/coredump/
else
SYSTEMD_CONF_OPTS += -Dcoredump=false
endif
ifeq ($(BR2_PACKAGE_SYSTEMD_PSTORE),y)
SYSTEMD_CONF_OPTS += -Dpstore=true
+SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/pstore/
else
SYSTEMD_CONF_OPTS += -Dpstore=false
endif
@@ -436,6 +440,7 @@ endif
ifeq ($(BR2_PACKAGE_SYSTEMD_TIMESYNCD),y)
SYSTEMD_CONF_OPTS += -Dtimesyncd=true
SYSTEMD_TIMESYNCD_USER = systemd-timesync -1 systemd-timesync -1 * - - - systemd Time Synchronization
+SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/timesync/
else
SYSTEMD_CONF_OPTS += -Dtimesyncd=false
endif
@@ -485,18 +490,23 @@ ifneq ($(SYSTEMD_FALLBACK_HOSTNAME),)
SYSTEMD_CONF_OPTS += -Dfallback-hostname=$(SYSTEMD_FALLBACK_HOSTNAME)
endif
+define SYSTEMD_INSTALL_ENTRY_HOOK
+ mkdir -p -m700 $(TARGET_DIR)/var/lib/private $(TARGET_DIR)/var/log/private \
+ $(TARGET_DIR)/var/cache/private
+ mkdir -p -m1777 $(TARGET_DIR)/var/tmp
+ $(if $(BR2_PACKAGE_SYSTEMD_MACHINED),mkdir -p -m700 $(TARGET_DIR)/var/lib/machines)
+ mkdir -p $(addprefix $(TARGET_DIR)/,var/lib $(filter %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
+ touch $(addprefix $(TARGET_DIR)/,etc/machine-id $(filter-out %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
+endef
+
define SYSTEMD_INSTALL_INIT_HOOK
ln -fs multi-user.target \
$(TARGET_DIR)/usr/lib/systemd/system/default.target
endef
-define SYSTEMD_INSTALL_MACHINEID_HOOK
- touch $(TARGET_DIR)/etc/machine-id
-endef
-
SYSTEMD_POST_INSTALL_TARGET_HOOKS += \
+ SYSTEMD_INSTALL_ENTRY_HOOK \
SYSTEMD_INSTALL_INIT_HOOK \
- SYSTEMD_INSTALL_MACHINEID_HOOK \
SYSTEMD_INSTALL_RESOLVCONF_HOOK
define SYSTEMD_INSTALL_IMAGES_CMDS
@@ -532,6 +542,10 @@ endef
SYSTEMD_TARGET_FINALIZE_HOOKS += SYSTEMD_INSTALL_NSSCONFIG_HOOK
+define SYSTEMD_PERMISSIONS
+ $(if $(SYSTEMD_TIMESYNCD_USER),/var/lib/systemd/timesync d 755 systemd-timesync systemd-timesync - - - - -)
+endef
+
ifneq ($(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)),)
# systemd provides multiple units to autospawn getty as neede
# * getty at .service to start a getty on normal TTY
--
2.27.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services
2020-07-17 23:42 [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services Norbert Lange
@ 2020-07-18 21:16 ` Yann E. MORIN
2020-07-20 8:42 ` Jérémy ROSEN
0 siblings, 1 reply; 4+ messages in thread
From: Yann E. MORIN @ 2020-07-18 21:16 UTC (permalink / raw)
To: buildroot
Norbert, All,
On 2020-07-18 01:42 +0200, Norbert Lange spake thusly:
> this adds a new hook and a corresponding variable to add
> addirectories and files after installation.
>
> various services need directories in /var when they are started,
> and create them if necessary. Creating those before, allows
> those services to start even if /var is read-only.
>
> Signed-off-by: Norbert Lange <nolange79@gmail.com>
> ---
> package/systemd/systemd.mk | 24 +++++++++++++++++++-----
> 1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/package/systemd/systemd.mk b/package/systemd/systemd.mk
> index c202f5be02..b57365872e 100644
> --- a/package/systemd/systemd.mk
> +++ b/package/systemd/systemd.mk
> @@ -317,6 +317,7 @@ endif
>
> ifeq ($(BR2_PACKAGE_SYSTEMD_LOGIND),y)
> SYSTEMD_CONF_OPTS += -Dlogind=true
> +SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/linger/
The naming is not nice. Also, paths should be absolute:
SYSTEMD_CREATE_DIRS += /var/lib/systemd/linger/
However, I am not fond of mixing the directories creation with two
infras: post-isntall hooks and _PERMISSIONS tables.
So, in fact:
SYSTEMD_LOGIND_PERMISIONS = /var/lib/systemd/linger d 755 0 0 - - - - -
Ditto for the others conditional directories. And of course, we should
also treat the non-conditional ones similarly.
[--SNIP--]
> @@ -436,6 +440,7 @@ endif
> ifeq ($(BR2_PACKAGE_SYSTEMD_TIMESYNCD),y)
> SYSTEMD_CONF_OPTS += -Dtimesyncd=true
> SYSTEMD_TIMESYNCD_USER = systemd-timesync -1 systemd-timesync -1 * - - - systemd Time Synchronization
> +SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/timesync/
SYSTEMD_TIMESYNCD_PERMISIONS = /var/lib/systemd/timesync d 755 systemd-timesync systemd-timesync - - - - -
[--SNIP--]
> @@ -485,18 +490,23 @@ ifneq ($(SYSTEMD_FALLBACK_HOSTNAME),)
> SYSTEMD_CONF_OPTS += -Dfallback-hostname=$(SYSTEMD_FALLBACK_HOSTNAME)
> endif
>
> +define SYSTEMD_INSTALL_ENTRY_HOOK
> + mkdir -p -m700 $(TARGET_DIR)/var/lib/private $(TARGET_DIR)/var/log/private \
> + $(TARGET_DIR)/var/cache/private
> + mkdir -p -m1777 $(TARGET_DIR)/var/tmp
> + $(if $(BR2_PACKAGE_SYSTEMD_MACHINED),mkdir -p -m700 $(TARGET_DIR)/var/lib/machines)
> + mkdir -p $(addprefix $(TARGET_DIR)/,var/lib $(filter %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
> + touch $(addprefix $(TARGET_DIR)/,etc/machine-id $(filter-out %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
> +endef
This would thus no longer be needed.
> define SYSTEMD_INSTALL_INIT_HOOK
> ln -fs multi-user.target \
> $(TARGET_DIR)/usr/lib/systemd/system/default.target
> endef
>
> -define SYSTEMD_INSTALL_MACHINEID_HOOK
> - touch $(TARGET_DIR)/etc/machine-id
> -endef
This could also probably be replaced with a non-conditional entry in the
permissions table, see below...
> SYSTEMD_POST_INSTALL_TARGET_HOOKS += \
> + SYSTEMD_INSTALL_ENTRY_HOOK \
> SYSTEMD_INSTALL_INIT_HOOK \
> - SYSTEMD_INSTALL_MACHINEID_HOOK \
> SYSTEMD_INSTALL_RESOLVCONF_HOOK
>
> define SYSTEMD_INSTALL_IMAGES_CMDS
> @@ -532,6 +542,10 @@ endef
>
> SYSTEMD_TARGET_FINALIZE_HOOKS += SYSTEMD_INSTALL_NSSCONFIG_HOOK
>
> +define SYSTEMD_PERMISSIONS
> + $(if $(SYSTEMD_TIMESYNCD_USER),/var/lib/systemd/timesync d 755 systemd-timesync systemd-timesync - - - - -)
> +endef
We usually do not use conditional in the permissions tables, but define
conditional variables that we then re-use (see above):
define SYSTEMD_PERMISSIONS
/etc/machine-id f 644 0 0 - - - - -
$(SYSTEMD_LOGIND_PERMISIONS)
$(SYSTEMD_TIMESYNCD_PERMISIONS)
...
endef
Regards,
Yann E. MORIN.
> +
> ifneq ($(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)),)
> # systemd provides multiple units to autospawn getty as neede
> # * getty at .service to start a getty on normal TTY
> --
> 2.27.0
>
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
^ permalink raw reply [flat|nested] 4+ messages in thread* [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services
2020-07-18 21:16 ` Yann E. MORIN
@ 2020-07-20 8:42 ` Jérémy ROSEN
2020-07-20 10:26 ` Norbert Lange
0 siblings, 1 reply; 4+ messages in thread
From: Jérémy ROSEN @ 2020-07-20 8:42 UTC (permalink / raw)
To: buildroot
I am kinda philosophically torn on this one...
According to man:file-hierarchy, /var MUST be writable (it MAY be a tmpfs
if the system has no persistent, writable storage)
This means that daemons can assume that /var will be writable, and we might
be starting a wild goose hunt to get them
working in all cases.
The clean way to have a file go in /var (at least with systemd) is to put
it in /usr/share/factory/var/ and systemd will copy it to
/var on first boot (or every boot if it's a tmpfs)
this has the added advantage that /var can be empty at install time, can be
easily reset by reformatting/emptying
without breaking the system.
I have no idea how factory is handled in sysV.
If buildroot wants to support read-only /var, it's supporting a "buggy
setup" according to various standards including FHS.
And yeah... it's a buggy setup, but it's also a common setup :(
So, I guess it's important to point that out but I don't really know what
the correct answer is for buildroot..
Jeremy
Le sam. 18 juil. 2020 ? 23:16, Yann E. MORIN <yann.morin.1998@free.fr> a
?crit :
> Norbert, All,
>
> On 2020-07-18 01:42 +0200, Norbert Lange spake thusly:
> > this adds a new hook and a corresponding variable to add
> > addirectories and files after installation.
> >
> > various services need directories in /var when they are started,
> > and create them if necessary. Creating those before, allows
> > those services to start even if /var is read-only.
> >
> > Signed-off-by: Norbert Lange <nolange79@gmail.com>
> > ---
> > package/systemd/systemd.mk | 24 +++++++++++++++++++-----
> > 1 file changed, 19 insertions(+), 5 deletions(-)
> >
> > diff --git a/package/systemd/systemd.mk b/package/systemd/systemd.mk
> > index c202f5be02..b57365872e 100644
> > --- a/package/systemd/systemd.mk
> > +++ b/package/systemd/systemd.mk
> > @@ -317,6 +317,7 @@ endif
> >
> > ifeq ($(BR2_PACKAGE_SYSTEMD_LOGIND),y)
> > SYSTEMD_CONF_OPTS += -Dlogind=true
> > +SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/linger/
>
> The naming is not nice. Also, paths should be absolute:
>
> SYSTEMD_CREATE_DIRS += /var/lib/systemd/linger/
>
> However, I am not fond of mixing the directories creation with two
> infras: post-isntall hooks and _PERMISSIONS tables.
>
> So, in fact:
>
> SYSTEMD_LOGIND_PERMISIONS = /var/lib/systemd/linger d 755 0 0 - - - - -
>
> Ditto for the others conditional directories. And of course, we should
> also treat the non-conditional ones similarly.
>
> [--SNIP--]
> > @@ -436,6 +440,7 @@ endif
> > ifeq ($(BR2_PACKAGE_SYSTEMD_TIMESYNCD),y)
> > SYSTEMD_CONF_OPTS += -Dtimesyncd=true
> > SYSTEMD_TIMESYNCD_USER = systemd-timesync -1 systemd-timesync -1 * - -
> - systemd Time Synchronization
> > +SYSTEMD_POST_INSTALL_ENTRIES += var/lib/systemd/timesync/
>
> SYSTEMD_TIMESYNCD_PERMISIONS = /var/lib/systemd/timesync d 755
> systemd-timesync systemd-timesync - - - - -
>
> [--SNIP--]
> > @@ -485,18 +490,23 @@ ifneq ($(SYSTEMD_FALLBACK_HOSTNAME),)
> > SYSTEMD_CONF_OPTS += -Dfallback-hostname=$(SYSTEMD_FALLBACK_HOSTNAME)
> > endif
> >
> > +define SYSTEMD_INSTALL_ENTRY_HOOK
> > + mkdir -p -m700 $(TARGET_DIR)/var/lib/private
> $(TARGET_DIR)/var/log/private \
> > + $(TARGET_DIR)/var/cache/private
> > + mkdir -p -m1777 $(TARGET_DIR)/var/tmp
> > + $(if $(BR2_PACKAGE_SYSTEMD_MACHINED),mkdir -p -m700
> $(TARGET_DIR)/var/lib/machines)
> > + mkdir -p $(addprefix $(TARGET_DIR)/,var/lib $(filter
> %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
> > + touch $(addprefix $(TARGET_DIR)/,etc/machine-id $(filter-out
> %/,$(SYSTEMD_POST_INSTALL_ENTRIES)))
> > +endef
>
> This would thus no longer be needed.
>
> > define SYSTEMD_INSTALL_INIT_HOOK
> > ln -fs multi-user.target \
> > $(TARGET_DIR)/usr/lib/systemd/system/default.target
> > endef
> >
> > -define SYSTEMD_INSTALL_MACHINEID_HOOK
> > - touch $(TARGET_DIR)/etc/machine-id
> > -endef
>
> This could also probably be replaced with a non-conditional entry in the
> permissions table, see below...
>
> > SYSTEMD_POST_INSTALL_TARGET_HOOKS += \
> > + SYSTEMD_INSTALL_ENTRY_HOOK \
> > SYSTEMD_INSTALL_INIT_HOOK \
> > - SYSTEMD_INSTALL_MACHINEID_HOOK \
> > SYSTEMD_INSTALL_RESOLVCONF_HOOK
> >
> > define SYSTEMD_INSTALL_IMAGES_CMDS
> > @@ -532,6 +542,10 @@ endef
> >
> > SYSTEMD_TARGET_FINALIZE_HOOKS += SYSTEMD_INSTALL_NSSCONFIG_HOOK
> >
> > +define SYSTEMD_PERMISSIONS
> > + $(if $(SYSTEMD_TIMESYNCD_USER),/var/lib/systemd/timesync d 755
> systemd-timesync systemd-timesync - - - - -)
> > +endef
>
> We usually do not use conditional in the permissions tables, but define
> conditional variables that we then re-use (see above):
>
> define SYSTEMD_PERMISSIONS
> /etc/machine-id f 644 0 0 - - - - -
> $(SYSTEMD_LOGIND_PERMISIONS)
> $(SYSTEMD_TIMESYNCD_PERMISIONS)
> ...
> endef
>
> Regards,
> Yann E. MORIN.
>
> > +
> > ifneq ($(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)),)
> > # systemd provides multiple units to autospawn getty as neede
> > # * getty at .service to start a getty on normal TTY
> > --
> > 2.27.0
> >
>
> --
>
> .-----------------.--------------------.------------------.--------------------.
> | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics'
> conspiracy: |
> | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___
> |
> | +33 561 099 427 `------------.-------: X AGAINST | \e/ There is
> no |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v
> conspiracy. |
>
> '------------------------------^-------^------------------^--------------------'
>
--
[image: SMILE] <http://www.smile.eu/>
20 rue des Jardins
92600 Asni?res-sur-Seine
*J?r?my ROSEN*
Architecte technique
[image: email] jeremy.rosen at smile.fr
[image: phone] +33 6 88 25 87 42
[image: url] http://www.smile.eu
[image: Twitter] <https://twitter.com/GroupeSmile> [image: Facebook]
<https://www.facebook.com/smileopensource> [image: LinkedIn]
<https://www.linkedin.com/company/smile> [image: Github]
<https://github.com/Smile-SA>
[image: D?couvrez l?univers Smile, rendez-vous sur smile.eu]
<https://www.smile.eu/fr/publications/livres-blancs/yocto?utm_source=signature&utm_medium=email&utm_campaign=signature>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20200720/bfed6b85/attachment.html>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services
2020-07-20 8:42 ` Jérémy ROSEN
@ 2020-07-20 10:26 ` Norbert Lange
0 siblings, 0 replies; 4+ messages in thread
From: Norbert Lange @ 2020-07-20 10:26 UTC (permalink / raw)
To: buildroot
Am Mo., 20. Juli 2020 um 10:42 Uhr schrieb J?r?my ROSEN <
jeremy.rosen@smile.fr>:
> I am kinda philosophically torn on this one...
>
>
> According to man:file-hierarchy, /var MUST be writable (it MAY be a tmpfs
> if the system has no persistent, writable storage)
>
I'd not confuse the "distribution image" (the thing that buildroot creates)
with the running system.
To me, buildroot should do *everything that's possible* up-front.
> This means that daemons can assume that /var will be writable, and we
> might be starting a wild goose hunt to get them
> working in all cases.
>
Nope, definitely not the aim for buildroot. Personally I would aim at some
sort of base system still being accessible, even if /var is read-only
(might happen if the block-device has errors).
systemd actively tries to do this, v246 will have some fallbacks do
services can start if /var/tmp is read-only (albeit in obviously reduced
fashion).
The clean way to have a file go in /var (at least with systemd) is to put
> it in /usr/share/factory/var/ and systemd will copy it to
> /var on first boot (or every boot if it's a tmpfs)
>
No, no, no. the factory approach is one of the most fragile I have ever
seen., See [1] for a short list of issues,
[2] for a patch with conflicting use.
That's something requiring a "wild goose hunt" to get in shape.
A clean approach is to mount a overlayfs, ideally already in the initramfs,
or to separate /usr into a RO image. Both approaches are hindered with the
intransparent
logic hidden behind the innocent REMOUNT_ROOTFS_RW option.
The best in-image option would be to either:
- hook /sbin/init
- create a systemd-unit that is run after /var is mounted and before
tmpfilesd-create is run.
At one of these points, do either an overlayfs or copying over the contents
to a new tmpfs, then bindmounting it to /var.
I'd still do this as a separate option to REMOUNT_ROOTFS_RW, perhaps even
as its own package.
this has the added advantage that /var can be empty at install time, can be
> easily reset by reformatting/emptying
> without breaking the system.
>
Thats what tmpfilesd is for, ideally it doesn't require copying over the
old contents. Then it works with an empty /var whether you use the rw or ro
option in buildroot,
you just might need to add a tmpfs mount there.
I have no idea how factory is handled in sysV.
>
> If buildroot wants to support read-only /var, it's supporting a "buggy
> setup" according to various standards including FHS.
> And yeah... it's a buggy setup, but it's also a common setup :(
>
I'd call it a robust setup, if things still work in a reduced fashion.
But again I use buildroot as a "distribution image" generator, I do mount
an overlayfs over the whole fs in the initramfs,
something that seems official support as you cant mount a .tar file.
>
> So, I guess it's important to point that out but I don't really know what
> the correct answer is for buildroot..
>
For this patch, its just a question if the work (as in maintainance cost)
is acceptable to pre-create the directories,
I don't see any downsides, philosophically or pragmatically.
How RO-systems should be supported is another question, but in my
opionion a bind-mount script that works
on all init-systems (just maybe hooked-in differently) and doesnt causes a
host of side-effects would be alot better than the status quo.
I'll append a small example, how such a bind-mount script (with overlay)
would look like.
[1] - http://lists.busybox.net/pipermail/buildroot/2020-July/287016.html
[2] - http://lists.busybox.net/pipermail/buildroot/2020-July/287200.html
ROOTFSDIR=/tmp/rootfs
OVLDIR=/run/ovl
# create a separate filesystem for testing
mkdir $ROOTFSDIR
mount -t tmpfs tmpfs_root_to $ROOTFSDIR
mkdir $ROOTFSDIR/var
touch $ROOTFSDIR/var/upperfile
mount -o remount,ro $ROOTFSDIR
# real overlay script
mkdir $OVLDIR
mount -t tmpfs tmpfs_root_ovl $OVLDIR
mkdir $OVLDIR/lower $OVLDIR/upper $OVLDIR/work
mount --bind $ROOTFSDIR/var $OVLDIR/lower
mount -t overlay -o
lowerdir=$OVLDIR/lower,upperdir=$OVLDIR/upper,workdir=$OVLDIR/work
overlay_var $ROOTFSDIR/var
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20200720/0ccdc4e3/attachment.html>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-07-20 10:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-17 23:42 [Buildroot] [PATCH 1/1] package/systemd: pre-create directories for services Norbert Lange
2020-07-18 21:16 ` Yann E. MORIN
2020-07-20 8:42 ` Jérémy ROSEN
2020-07-20 10:26 ` Norbert Lange
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox