git: 982f980b86d6 - main - prometheus_sysctl_exporter: ignore ENOENT for mibs specified on the CLI

From: Alan Somers <asomers_at_FreeBSD.org>
Date: Sun, 24 Jul 2022 15:21:23 UTC
The branch main has been updated by asomers:

URL: https://cgit.FreeBSD.org/src/commit/?id=982f980b86d6bab4d55452d17bf3f5eb04e5f01e

commit 982f980b86d6bab4d55452d17bf3f5eb04e5f01e
Author:     Alan Somers <asomers@FreeBSD.org>
AuthorDate: 2022-06-21 18:51:14 +0000
Commit:     Alan Somers <asomers@FreeBSD.org>
CommitDate: 2022-07-24 15:19:46 +0000

    prometheus_sysctl_exporter: ignore ENOENT for mibs specified on the CLI
    
    They might belong to kernel modules not currently loaded, or to other
    kernel versions.  Ignoring them allows the configuration to be shared
    between multiple hosts.
    
    MFC after:      2 weeks
    Sponsored by:   Axcient
    Reviewed by:    rew
    Differential Revision: https://reviews.freebsd.org/D35540
---
 .../prometheus_sysctl_exporter.c                          | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/usr.sbin/prometheus_sysctl_exporter/prometheus_sysctl_exporter.c b/usr.sbin/prometheus_sysctl_exporter/prometheus_sysctl_exporter.c
index e452e305d2bf..931d8e965d00 100644
--- a/usr.sbin/prometheus_sysctl_exporter/prometheus_sysctl_exporter.c
+++ b/usr.sbin/prometheus_sysctl_exporter/prometheus_sysctl_exporter.c
@@ -67,13 +67,12 @@ oid_get_root(struct oid *o)
 }
 
 /* Obtains the OID for a sysctl by name. */
-static void
+static bool
 oid_get_by_name(struct oid *o, const char *name)
 {
 
 	o->len = nitems(o->id);
-	if (sysctlnametomib(name, o->id, &o->len) != 0)
-		err(1, "sysctl(%s)", name);
+	return (sysctlnametomib(name, o->id, &o->len) == 0);
 }
 
 /* Returns whether an OID is placed below another OID. */
@@ -644,7 +643,15 @@ main(int argc, char *argv[])
 		for (i = 0; i < argc; ++i) {
 			struct oid o, root;
 
-			oid_get_by_name(&root, argv[i]);
+			if (!oid_get_by_name(&root, argv[i])) {
+				/*
+				 * Ignore trees provided as arguments that
+				 * can't be found.  They might belong, for
+				 * example, to kernel modules not currently
+				 * loaded.
+				 */
+				continue;
+			}
 			o = root;
 			do {
 				oid_print(&o, &on, print_descriptions, exclude, include, fp);