Hi,

Le 23/09/2022 à 19:22, Vagrant Cascadian a écrit :
On 2022-09-23, Arnaud Ferraris wrote:
On Sat, 10 Sep 2022 10:18:39 -0700 Vagrant Cascadian
<vagr...@debian.org> wrote:
On 2022-06-04, Jonas Smedegaard wrote:
Quoting Arnaud Ferraris (2022-06-04 16:39:03)
Currently u-boot-menu makes use of a single configuration file
one has to edit in order to change the default options. It could
be useful to use config fragments containing only one (or more)
variables, so that different packages could change different
config options (for example, one fragment could modify the
default cmdline, while another one could change the DTB folder).

Thanks, that sounds like a useful feature indeed.

Seems more sensible for me, however, to implement this using debconf.

Otherwise, installation and removal of a package would need to trigger
u-boot-menu, and u-boot-menu would need to specially examine such
cofigfile snippets to skip snippets belonging to removed but not purged
packages.

Well, you could implement configuration files snippets directory outside
of /etc (e.g. /usr/share/u-boot-menu/snippet.d or something like that),
which would avoid this problem. u-boot-menu could have a dpkg trigger
that for when files in this directory change.

I quite like this approach, thanks for the suggestion!

Do you think allowing both /etc/u-boot-menu.d (aimed solely at
end-users) and /usr/share/u-boot-menu/conf.d (for other packages and/or
derivatives), with a dpkg trigger only on the latter, would make sense?
Or should we aim only for the /usr/share... approach?

I think it's reasonable, though you'd have to encourage packages to
*not* use /etc/u-boot-menu*.d, maybe documenting it in
README.Debian...

I added some notes about this in both the manpage and a (new) README.Debian


I could see a preference order being /etc/default/u-boot which is
overidden by /usr/share/u-boot-menu/conf.d which is overridden by
/etc/u-boot-menu.d (or /etc/u-boot-menu/conf.d ?).

Yes, that makes the most sense to me (I also used /etc/u-boot-menu/conf.d instead of /etc/u-boot-menu.d for consistency).


A fancy implementation might allow /etc to override /usr/share if the
filenames match, but that might be more complicated than it's
worth. Jonas knows I've fallen into that rabbit hole in packages of the
ancient past... :)

Hmm, I don't think that's worth the hassle as it would add *a lot* of complexity for very little gain IMHO.



That seems a lot simpler than introducing the complexity of debconf
generated configuration files...

Indeed, so far my experiments with debconf for solving this matter have
been sub-optimal at best.

I'll update my patch in the next few days and submit it asap.

Updated patch attached, as always comments and suggestions are welcome :)

Cheers,
Arnaud


Thanks!


live well,
   vagrant
From 2949907b16bff2857cff0fb713967d264feb6567 Mon Sep 17 00:00:00 2001
From: Arnaud Ferraris <aferra...@debian.org>
Date: Tue, 1 Nov 2022 13:33:22 +0100
Subject: [PATCH] u-boot-update: allow using config fragments

In order to allow other packages and/or derivative distros to configure
specific aspects of `u-boot-menu` it can be useful to allow using config
fragments. This patch therefore implements loading config files from
`/usr/share/u-boot-menu/conf.d` (to be used by other packages) and
`/etc/u-boot-menu.d` (to be used by end-users, taking priority over
files under the preceding location), overriding the values loaded from
the default configuration file.

This commit also adds a dpkg trigger so any modification of files under
`/usr/share/u-boot-menu/conf.d` will result in `u-boot-update` being
automatically run.
---
 debian/README.Debian        | 32 ++++++++++++++++++++++++++++++++
 debian/u-boot-menu.postinst |  8 ++++++++
 debian/u-boot-menu.triggers |  1 +
 u-boot-update               |  9 +++++++++
 u-boot-update.8             | 16 +++++++++++++++-
 5 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 debian/README.Debian
 create mode 100755 debian/u-boot-menu.postinst
 create mode 100644 debian/u-boot-menu.triggers

diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..f502387
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,32 @@
+Configuration files handling
+============================
+
+Configuration files are read from the following locations, ordered by priority:
+1. /etc/default/u-boot
+2. /usr/share/u-boot-menu/conf.d/*.conf
+3. /etc/u-boot-menu/conf.d/*.conf
+
+Each configuration file can contain one or more environment variable and is
+sourced by u-boot-update. See u-boot-update(8) for more information about
+allowed variables.
+
+Variables values can be overriden by highest-priority configuration files. For
+example, if /etc/default/u-boot contains `U_BOOT_DEFAULT=l0` and there is a
+file named /usr/share/u-boot-menu/conf.d/new-default.conf containing
+`U_BOOT_DEFAULT=l0r`, then the menu entry labelled `l0r` will be set as the
+default entry. Moreover, if there is a file named, for example,
+/etc/u-boot-menu/conf.d/restore-default.conf containing `U_BOOT_DEFAULT=l1`,
+then the default menu entry will be the one labelled `l1`.
+
+This allows flexible configuration management by allowing other packages (for
+example, a support package for a specific device) to place configuration
+fragment files under /usr/share/u-boot-menu/conf.d/ to override the default
+values provided by u-boot-menu, while leaving an option for the end user to
+get the final word by creating a configuration fragment file under
+/etc/u-boot-menu/conf.d/.
+
+IMPORTANT: In order to avoid situations where the system might be rendered
+unbootable by a package removed but not purged, other packages (or downstream
+distributions) MUST NOT edit or modify files under /etc as those are meant for
+use by end-users only. Instead, it is mandated for such packages to install
+their config fragments ONLY under /usr/share/u-boot-menu/conf.d/.
diff --git a/debian/u-boot-menu.postinst b/debian/u-boot-menu.postinst
new file mode 100755
index 0000000..abff2bf
--- /dev/null
+++ b/debian/u-boot-menu.postinst
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "triggered" ]
+then
+	/usr/sbin/u-boot-update
+fi
diff --git a/debian/u-boot-menu.triggers b/debian/u-boot-menu.triggers
new file mode 100644
index 0000000..ae73129
--- /dev/null
+++ b/debian/u-boot-menu.triggers
@@ -0,0 +1 @@
+interest-noawait /usr/share/u-boot-menu/conf.d
diff --git a/u-boot-update b/u-boot-update
index 69da211..8f3cd4f 100755
--- a/u-boot-update
+++ b/u-boot-update
@@ -49,6 +49,15 @@ then
 	. /etc/default/u-boot
 fi
 
+# Reading config file fragments if they exist
+for file in /usr/share/u-boot-menu/conf.d/*.conf /etc/u-boot-menu/conf.d/*.conf
+do
+	if [ -e "${file}" ]
+	then
+		. "${file}"
+	fi
+done
+
 # Reading the os-release file
 if [ -e /etc/os-release ]
 then
diff --git a/u-boot-update.8 b/u-boot-update.8
index dfc3cd7..0c936fe 100644
--- a/u-boot-update.8
+++ b/u-boot-update.8
@@ -9,7 +9,19 @@ u\-boot\-update \- program to generate u\-boot menu files
 .SH DESCRIPTION
 u\-boot\-update is a tool used to generate the menu files
 used by the U\-BOOT bootloader.
-Options can be configured in /etc/default/u\-boot.
+Options can be configured in /etc/default/u\-boot
+or by adding configuration fragment files to /usr/share/u\-boot\-menu/conf.d/
+(those take precedence over /etc/default/u\-boot) and/or to
+/etc/u\-boot\-menu/conf.d/ (those take precedence over the 2 aforementioned
+locations).
+
+.PP
+
+In order to avoid situations where the system might be rendered unbootable by a
+package removal, other packages and downstream distributions MUST NOT edit or
+modify files under /etc as those are meant for use by end\-users only. Instead,
+it is mandated for such packages to install their config fragments ONLY under
+/usr/share/u\-boot\-menu/conf.d/.
 
 .PP
 
@@ -126,6 +138,8 @@ Default is 'initrd.img'.
 
 .SH FILES
 /etc/default/u-boot
+/usr/share/u-boot-menu/conf.d/
+/etc/u-boot-menu/conf.d/
 
 .SH HOMEPAGE
 More information about U\-BOOT
-- 
2.35.1

Reply via email to