From ecb6f5502dddc28e2853a95785cafe85ac5a0db7 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 3 Aug 2015 19:12:22 +0200 Subject: [PATCH] [Config] Reworked the services' configuration --- conf/lms.conf.sample | 15 ++-- src/config/ConfigReader.cpp | 99 +++++++++------------------ src/config/ConfigReader.hpp | 35 +++------- src/cover/CoverArtGrabber.cpp | 24 +++++-- src/cover/CoverArtGrabber.hpp | 9 +-- src/logger/Logger.cpp | 17 +++-- src/logger/Logger.hpp | 9 +-- src/main/main.cpp | 42 +++--------- src/service/DatabaseUpdateService.cpp | 22 ++++-- src/service/DatabaseUpdateService.hpp | 9 +-- src/service/LmsAPIServerService.cpp | 18 +++-- src/service/LmsAPIServerService.hpp | 13 +--- src/service/UserInterfaceService.cpp | 23 +++---- src/service/UserInterfaceService.hpp | 16 +---- 14 files changed, 129 insertions(+), 222 deletions(-) diff --git a/conf/lms.conf.sample b/conf/lms.conf.sample index c8788d32..01ffec79 100644 --- a/conf/lms.conf.sample +++ b/conf/lms.conf.sample @@ -2,9 +2,14 @@ main = { logger = { - file = "/var/lms/lms.log" # comment to disable file logging - console = true; - level = 7; + level = 7; # level common for all loggers + file = { + enable = true; + path = "/var/lms/lms.log"; # comment to disable file logging + } + console = { + enable = true; + } } database = { @@ -23,8 +28,6 @@ main = { ui = { - enable = true; - resources = { docroot = "/var/lms/docroot" approot = "/var/lms/approot" @@ -44,8 +47,6 @@ ui = { } remote = { - enable = true; - nb-threads = 1; listen-endpoint = { diff --git a/src/config/ConfigReader.cpp b/src/config/ConfigReader.cpp index 5e351bc8..90c093de 100644 --- a/src/config/ConfigReader.cpp +++ b/src/config/ConfigReader.cpp @@ -23,89 +23,52 @@ namespace { - void splitStrings(const std::string& source, std::vector& res) - { - std::istringstream oss(source); - - std::string str; - while(oss >> str) - res.push_back(str); - } - } -ConfigReader::ConfigReader(boost::filesystem::path p) +ConfigReader::ConfigReader() +: _config (nullptr) { - _config.readFile(p.string().c_str()); +} + +ConfigReader& +ConfigReader::instance() +{ + static ConfigReader instance; + return instance; } void -ConfigReader::getLoggerConfig(Logger::Config& config) +ConfigReader::setFile(boost::filesystem::path p) { - config.enableFileLogging = _config.lookupValue("main.logger.file", config.logPath); - config.enableConsoleLogging = _config.lookup("main.logger.console"); - config.minSeverity = static_cast((int)_config.lookup("main.logger.level")); + if (_config != nullptr) + delete _config; + + _config = new libconfig::Config(); + + _config->readFile(p.string().c_str()); } -void -ConfigReader::getCoverGrabberConfig(CoverArt::Grabber::Config& config) +std::string +ConfigReader::getString(std::string setting) { - std::string extensions = _config.lookup("main.cover.file_extensions"); - config.maxFileSize = static_cast(_config.lookup("main.cover.file_max_size")); - std::string filenames = _config.lookup("main.cover.file_preferred_names"); - - splitStrings(extensions, config.fileExtensions); - splitStrings(filenames, config.preferredFileNames); + return _config->lookup(setting); } -void -ConfigReader::getUserInterfaceConfig(Service::UserInterfaceService::Config& config) +unsigned long +ConfigReader::getULong(std::string setting) { - - config.enable = _config.lookup("ui.enable"); - if (!config.enable) - return; - - config.docRootPath = _config.lookup("ui.resources.docroot"); - config.appRootPath = _config.lookup("ui.resources.approot"); - config.httpsPort = static_cast(_config.lookup("ui.listen-endpoint.port")); - config.httpsAddress = boost::asio::ip::address::from_string((const char*)_config.lookup("ui.listen-endpoint.addr")); - config.sslCertificatePath = _config.lookup("ui.ssl-crypto.cert"); - config.sslPrivateKeyPath = _config.lookup("ui.ssl-crypto.key"); - config.sslTempDhPath = _config.lookup("ui.ssl-crypto.dh"); - - config.dbPath = _config.lookup("main.database.path"); + return static_cast(_config->lookup(setting)); } -#if defined HAVE_LMSAPI -void -ConfigReader::getLmsAPIConfig(Service::LmsAPIService::Config& config) +long +ConfigReader::getLong(std::string setting) { - config.enable = _config.lookup("remote.enable"); - if (!config.enable) - return; - - config.port = static_cast(_config.lookup("remote.listen-endpoint.port")); - config.address = boost::asio::ip::address::from_string((const char*)_config.lookup("remote.listen-endpoint.addr")); - config.sslCertificatePath = _config.lookup("remote.ssl-crypto.cert"); - config.sslPrivateKeyPath = _config.lookup("remote.ssl-crypto.key"); - config.sslTempDhPath = _config.lookup("remote.ssl-crypto.dh"); - - config.dbPath = _config.lookup("main.database.path"); -} -#endif - -void -ConfigReader::getDatabaseUpdateConfig(Service::DatabaseUpdateService::Config& config) -{ - config.enable = true; - - config.dbPath = _config.lookup("main.database.path"); - - std::string audioExtensions = _config.lookup("main.database.audio_extensions"); - std::string videoExtensions = _config.lookup("main.database.video_extensions"); - - splitStrings(audioExtensions, config.audioExtensions); - splitStrings(videoExtensions, config.videoExtensions); + return _config->lookup(setting); +} + +bool +ConfigReader::getBool(std::string setting) +{ + return _config->lookup(setting); } diff --git a/src/config/ConfigReader.hpp b/src/config/ConfigReader.hpp index 6abc5039..6f68156c 100644 --- a/src/config/ConfigReader.hpp +++ b/src/config/ConfigReader.hpp @@ -23,40 +23,27 @@ #include #include -#include "config/config.h" - -#include "cover/CoverArtGrabber.hpp" -#include "logger/Logger.hpp" - -#include "service/UserInterfaceService.hpp" -#include "service/DatabaseUpdateService.hpp" -#if defined HAVE_LMSAPI -#include "service/LmsAPIServerService.hpp" -#endif - class ConfigReader { public: - ConfigReader(boost::filesystem::path p); + ConfigReader(const ConfigReader&) = delete; + ConfigReader& operator=(const ConfigReader&) = delete; - // Logger configuration - void getLoggerConfig(Logger::Config& config); + static ConfigReader& instance(); - // Covers - void getCoverGrabberConfig(CoverArt::Grabber::Config& config); + void setFile(boost::filesystem::path p); - // Service configurations - void getUserInterfaceConfig(Service::UserInterfaceService::Config& config); - void getDatabaseUpdateConfig(Service::DatabaseUpdateService::Config& config); - -#if defined HAVE_LMSAPI - void getLmsAPIConfig(Service::LmsAPIService::Config& config); -#endif + std::string getString(std::string setting); + unsigned long getULong(std::string setting); + long getLong(std::string setting); + bool getBool(std::string setting); private: - libconfig::Config _config; + ConfigReader(); + + libconfig::Config *_config; }; #endif diff --git a/src/cover/CoverArtGrabber.cpp b/src/cover/CoverArtGrabber.cpp index 9194330a..695ddc3e 100644 --- a/src/cover/CoverArtGrabber.cpp +++ b/src/cover/CoverArtGrabber.cpp @@ -17,10 +17,8 @@ * along with LMS. If not, see . */ - -#include - #include "logger/Logger.hpp" +#include "config/ConfigReader.hpp" #include "av/InputFormatContext.hpp" #include "CoverArtGrabber.hpp" @@ -28,6 +26,18 @@ namespace { +std::vector splitStrings(const std::string& source) +{ + std::vector res; + std::istringstream oss(source); + + std::string str; + while(oss >> str) + res.push_back(str); + + return res; +} + bool isFileSupported(const boost::filesystem::path& file, const std::vector extensions) { @@ -58,12 +68,12 @@ Grabber::instance() } void -Grabber::init(const Config& config) +Grabber::init() { - for (auto extension : config.fileExtensions) + for (const std::string& extension : splitStrings( ConfigReader::instance().getString("main.cover.file_extensions"))) _fileExtensions.push_back("." + extension); - _maxFileSize = config.maxFileSize; + _maxFileSize = ConfigReader::instance().getULong("main.cover.file_max_size"); } std::vector @@ -75,7 +85,7 @@ Grabber::getFromInputFormatContext(const Av::InputFormatContext& input, std::siz { std::vector pictures = input.getPictures(nbMaxCovers); - BOOST_FOREACH(const Av::Picture& picture, pictures) + for (Av::Picture& picture : pictures) res.push_back( CoverArt(picture.mimeType, picture.data) ); } diff --git a/src/cover/CoverArtGrabber.hpp b/src/cover/CoverArtGrabber.hpp index b07bbb56..f2dbb33e 100644 --- a/src/cover/CoverArtGrabber.hpp +++ b/src/cover/CoverArtGrabber.hpp @@ -38,14 +38,7 @@ class Grabber static Grabber& instance(); - struct Config - { - std::vector fileExtensions; - std::size_t maxFileSize; - std::vector preferredFileNames; - }; - - void init(const Config& config); + void init(); std::vector getCoverPaths(const boost::filesystem::path& directoryPath, std::size_t nbMaxCovers = 1) const; std::vector getFromDirectory(const boost::filesystem::path& path, std::size_t nbMaxCovers = 1) const; diff --git a/src/logger/Logger.cpp b/src/logger/Logger.cpp index 41b6db0f..b99f5664 100644 --- a/src/logger/Logger.cpp +++ b/src/logger/Logger.cpp @@ -17,8 +17,6 @@ * along with LMS. If not, see . */ -#include - #include #include #include @@ -37,6 +35,8 @@ #include +#include "config/ConfigReader.hpp" + #include "Logger.hpp" @@ -64,7 +64,7 @@ Logger::Logger() MOD_UI, }; - BOOST_FOREACH(Module module, modules) + for(Module module : modules) _loggers[module].add_attribute("Module", boost::log::attributes::constant< Module >(module)); } @@ -74,19 +74,18 @@ Logger::get(Module module) return _loggers[module]; } - void -Logger::init(const Config& config) +Logger::init() { boost::log::add_common_attributes(); boost::log::register_simple_formatter_factory< Severity, char >("Severity"); - if (config.enableFileLogging) + if (ConfigReader::instance().getBool("main.logger.file.enable")) { boost::log::add_file_log ( - boost::log::keywords::file_name = config.logPath + std::string(".%N"), + boost::log::keywords::file_name = ConfigReader::instance().getString("main.logger.file.path") + std::string(".%N"), boost::log::keywords::rotation_size = 10 * 1024 * 1024, boost::log::keywords::open_mode = std::ios_base::app, boost::log::keywords::auto_flush = true, @@ -100,7 +99,7 @@ Logger::init(const Config& config) ); } - if (config.enableConsoleLogging) + if (ConfigReader::instance().getBool("main.logger.console.enable")) { boost::log::add_console_log(std::cout, boost::log::keywords::format = ( @@ -115,7 +114,7 @@ Logger::init(const Config& config) boost::log::core::get()->set_filter ( - boost::log::expressions::attr("Severity") <= config.minSeverity + boost::log::expressions::attr("Severity") <= ConfigReader::instance().getULong("main.logger.level") ); } diff --git a/src/logger/Logger.hpp b/src/logger/Logger.hpp index ca540f65..98d5c69f 100644 --- a/src/logger/Logger.hpp +++ b/src/logger/Logger.hpp @@ -65,15 +65,8 @@ class Logger static Logger& instance(); - struct Config { - bool enableFileLogging; - bool enableConsoleLogging; - std::string logPath; - Severity minSeverity; - }; - //[ example_tutorial_file_advanced - void init(const Config& config); + void init(); boost::log::sources::severity_logger< Severity >& get(Module module); diff --git a/src/main/main.cpp b/src/main/main.cpp index c63f7247..54af36fb 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -20,11 +20,11 @@ #include #include "config/config.h" -#include "logger/Logger.hpp" - #include "config/ConfigReader.hpp" #include "transcode/AvConvTranscoder.hpp" #include "av/Common.hpp" +#include "logger/Logger.hpp" +#include "cover/CoverArtGrabber.hpp" #include "service/ServiceManager.hpp" #include "service/DatabaseUpdateService.hpp" @@ -61,28 +61,10 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - ConfigReader configReader(configFile); + ConfigReader::instance().setFile(configFile); - // Initializa logging facility - { - Logger::Config loggerConfig; - configReader.getLoggerConfig(loggerConfig); - Logger::instance().init(loggerConfig); - } - - { - CoverArt::Grabber::Config config; - configReader.getCoverGrabberConfig(config); - CoverArt::Grabber::instance().init(config); - } - - LMS_LOG(MOD_MAIN, SEV_INFO) << "Reading service configurations..."; - - Service::DatabaseUpdateService::Config dbUpdateConfig; - configReader.getDatabaseUpdateConfig(dbUpdateConfig); - - Service::UserInterfaceService::Config uiConfig; - configReader.getUserInterfaceConfig(uiConfig); + Logger::instance().init(); + CoverArt::Grabber::instance().init(); Service::ServiceManager& serviceManager = Service::ServiceManager::instance(); @@ -93,20 +75,12 @@ int main(int argc, char* argv[]) LMS_LOG(MOD_MAIN, SEV_INFO) << "Starting services..."; - if (dbUpdateConfig.enable) - serviceManager.startService( std::make_shared( dbUpdateConfig ) ); - + serviceManager.startService( std::make_shared() ); + serviceManager.startService( std::make_shared(boost::filesystem::path(argv[0]))); #if defined HAVE_LMSAPI - Service::LmsAPIService::Config lmsAPIConfig; - configReader.getLmsAPIConfig(lmsAPIConfig); - - if (lmsAPIConfig.enable) - serviceManager.startService( std::make_shared( lmsAPIConfig )); + serviceManager.startService( std::make_shared( )); #endif - if (uiConfig.enable) - serviceManager.startService( std::make_shared(boost::filesystem::path(argv[0]), uiConfig)); - LMS_LOG(MOD_MAIN, SEV_NOTICE) << "Now running..."; serviceManager.run(); diff --git a/src/service/DatabaseUpdateService.cpp b/src/service/DatabaseUpdateService.cpp index fb639bf1..73ae911a 100644 --- a/src/service/DatabaseUpdateService.cpp +++ b/src/service/DatabaseUpdateService.cpp @@ -19,18 +19,32 @@ #include +#include "config/ConfigReader.hpp" #include "logger/Logger.hpp" #include "DatabaseUpdateService.hpp" +static std::vector splitStrings(const std::string& source) +{ + std::vector res; + std::istringstream oss(source); + + std::string str; + while(oss >> str) + res.push_back(str); + + return res; +} + namespace Service { -DatabaseUpdateService::DatabaseUpdateService(const Config& config) +DatabaseUpdateService::DatabaseUpdateService() : _metadataParser(), - _databaseUpdater( config.dbPath, _metadataParser) + _databaseUpdater( ConfigReader::instance().getString("main.database.path"), + _metadataParser) { - _databaseUpdater.setAudioExtensions(config.audioExtensions); - _databaseUpdater.setVideoExtensions(config.videoExtensions); + _databaseUpdater.setAudioExtensions(splitStrings(ConfigReader::instance().getString("main.database.audio_extensions"))); + _databaseUpdater.setVideoExtensions(splitStrings(ConfigReader::instance().getString("main.database.video_extensions"))); } void diff --git a/src/service/DatabaseUpdateService.hpp b/src/service/DatabaseUpdateService.hpp index becc74d7..55bfadaa 100644 --- a/src/service/DatabaseUpdateService.hpp +++ b/src/service/DatabaseUpdateService.hpp @@ -36,14 +36,7 @@ class DatabaseUpdateService : public Service typedef std::shared_ptr pointer; - struct Config { - bool enable; - boost::filesystem::path dbPath; - std::vector audioExtensions; - std::vector videoExtensions; - }; - - DatabaseUpdateService(const Config& config); + DatabaseUpdateService(); // Service interface void start(void); diff --git a/src/service/LmsAPIServerService.cpp b/src/service/LmsAPIServerService.cpp index c141c4e0..94c0cbb1 100644 --- a/src/service/LmsAPIServerService.cpp +++ b/src/service/LmsAPIServerService.cpp @@ -17,18 +17,24 @@ * along with LMS. If not, see . */ +#include + +#include "config/ConfigReader.hpp" #include "logger/Logger.hpp" #include "LmsAPIServerService.hpp" namespace Service { -LmsAPIService::LmsAPIService(const Config& config) -: _server(boost::asio::ip::tcp::endpoint(config.address, config.port), - config.sslCertificatePath, - config.sslPrivateKeyPath, - config.sslTempDhPath, - config.dbPath) +LmsAPIService::LmsAPIService() +: _server( + boost::asio::ip::tcp::endpoint( + boost::asio::ip::address::from_string(ConfigReader::instance().getString("remote.listen-endpoint.addr")), + ConfigReader::instance().getULong("remote.listen-endpoint.port")), + ConfigReader::instance().getString("remote.ssl-crypto.cert"), + ConfigReader::instance().getString("remote.ssl-crypto.key"), + ConfigReader::instance().getString("remote.ssl-crypto.dh"), + ConfigReader::instance().getString("main.database.path")) { } diff --git a/src/service/LmsAPIServerService.hpp b/src/service/LmsAPIServerService.hpp index 8fd17f1f..06aaa556 100644 --- a/src/service/LmsAPIServerService.hpp +++ b/src/service/LmsAPIServerService.hpp @@ -21,7 +21,6 @@ #define REMOTE_SERVER_SERVICE_HPP #include -#include #include "config/config.h" @@ -35,17 +34,7 @@ class LmsAPIService : public Service { public: - struct Config { - bool enable; - boost::asio::ip::address address; - unsigned short port; - boost::filesystem::path sslCertificatePath; - boost::filesystem::path sslPrivateKeyPath; - boost::filesystem::path sslTempDhPath; - boost::filesystem::path dbPath; - }; - - LmsAPIService(const Config& config); + LmsAPIService(); void start(void); void stop(void); diff --git a/src/service/UserInterfaceService.cpp b/src/service/UserInterfaceService.cpp index 06353841..cf937897 100644 --- a/src/service/UserInterfaceService.cpp +++ b/src/service/UserInterfaceService.cpp @@ -22,24 +22,23 @@ #include "UserInterfaceService.hpp" #include "ui/LmsApplication.hpp" +#include "config/ConfigReader.hpp" + namespace Service { -UserInterfaceService::UserInterfaceService( boost::filesystem::path runAppPath, const Config& config) +UserInterfaceService::UserInterfaceService( boost::filesystem::path runAppPath) : _server(runAppPath.string()) { std::vector args; args.push_back(runAppPath.string()); - args.push_back("--docroot=" + config.docRootPath.string()); - args.push_back("--approot=" + config.appRootPath.string()); - { - std::ostringstream oss; oss << config.httpsPort; - args.push_back("--https-port=" + oss.str()); - } - args.push_back("--https-address=" + config.httpsAddress.to_string()); - args.push_back("--ssl-certificate=" + config.sslCertificatePath.string()); - args.push_back("--ssl-private-key=" + config.sslPrivateKeyPath.string()); - args.push_back("--ssl-tmp-dh=" + config.sslTempDhPath.string()); + args.push_back("--docroot=" + ConfigReader::instance().getString("ui.resources.docroot")); + args.push_back("--approot=" + ConfigReader::instance().getString("ui.resources.approot")); + args.push_back("--https-port=" + std::to_string( ConfigReader::instance().getULong("ui.listen-endpoint.port"))); + args.push_back("--https-address=" + ConfigReader::instance().getString("ui.listen-endpoint.addr")); + args.push_back("--ssl-certificate=" + ConfigReader::instance().getString("ui.ssl-crypto.cert")); + args.push_back("--ssl-private-key=" + ConfigReader::instance().getString("ui.ssl-crypto.key")); + args.push_back("--ssl-tmp-dh=" + ConfigReader::instance().getString("ui.ssl-crypto.dh")); // Construct argc/argv int argc = args.size(); @@ -55,7 +54,7 @@ UserInterfaceService::UserInterfaceService( boost::filesystem::path runAppPath, _server.setServerConfiguration (argc, const_cast(argv)); // bind entry point - _server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create, _1, config.dbPath)); + _server.addEntryPoint(Wt::Application, boost::bind(UserInterface::LmsApplication::create, _1, ConfigReader::instance().getString("main.database.path"))); } diff --git a/src/service/UserInterfaceService.hpp b/src/service/UserInterfaceService.hpp index 2ae09b51..c023a3f6 100644 --- a/src/service/UserInterfaceService.hpp +++ b/src/service/UserInterfaceService.hpp @@ -21,7 +21,6 @@ #define WEB_SERVER_SERVICE_HPP #include -#include #include @@ -33,20 +32,7 @@ class UserInterfaceService : public Service { public: - struct Config { - bool enable; - boost::filesystem::path docRootPath; - boost::filesystem::path appRootPath; - unsigned short httpsPort; - boost::asio::ip::address httpsAddress; - boost::filesystem::path sslCertificatePath; - boost::filesystem::path sslPrivateKeyPath; - boost::filesystem::path sslTempDhPath; - boost::filesystem::path dbPath; - }; - - UserInterfaceService(boost::filesystem::path runAppPath, - const Config& config); + UserInterfaceService(boost::filesystem::path runAppPath); void start(void); void stop(void);