summaryrefslogtreecommitdiffstats
path: root/libs/ini-config
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2021-01-06 18:30:03 -0500
committerScott Murray <scott.murray@konsulko.com>2021-01-12 23:07:09 +0000
commit96c3e18cf1f7ac1da8371e8ca84400d9321d3a6f (patch)
tree772c254268a4c4b5cd1bb9ae6a872ee6a324b2e3 /libs/ini-config
parent9e3940f8de8b2dffd2550fcf5aa3503b9610e441 (diff)
Add back the ini-config and config-parser code that existed previously, and use it in binding init to over-ride the device mapping from the controller JSON if /etc/dev-mapping.conf exists. This restores the documented behavior, and is needed for the existing AGL demo platform support and soon CI. Additionally: - Add code to validate the active_message_set, diagnostic_bus, and bus device mapping configuration values. - The above required moving plugin loading before the configuration callback in the controller configuration, but this change seems rational in that everything required by the generated plugin code is already initialized before then, and it makes validating the configuration possible without adding an extra callback. - Add logging of the used CAN bus to device mappings at info level to ease debugging any future issues. - Tweak the log level of the missing configuration file message to info from error, since it is a legitimate mode of operation if relying on the default bus values in the controller JSON. Bug-AGL: SPEC-3755 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I440f5e0fc85be41f7c4c1f47d824a403525a18f9 (cherry picked from commit 9e23caa4c56259044604c38f107f7c637001b846)
Diffstat (limited to 'libs/ini-config')
-rw-r--r--libs/ini-config/CMakeLists.txt38
-rw-r--r--libs/ini-config/ini-config.cpp100
-rw-r--r--libs/ini-config/ini-config.hpp61
3 files changed, 199 insertions, 0 deletions
diff --git a/libs/ini-config/CMakeLists.txt b/libs/ini-config/CMakeLists.txt
new file mode 100644
index 00000000..ceb48259
--- /dev/null
+++ b/libs/ini-config/CMakeLists.txt
@@ -0,0 +1,38 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###########################################################################
+
+# Add target to project dependency list
+PROJECT_TARGET_ADD(ini-config)
+
+ # Define project Target
+ add_library(${TARGET_NAME} STATIC ${TARGET_NAME}.cpp)
+
+ # Binder exposes a unique public entry point
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ OUTPUT_NAME ${TARGET_NAME}
+ )
+
+ # Define target includes
+ TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME}
+ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ # Library dependencies (include updates automatically)
+ TARGET_LINK_LIBRARIES(${TARGET_NAME}
+ ${link_libraries})
diff --git a/libs/ini-config/ini-config.cpp b/libs/ini-config/ini-config.cpp
new file mode 100644
index 00000000..e429b959
--- /dev/null
+++ b/libs/ini-config/ini-config.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015, 2016 ,2017 "IoT.bzh"
+ * Author "Loïc Collignon" <loic.collignon@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ini-config.hpp"
+
+bool starts_with(const std::string& text, const std::string& token)
+{
+ if(text.length() < token.length()) return false;
+ return (text.compare(0, token.length(), token) == 0);
+}
+
+void ini_config::read_file(const std::string& filename)
+{
+ std::ifstream f(filename);
+ if (f)
+ {
+ std::regex r_section("^\\s*\\[([^\\]]+)\\]\\s*(#.*)?$");
+ std::regex r_key("^\\s*([^\\s]+)\\s*=\\s*\"([^\"]+)\"\\s*(#.*)?$");
+ std::string current_section;
+ std::string line;
+ while (std::getline(f, line))
+ {
+ std::smatch mr;
+
+ switch (qualify(line))
+ {
+ case line_type::section:
+ if (std::regex_match(line, mr, r_section) && mr.size() >= 2 && mr[1].matched)
+ {
+ current_section = mr[1].str();
+ }
+ break;
+ case line_type::key:
+ if(std::regex_match(line, mr, r_key) && mr.size() >= 2 && mr[1].matched)
+ {
+ std::string key = current_section + '/' + mr[1].str();
+ config_[key] = (mr.size() >= 3 && mr[2].matched) ? mr[2].str() : "";
+ }
+ break;
+ case line_type::ignore:
+ break;
+ }
+ }
+ }
+}
+
+ini_config::map ini_config::get_keys(const std::string& section, bool wo_prefix)
+{
+ map ret;
+ std::string key;
+
+ std::string prefix = section + '/';
+ for(auto i = config_.begin();
+ i != config_.end();
+ ++i)
+ {
+ if (starts_with(i->first, prefix))
+ {
+ if(wo_prefix)
+ key = i->first.substr(section.size()+1);
+ else
+ key = i->first;
+ ret[key] = i->second;
+ }
+ }
+ return ret;
+}
+
+std::string ini_config::get_value(const std::string& section, const std::string& key)
+{
+ return config_[section + '/' + key];
+}
+
+ini_config::line_type ini_config::qualify(std::string& line)
+{
+ if (line.size())
+ {
+ for (std::string::value_type c : line)
+ {
+ if (c == '#') return line_type::ignore;
+ if (c == '[') return line_type::section;
+ if (!std::isspace(c, std::locale("C"))) return line_type::key;
+ }
+ }
+ return line_type::ignore;
+}
diff --git a/libs/ini-config/ini-config.hpp b/libs/ini-config/ini-config.hpp
new file mode 100644
index 00000000..4c8cc118
--- /dev/null
+++ b/libs/ini-config/ini-config.hpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015, 2016 ,2017 "IoT.bzh"
+ * Author "Loïc Collignon" <loic.collignon@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INI_CONFIG_HPP
+#define INI_CONFIG_HPP
+
+#include <string>
+#include <fstream>
+#include <map>
+#include <regex>
+#include <algorithm>
+
+// Représente un fichier de configuration.
+class ini_config
+{
+public:
+ using map = std::map<std::string, std::string>;
+
+ void read_file(const std::string& filename);
+
+ map get_keys(const std::string& section, bool wo_prefix=true);
+ std::string get_value(const std::string& section, const std::string& key);
+
+ typename map::size_type size() const { return config_.size(); }
+ typename map::iterator begin() { return config_.begin(); }
+ typename map::iterator end() { return config_.end(); }
+ typename map::const_iterator cbegin() const { return config_.cbegin(); }
+ typename map::const_iterator cend() const { return config_.cend(); }
+ typename map::reverse_iterator rbegin() { return config_.rbegin(); }
+ typename map::reverse_iterator rend() { return config_.rend(); }
+ typename map::const_reverse_iterator crbegin() const { return config_.crbegin(); }
+ typename map::const_reverse_iterator crend() const { return config_.crend(); }
+
+private:
+ map config_;
+
+ enum class line_type
+ {
+ ignore = 0,
+ section = 1,
+ key = 2
+ };
+
+ line_type qualify(std::string& line);
+};
+
+#endif // INI_CONFIG_HPP