@@ -171,10 +171,10 @@ fi
AC_SUBST([systemd_unitdir])
AM_CONDITIONAL([ENABLE_SYSTEMD_UNITS], [test "x$with_systemd" = "xyes"])
-ndctl_monitorconfdir=${sysconfdir}/ndctl
-ndctl_monitorconf=monitor.conf
-AC_SUBST([ndctl_monitorconfdir])
-AC_SUBST([ndctl_monitorconf])
+ndctl_confdir=${sysconfdir}/ndctl
+ndctl_conf=ndctl.conf
+AC_SUBST([ndctl_confdir])
+AC_SUBST([ndctl_conf])
daxctl_modprobe_datadir=${datadir}/daxctl
daxctl_modprobe_data=daxctl.conf
@@ -7,7 +7,7 @@ BUILT_SOURCES = config.h
config.h: $(srcdir)/Makefile.am
$(AM_V_GEN) echo "/* Autogenerated by ndctl/Makefile.am */" >$@ && \
echo '#define NDCTL_CONF_FILE \
- "$(ndctl_monitorconfdir)/$(ndctl_monitorconf)"' >>$@
+ "$(ndctl_confdir)/$(ndctl_conf)"' >>$@
$(AM_V_GEN) echo '#define NDCTL_KEYS_DIR "$(ndctl_keysdir)"' >>$@
ndctl_SOURCES = ndctl.c \
@@ -42,7 +42,7 @@ keys_configdir = $(ndctl_keysdir)
keys_config_DATA = $(ndctl_keysreadme)
endif
-EXTRA_DIST += keys.readme monitor.conf ndctl-monitor.service
+EXTRA_DIST += keys.readme ndctl.conf ndctl-monitor.service
if ENABLE_DESTRUCTIVE
ndctl_SOURCES += ../test/blk_namespaces.c \
@@ -54,6 +54,7 @@ ndctl_LDADD =\
lib/libndctl.la \
../daxctl/lib/libdaxctl.la \
../libutil.a \
+ ../libccan.a \
$(UUID_LIBS) \
$(KMOD_LIBS) \
$(JSON_LIBS)
@@ -73,8 +74,8 @@ ndctl_SOURCES += ../test/libndctl.c \
test.c
endif
-monitor_configdir = $(ndctl_monitorconfdir)
-monitor_config_DATA = $(ndctl_monitorconf)
+ndctl_configdir = $(ndctl_confdir)
+ndctl_config_DATA = $(ndctl_conf)
if ENABLE_SYSTEMD_UNITS
systemd_unit_DATA = ndctl-monitor.service
@@ -10,11 +10,13 @@
#include <util/filter.h>
#include <util/util.h>
#include <util/parse-options.h>
+#include <util/parse-configs.h>
#include <util/strbuf.h>
#include <ndctl/config.h>
#include <ndctl/ndctl.h>
#include <ndctl/libndctl.h>
#include <sys/epoll.h>
+#include <stdbool.h>
#define BUF_SIZE 2048
/* reuse the core log helpers for the monitor logger */
@@ -463,113 +465,6 @@ out:
return rc;
}
-static void parse_config(const char **arg, char *key, char *val, char *ident)
-{
- struct strbuf value = STRBUF_INIT;
- size_t arg_len = *arg ? strlen(*arg) : 0;
-
- if (!ident || !key || (strcmp(ident, key) != 0))
- return;
-
- if (arg_len) {
- strbuf_add(&value, *arg, arg_len);
- strbuf_addstr(&value, " ");
- }
- strbuf_addstr(&value, val);
- *arg = strbuf_detach(&value, NULL);
-}
-
-static int read_config_file(struct ndctl_ctx *ctx, struct monitor *_monitor,
- struct util_filter_params *_param)
-{
- FILE *f;
- size_t len = 0;
- int line = 0, rc = 0;
- char *buf = NULL, *seek, *value, *config_file;
-
- if (_monitor->config_file)
- config_file = strdup(_monitor->config_file);
- else
- config_file = strdup(NDCTL_CONF_FILE);
- if (!config_file) {
- fail("strdup default config file failed\n");
- rc = -ENOMEM;
- goto out;
- }
-
- buf = malloc(BUF_SIZE);
- if (!buf) {
- fail("malloc read config-file buf error\n");
- rc = -ENOMEM;
- goto out;
- }
- seek = buf;
-
- f = fopen(config_file, "r");
- if (!f) {
- if (_monitor->config_file) {
- err(&monitor, "config-file: %s cannot be opened\n",
- config_file);
- rc = -errno;
- }
- goto out;
- }
-
- while (fgets(seek, BUF_SIZE, f)) {
- value = NULL;
- line++;
-
- while (isspace(*seek))
- seek++;
-
- if (*seek == '#' || *seek == '\0')
- continue;
-
- value = strchr(seek, '=');
- if (!value) {
- fail("config-file syntax error, skip line[%i]\n", line);
- continue;
- }
-
- value[0] = '\0';
- value++;
-
- while (isspace(value[0]))
- value++;
-
- len = strlen(seek);
- if (len == 0)
- continue;
- while (isspace(seek[len-1]))
- len--;
- seek[len] = '\0';
-
- len = strlen(value);
- if (len == 0)
- continue;
- while (isspace(value[len-1]))
- len--;
- value[len] = '\0';
-
- if (len == 0)
- continue;
-
- parse_config(&_param->bus, "bus", value, seek);
- parse_config(&_param->dimm, "dimm", value, seek);
- parse_config(&_param->region, "region", value, seek);
- parse_config(&_param->namespace, "namespace", value, seek);
- parse_config(&_monitor->dimm_event, "dimm-event", value, seek);
-
- if (!_monitor->log)
- parse_config(&_monitor->log, "log", value, seek);
- }
- fclose(f);
-out:
- free(buf);
- free(config_file);
- return rc;
-}
-
int cmd_monitor(int argc, const char **argv, struct ndctl_ctx *ctx)
{
const struct option options[] = {
@@ -601,6 +496,19 @@ int cmd_monitor(int argc, const char **argv, struct ndctl_ctx *ctx)
"ndctl monitor [<options>]",
NULL
};
+ const struct config configs[] = {
+ CONF_STR("core:bus", ¶m.bus, NULL),
+ CONF_STR("core:region", ¶m.region, NULL),
+ CONF_STR("core:dimm", ¶m.dimm, NULL),
+ CONF_STR("core:namespace", ¶m.namespace, NULL),
+ CONF_STR("monitor:bus", ¶m.bus, NULL),
+ CONF_STR("monitor:region", ¶m.region, NULL),
+ CONF_STR("monitor:dimm", ¶m.dimm, NULL),
+ CONF_STR("monitor:namespace", ¶m.namespace, NULL),
+ CONF_STR("monitor:dimm-event", &monitor.dimm_event, NULL),
+ //CONF_FILE("monitor:log", &monitor.log, NULL),
+ CONF_END(),
+ };
const char *prefix = "./";
struct util_filter_ctx fctx = { 0 };
struct monitor_filter_arg mfa = { 0 };
@@ -621,7 +529,10 @@ int cmd_monitor(int argc, const char **argv, struct ndctl_ctx *ctx)
else
monitor.ctx.log_priority = LOG_INFO;
- rc = read_config_file(ctx, &monitor, ¶m);
+ if (monitor.config_file)
+ rc = parse_configs(monitor.config_file, configs);
+ else
+ rc = parse_configs(NDCTL_CONF_FILE, configs);
if (rc)
goto out;
similarity index 82%
rename from ndctl/monitor.conf
rename to ndctl/ndctl.conf
@@ -1,14 +1,22 @@
-# This is the main ndctl monitor configuration file. It contains the
-# configuration directives that give ndctl monitor instructions.
-# You can change the configuration of ndctl monitor by editing this
+# This is the ndctl global configuration file. It contains the
+# configuration directives that give ndctl instructions.
+# You can change the configuration of ndctl by editing this
# file or using [--config-file=<file>] option to override this one.
-# The changed value will work after restart ndctl monitor service.
+# The changed value will work after restart ndctl services.
# In this file, lines starting with a hash (#) are comments.
# The configurations should follow <key> = <value> style.
# Multiple space-separated values are allowed, but except the following
# characters: : ? / \ % " ' $ & ! * { } [ ] ( ) = < > @
+[core]
+# The values in the [core] section work for all ndctl commands.
+# dimm = all
+# bus = all
+# region = all
+# namespace = all
+
+[monitor]
# The objects to monitor are filtered via dimm's name by setting key "dimm".
# If this value is different from the value of [--dimm=<value>] option,
# both of the values will work.