Add "config query" command to remotecontrol plugin to query a configuration value...
authorHenning Rogge <hrogge@gmail.com>
Sat, 12 May 2018 16:37:35 +0000 (18:37 +0200)
committerHenning Rogge <hrogge@gmail.com>
Sat, 12 May 2018 16:37:35 +0000 (18:37 +0200)
include/oonf/libconfig/cfg_cmd.h
src/generic/remotecontrol/remotecontrol.c
src/libconfig/cfg_cmd.c

index d4ace0c..670f137 100644 (file)
@@ -57,6 +57,7 @@ EXPORT int cfg_cmd_handle_set(struct cfg_instance *instance, struct cfg_db *db,
 EXPORT int cfg_cmd_handle_remove(
   struct cfg_instance *instance, struct cfg_db *db, const char *arg, struct autobuf *log);
 EXPORT int cfg_cmd_handle_get(struct cfg_instance *instance, struct cfg_db *db, const char *arg, struct autobuf *log);
+EXPORT int cfg_cmd_handle_query(struct cfg_instance *instance, struct cfg_db *db, const char *arg, struct autobuf *log);
 EXPORT int cfg_cmd_handle_load(struct cfg_instance *instance, struct cfg_db *db, const char *arg, struct autobuf *log);
 EXPORT int cfg_cmd_handle_save(struct cfg_instance *instance, struct cfg_db *db, const char *arg, struct autobuf *log);
 EXPORT int cfg_cmd_handle_schema(struct cfg_db *db, const char *arg, struct autobuf *log);
index 4254552..edfc272 100644 (file)
@@ -178,7 +178,9 @@ static struct oonf_telnet_command _telnet_cmds[] = {
     "\"config get\":                                      Show all section types in database\n"
     "\"config get <section_type>.\":                      Show all named sections of a certain type\n"
     "\"config get <section_type>.<key>\":                 Show the value(s) of a key in an unnamed section\n"
-    "\"config get <section_type>[<name>].<key>\":         Show the value(s) of a key in a named section\n",
+    "\"config get <section_type>[<name>].<key>\":         Show the value(s) of a key in a named section\n"
+    "\"config query <section_type>.<key>\":               Show the value(s) of a key in an unnamed section, show default value if no data available\n"
+    "\"config query <section_type>[<name>].<key>\":       Show the value(s) of a key in a named section, show default value if no data available\n",
     .acl = &_remotecontrol_config.acl),
   TELNET_CMD("route", _cb_handle_route,
     "\"route add [src-ip <src-ip>] [gw <gateway ip>] dst <destination prefix> [src-prefix <src-prefix]\n"
@@ -422,6 +424,9 @@ _cb_handle_config(struct oonf_telnet_data *data) {
   else if ((next = str_hasnextword(data->parameter, "get"))) {
     result = cfg_cmd_handle_get(oonf_cfg_get_instance(), oonf_cfg_get_rawdb(), next, data->out);
   }
+  else if ((next = str_hasnextword(data->parameter, "query"))) {
+    result = cfg_cmd_handle_query(oonf_cfg_get_instance(), oonf_cfg_get_rawdb(), next, data->out);
+  }
   else if ((next = str_hasnextword(data->parameter, "load"))) {
     result = cfg_cmd_handle_load(oonf_cfg_get_instance(), oonf_cfg_get_rawdb(), next, data->out);
   }
index 4600b1b..2c8227f 100644 (file)
@@ -285,6 +285,62 @@ handle_get_cleanup:
 }
 
 /**
+ * Implements the 'query' command for the command line
+ * @param instance pointer to cfg_instance
+ * @param db pointer to cfg_db to be modified
+ * @param arg argument of command
+ * @param log pointer for logging
+ * @return 0 if succeeded, -1 otherwise
+ */
+int
+cfg_cmd_handle_query(
+  struct cfg_instance *instance __attribute__((unused)), struct cfg_db *db, const char *arg, struct autobuf *log) {
+  struct _parsed_argument pa;
+  const struct const_strarray *array;
+  const char *tmp;
+  char *arg_copy;
+  int result;
+
+  if (arg == NULL || *arg == 0) {
+    cfg_append_printable_line(log, "Query needs section and key, but no value: %s", arg);
+    return 0;
+  }
+
+  arg_copy = strdup(arg);
+  if (!arg_copy) {
+    return -1;
+  }
+
+  /* prepare for cleanup */
+  result = -1;
+
+  if (_do_parse_arg(arg_copy, &pa, log)) {
+    goto handle_get_cleanup;
+  }
+
+  if (pa.entry_key == NULL || pa.entry_value != NULL) {
+    cfg_append_printable_line(log, "Query needs section and key, but no value: %s", arg);
+    goto handle_get_cleanup;
+  }
+
+  array = cfg_db_get_entry_value(db, pa.section_type, pa.section_name, pa.entry_key);
+  if (array) {
+    cfg_append_printable_line(log, "Key '%s' has value:", arg);
+    strarray_for_each_element(array, tmp) {
+      cfg_append_printable_line(log, "%s", tmp);
+    }
+    result = 0;
+  }
+  else {
+    cfg_append_printable_line(log, "Key '%s' has no value:", arg);
+  }
+
+handle_get_cleanup:
+  free(arg_copy);
+  return result;
+}
+
+/**
  * Implements the 'load' command for the command line
  * @param instance pointer to cfg_instance
  * @param db pointer to cfg_db to be modified