23 #include <config/config.h> 24 #include <logging/logger.h> 25 #include <plugins/openprs/aspect/openprs_kernel_manager.h> 26 #include <utils/misc/string_commands.h> 27 #include <utils/misc/string_split.h> 28 #include <utils/sub_process/proc.h> 29 #include <utils/time/time.h> 31 #include <boost/format.hpp> 53 unsigned short server_tcp_port,
54 const std::string &mp_host,
55 unsigned short mp_tcp_port,
59 : server_host_(server_host), server_port_(server_tcp_port), mp_host_(mp_host), mp_port_(mp_tcp_port)
87 std::list<std::string> &extra_data_path,
90 if (kernels_.find(kernel_name) != kernels_.end()) {
91 throw Exception(
"OpenPRS kernel '%s' already exists", kernel_name.c_str());
94 std::string
server_port = boost::str(boost::format(
"%u") % server_port_);
95 std::string
mp_port = boost::str(boost::format(
"%u") % mp_port_);
97 const char *argv[] = {use_xoprs ?
"xoprs" :
"oprs",
112 std::list<std::string> data_path;
114 if (config_->
is_list(
"/openprs/kernels/data-path")) {
115 std::vector<std::string> pl = config_->
get_strings(
"/openprs/kernels/data-path");
116 std::for_each(pl.begin(), pl.end(), [&data_path](std::string &p) { data_path.push_back(p); });
118 std::string cfg_data_path = config_->
get_string(
"/openprs/kernels/data-path");
123 std::list<std::string>::iterator ins_pos = data_path.begin();
124 for (
auto p : extra_data_path) {
125 ins_pos = data_path.insert(ins_pos, p);
127 const std::string env_HOME = getenv(
"HOME");
128 for (
auto &p : data_path) {
129 std::string::size_type pos = 0;
130 while ((pos = p.find(
"$HOME", pos)) != std::string::npos) {
131 p.replace(pos, 5, env_HOME);
132 pos += env_HOME.length();
135 if ((pos = p.find(
"@BASEDIR@")) != std::string::npos) {
136 p.replace(pos, 9, BASEDIR);
138 if ((pos = p.find(
"@FAWKES_BASEDIR@")) != std::string::npos) {
139 p.replace(pos, 16, FAWKES_BASEDIR);
141 if ((pos = p.find(
"@RESDIR@")) != std::string::npos) {
142 p.replace(pos, 8, RESDIR);
144 if ((pos = p.find(
"@CONFDIR@")) != std::string::npos) {
145 p.replace(pos, 9, CONFDIR);
148 std::string oprs_data_path =
str_join(data_path,
':');
150 const char *envp_path_ext[] = {
151 "LD_LIBRARY_PATH", OPENPRS_MOD_DIR,
"OPRS_DATA_PATH", oprs_data_path.c_str(), NULL};
155 boost::str(boost::format(
"FAWKES_OPRS_GDB_DELAY=%s") % (utils_gdb_delay ?
"true" :
"false")));
157 const char *envp[envp_v.size() + 1];
158 for (
unsigned int i = 0; i < envp_v.size(); ++i) {
159 envp[i] = envp_v[i].c_str();
160 if (envp_v[i].compare(0, 15,
"OPRS_DATA_PATH=") == 0) {
161 logger_->
log_info(
"OpenPRSKernelMgr",
"%s data path: %s", kernel_name.c_str(), envp[i]);
164 envp[envp_v.size()] = NULL;
167 logger_->
log_info(
"OpenPRSKernelMgr",
"Running: %s", command.c_str());
169 std::string progname = std::string(use_xoprs ?
"XOPRS" :
"OPRS") +
"-" + kernel_name;
172 std::string oprs_error;
174 oprs =
new SubProcess(progname.c_str(), argv[0], argv, (
const char **)envp, logger_);
184 kernels_[kernel_name] = oprs;
186 throw Exception(
"Failed to initialize OpenPRS kernel '%s' (%s)",
199 if (kernels_.find(kernel_name) != kernels_.end()) {
200 delete kernels_[kernel_name];
201 kernels_.erase(kernel_name);
208 std::list<std::string>
211 std::list<std::string> rv;
212 for (
auto k : kernels_) {
213 rv.push_back(k.first);
OpenPRSKernelManager(const std::string &server_host, unsigned short server_tcp_port, const std::string &mp_host, unsigned short mp_tcp_port, Logger *logger, Clock *clock, Configuration *config)
Constructor.
virtual void log_info(const char *component, const char *format,...)=0
Log informational message.
Fawkes library namespace.
void create_kernel(const std::string &kernel_name, bool use_xoprs, std::list< std::string > &extra_data_path, bool utils_gdb_delay)
Create a new kernel.
This is supposed to be the central clock in Fawkes.
static std::list< std::string > str_split_list(const std::string &s, char delim='/')
Split string by delimiter.
virtual bool is_list(const char *path)=0
Check if a value is a list.
std::list< std::string > kernels() const
Get map of kernels.
void destroy_kernel(const std::string &kernel_name)
Destroy the named kernel.
Base class for exceptions in Fawkes.
std::string command_args_tostring(const char *argv[])
Convert command args to string.
static std::string str_join(const std::vector< std::string > &v, char delim='/')
Join vector of strings string using given delimiter.
virtual const char * what_no_backtrace() const
Get primary string (does not implicitly print the back trace).
virtual ~OpenPRSKernelManager()
Destructor.
unsigned short mp_port() const
Get mp-oprs TCP port.
Sub-process execution with stdin/stdout/stderr redirection.
virtual std::vector< std::string > get_strings(const char *path)=0
Get list of values from configuration which is of type string.
std::vector< std::string > envp_copy_expand(char *environ[], const char *path_ext[])
Copy an environment and extend certain paths.
Interface for configuration handling.
unsigned short server_port() const
Get oprs-server TCP port.
virtual std::string get_string(const char *path)=0
Get value from configuration which is of type string.