diff --git a/common/include/villas/tool.hpp b/common/include/villas/tool.hpp new file mode 100644 index 000000000..266d7ba13 --- /dev/null +++ b/common/include/villas/tool.hpp @@ -0,0 +1,71 @@ +/** Common entry point for all villas command line tools. + * + * @file + * @author Steffen Vogel + * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *********************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include + +namespace villas { + +class Tool { + +protected: + Logger logger; + + int argc; + char **argv; + + std::string name; + + static Tool *current_tool; + + static void staticHandler(int signal, siginfo_t *sinfo, void *ctx); + + virtual void handler(int, siginfo_t *, void *) + { } + + static void printCopyright(); + static void printVersion(); + +public: + Tool(int ac, char *av[], const std::string &name); + + virtual int main() + { + return 0; + } + + virtual void usage() + { } + + virtual void parse() + { } + + int run(); +}; + +} // namespace villas diff --git a/common/lib/CMakeLists.txt b/common/lib/CMakeLists.txt index 8ebe261a9..1d875435b 100644 --- a/common/lib/CMakeLists.txt +++ b/common/lib/CMakeLists.txt @@ -45,6 +45,7 @@ add_library(villas-common SHARED terminal.cpp version.cpp common.cpp + tool.cpp ) execute_process( diff --git a/common/lib/tool.cpp b/common/lib/tool.cpp new file mode 100644 index 000000000..93fde9d7b --- /dev/null +++ b/common/lib/tool.cpp @@ -0,0 +1,89 @@ + +/** Common entry point for all villas command line tools. + * + * @author Steffen Vogel + * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *********************************************************************************/ + +#include + +#include + +using namespace villas; + +void Tool::staticHandler(int signal, siginfo_t *sinfo, void *ctx) +{ + if (current_tool) + current_tool->handler(signal, sinfo, ctx); +} + +void Tool::printCopyright() +{ + std::cout << PROJECT_NAME " " << CLR_BLU(PROJECT_BUILD_ID) + << " (built on " CLR_MAG(__DATE__) " " CLR_MAG(__TIME__) ")" << std::endl + << " Copyright 2014-2017, Institute for Automation of Complex Power Systems, EONERC" << std::endl + << " Steffen Vogel " << std::endl; +} + +void Tool::printVersion() +{ + std::cout << PROJECT_BUILD_ID << std::endl; +} + +Tool::Tool(int ac, char *av[], const std::string &nme) : + argc(ac), + argv(av), + name(nme) +{ + current_tool = this; + + logger = logging.get(name); +} + +int Tool::run() +{ + try { + int ret; + + logger->info("This is VILLASnode {} (built on {}, {})", + CLR_BLD(CLR_YEL(PROJECT_BUILD_ID)), + CLR_BLD(CLR_MAG(__DATE__)), CLR_BLD(CLR_MAG(__TIME__))); + + ret = utils::signals_init(staticHandler); + if (ret) + throw RuntimeError("Failed to initialize signal subsystem"); + + /* Parse command line arguments */ + parse(); + + /* Run tool */ + ret = main(); + + logger->info(CLR_GRN("Goodbye!")); + + return ret; + } + catch (std::runtime_error &e) { + logger->error("{}", e.what()); + + return -1; + } +} + +Tool *Tool::current_tool = nullptr;