]> git.stg.codes - stg.git/blob - projects/stargazer/plugin_runner.cpp
Produce debug output only if SMUX_DEBUG is defined
[stg.git] / projects / stargazer / plugin_runner.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
19  */
20
21 /*
22  $Revision: 1.17 $
23  $Date: 2010/09/13 05:52:46 $
24  $Author: faust $
25  */
26
27 #include <dlfcn.h>
28 #include <unistd.h>
29
30 #include "stg/common.h"
31 #include "stg/traffcounter.h"
32 #include "plugin_runner.h"
33 #include "settings_impl.h"
34 #include "admins_impl.h"
35 #include "tariffs_impl.h"
36 #include "users_impl.h"
37 #include "services_impl.h"
38 #include "corps_impl.h"
39
40 //-----------------------------------------------------------------------------
41 PLUGIN_RUNNER::PLUGIN_RUNNER(const std::string & pFileName,
42                              const MODULE_SETTINGS & ms,
43                              ADMINS_IMPL * a,
44                              TARIFFS_IMPL * t,
45                              USERS_IMPL * u,
46                              SERVICES_IMPL * svc,
47                              CORPORATIONS_IMPL * crp,
48                              TRAFFCOUNTER * tc,
49                              STORE * st,
50                              const SETTINGS_IMPL * s)
51     : pluginFileName(pFileName),
52       pluginSettingFileName(),
53       plugin(NULL),
54       isPluginLoaded(false),
55       errorStr(),
56       libHandle(NULL),
57       isRunning(false),
58       admins(a),
59       tariffs(t),
60       users(u),
61       services(svc),
62       corps(crp),
63       store(st),
64       traffCnt(tc),
65       stgSettings(s),
66       modSettings(ms)
67 {
68 }
69 //-----------------------------------------------------------------------------
70 PLUGIN_RUNNER::PLUGIN_RUNNER(const PLUGIN_RUNNER & rvalue)
71     : pluginFileName(rvalue.pluginFileName),
72       pluginSettingFileName(rvalue.pluginSettingFileName),
73       plugin(rvalue.plugin),
74       isPluginLoaded(rvalue.isPluginLoaded),
75       errorStr(rvalue.errorStr),
76       libHandle(rvalue.libHandle),
77       isRunning(rvalue.isRunning),
78       admins(rvalue.admins),
79       tariffs(rvalue.tariffs),
80       users(rvalue.users),
81       services(rvalue.services),
82       corps(rvalue.corps),
83       store(rvalue.store),
84       traffCnt(rvalue.traffCnt),
85       stgSettings(rvalue.stgSettings),
86       modSettings(rvalue.modSettings)
87 {
88 }
89 //-----------------------------------------------------------------------------
90 PLUGIN_RUNNER & PLUGIN_RUNNER::operator=(const PLUGIN_RUNNER & rvalue)
91 {
92 pluginFileName = rvalue.pluginFileName;
93 pluginSettingFileName = rvalue.pluginSettingFileName;
94 plugin = rvalue.plugin;
95 isPluginLoaded = rvalue.isPluginLoaded;
96 errorStr = rvalue.errorStr;
97 libHandle = rvalue.libHandle;
98 isRunning = rvalue.isRunning;
99 admins = rvalue.admins;
100 tariffs = rvalue.tariffs;
101 users = rvalue.users;
102 services = rvalue.services;
103 corps = rvalue.corps;
104 store = rvalue.store;
105 traffCnt = rvalue.traffCnt;
106 stgSettings = rvalue.stgSettings;
107 modSettings = rvalue.modSettings;
108
109 return *this;
110 }
111 //-----------------------------------------------------------------------------
112 PLUGIN_RUNNER::~PLUGIN_RUNNER()
113 {
114 if (isPluginLoaded)
115     {
116     Unload();
117     }
118
119 isPluginLoaded = false;
120 }
121 //-----------------------------------------------------------------------------
122 PLUGIN * PLUGIN_RUNNER::GetPlugin()
123 {
124 if (!isPluginLoaded)
125     {
126     errorStr = "Plugin '" + pluginFileName + "' is not loaded yet!";
127     printfd(__FILE__, "PLUGIN_LOADER::GetPlugin() - %s\n", errorStr.c_str());
128     return NULL;
129     }
130
131 return plugin;
132 }
133 //-----------------------------------------------------------------------------
134 int PLUGIN_RUNNER::Start()
135 {
136 if (!isPluginLoaded)
137     if (Load())
138         return -1;
139
140 if (!plugin)
141     {
142     errorStr = "Plugin '" + pluginFileName + "' was not created!";
143     printfd(__FILE__, "PLUGIN_LOADER::Start() - %s\n", errorStr.c_str());
144     return -1;
145     }
146
147 plugin->SetTariffs(tariffs);
148 plugin->SetAdmins(admins);
149 plugin->SetUsers(users);
150 plugin->SetServices(services);
151 plugin->SetCorporations(corps);
152 plugin->SetTraffcounter(traffCnt);
153 plugin->SetStore(store);
154 plugin->SetStgSettings(stgSettings);
155
156 if (plugin->Start())
157     {
158     errorStr = plugin->GetStrError();
159     return -1;
160     }
161
162 return 0;
163 }
164 //-----------------------------------------------------------------------------
165 int PLUGIN_RUNNER::Stop()
166 {
167 if (!isPluginLoaded)
168     {
169     errorStr = "Plugin '" + pluginFileName + "' was not loaded yet!";
170     printfd(__FILE__, "PLUGIN_LOADER::Stop() - %s\n", errorStr.c_str());
171     return -1;
172     }
173
174 if (!plugin)
175     {
176     errorStr = "Plugin '" + pluginFileName + "' was not created!";
177     printfd(__FILE__, "PLUGIN_LOADER::Stop() - %s\n", errorStr.c_str());
178     return -1;
179     }
180
181 plugin->Stop();
182
183 return 0;
184 }
185 //-----------------------------------------------------------------------------
186 int PLUGIN_RUNNER::Reload()
187 {
188 if (!isPluginLoaded)
189     {
190     errorStr = "Plugin '" + pluginFileName + "' was not loaded yet!";
191     printfd(__FILE__, "PLUGIN_LOADER::Reload() - %s\n", errorStr.c_str());
192     return -1;
193     }
194
195 if (!plugin)
196     {
197     errorStr = "Plugin '" + pluginFileName + "' was not created!";
198     printfd(__FILE__, "PLUGIN_LOADER::Reload() - %s\n", errorStr.c_str());
199     return -1;
200     }
201
202 int res = plugin->Reload();
203 errorStr = plugin->GetStrError();
204 return res;
205 }
206 //-----------------------------------------------------------------------------
207 bool PLUGIN_RUNNER::IsRunning()
208 {
209 if (!isPluginLoaded)
210     {
211     errorStr = "Plugin '" + pluginFileName + "' was not loaded yet!";
212     printfd(__FILE__, "PLUGIN_LOADER::IsRunning() - %s\n", errorStr.c_str());
213     return false;
214     }
215
216 if (!plugin)
217     {
218     errorStr = "Plugin '" + pluginFileName + "' was not created!";
219     printfd(__FILE__, "PLUGIN_LOADER::IsRunning() - %s\n", errorStr.c_str());
220     return false;
221     }
222
223 return plugin->IsRunning();
224 }
225 //-----------------------------------------------------------------------------
226 int PLUGIN_RUNNER::Load()
227 {
228 if (isPluginLoaded)
229     {
230     errorStr = "Plugin '" + pluginFileName + "' was already loaded!";
231     printfd(__FILE__, "PLUGIN_LOADER::Load() - %s\n", errorStr.c_str());
232     return -1;
233     }
234
235 if (pluginFileName.empty())
236     {
237     errorStr = "Empty plugin file name!";
238     printfd(__FILE__, "PLUGIN_LOADER::Load() - %s\n", errorStr.c_str());
239     return -1;
240     }
241
242 libHandle = dlopen(pluginFileName.c_str(), RTLD_NOW);
243
244 if (!libHandle)
245     {
246     errorStr = "Error loading plugin '"
247         + pluginFileName + "': '" + dlerror() + "'";
248     printfd(__FILE__, "PLUGIN_LOADER::Load() - %s\n", errorStr.c_str());
249     return -1;
250     }
251
252 isPluginLoaded = true;
253
254 PLUGIN * (*GetPlugin)();
255 GetPlugin = (PLUGIN * (*)())dlsym(libHandle, "GetPlugin");
256 if (!GetPlugin)
257     {
258     errorStr = std::string("GetPlugin() not found. ") + dlerror();
259     printfd(__FILE__, "PLUGIN_LOADER::Load() - %s\n", errorStr.c_str());
260     return -1;
261     }
262 plugin = GetPlugin();
263
264 if (!plugin)
265     {
266     errorStr = "Plugin was not created!";
267     printfd(__FILE__, "PLUGIN_LOADER::Load() - %s\n", errorStr.c_str());
268     return -1;
269     }
270
271 plugin->SetSettings(modSettings);
272 if (plugin->ParseSettings())
273     {
274     errorStr = plugin->GetStrError();
275     printfd(__FILE__, "PLUGIN_LOADER::Load() - Failed to parse settings. Plugin reports: '%s'\n", errorStr.c_str());
276     return -1;
277     }
278
279 return 0;
280 }
281 //-----------------------------------------------------------------------------
282 int PLUGIN_RUNNER::Unload()
283 {
284 if (isPluginLoaded)
285     {
286     if (dlclose(libHandle))
287         {
288         errorStr = "Failed to unload plugin '";
289         errorStr += pluginFileName + "': ";
290         errorStr += dlerror();
291         printfd(__FILE__, "PLUGIN_LOADER::Unload() - %s", errorStr.c_str());
292         return -1;
293         }
294     plugin = NULL;
295     isPluginLoaded = false;
296     }
297 return 0;
298 }
299 //-----------------------------------------------------------------------------