Do not accept configuration with unknown sections/values if 'global.failfast' is...
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 11 Jun 2018 12:01:31 +0000 (14:01 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 11 Jun 2018 12:01:31 +0000 (14:01 +0200)
Set 'global.failfast' to true by default

include/oonf/libconfig/cfg_schema.h
src/libconfig/cfg_schema.c
src/libcore/oonf_cfg.c

index a2070ba..aa70a94 100644 (file)
@@ -1336,7 +1336,7 @@ EXPORT void cfg_schema_add(struct cfg_schema *schema);
 EXPORT void cfg_schema_add_section(struct cfg_schema *schema, struct cfg_schema_section *section);
 EXPORT void cfg_schema_remove_section(struct cfg_schema *schema, struct cfg_schema_section *section);
 
-EXPORT int cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_sections, struct autobuf *out);
+EXPORT int cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_elements, struct autobuf *out);
 
 EXPORT int cfg_schema_tobin(
   void *target, struct cfg_named_section *named, const struct cfg_schema_entry *entries, size_t count);
index f115ed6..86e6f63 100644 (file)
@@ -66,7 +66,7 @@
 #include <oonf/libconfig/cfg_validate.h>
 
 static bool _validate_cfg_entry(struct cfg_db *db, struct cfg_section_type *section, struct cfg_named_section *named,
-  struct cfg_entry *entry, const char *section_name, bool cleanup, struct autobuf *out);
+  struct cfg_entry *entry, const char *section_name, bool cleanup, bool ignore_unknown, struct autobuf *out);
 static bool _section_needs_default_named_one(struct cfg_section_type *type);
 static void _handle_named_section_change(struct cfg_schema_section *s_section, struct cfg_db *pre_change,
   struct cfg_db *post_change, const char *section_name, bool startup, struct cfg_named_section *pre_defnamed,
@@ -184,13 +184,12 @@ cfg_schema_remove_section(struct cfg_schema *schema, struct cfg_schema_section *
  * Validates a database with a schema
  * @param db pointer to configuration database
  * @param cleanup if true, bad values will be removed from the database
- * @param ignore_unknown_sections true if the validation should skip sections
- *   in the database that have no schema.
+ * @param ignore_unknown false to throw an error for sections or keys without schema.
  * @param out autobuffer for validation output
  * @return 0 if validation found no problems, -1 otherwise
  */
 int
-cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_sections, struct autobuf *out) {
+cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown, struct autobuf *out) {
   char section_name[256];
   struct cfg_section_type *section, *section_it;
   struct cfg_named_section *named, *named_it;
@@ -214,7 +213,7 @@ cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_section
     schema_section_first = avl_find_element(&db->schema->sections, section->type, schema_section_first, _section_node);
 
     if (schema_section_first == NULL) {
-      if (ignore_unknown_sections) {
+      if (ignore_unknown) {
         continue;
       }
 
@@ -275,7 +274,7 @@ cfg_schema_validate(struct cfg_db *db, bool cleanup, bool ignore_unknown_section
 
         /* check for bad values */
         CFG_FOR_ALL_ENTRIES(named, entry, entry_it) {
-          warning = _validate_cfg_entry(db, section, named, entry, section_name, cleanup, out);
+          warning = _validate_cfg_entry(db, section, named, entry, section_name, cleanup, ignore_unknown, out);
           error |= warning;
         }
 
@@ -975,24 +974,27 @@ _handle_db_changes(struct cfg_db *pre_change, struct cfg_db *post_change, bool s
  * @param entry pointer to configuration entry
  * @param section_name name of section including type (for debug output)
  * @param cleanup true if bad _entries should be removed
+ * @param ignore_unknown true to throw an error for keys without a schema
  * @param out error output buffer
  * @return true if an error happened, false otherwise
  */
 static bool
 _validate_cfg_entry(struct cfg_db *db, struct cfg_section_type *section, struct cfg_named_section *named,
-  struct cfg_entry *entry, const char *section_name, bool cleanup, struct autobuf *out) {
+  struct cfg_entry *entry, const char *section_name, bool cleanup, bool ignore_unknown, struct autobuf *out) {
   struct cfg_schema_entry *schema_entry, *s_entry_it;
   struct cfg_schema_entry_key key;
-  bool warning, do_remove;
+  bool warning, do_remove, not_found;
   char *ptr1;
 
   warning = false;
+  not_found = true;
   ptr1 = NULL;
 
   key.type = section->type;
   key.entry = entry->name;
 
   avl_for_each_elements_with_key(&db->schema->entries, schema_entry, _node, s_entry_it, &key) {
+    not_found = false;
     if (schema_entry->cb_validate == NULL) {
       continue;
     }
@@ -1025,6 +1027,12 @@ _validate_cfg_entry(struct cfg_db *db, struct cfg_section_type *section, struct
       cfg_db_remove_entry(db, section->type, named->name, entry->name);
     }
   }
+
+  if (not_found && !ignore_unknown) {
+    cfg_append_printable_line(out,
+      "Entry '%s' in section %s is unknown", entry->name, section_name);
+    return true;
+  }
   return warning;
 }
 
index efc9d0a..c31a4e1 100644 (file)
@@ -85,8 +85,8 @@ static int _argc;
 /* define global configuration template */
 static struct cfg_schema_entry _global_entries[] = {
   [IDX_FORK] = CFG_MAP_BOOL(oonf_config_global, fork, "fork", "no", "Set to true to fork daemon into background."),
-  [IDX_FAILFAST] = CFG_MAP_BOOL(oonf_config_global, failfast, "failfast", "no",
-    "Set to true to stop daemon startup if at least one plugin doesn't load."),
+  [IDX_FAILFAST] = CFG_MAP_BOOL(oonf_config_global, failfast, "failfast", "yes",
+    "Set to true to stop daemon startup if at least one plugin doesn't load or a configuration entry is unknown."),
   [IDX_PIDFILE] =
     CFG_MAP_STRING(oonf_config_global, pidfile, "pidfile", "", "Write the process id of the forced child into a file"),
   [IDX_LOCKFILE] = CFG_MAP_STRING(oonf_config_global, lockfile, "lockfile", "",
@@ -364,7 +364,7 @@ oonf_cfg_apply(void) {
 
   /*** phase 2: check configuration and apply it ***/
   /* validate configuration data */
-  if (cfg_schema_validate(_oonf_raw_db, false, true, &log)) {
+  if (cfg_schema_validate(_oonf_raw_db, false, !config_global.failfast, &log)) {
     OONF_WARN(LOG_CONFIG, "Configuration validation failed: %s", abuf_getptr(&log));
     goto apply_failed;
   }