summaryrefslogtreecommitdiffhomepage
path: root/config.cpp
diff options
context:
space:
mode:
authorRoland Reichwein <mail@reichwein.it>2020-04-03 19:23:29 +0200
committerRoland Reichwein <mail@reichwein.it>2020-04-03 19:23:29 +0200
commit12972923e74e3dd174f3ce3e59c2db5ca9b400eb (patch)
treec1893aa2eefedb6cae317940bf6a63e24f1e733c /config.cpp
parentd8c3333e7a7330c10bb96e426482e2b158011251 (diff)
Configuration
Diffstat (limited to 'config.cpp')
-rw-r--r--config.cpp102
1 files changed, 100 insertions, 2 deletions
diff --git a/config.cpp b/config.cpp
index edbe3c4..c71ce9e 100644
--- a/config.cpp
+++ b/config.cpp
@@ -3,7 +3,10 @@
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
+#include <iostream>
+
namespace pt = boost::property_tree;
+using namespace std::string_literals;
void Config::readConfigfile(std::string filename)
{
@@ -13,15 +16,80 @@ void Config::readConfigfile(std::string filename)
pt::ptree tree;
- pt::read_xml(filename, tree);
+ pt::read_xml(filename, tree, pt::xml_parser::no_comments | pt::xml_parser::trim_whitespace);
+ // mandatory
m_user = tree.get<std::string>("webserver.user");
- m_group = tree.get<std::string>("webserver.group1");
+ m_group = tree.get<std::string>("webserver.group");
+
+ // optional entries
+ auto elements = tree.get_child_optional("webserver");
+ if (elements) {
+ for (const auto& element: *elements) {
+ if (element.first == "plugin-directory"s) {
+ m_plugin_directories.push_back(element.second.data());
+ } else if (element.first == "sites"s) {
+ for (const auto& site: element.second) {
+ if (site.first != "site"s)
+ throw std::runtime_error("<site> expected in <sites>");
+ Site site_struct;
+ for (const auto& x: site.second) {
+ if (x.first == "name"s) {
+ site_struct.name = x.second.data();
+ } else if (x.first == "host"s) {
+ site_struct.host = x.second.data();
+ } else if (x.first == "path"s) {
+ Path path;
+ auto attrs = x.second.get_child("<xmlattr>");
+ path.requested = attrs.get<std::string>("requested");
+ std::string type = attrs.get<std::string>("type");
+ if (type == "files") {
+ path.type = Files;
+ } else if (type == "plugin") {
+ path.type = Plugin;
+ } else
+ throw std::runtime_error("Unknown type: "s + type);
+ for (const auto& param: x.second) {
+ if (param.first.size() > 0 && param.first[0] != '<') // exclude meta-elements like <xmlattr>
+ path.params[param.first.data()] = param.second.data();
+ }
+ site_struct.paths.push_back(path);
+ } else
+ throw std::runtime_error("Unknown element: "s + x.first);
+ }
+ m_sites.push_back(site_struct);
+ }
+ } else if (element.first == "sockets"s) {
+ for (const auto& socket: element.second) {
+ if (socket.first != "socket"s)
+ throw std::runtime_error("<socket> expected in <sockets>");
+ Socket socket_struct;
+ for (const auto& x: socket.second) {
+ if (x.first == "address"s) {
+ socket_struct.address = x.second.data();
+ } else if (x.first == "port"s) {
+ socket_struct.port = x.second.data();
+ } else if (x.first == "protocol"s) {
+ if (x.second.data() == "http"s)
+ socket_struct.protocol = HTTP;
+ else if (x.second.data() == "https"s)
+ socket_struct.protocol = HTTPS;
+ else
+ throw std::runtime_error("Unknown protocol: "s + x.second.data());
+ } else
+ throw std::runtime_error("Unknown element: "s + x.first);
+ }
+ m_sockets.push_back(socket_struct);
+ }
+ }
+ }
+ }
}
Config::Config(const std::string& filename)
{
readConfigfile(filename);
+ dump();
}
std::string Config::User() const
@@ -33,3 +101,33 @@ std::string Config::Group() const
{
return m_group;
}
+
+void Config::dump() const
+{
+ std::cout << "=== Configuration ===========================" << std::endl;
+ std::cout << "User: " << m_user << std::endl;
+ std::cout << "Group: " << m_user << std::endl;
+
+ std::cout << "Plugin Directories:";
+ for (const auto& dir: m_plugin_directories)
+ std::cout << " " << dir;
+ std::cout << std::endl;
+
+ for (const auto& site: m_sites) {
+ std::cout << "Site: " << site.name << ": " << site.host << std::endl;
+ if (site.paths.size() == 0)
+ std::cout << " Warning: No paths configured." << std::endl;
+ for (const auto& path: site.paths) {
+ std::cout << " Path: " << path.requested << " -> " << ((path.type == Files) ? "files" : "plugin") << std::endl;
+ for (const auto& param: path.params) {
+ std::cout << " " << param.first << ": " << param.second << std::endl;
+ }
+ }
+ }
+
+ for (const auto& socket: m_sockets) {
+ std::cout << "Socket: " << socket.address << ":" << socket.port << " (" << (socket.protocol == HTTP ? "HTTP" : "HTTPS") << ")" << std::endl;
+ }
+ std::cout << "=============================================" << std::endl;
+}
+