2023-11-20 02:54:29

by NeilBrown

[permalink] [raw]
Subject: [PATCH 0/2 nfs-utils] conffile: use /usr/etc aswell

The first patch it just a little cleanup.
The second is the important one. It follows a trend of deprecating / in favour of /usr

NeilBrown

[PATCH 1/2] conffile: don't report error from conf_init_file()
[PATCH 2/2] conffile: allow /usr/etc to provide any config files


2023-11-20 02:54:34

by NeilBrown

[permalink] [raw]
Subject: [PATCH 1/2] conffile: don't report error from conf_init_file()

conf_init_file() currently reports an error if the main config file
doesn't exist - even if there are conf files in the conf.d directory.

This is only used by nfsconfcli.c. However this is not needed. If
there is a real error, and error message is already logged.
If it is simply that the file doesn't exist, that isn't really an error.

So remove the error messages and change conf_init_file() to not return
any status.

Also fix up assorted nearby white-space issues.

Signed-off-by: NeilBrown <[email protected]>
---
support/include/conffile.h | 2 +-
support/nfs/conffile.c | 32 ++++++++++++++------------------
tools/nfsconf/nfsconfcli.c | 15 ++-------------
3 files changed, 17 insertions(+), 32 deletions(-)

diff --git a/support/include/conffile.h b/support/include/conffile.h
index c4a3ca62860e..c04cd1ec5c0c 100644
--- a/support/include/conffile.h
+++ b/support/include/conffile.h
@@ -62,7 +62,7 @@ extern char *conf_get_str(const char *, const char *);
extern char *conf_get_str_with_def(const char *, const char *, char *);
extern char *conf_get_section(const char *, const char *, const char *);
extern char *conf_get_entry(const char *, const char *, const char *);
-extern int conf_init_file(const char *);
+extern void conf_init_file(const char *);
extern void conf_cleanup(void);
extern int conf_match_num(const char *, const char *, int);
extern int conf_remove(int, const char *, const char *);
diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c
index fd4a17ad4293..6b813dd95147 100644
--- a/support/nfs/conffile.c
+++ b/support/nfs/conffile.c
@@ -658,7 +658,7 @@ conf_load_file(const char *conf_file)
return 0;
}

-static void
+static void
conf_init_dir(const char *conf_file)
{
struct dirent **namelist = NULL;
@@ -669,14 +669,14 @@ conf_init_dir(const char *conf_file)
dname = malloc(strlen(conf_file) + 3);
if (dname == NULL) {
xlog(L_WARNING, "conf_init_dir: malloc: %s", strerror(errno));
- return;
+ return;
}
sprintf(dname, "%s.d", conf_file);

n = scandir(dname, &namelist, NULL, versionsort);
if (n < 0) {
if (errno != ENOENT) {
- xlog(L_WARNING, "conf_init_dir: scandir %s: %s",
+ xlog(L_WARNING, "conf_init_dir: scandir %s: %s",
dname, strerror(errno));
}
free(dname);
@@ -691,7 +691,7 @@ conf_init_dir(const char *conf_file)
for (i = 0; i < n; i++ ) {
struct dirent *d = namelist[i];

- switch (d->d_type) {
+ switch (d->d_type) {
case DT_UNKNOWN:
case DT_REG:
case DT_LNK:
@@ -701,13 +701,13 @@ conf_init_dir(const char *conf_file)
}
if (*d->d_name == '.')
continue;
-
+
fname_len = strlen(d->d_name);
path_len = (fname_len + dname_len);
if (!fname_len || path_len > PATH_MAX) {
xlog(L_WARNING, "conf_init_dir: Too long file name: %s in %s",
d->d_name, dname);
- continue;
+ continue;
}

/*
@@ -715,7 +715,7 @@ conf_init_dir(const char *conf_file)
* that end with CONF_FILE_EXT
*/
if (fname_len <= CONF_FILE_EXT_LEN) {
- xlog(D_GENERAL, "conf_init_dir: %s: name too short",
+ xlog(D_GENERAL, "conf_init_dir: %s: name too short",
d->d_name);
continue;
}
@@ -746,31 +746,29 @@ conf_init_dir(const char *conf_file)
free(namelist[i]);
free(namelist);
free(dname);
-
+
return;
}

-int
+void
conf_init_file(const char *conf_file)
{
unsigned int i;
- int ret;

for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++)
LIST_INIT (&conf_bindings[i]);

TAILQ_INIT (&conf_trans_queue);

- if (conf_file == NULL)
- conf_file=NFS_CONFFILE;
+ if (conf_file == NULL)
+ conf_file = NFS_CONFFILE;

/*
- * First parse the give config file
- * then parse the config.conf.d directory
+ * First parse the give config file
+ * then parse the config.conf.d directory
* (if it exists)
- *
*/
- ret = conf_load_file(conf_file);
+ conf_load_file(conf_file);

/*
* When the same variable is set in both files
@@ -779,8 +777,6 @@ conf_init_file(const char *conf_file)
* have the final say.
*/
conf_init_dir(conf_file);
-
- return ret;
}

/*
diff --git a/tools/nfsconf/nfsconfcli.c b/tools/nfsconf/nfsconfcli.c
index b2ef96d1c600..bd9d52701aa6 100644
--- a/tools/nfsconf/nfsconfcli.c
+++ b/tools/nfsconf/nfsconfcli.c
@@ -135,19 +135,8 @@ int main(int argc, char **argv)
return 1;
}

- if (mode != MODE_SET && mode != MODE_UNSET) {
- if (conf_init_file(confpath)) {
- /* config file was missing or had an error, warn about it */
- if (verbose || mode != MODE_ISSET) {
- fprintf(stderr, "Error loading config file %s\n",
- confpath);
- }
-
- /* this isnt fatal for --isset */
- if (mode != MODE_ISSET)
- return 1;
- }
- }
+ if (mode != MODE_SET && mode != MODE_UNSET)
+ conf_init_file(confpath);

/* --dump mode, output the current configuration */
if (mode == MODE_DUMP) {
--
2.42.0

2023-11-20 02:54:39

by NeilBrown

[permalink] [raw]
Subject: [PATCH 2/2] conffile: allow /usr/etc to provide any config files expected in /etc

If any config file is configured to be in /etc, also read from /usr/etc.
This followed a growing trend of moving as much as possible out of /
and into /usr.

See https://en.opensuse.org/openSUSE:Packaging_UsrEtc

Signed-off-by: NeilBrown <[email protected]>
---
support/nfs/conffile.c | 27 ++++++++++++++++-----------
support/nfsidmap/idmapd.conf.5 | 15 ++++++++++++++-
systemd/nfs.conf.man | 23 ++++++++++++++---------
systemd/nfs.systemd.man | 10 +++++++++-
utils/mount/nfsmount.conf.man | 19 ++++++++++---------
5 files changed, 63 insertions(+), 31 deletions(-)

diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c
index 6b813dd95147..884eca9e6b42 100644
--- a/support/nfs/conffile.c
+++ b/support/nfs/conffile.c
@@ -763,19 +763,24 @@ conf_init_file(const char *conf_file)
if (conf_file == NULL)
conf_file = NFS_CONFFILE;

- /*
- * First parse the give config file
- * then parse the config.conf.d directory
- * (if it exists)
+ /* If the config file is in /etc (normal) then check
+ * /usr/etc first. Also check config.conf.d for files
+ * names *.conf.
+ *
+ * Content or later files always over-rides earlier
+ * files.
*/
+ if (strncmp(conf_file, "/etc/", 5) == 0) {
+ char *usrconf = NULL;
+
+ asprintf(&usrconf, "/usr%s", conf_file);
+ if (usrconf) {
+ conf_load_file(usrconf);
+ conf_init_dir(usrconf);
+ free(usrconf);
+ }
+ }
conf_load_file(conf_file);
-
- /*
- * When the same variable is set in both files
- * the conf.d file will override the config file.
- * This allows automated admin systems to
- * have the final say.
- */
conf_init_dir(conf_file);
}

diff --git a/support/nfsidmap/idmapd.conf.5 b/support/nfsidmap/idmapd.conf.5
index 87e39bb41ab1..58c2d97752f6 100644
--- a/support/nfsidmap/idmapd.conf.5
+++ b/support/nfsidmap/idmapd.conf.5
@@ -37,7 +37,7 @@ Configuration file for libnfsidmap. Used by idmapd and svcgssd to map NFSv4 nam
.SH DESCRIPTION
The
.B idmapd.conf
-configuration file consists of several sections, initiated by strings of the
+configuration files consists of several sections, initiated by strings of the
form [General] and [Mapping]. Each section may contain lines of the form
.nf
variable = value
@@ -398,6 +398,19 @@ LDAP_base = dc=org,dc=domain
.\" Additional sections
.\" -------------------------------------------------------------------
.\"
+.SH FILES
+.I /usr/etc/idmapd.conf
+.br
+.I /usr/etc/idmapd.conf.d/*.conf
+.br
+.I /etc/idmapd.conf
+.br
+.I /etc/idmapd.conf.d/*.conf
+.br
+.IP
+Files are read in the order listed. Later settings override earlier
+settings.
+
.SH SEE ALSO
.BR idmapd (8)
.BR svcgssd (8)
diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
index 866939aa704d..d03fc8872caa 100644
--- a/systemd/nfs.conf.man
+++ b/systemd/nfs.conf.man
@@ -2,10 +2,13 @@
.SH NAME
nfs.conf \- general configuration for NFS daemons and tools
.SH SYNOPSIS
+.I /usr/etc/nfs.conf
+.I /usr/etc/nfs.conf.d/
.I /etc/nfs.conf
+.I /etc/nfs.conf.d/
.SH DESCRIPTION
.PP
-This file contains site-specific configuration for various NFS daemons
+These files contain site-specific configuration for various NFS daemons
and other processes. Most configuration can also be passed to
processes via command line arguments, but it can be more convenient to
have a central file. In particular, this encourages consistent
@@ -314,15 +317,17 @@ See
for deatils.

.SH FILES
-.TP 10n
+.I /usr/etc/nfs.conf
+.br
+.I /usr/etc/nfs.conf.d/*.conf
+.br
.I /etc/nfs.conf
-Default NFS client configuration file
-.TP 10n
-.I /etc/nfs.conf.d
-When this directory exists and files ending
-with ".conf" exist, those files will be
-used to set configuration variables. These
-files will override variables set in /etc/nfs.conf
+.br
+.I /etc/nfs.conf.d/*.conf
+.br
+.IP
+Various configuration files read in order. Later settings override
+earlier settings.
.SH SEE ALSO
.BR nfsdcltrack (8),
.BR rpc.nfsd (8),
diff --git a/systemd/nfs.systemd.man b/systemd/nfs.systemd.man
index 46b476a662c8..df89ddd13b76 100644
--- a/systemd/nfs.systemd.man
+++ b/systemd/nfs.systemd.man
@@ -27,7 +27,9 @@ any command line arguments to daemons so as to configure their
behavior. In many case such configuration can be performed by making
changes to
.I /etc/nfs.conf
-or other configuration files. When that is not convenient, a
+or other configuration files (see
+.BR nfs.conf (5)).
+When that is not convenient, a
distribution might provide systemd "drop-in" files which replace the
.B ExecStart=
setting to start the program with different arguments. For example a
@@ -171,6 +173,12 @@ running, it can be masked with
/etc/nfsmount.conf
.br
/etc/idmapd.conf
+.P
+Also similar files in
+.B /usr/etc
+and in related
+.I conf.d
+drop-in directories.
.SH SEE ALSO
.BR systemd.unit (5),
.BR nfs.conf (5),
diff --git a/utils/mount/nfsmount.conf.man b/utils/mount/nfsmount.conf.man
index 34879c8d63c7..10287cdfea69 100644
--- a/utils/mount/nfsmount.conf.man
+++ b/utils/mount/nfsmount.conf.man
@@ -115,16 +115,17 @@ All mounts to the '/export/home' export will be performed in
the background (i.e. done asynchronously).
.RE
.SH FILES
-.TP 10n
+.I /usr/etc/nfsmount.conf
+.br
+.I /usr/etc/nfsmount.conf.d/*.conf
+.br
.I /etc/nfsmount.conf
-Default NFS mount configuration file
-.TP 10n
-.I /etc/nfsmount.conf.d
-When this directory exists and files ending
-with ".conf" exist, those files will be
-used to set configuration variables. These
-files will override variables set
-in /etc/nfsmount.conf
+.br
+.I /etc/nfsmount.conf.d/*.conf
+.br
+.IP
+Default NFS mount configuration files, variables set in the later file
+over-ride those in the earlier file.
.PD
.SH SEE ALSO
.BR nfs (5),
--
2.42.0

2023-11-29 12:33:02

by Steve Dickson

[permalink] [raw]
Subject: Re: [PATCH 0/2 nfs-utils] conffile: use /usr/etc aswell



On 11/19/23 9:52 PM, NeilBrown wrote:
> The first patch it just a little cleanup.
> The second is the important one. It follows a trend of deprecating / in favour of /usr
>
> NeilBrown
>
> [PATCH 1/2] conffile: don't report error from conf_init_file()
> [PATCH 2/2] conffile: allow /usr/etc to provide any config files
>
Committed... (tag: nfs-utils-2-7-1-rc1)

steved