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");
121 }
catch (Exception &e) {
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;
171 SubProcess *oprs = NULL;
172 std::string oprs_error;
174 oprs =
new SubProcess(progname.c_str(), argv[0], argv, (
const char **)envp, logger_);
175 }
catch (Exception &e) {
177 oprs_error = e.what_no_backtrace();
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);