diff --git a/CHANGELOG.md b/CHANGELOG.md index 40929bda..f359ccad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,14 @@ Expected: June 2024 ### Features +* CLI configurable format: [Default format should be configurable](https://github.com/clicon/clixon-controller/issues/87) + * New `clixon-config@2024-04-01.yang` revision - * Added options: `CLICON_NETCONF_DUPLICATE_ALLOW` - Disable duplicate check in NETCONF messages + * Added options: + - `CLICON_NETCONF_DUPLICATE_ALLOW` - Disable duplicate check in NETCONF messages + - `CLICON_CLI_OUTPUT_FORMAT` - Default CLI output format * New `clixon-lib@2024-04-01.yang` revision + - Added: Default format ## 7.0.1 3 April 2024 diff --git a/apps/cli/cli_common.c b/apps/cli/cli_common.c index c525b06e..aa5ea6d2 100644 --- a/apps/cli/cli_common.c +++ b/apps/cli/cli_common.c @@ -926,6 +926,7 @@ cli_validate(clixon_handle h, * @param[in] db2 Name of second datastrore * @retval 0 OK * @retval -1 Error + * @note JSON and CLI are NYI */ int compare_db_names(clixon_handle h, @@ -975,7 +976,7 @@ compare_db_names(clixon_handle h, goto done; cligen_output(stdout, "%s", cbuf_get(cb)); break; - case FORMAT_JSON: + case FORMAT_JSON: /* XXX NYI */ case FORMAT_CLI: if (clixon_compare_xmls(xc1, xc2, format) < 0) /* astext? */ goto done; @@ -1023,6 +1024,14 @@ compare_dbs(clixon_handle h, clixon_err(OE_XML, 0, "format not found %s", formatstr); goto done; } + /* Special default format handling */ + if (format == FORMAT_DEFAULT){ + formatstr = clicon_option_str(h, "CLICON_CLI_OUTPUT_FORMAT"); + if ((int)(format = format_str2int(formatstr)) < 0){ + clixon_err(OE_PLUGIN, 0, "Not valid format: %s", formatstr); + goto done; + } + } if (compare_db_names(h, format, db1, db2) < 0) goto done; retval = 0; @@ -1318,6 +1327,8 @@ save_config_file(clixon_handle h, goto done; fprintf(f, "]]>]]>\n"); break; + default: + break; } /* switch */ retval = 0; /* Fall through */ diff --git a/apps/cli/cli_pipe.c b/apps/cli/cli_pipe.c index 5e7cbb43..9c653a2b 100644 --- a/apps/cli/cli_pipe.c +++ b/apps/cli/cli_pipe.c @@ -286,7 +286,7 @@ pipe_showas_fn(clixon_handle h, goto done; } if (cvec_len(argv) > argc){ - if (cli_show_option_format(argv, argc++, &format) < 0) + if (cli_show_option_format(h, argv, argc++, &format) < 0) goto done; } if (cvec_len(argv) > argc){ diff --git a/apps/cli/cli_show.c b/apps/cli/cli_show.c index baae3ce4..bc457702 100644 --- a/apps/cli/cli_show.c +++ b/apps/cli/cli_show.c @@ -611,13 +611,13 @@ cli_show_common(clixon_handle h, int skiptop ) { - int retval = -1; - cxobj *xt = NULL; - cxobj *xerr; - cxobj **vec = NULL; - size_t veclen; - cxobj *xp; - int i; + int retval = -1; + cxobj *xt = NULL; + cxobj *xerr; + cxobj **vec = NULL; + size_t veclen; + cxobj *xp; + int i; if (state && strcmp(db, "running") != 0){ clixon_err(OE_FATAL, 0, "Show state only for running database, not %s", db); @@ -713,6 +713,7 @@ done: /*! Common internal parse cli show format option * + * @param[in] h Clixon handle * @param[in] argv String vector: [] * @param[in] argc Index into argv * @param[out] format Output format @@ -720,18 +721,29 @@ done: * @retval -1 Error */ int -cli_show_option_format(cvec *argv, +cli_show_option_format(clixon_handle h, + cvec *argv, int argc, - enum format_enum *format) + enum format_enum *formatp) { - int retval = -1; - char *formatstr; + int retval = -1; + enum format_enum format = FORMAT_XML; + char *formatstr; formatstr = cv_string_get(cvec_i(argv, argc)); - if ((int)(*format = format_str2int(formatstr)) < 0){ + if ((int)(format = format_str2int(formatstr)) < 0){ clixon_err(OE_PLUGIN, 0, "Not valid format: %s", formatstr); goto done; } + /* Special default format handling */ + if (format == FORMAT_DEFAULT){ + formatstr = clicon_option_str(h, "CLICON_CLI_OUTPUT_FORMAT"); + if ((int)(format = format_str2int(formatstr)) < 0){ + clixon_err(OE_PLUGIN, 0, "Not valid format: %s", formatstr); + goto done; + } + } + *formatp = format; retval = 0; done: return retval; @@ -774,7 +786,7 @@ cli_show_option_bool(cvec *argv, /*! Common internal parse cli show with-default option * - * Ddefault modes accorsing to RFC6243 + three extra modes based on report-all-tagged: + * Default modes accorsing to RFC6243 + three extra modes based on report-all-tagged: * 1) NULL * 2) report-all-tagged-default Strip "default" attribute (=report-all) * 3) report-all-tagged-strip Strip "default" attribute and all nodes tagged with it (=trim) @@ -878,7 +890,7 @@ cli_show_config(clixon_handle h, } dbname = cv_string_get(cvec_i(argv, argc++)); if (cvec_len(argv) > argc) - if (cli_show_option_format(argv, argc++, &format) < 0) + if (cli_show_option_format(h, argv, argc++, &format) < 0) goto done; if (cvec_len(argv) > argc) xpath = cv_string_get(cvec_i(argv, argc++)); @@ -1062,7 +1074,7 @@ cli_show_auto(clixon_handle h, else dbname = str; if (cvec_len(argv) > argc) - if (cli_show_option_format(argv, argc++, &format) < 0) + if (cli_show_option_format(h, argv, argc++, &format) < 0) goto done; if (cvec_len(argv) > argc){ if (cli_show_option_bool(argv, argc++, &pretty) < 0) @@ -1194,7 +1206,7 @@ cli_show_auto_mode(clixon_handle h, } dbname = cv_string_get(cvec_i(argv, argc++)); if (cvec_len(argv) > argc) - if (cli_show_option_format(argv, argc++, &format) < 0) + if (cli_show_option_format(h, argv, argc++, &format) < 0) goto done; if (cvec_len(argv) > argc){ if (cli_show_option_bool(argv, argc++, &pretty) < 0) @@ -1868,3 +1880,60 @@ cli_show_statistics(clixon_handle h, cbuf_free(cb); return retval; } + +/*! CLI set default output format + * + * @param[in] h Clixon handle + * @param[in] cvv Vector of cli string and instantiated variables, expected: 1: format + * @param[in] argv Vector, expected NULL + * @retval 0 OK + * @retval -1 Error + * Format of argv: + * Generated + */ +int +cli_format_set(clixon_handle h, + cvec *cvv, + cvec *argv) +{ + int retval = -1; + cg_var *cv; + char *str; + enum format_enum fmt = FORMAT_XML; + + if ((cv = cvec_find(cvv, "fmt")) == NULL){ + clixon_err(OE_PLUGIN, EINVAL, "Requires one variable to be "); + goto done; + } + str = cv_string_get(cv); + if ((fmt = format_str2int(str)) < 0){ + clixon_err(OE_PLUGIN, EINVAL, "Invalid format: %s", str); + goto done; + } + /* Alt make a int option/data */ + retval = clicon_option_str_set(h, "CLICON_CLI_OUTPUT_FORMAT", str); + done: + return retval; +} + +/*! CLI set default output format + * + * @param[in] h Clixon handle + * @param[in] cvv Vector of cli string and instantiated variables, expected: 1: format + * @param[in] argv Vector, expected NULL + * @retval 0 OK + * @retval -1 Error + * Format of argv: + * Generated + */ +int +cli_format_show(clixon_handle h, + cvec *cvv, + cvec *argv) +{ + char *str; + + str = clicon_option_str(h, "CLICON_CLI_OUTPUT_FORMAT"); + cligen_output(stderr, "%s\n", str); + return 0; +} diff --git a/apps/cli/clixon_cli_api.h b/apps/cli/clixon_cli_api.h index 31156cac..c6de2631 100644 --- a/apps/cli/clixon_cli_api.h +++ b/apps/cli/clixon_cli_api.h @@ -128,7 +128,7 @@ int cli_show_common(clixon_handle h, char *db, enum format_enum format, int pret int show_yang(clixon_handle h, cvec *vars, cvec *argv); int show_conf_xpath(clixon_handle h, cvec *cvv, cvec *argv); -int cli_show_option_format(cvec *argv, int argc, enum format_enum *format); +int cli_show_option_format(clixon_handle h, cvec *argv, int argc, enum format_enum *format); int cli_show_option_bool(cvec *argv, int argc, int *result); int cli_show_option_withdefault(cvec *argv, int argc, char **withdefault, char **extdefault); int cli_show_config(clixon_handle h, cvec *cvv, cvec *argv); diff --git a/example/main/README.md b/example/main/README.md index 86f6fd05..82cca145 100644 --- a/example/main/README.md +++ b/example/main/README.md @@ -104,7 +104,7 @@ cli> set table parameter a ? cli> set table parameter a value 42 cli> validate cli> commit -cli> show configuration xml +cli> show configuration a diff --git a/example/main/example_cli.cli b/example/main/example_cli.cli index 719d7500..185ace15 100644 --- a/example/main/example_cli.cli +++ b/example/main/example_cli.cli @@ -41,6 +41,9 @@ edit @datamodelmode, cli_auto_edit("basemodel"); up, cli_auto_up("basemodel"); top, cli_auto_top("basemodel"); set @datamodel, cli_auto_set(); +set default { + format("Set default output format") ("CLI output format"), cli_format_set(); +} merge @datamodel, cli_auto_merge(); create @datamodel, cli_auto_create(); delete("Delete a configuration item") { @@ -77,18 +80,17 @@ copy("Copy and create a new object") { discard("Discard edits (rollback 0)"), discard_changes(); show("Show a particular state of the system"){ + default{ + format("Show default output format"), cli_format_show(); + } auto("Show expand x"){ - xml @datamodelshow, cli_show_auto("candidate", "xml", true, false, "report-all"); - text @datamodelshow, cli_show_auto("candidate", "text", true, false, "report-all"); - json @datamodelshow, cli_show_auto("candidate", "json", true, false, "report-all"); - netconf @datamodelshow, cli_show_auto("candidate", "netconf", true, false, "report-all"); - cli @datamodelshow, cli_show_auto("candidate", "cli", true, false, "report-all", "set "); + @datamodelshow, cli_show_auto("candidate", "default", true, false, "report-all"); } xpath("Show configuration") ("XPATH expression") [("Namespace")], show_conf_xpath("candidate"); version("Show version"), cli_show_version("candidate", "text", "/"); options("Show clixon options"), cli_show_options(); - compare("Compare candidate and running databases"), compare_dbs("running", "candidate", "xml");{ + compare("Compare candidate and running databases"), compare_dbs("running", "candidate", "default");{ xml("Show comparison in xml"), compare_dbs("running", "candidate", "xml"); text("Show comparison in text"), compare_dbs("running", "candidate", "text"); } @@ -98,32 +100,25 @@ show("Show a particular state of the system"){ text, cli_pagination("use xpath var", "es", "http://example.com/ns/example-social", "text", "10"); json, cli_pagination("use xpath var", "es", "http://example.com/ns/example-social", "json", "10"); } - configuration("Show configuration"), cli_show_auto_mode("candidate", "text", true, false);{ - xml("Show configuration as XML"), cli_show_auto_mode("candidate", "xml", true, false);{ - default("With-default mode"){ - report-all, cli_show_auto_mode("candidate", "xml", true, false, "report-all"); - trim, cli_show_auto_mode("candidate", "xml", true, false, "trim"); - explicit, cli_show_auto_mode("candidate", "xml", true, false, "explicit"); - report-all-tagged, cli_show_auto_mode("candidate", "xml", true, false, "report-all-tagged"); - report-all-tagged-default, cli_show_auto_mode("candidate", "xml", true, false, "report-all-tagged-default"); - report-all-tagged-strip, cli_show_auto_mode("candidate", "xml", true, false, "report-all-tagged-strip"); - } - } - cli("Show configuration as CLI commands"), cli_show_auto_mode("candidate", "cli", true, false, "explicit", "set "); - netconf("Show configuration as netconf edit-config operation"), cli_show_auto_mode("candidate", "netconf", true, false); - text("Show configuration as text"), cli_show_auto_mode("candidate", "text", true, false); - json("Show configuration as JSON"), cli_show_auto_mode("candidate", "json", true, false); - + configuration("Show configuration"), cli_show_auto_mode("candidate", "default", true, false, "explicit", "set ");{ + default("With-default mode"){ + report-all, cli_show_auto_mode("candidate", "default", true, false, "report-all"); + trim, cli_show_auto_mode("candidate", "default", true, false, "trim"); + explicit, cli_show_auto_mode("candidate", "default", true, false, "explicit"); + report-all-tagged, cli_show_auto_mode("candidate", "default", true, false, "report-all-tagged"); + report-all-tagged-default, cli_show_auto_mode("candidate", "default", true, false, "report-all-tagged-default"); + report-all-tagged-strip, cli_show_auto_mode("candidate", "default", true, false, "report-all-tagged-strip"); + } } - state("Show configuration and state"), cli_show_auto_mode("running", "text", true, true); { - xml("Show configuration and state as XML"), cli_show_auto_mode("running", "xml", true, true);{ + state("Show configuration and state"), cli_show_auto_mode("running", "default", true, true); { + xml("Show configuration and state as XML"), cli_show_auto_mode("running", "default", true, true);{ default("With-default mode"){ - report-all, cli_show_auto_mode("running", "xml", true, true, "report-all"); - trim, cli_show_auto_mode("running", "xml", true, true, "trim"); - explicit, cli_show_auto_mode("running", "xml", true, true, "explicit"); - report-all-tagged, cli_show_auto_mode("running", "xml", true, true, "report-all-tagged"); - report-all-tagged-default, cli_show_auto_mode("running", "xml", true, true, "report-all-tagged-default"); - report-all-tagged-strip, cli_show_auto_mode("running", "xml", true, true, "report-all-tagged-strip"); + report-all, cli_show_auto_mode("running", "default", true, true, "report-all"); + trim, cli_show_auto_mode("running", "default", true, true, "trim"); + explicit, cli_show_auto_mode("running", "default", true, true, "explicit"); + report-all-tagged, cli_show_auto_mode("running", "default", true, true, "report-all-tagged"); + report-all-tagged-default, cli_show_auto_mode("running", "default", true, true, "report-all-tagged-default"); + report-all-tagged-strip, cli_show_auto_mode("running", "default", true, true, "report-all-tagged-strip"); } } } diff --git a/lib/clixon/clixon_xml.h b/lib/clixon/clixon_xml.h index 6160f6ed..35455c60 100644 --- a/lib/clixon/clixon_xml.h +++ b/lib/clixon/clixon_xml.h @@ -182,14 +182,15 @@ typedef int (xml_applyfn_t)(cxobj *x, void *arg); typedef struct clixon_xml_vec clixon_xvec; /* struct defined in clicon_xml_vec.c */ /* Alternative tree formats, - * @see format_int2str, format_str2int + * @see format_int2str, format_str2int, datastore_format in clixon-lib.yang */ enum format_enum{ FORMAT_XML, FORMAT_JSON, FORMAT_TEXT, FORMAT_CLI, - FORMAT_NETCONF + FORMAT_NETCONF, + FORMAT_DEFAULT }; /* diff --git a/lib/src/clixon_proto.c b/lib/src/clixon_proto.c index 2a193a7c..892f0434 100644 --- a/lib/src/clixon_proto.c +++ b/lib/src/clixon_proto.c @@ -68,6 +68,7 @@ #include "clixon_queue.h" #include "clixon_hash.h" #include "clixon_handle.h" +#include "clixon_string.h" #include "clixon_event.h" #include "clixon_yang.h" #include "clixon_xml.h" @@ -83,24 +84,18 @@ static int _atomicio_sig = 0; -/*! Formats (showas) derived from XML - */ -struct formatvec{ - char *fv_str; - int fv_int; -}; - /*! Translate between int and string of tree formats * - * @see eum format_enum + * @see enum format_enum */ -static struct formatvec _FORMATS[] = { +static const map_str2int _FORMATS[] = { {"xml", FORMAT_XML}, {"text", FORMAT_TEXT}, {"json", FORMAT_JSON}, {"cli", FORMAT_CLI}, {"netconf", FORMAT_NETCONF}, - {NULL, -1} + {"default", FORMAT_DEFAULT}, + {NULL, -1} }; /*! Translate from numeric format to string representation @@ -111,12 +106,7 @@ static struct formatvec _FORMATS[] = { char * format_int2str(enum format_enum showas) { - struct formatvec *fv; - - for (fv=_FORMATS; fv->fv_int != -1; fv++) - if (fv->fv_int == showas) - break; - return fv?(fv->fv_str?fv->fv_str:"unknown"):"unknown"; + return (char*)clicon_int2str(_FORMATS, showas); } /*! Translate from string to numeric format representation @@ -127,12 +117,7 @@ format_int2str(enum format_enum showas) enum format_enum format_str2int(char *str) { - struct formatvec *fv; - - for (fv=_FORMATS; fv->fv_int != -1; fv++) - if (strcmp(fv->fv_str, str) == 0) - break; - return fv?fv->fv_int:-1; + return clicon_str2int(_FORMATS, str); } /*! Given family, addr str, port, return sockaddr and length diff --git a/test/nacm.sh b/test/nacm.sh index 46f5aada..12def02c 100755 --- a/test/nacm.sh +++ b/test/nacm.sh @@ -4,6 +4,8 @@ if [ $(whoami) != root ]; then EXTRAUSER="$(whoami)" +else + EXTRAUSER="" fi # Three groups from RFC8341 A.1 (admin extended with $USER) diff --git a/test/test_augment_default.sh b/test/test_augment_default.sh index 0b8b30ac..ed8a43a5 100755 --- a/test/test_augment_default.sh +++ b/test/test_augment_default.sh @@ -25,6 +25,7 @@ cat < $cfg /usr/local/var/run/$APPNAME.pidfile $dir true + xml EOF @@ -89,19 +90,19 @@ new "wait backend" wait_backend new "cli show config startup" -expectpart "$($clixon_cli -1 -f $cfg -l o show config xml default report-all)" 0 '
' '' 'true' +expectpart "$($clixon_cli -1 -f $cfg -l o show config default report-all)" 0 '
' '' 'true' new "cli delete map name" expectpart "$($clixon_cli -1 -f $cfg -l o delete table map name me)" 0 "" new "cli show config deleted" -expectpart "$($clixon_cli -1 -f $cfg -l o show config xml default report-all)" 0 '
' '' 'true' +expectpart "$($clixon_cli -1 -f $cfg -l o show config default report-all)" 0 '
' '' 'true' new "cli set map name" expectpart "$($clixon_cli -1 -f $cfg -l o set table map name x)" 0 "" new "cli show config set" -expectpart "$($clixon_cli -1 -f $cfg -l o show config xml default report-all)" 0 '
' '' 'true' +expectpart "$($clixon_cli -1 -f $cfg -l o show config default report-all)" 0 '
' '' 'true' if [ $BE -ne 0 ]; then new "Kill backend" diff --git a/test/test_cli_varonly.sh b/test/test_cli_varonly.sh index 890c05fa..53e7bfdf 100755 --- a/test/test_cli_varonly.sh +++ b/test/test_cli_varonly.sh @@ -28,6 +28,7 @@ cat < $cfg /usr/local/var/run/$APPNAME.sock /usr/local/var/run/$APPNAME.pidfile $dir + cli EOF @@ -73,10 +74,10 @@ new "cli set 43 exclude keys" expectpart "$($clixon_cli -1 -o CLICON_CLI_VARONLY=1 -f $cfg set table parameter 43)" 0 "^$" new "cli show 42 43 include" -expectpart "$($clixon_cli -1 -o CLICON_CLI_VARONLY=0 -f $cfg show conf cli)" 0 "set table parameter 42" "set table parameter 43" +expectpart "$($clixon_cli -1 -o CLICON_CLI_VARONLY=0 -f $cfg show conf)" 0 "set table parameter 42" "set table parameter 43" new "cli show 42 43 exclude" -expectpart "$($clixon_cli -1 -o CLICON_CLI_VARONLY=1 -f $cfg show conf cli)" 0 "set table parameter 42" "set table parameter 43" +expectpart "$($clixon_cli -1 -o CLICON_CLI_VARONLY=1 -f $cfg show conf)" 0 "set table parameter 42" "set table parameter 43" new "cli expand include keys" expectpart "$(echo "set table parameter ?" | $clixon_cli -o CLICON_CLI_VARONLY=0 -f $cfg 2>&1)" 0 42 43 diff --git a/test/test_nacm_ext.sh b/test/test_nacm_ext.sh index 7b51bae7..2be56964 100755 --- a/test/test_nacm_ext.sh +++ b/test/test_nacm_ext.sh @@ -38,6 +38,7 @@ cat < $cfg external $nacmfile none + text $RESTCONFIG EOF diff --git a/test/test_netconf.sh b/test/test_netconf.sh index a8576d98..693c334d 100755 --- a/test/test_netconf.sh +++ b/test/test_netconf.sh @@ -37,6 +37,7 @@ cat < $cfg /usr/local/var/run/$APPNAME.pidfile /usr/local/var/$APPNAME true + cli EOF @@ -301,7 +302,7 @@ new "netconf get replaced config (report-all)" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "report-all" "" "eth&t<>trueeth1ex:ethtrueeth2ex:ethtrue" new "cli show configuration eth& - encoding tests" -expectpart "$($clixon_cli -1 -f $cfg show conf cli)" 0 "interfaces interface eth& type t<> +expectpart "$($clixon_cli -1 -f $cfg show conf)" 0 "interfaces interface eth& type t<> interfaces interface eth& enabled true" new "netconf edit CDATA" diff --git a/test/test_type.sh b/test/test_type.sh index 211e9c1b..b39ff90c 100755 --- a/test/test_type.sh +++ b/test/test_type.sh @@ -240,6 +240,7 @@ function testrun(){ /usr/local/var/run/$APPNAME.pidfile /usr/local/var/$APPNAME $format + text ${AUTOCLI} EOF diff --git a/test/test_yang_anydata.sh b/test/test_yang_anydata.sh index 8b04b947..20aa416a 100755 --- a/test/test_yang_anydata.sh +++ b/test/test_yang_anydata.sh @@ -147,6 +147,7 @@ function testrun() $unknown false false + xml $F $RESTCONFIG @@ -209,7 +210,7 @@ EOF # Add other functions, (based on previous errors), eg cli show config, cli commit. new "cli show configuration" - expectpart "$($clixon_cli -1 -f $cfg show conf xml)" 0 "42" + expectpart "$($clixon_cli -1 -f $cfg show conf)" 0 "42" new "cli commit" expectpart "$($clixon_cli -1 -f $cfg commit)" 0 "^$" diff --git a/yang/clixon/clixon-config@2024-04-01.yang b/yang/clixon/clixon-config@2024-04-01.yang index ee9fb06f..1056faaf 100644 --- a/yang/clixon/clixon-config@2024-04-01.yang +++ b/yang/clixon/clixon-config@2024-04-01.yang @@ -53,6 +53,7 @@ module clixon-config { description "Added options: CLICON_NETCONF_DUPLICATE_ALLOW - Disable duplicate check in NETCONF messages. + CLICON_CLI_OUTPUT_FORMAT - Default CLI output format Released in Clixon 7.1"; } revision 2024-01-01 { @@ -879,6 +880,12 @@ module clixon-config { While setting this value makes sense for adding new values, it makes less sense for deleting."; } + leaf CLICON_CLI_OUTPUT_FORMAT { + type cl:datastore_format; + default xml; + description + "Default CLI output format."; + } leaf CLICON_SOCK_FAMILY { type socket_address_family; default UNIX; diff --git a/yang/clixon/clixon-lib@2024-04-01.yang b/yang/clixon/clixon-lib@2024-04-01.yang index 21ba5072..ac5d977a 100644 --- a/yang/clixon/clixon-lib@2024-04-01.yang +++ b/yang/clixon/clixon-lib@2024-04-01.yang @@ -70,7 +70,8 @@ module clixon-lib { revision 2024-04-01 { description - "Released in Clixon 7.1"; + "Added: Default format + Released in Clixon 7.1"; } revision 2024-01-01 { description @@ -179,6 +180,9 @@ module clixon-lib { enum cli{ description "CLI format"; } + enum default{ + description "Default format"; + } } } identity snmp {