summaryrefslogtreecommitdiff
path: root/server/src/main.cpp
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2015-03-27 16:07:27 +0300
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2015-03-27 16:07:27 +0300
commitff44c9cd55bff146c6c47277656a967045184c7b (patch)
treeb1d5d59696c8811db0badea0e6dcedca3601b183 /server/src/main.cpp
parentf87e3320c499edccd545ff3bfc244ef5c7216bb5 (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.cpp106
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;
}