Browse Source

Implement plugin's config

Serj Kalichev 1 year ago
parent
commit
f83feba9f2
3 changed files with 76 additions and 27 deletions
  1. 47 1
      src/plugin.c
  2. 21 24
      src/syms.c
  3. 8 2
      xml/sysrepo.xml

+ 47 - 1
src/plugin.c

@@ -7,6 +7,8 @@
 #include <assert.h>
 
 #include <faux/faux.h>
+#include <faux/str.h>
+#include <faux/ini.h>
 #include <klish/kplugin.h>
 #include <klish/kcontext.h>
 
@@ -19,6 +21,8 @@
 const uint8_t kplugin_sysrepo_major = KPLUGIN_MAJOR;
 const uint8_t kplugin_sysrepo_minor = KPLUGIN_MINOR;
 
+static uint32_t parse_plugin_conf(const char *conf, uint32_t default_flags);
+
 
 int kplugin_sysrepo_init(kcontext_t *context)
 {
@@ -80,7 +84,7 @@ int kplugin_sysrepo_init(kcontext_t *context)
 	udata = faux_zmalloc(sizeof(*udata));
 	assert(udata);
 	udata->path = NULL;
-	udata->flags = 0;
+	udata->flags = parse_plugin_conf(kplugin_conf(plugin), SRP_DEFAULT_PARSE_OPTS);
 	kplugin_set_udata(plugin, udata);
 
 	return 0;
@@ -142,3 +146,45 @@ void srp_udata_set_path(kcontext_t *context, faux_argv_t *path)
 		faux_argv_free(udata->path);
 	udata->path = path;
 }
+
+
+static uint32_t parse_plugin_conf(const char *conf, uint32_t default_flags)
+{
+	uint32_t flags = default_flags;
+	faux_ini_t *ini = NULL;
+	const char *val = NULL;
+
+	if (!conf)
+		return flags;
+
+	ini = faux_ini_new();
+	if (!faux_ini_parse_str(ini, conf)) {
+		faux_ini_free(ini);
+		return flags;
+	}
+
+	if ((val = faux_ini_find(ini, "JuniperLikeShow"))) {
+		if (faux_str_cmp(val, "y") == 0)
+			flags = flags | PPARSE_JUNIPER_SHOW;
+		else if (faux_str_cmp(val, "n") == 0)
+			flags = flags & (~(uint32_t)PPARSE_JUNIPER_SHOW);
+	}
+
+	if ((val = faux_ini_find(ini, "FirstKeyWithStatement"))) {
+		if (faux_str_cmp(val, "y") == 0)
+			flags = flags | PPARSE_FIRST_KEY_W_STMT;
+		else if (faux_str_cmp(val, "n") == 0)
+			flags = flags & (~(uint32_t)PPARSE_FIRST_KEY_W_STMT);
+	}
+
+	if ((val = faux_ini_find(ini, "MultiKeysWithStatement"))) {
+		if (faux_str_cmp(val, "y") == 0)
+			flags = flags | PPARSE_MULTI_KEYS_W_STMT;
+		else if (faux_str_cmp(val, "n") == 0)
+			flags = flags & (~(uint32_t)PPARSE_MULTI_KEYS_W_STMT);
+	}
+
+	faux_ini_free(ini);
+
+	return flags;
+}

+ 21 - 24
src/syms.c

@@ -75,7 +75,7 @@ static int srp_compl_or_help(kcontext_t *context, bool_t help)
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	entry_name = kentry_name(kcontext_candidate_entry(context));
 	args = param2argv(cur_path, kcontext_parent_pargv(context), entry_name);
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 	pline_print_completions(pline, help);
 	pline_free(pline);
@@ -145,7 +145,7 @@ static int srp_check_type(kcontext_t *context,
 	args = param2argv(cur_path, kcontext_parent_pargv(context), entry_name);
 	if (value)
 		faux_argv_add(args, value);
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid)
@@ -194,7 +194,7 @@ int srp_PLINE_INSERT_FROM(kcontext_t *context)
 
 
 static faux_argv_t *assemble_insert_to(sr_session_ctx_t *sess, const kpargv_t *pargv,
-	faux_argv_t *cur_path, const char *candidate_value)
+	faux_argv_t *cur_path, const char *candidate_value, uint32_t flags)
 {
 	faux_argv_t *args = NULL;
 	faux_argv_t *insert_to = NULL;
@@ -205,7 +205,7 @@ static faux_argv_t *assemble_insert_to(sr_session_ctx_t *sess, const kpargv_t *p
 	assert(sess);
 
 	args = param2argv(cur_path, pargv, "from_path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, flags);
 	expr = pline_current_expr(pline);
 	for (i = 0; i < (expr->args_num - expr->list_pos); i++) {
 		faux_argv_node_t *iter = faux_argv_iterr(args);
@@ -246,8 +246,8 @@ int srp_PLINE_INSERT_TO(kcontext_t *context)
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	value = kcontext_candidate_value(context);
 	args = assemble_insert_to(sess, kcontext_parent_pargv(context),
-		cur_path, value);
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+		cur_path, value, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid)
@@ -287,8 +287,8 @@ static int srp_compl_or_help_insert_to(kcontext_t *context, bool_t help)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = assemble_insert_to(sess, kcontext_parent_pargv(context),
-		cur_path, NULL);
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+		cur_path, NULL, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 	pline_print_completions(pline, help);
 	pline_free(pline);
@@ -334,7 +334,7 @@ int srp_set(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -398,7 +398,7 @@ int srp_del(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -456,7 +456,7 @@ int srp_edit(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 
 	if (pline->invalid) {
 		fprintf(stderr, "Invalid 'edit' request\n");
@@ -533,7 +533,7 @@ int srp_up(kcontext_t *context)
 
 		iter = faux_argv_iterr(cur_path);
 		faux_argv_del(cur_path, iter);
-		pline = pline_parse(sess, cur_path, SRP_DEFAULT_PARSE_OPTS);
+		pline = pline_parse(sess, cur_path, srp_udata_flags(context));
 		if (pline->invalid) {
 			pline_free(pline);
 			continue;
@@ -595,7 +595,7 @@ int srp_insert(kcontext_t *context)
 
 	// 'from' argument
 	insert_from = param2argv(cur_path, pargv, "from_path");
-	pline = pline_parse(sess, insert_from, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, insert_from, srp_udata_flags(context));
 	faux_argv_free(insert_from);
 
 	if (pline->invalid) {
@@ -631,8 +631,9 @@ int srp_insert(kcontext_t *context)
 
 	// 'to' argument
 	if ((SR_MOVE_BEFORE == position) || (SR_MOVE_AFTER == position)) {
-		insert_to = assemble_insert_to(sess, pargv, cur_path, NULL);
-		pline_to = pline_parse(sess, insert_to, SRP_DEFAULT_PARSE_OPTS);
+		insert_to = assemble_insert_to(sess, pargv, cur_path,
+			NULL, srp_udata_flags(context));
+		pline_to = pline_parse(sess, insert_to, srp_udata_flags(context));
 		faux_argv_free(insert_to);
 
 		if (pline_to->invalid) {
@@ -781,7 +782,7 @@ int srp_show_xml(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -854,7 +855,7 @@ static int show(kcontext_t *context, sr_datastore_t ds)
 
 	if (kpargv_find(kcontext_pargv(context), "path") || cur_path) {
 		args = param2argv(cur_path, kcontext_pargv(context), "path");
-		pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+		pline = pline_parse(sess, args, srp_udata_flags(context));
 		faux_argv_free(args);
 
 		if (pline->invalid) {
@@ -882,7 +883,7 @@ static int show(kcontext_t *context, sr_datastore_t ds)
 		xpath = expr->xpath;
 	}
 
-	show_xpath(sess, xpath, SRP_DEFAULT_PARSE_OPTS);
+	show_xpath(sess, xpath, srp_udata_flags(context));
 
 	ret = 0;
 err:
@@ -911,7 +912,7 @@ int srp_show_running(kcontext_t *context)
 		return -1;
 	}
 
-	show_xpath(sess, NULL, SRP_DEFAULT_PARSE_OPTS);
+	show_xpath(sess, NULL, srp_udata_flags(context));
 	sr_disconnect(conn);
 
 	return 0;
@@ -941,7 +942,7 @@ int srp_deactivate(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, SRP_DEFAULT_PARSE_OPTS);
+	pline = pline_parse(sess, args, srp_udata_flags(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -995,10 +996,6 @@ int srp_deactivate(kcontext_t *context)
 
 	sr_release_data(data);
 
-
-
-
-
 	ret = 0;
 err:
 	pline_free(pline);

+ 8 - 2
xml/sysrepo.xml

@@ -4,7 +4,11 @@
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema http://clish.sourceforge.net/XMLSchema/clish.xsd">
 
-<PLUGIN name="sysrepo"/>
+<PLUGIN name="sysrepo">
+	JuniperLikeShow = y
+	FirstKeyWithStatement = n
+	MultiKeysWithStatement = y
+</PLUGIN>
 
 
 <ENTRY name="PLINE_SET" purpose="ptype">
@@ -67,10 +71,12 @@
 
 	<ENTRY name="show" help="Show" mode="switch">
 		<ENTRY name="COMMAND" purpose="ptype" ref="/COMMAND"/>
+
 		<ENTRY name="configuration" help="Show running-config" mode="sequence">
 			<ENTRY name="SUBCOMMAND" purpose="ptype" ref="/SUBCOMMAND"/>
+			<ACTION sym="srp_show_running@sysrepo"/>
 		</ENTRY>
-		<ACTION sym="srp_show_running@sysrepo"/>
+
 	</ENTRY>
 
 </ENTRY>