multipathd: implement "show config local"
authorMartin Wilck <mwilck@suse.com>
Fri, 8 Jun 2018 10:20:36 +0000 (12:20 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 21 Jun 2018 07:49:55 +0000 (09:49 +0200)
This new command is like "show config", but only those "device" sections are
dumped that match actually present devices in the system. Furthermore, empty
"multipath" sections for all detected multipath maps are dumped. This way,
the output is suitable as a template for creating "multipath.conf".

"multipathd show config local" should produce output that,
when used as configuration file, creates the same configuration
as was in place while it was dumped. Add a test for this to the
test suite.

Some minor differences in the configuration dump can't be avoided
because the ordering of hwtable entries may change (e.g. if a user
adds a device entry for a device which is also in the built-in hwtable,
these entries will be merged end the merged entry will be at the position
of the new entry, i.e. after all built-in hwtable entries), and multipath
sections are added to the configuration. But by all means, path
and mulitpath objects should have the same properties than before.

Signed-off-by: Martin Wilck <mwilck@suse.com>
multipathd/cli.c
multipathd/cli.h
multipathd/cli_handlers.c
multipathd/cli_handlers.h
multipathd/main.c
multipathd/multipathd.8

index d5ee4ff..a75afe3 100644 (file)
@@ -212,6 +212,7 @@ load_keys (void)
        r += add_key(keys, "setprkey", SETPRKEY, 0);
        r += add_key(keys, "unsetprkey", UNSETPRKEY, 0);
        r += add_key(keys, "key", KEY, 1);
+       r += add_key(keys, "local", LOCAL, 0);
 
 
        if (r) {
@@ -549,6 +550,7 @@ cli_init (void) {
        add_handler(LIST+MAP+FMT, NULL);
        add_handler(LIST+MAP+RAW+FMT, NULL);
        add_handler(LIST+CONFIG, NULL);
+       add_handler(LIST+CONFIG+LOCAL, NULL);
        add_handler(LIST+BLACKLIST, NULL);
        add_handler(LIST+DEVICES, NULL);
        add_handler(LIST+WILDCARDS, NULL);
index 021f25b..7cc7e4b 100644 (file)
@@ -44,6 +44,7 @@ enum {
        __SETPRKEY,
        __UNSETPRKEY,
        __KEY,
+       __LOCAL,
 };
 
 #define LIST           (1 << __LIST)
@@ -87,6 +88,7 @@ enum {
 #define SETPRKEY       (1ULL << __SETPRKEY)
 #define UNSETPRKEY     (1ULL << __UNSETPRKEY)
 #define KEY            (1ULL << __KEY)
+#define LOCAL          (1ULL << __LOCAL)
 
 #define INITIAL_REPLY_LEN      1200
 
index d4a2cb1..47830e1 100644 (file)
@@ -247,14 +247,15 @@ show_map_json (char ** r, int * len, struct multipath * mpp,
 }
 
 static int
-show_config (char ** r, int * len, const struct _vector *hwtable)
+show_config (char ** r, int * len, const struct _vector *hwtable,
+            const struct _vector *mpvec)
 {
        struct config *conf;
        char *reply;
 
        conf = get_multipath_config();
        pthread_cleanup_push(put_multipath_config, conf);
-       reply = snprint_config(conf, len, hwtable, NULL);
+       reply = snprint_config(conf, len, hwtable, mpvec);
        pthread_cleanup_pop(1);
        if (reply == NULL)
                return 1;
@@ -278,7 +279,28 @@ cli_list_config (void * v, char ** reply, int * len, void * data)
 {
        condlog(3, "list config (operator)");
 
-       return show_config(reply, len, NULL);
+       return show_config(reply, len, NULL, NULL);
+}
+
+static void v_free(void *x)
+{
+       vector_free(x);
+}
+
+int
+cli_list_config_local (void * v, char ** reply, int * len, void * data)
+{
+       struct vectors * vecs = (struct vectors *)data;
+       vector hwes;
+       int ret;
+
+       condlog(3, "list config local (operator)");
+
+       hwes = get_used_hwes(vecs->pathvec);
+       pthread_cleanup_push(v_free, hwes);
+       ret = show_config(reply, len, hwes, vecs->mpvec);
+       pthread_cleanup_pop(1);
+       return ret;
 }
 
 int
index 78a3a43..edbdf06 100644 (file)
@@ -16,6 +16,7 @@ int cli_list_maps_topology (void * v, char ** reply, int * len, void * data);
 int cli_list_map_json (void * v, char ** reply, int * len, void * data);
 int cli_list_maps_json (void * v, char ** reply, int * len, void * data);
 int cli_list_config (void * v, char ** reply, int * len, void * data);
+int cli_list_config_local (void * v, char ** reply, int * len, void * data);
 int cli_list_blacklist (void * v, char ** reply, int * len, void * data);
 int cli_list_devices (void * v, char ** reply, int * len, void * data);
 int cli_list_wildcards (void * v, char ** reply, int * len, void * data);
index 6b1e782..72f06b5 100644 (file)
@@ -1494,6 +1494,7 @@ uxlsnrloop (void * ap)
        set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt);
        set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt);
        set_handler_callback(LIST+MAP+JSON, cli_list_map_json);
+       set_handler_callback(LIST+CONFIG+LOCAL, cli_list_config_local);
        set_handler_callback(LIST+CONFIG, cli_list_config);
        set_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
        set_handler_callback(LIST+DEVICES, cli_list_devices);
index e78ac9e..94c3f97 100644 (file)
@@ -135,6 +135,11 @@ Show the currently used configuration, derived from default values and values
 specified within the configuration file \fI/etc/multipath.conf\fR.
 .
 .TP
+.B list|show config local
+Show the currently used configuration like \fIshow config\fR, but limiting
+the devices section to those devices that are actually present in the system.
+.
+.TP
 .B list|show blacklist
 Show the currently used blacklist rules, derived from default values and values
 specified within the configuration file \fI/etc/multipath.conf\fR.