diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-03-27 16:07:27 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-03-27 16:07:27 +0300 |
commit | ff44c9cd55bff146c6c47277656a967045184c7b (patch) | |
tree | b1d5d59696c8811db0badea0e6dcedca3601b183 /server/src/main.cpp | |
parent | f87e3320c499edccd545ff3bfc244ef5c7216bb5 (diff) |
working module loader
basic program options support
abitilty to print installed modules info
started config support implementation
Diffstat (limited to 'server/src/main.cpp')
-rw-r--r-- | server/src/main.cpp | 106 |
1 files changed, 85 insertions, 21 deletions
diff --git a/server/src/main.cpp b/server/src/main.cpp index 54bb498..67e5fa6 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -17,36 +17,100 @@ along with UDM. If not, see <http://www.gnu.org/licenses/>. */ +#include <boost/program_options.hpp> +#include <boost/property_tree/ptree.hpp> +#include <boost/property_tree/info_parser.hpp> +#include <boost/filesystem.hpp> +#include <iostream> -#include <dlfcn.h> #include <api_module_metadata_storage.h> +#include <modules_handler.h> -core_api module_api; -void module_load_test() +core_api *module_api = nullptr; + +modules_handler *modules = nullptr; + +namespace bpo = boost::program_options; +namespace bpt = boost::property_tree; + +bpt::ptree config; + + + +int main(int argc, char *argv[]) { - void *lib = dlopen("./modules/metadata/libflat_files.so", RTLD_LAZY); - if(!lib) + bpo::options_description desc("Available commands and options"); + desc.add_options() + ("help", "this message") + ("daemon", "fork to background") + ("config", bpo::value<std::string>(), "use specified config file instead of \"~/.config/udm/udm.conf\"") + ("list-modules", "list all installed modules") + ("run", "start UDM server") + ; + + bool daemon = false, run = false; + std::string config_path = "~/.config/udm/udm.conf"; + try{ + + bpo::variables_map vm; + bpo::store(bpo::parse_command_line(argc, argv, desc), vm); + bpo::notify(vm); + + //load config first, as it may be needed for other commands + if(vm.count("config")) + config_path = vm["config"].as<std::string>(); + + if(boost::filesystem::exists(config_path) && boost::filesystem::is_regular(config_path)) + bpt::read_info(config_path, config); //TODO: finish this + else + std::cerr<<"failed to load config: \"" + config_path + "\", file does not exists or is not regular file\n"; + + + if(vm.count("help")) + { + std::cout<<desc<<std::endl; + return 0; + } + if(vm.count("daemon")) + { + daemon = true; + } + if(vm.count("list-modules")) + { + if(!module_api) + module_api = new core_api; + if(!modules) + modules = new modules_handler; + std::cout<<modules->list_modules(); + return 0; + } + if(vm.count("run")) + { + run = true; + } + } + catch(std::exception &e) { - printf("%s\n", dlerror()); - return; + std::cerr<<"error: "<<e.what()<<std::endl; + std::cout<<desc<<std::endl; + return -1; } - void *fptr = dlsym(lib, "load"); - if(!fptr) + catch(...) { - printf("%s\n", dlerror()); - dlclose(lib); - return; + //noop + return -1; } - void *(*f)(void); - f = (void* (*)())fptr; - module_metadata_storage *m = static_cast<module_metadata_storage*>(f()); - m->load(&module_api); -} - + if(run) + { + if(daemon) + { + //TODO: fork here + } + } + //module_api must be created first + std::cerr<<"error: no command specified"<<std::endl; + std::cout<<desc<<std::endl; -int main(int argc, char *argv[]) -{ - module_load_test(); return 0; } |