2011-07-11 Vanessa Gil <vanessa.gil@artica.es>
* win32/pandora_agent_conf.cc win32/pandora_windows_service.cc: Allow drone agents in Windows. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@4545 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
8bff091cfa
commit
0c2241b9c8
|
@ -1,3 +1,8 @@
|
|||
2011-07-11 Vanessa Gil <vanessa.gil@artica.es>
|
||||
|
||||
* win32/pandora_agent_conf.cc
|
||||
win32/pandora_windows_service.cc: Allow drone agents in Windows.
|
||||
|
||||
2011-07-08 Vanessa Gil <vanessa.gil@artica.es>
|
||||
|
||||
* unix/pandora_agent: Allow drone agents in Unix.
|
||||
|
|
|
@ -101,6 +101,145 @@ Pandora::Pandora_Agent_Conf::parseFile(string path_file, Collection *aux){
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create configuration file for drone agents.
|
||||
* @param filename Configuration file to open.
|
||||
* @param path_broker Configuration file to write.
|
||||
*/
|
||||
void
|
||||
writeBrokerConf(string path_broker, string filename, string name_broker){
|
||||
ifstream file_conf (filename.c_str ());
|
||||
ofstream file_broker (path_broker.c_str ());
|
||||
string buffer;
|
||||
string comp;
|
||||
unsigned int pos;
|
||||
|
||||
/* Read and set the file */
|
||||
while (!file_conf.eof ()) {
|
||||
/* Set the value from each line */
|
||||
getline (file_conf, buffer);
|
||||
|
||||
pos = buffer.find("agent_name");
|
||||
if (pos != string::npos){
|
||||
comp = buffer.substr (0,12);
|
||||
if (comp == "# agent_name"){
|
||||
buffer = "agent_name "+name_broker+"\n";
|
||||
}
|
||||
}
|
||||
|
||||
pos = buffer.find("broker_agent");
|
||||
if (pos != string::npos){
|
||||
continue;
|
||||
} else {
|
||||
buffer = buffer + "\n";
|
||||
}
|
||||
file_broker << buffer;
|
||||
|
||||
}
|
||||
file_conf.close ();
|
||||
file_broker.close();
|
||||
}
|
||||
|
||||
void
|
||||
Pandora::Pandora_Agent_Conf::setFile (string *all_conf){
|
||||
string buffer, filename;
|
||||
unsigned int pos;
|
||||
Collection *aux;
|
||||
|
||||
filename = Pandora::getPandoraInstallDir ();
|
||||
filename += "pandora_agent.conf";
|
||||
|
||||
ifstream file (filename.c_str ());
|
||||
|
||||
if (this->key_values)
|
||||
delete this->key_values;
|
||||
this->key_values = new list<Key_Value> ();
|
||||
|
||||
if (this->collection_list)
|
||||
delete this->collection_list;
|
||||
this->collection_list = new list<Collection> ();
|
||||
|
||||
if (!file.is_open ()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Read and set the file */
|
||||
while (!file.eof ()) {
|
||||
/* Set the value from each line */
|
||||
getline (file, buffer);
|
||||
|
||||
/* Ignore blank or commented lines */
|
||||
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
|
||||
/*Check if is a include*/
|
||||
pos = buffer.find("include");
|
||||
if (pos != string::npos){
|
||||
string path_file;
|
||||
unsigned pos_c;
|
||||
|
||||
path_file = buffer.substr(pos+8);
|
||||
|
||||
pos_c = path_file.find("\"");
|
||||
/* Remove " */
|
||||
while (pos_c != string::npos){
|
||||
path_file.replace(pos_c, 1, "");
|
||||
pos_c = path_file.find("\"",pos_c+1);
|
||||
}
|
||||
parseFile(path_file, aux);
|
||||
}
|
||||
/*Check if is a broker_agent*/
|
||||
pos = buffer.find("broker_agent");
|
||||
if (pos != string::npos){
|
||||
string path_broker, name_broker;
|
||||
unsigned pos_c;
|
||||
int position = 0;
|
||||
|
||||
name_broker = buffer.substr(pos+13);
|
||||
path_broker = name_broker+".conf";
|
||||
|
||||
all_conf[position] = Pandora::getPandoraInstallDir () + path_broker;
|
||||
position += 1;
|
||||
|
||||
ifstream file_br (path_broker.c_str ());
|
||||
/* Check if already exists the configuration file*/
|
||||
if (!file_br){
|
||||
file_br.close();
|
||||
writeBrokerConf(path_broker, filename, name_broker);
|
||||
}
|
||||
}
|
||||
|
||||
/*Check if is a collection*/
|
||||
pos = buffer.find("file_collection");
|
||||
if(pos != string::npos) {
|
||||
string collection_name, trimmed_str;
|
||||
|
||||
/*Add collection to collection_list*/
|
||||
/*The number 15 is the number of character of string file_collection*/
|
||||
collection_name = buffer.substr(pos+15);
|
||||
|
||||
aux = new Collection();
|
||||
|
||||
aux->name = trim (collection_name);
|
||||
|
||||
/*Check for ".." substring for security issues*/
|
||||
if ( collection_name.find("..") == string::npos ) {
|
||||
aux->verify = 0;
|
||||
collection_list->push_back (*aux);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
/*Check if is a module*/
|
||||
pos = buffer.find ("module_");
|
||||
if (pos == string::npos) {
|
||||
Key_Value kv;
|
||||
|
||||
kv.parseLine (buffer);
|
||||
key_values->push_back (kv);
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets configuration file to Pandora_Agent_Conf object instance.
|
||||
*
|
||||
|
@ -154,6 +293,7 @@ Pandora::Pandora_Agent_Conf::setFile (string filename) {
|
|||
}
|
||||
parseFile(path_file, aux);
|
||||
}
|
||||
|
||||
/*Check if is a collection*/
|
||||
pos = buffer.find("file_collection");
|
||||
if(pos != string::npos) {
|
||||
|
|
|
@ -52,6 +52,7 @@ namespace Pandora {
|
|||
|
||||
~Pandora_Agent_Conf ();
|
||||
void parseFile(string path_file, Collection *aux);
|
||||
void setFile (string *all_conf);
|
||||
void setFile (string filename);
|
||||
string getValue (const string key);
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <pandora_agent_conf.h>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
using namespace Pandora;
|
||||
|
@ -113,13 +114,98 @@ Pandora_Windows_Service::start () {
|
|||
this->started = true;
|
||||
}
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::pandora_init_broker (string file_conf) {
|
||||
string interval, debug, transfer_interval, util_dir, path, env;
|
||||
string udp_server_enabled, udp_server_port, udp_server_addr, udp_server_auth_addr;
|
||||
int pos;
|
||||
|
||||
/*setPandoraDebug (true);*/
|
||||
|
||||
// Add the util subdirectory to the PATH
|
||||
util_dir = Pandora::getPandoraInstallDir ();
|
||||
util_dir += "util";
|
||||
path = getenv ("PATH");
|
||||
env = "PATH=" + path + ";" + util_dir;
|
||||
putenv (env.c_str ());
|
||||
|
||||
this->conf = Pandora::Pandora_Agent_Conf::getInstance ();
|
||||
this->conf->setFile (file_conf);
|
||||
this->modules = new Pandora_Module_List (file_conf);
|
||||
|
||||
pandoraLog ("Pandora agent started");
|
||||
}
|
||||
|
||||
int
|
||||
Pandora_Windows_Service::count_broker_agents(){
|
||||
string buffer;
|
||||
string filename;
|
||||
unsigned int pos;
|
||||
int num = 0;
|
||||
|
||||
filename = Pandora::getPandoraInstallDir ();
|
||||
filename += "pandora_agent.conf";
|
||||
ifstream file (filename.c_str ());
|
||||
|
||||
/* Read and set the file */
|
||||
while (!file.eof ()) {
|
||||
/* Set the value from each line */
|
||||
getline (file, buffer);
|
||||
|
||||
/* Ignore blank or commented lines */
|
||||
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
|
||||
/*Check if is a broker_agent*/
|
||||
pos = buffer.find("broker_agent");
|
||||
if (pos != string::npos){
|
||||
num += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close ();
|
||||
return num;
|
||||
}
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::check_broker_agents(string *all_conf){
|
||||
string buffer, filename;
|
||||
unsigned int pos;
|
||||
int pos_file = 0;
|
||||
|
||||
filename = Pandora::getPandoraInstallDir ();
|
||||
filename += "pandora_agent.conf";
|
||||
|
||||
ifstream file (filename.c_str ());
|
||||
|
||||
while (!file.eof ()) {
|
||||
/* Set the value from each line */
|
||||
getline (file, buffer);
|
||||
|
||||
/* Ignore blank or commented lines */
|
||||
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
|
||||
/*Check if is a broker_agent*/
|
||||
pos = buffer.find("broker_agent");
|
||||
if (pos != string::npos){
|
||||
string name_broker, path_broker;
|
||||
|
||||
name_broker = buffer.substr(pos+13);
|
||||
path_broker = Pandora::getPandoraInstallDir () + name_broker + ".conf";
|
||||
all_conf[pos_file] = path_broker;
|
||||
pos_file += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::pandora_init () {
|
||||
string conf_file, interval, debug, transfer_interval, util_dir, path, env;
|
||||
string udp_server_enabled, udp_server_port, udp_server_addr, udp_server_auth_addr;
|
||||
int pos, num;
|
||||
|
||||
setPandoraDebug (true);
|
||||
|
||||
|
||||
// Add the util subdirectory to the PATH
|
||||
util_dir = Pandora::getPandoraInstallDir ();
|
||||
util_dir += "util";
|
||||
|
@ -130,10 +216,13 @@ Pandora_Windows_Service::pandora_init () {
|
|||
conf_file = Pandora::getPandoraInstallDir ();
|
||||
conf_file += "pandora_agent.conf";
|
||||
|
||||
num = count_broker_agents();
|
||||
string all_conf[num];
|
||||
|
||||
this->conf = Pandora::Pandora_Agent_Conf::getInstance ();
|
||||
this->conf->setFile (conf_file);
|
||||
this->conf->setFile (all_conf);
|
||||
this->modules = new Pandora_Module_List (conf_file);
|
||||
|
||||
|
||||
/* Get the interval value (in seconds) and set it to the service */
|
||||
interval = conf->getValue ("interval");
|
||||
transfer_interval = conf->getValue ("transfer_interval");
|
||||
|
@ -891,11 +980,11 @@ Pandora_Windows_Service::checkCollections () {
|
|||
}
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::checkConfig () {
|
||||
Pandora_Windows_Service::checkConfig (string file) {
|
||||
int i, conf_size;
|
||||
char *conf_str = NULL, *remote_conf_str = NULL, *remote_conf_md5 = NULL;
|
||||
char agent_md5[33], conf_md5[33], flag;
|
||||
string agent_name, conf_file, conf_tmp_file, md5_tmp_file, temp_dir, tmp;
|
||||
string agent_name, conf_tmp_file, md5_tmp_file, temp_dir, tmp;
|
||||
|
||||
tmp = conf->getValue ("remote_config");
|
||||
if (tmp != "1") {
|
||||
|
@ -909,10 +998,6 @@ Pandora_Windows_Service::checkConfig () {
|
|||
temp_dir += "\\";
|
||||
}
|
||||
|
||||
/* Get base install directory */
|
||||
conf_file = Pandora::getPandoraInstallDir ();
|
||||
conf_file += "pandora_agent.conf";
|
||||
|
||||
/* Get agent name */
|
||||
tmp = conf->getValue ("agent_name");
|
||||
if (tmp.empty ()) {
|
||||
|
@ -930,7 +1015,7 @@ Pandora_Windows_Service::checkConfig () {
|
|||
|
||||
/* Calculate md5 hashes */
|
||||
try {
|
||||
conf_size = Pandora_File::readBinFile (conf_file, &conf_str);
|
||||
conf_size = Pandora_File::readBinFile (file, &conf_str);
|
||||
Pandora_File::md5 (conf_str, conf_size, conf_md5);
|
||||
} catch (...) {
|
||||
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error calculating configuration md5");
|
||||
|
@ -1017,7 +1102,7 @@ Pandora_Windows_Service::checkConfig () {
|
|||
conf_size = Pandora_File::readBinFile (tmp, &conf_str);
|
||||
Pandora_File::removeFile (tmp);
|
||||
/* Save new configuration */
|
||||
Pandora_File::writeBinFile (conf_file, conf_str, conf_size);
|
||||
Pandora_File::writeBinFile (file, conf_str, conf_size);
|
||||
} catch (...) {
|
||||
pandoraDebug("Pandora_Windows_Service::checkConfig: Error retrieving configuration file from server");
|
||||
if (conf_str != NULL) {
|
||||
|
@ -1154,19 +1239,20 @@ Pandora_Windows_Service::sendBufferedXml (string path) {
|
|||
}
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::pandora_run () {
|
||||
Pandora_Windows_Service::pandora_run_broker (string config) {
|
||||
Pandora_Agent_Conf *conf = NULL;
|
||||
string server_addr;
|
||||
int startup_delay = 0;
|
||||
static unsigned char delayed = 0;
|
||||
int exe = 1;
|
||||
int startup_delay = 0;
|
||||
static unsigned char delayed = 0;
|
||||
int exe = 1;
|
||||
int i;
|
||||
|
||||
pandoraDebug ("Run begin");
|
||||
|
||||
|
||||
conf = this->getConf ();
|
||||
|
||||
/* Sleep if a startup delay was specified */
|
||||
startup_delay = atoi (conf->getValue ("startup_delay").c_str ()) * 1000;
|
||||
startup_delay = atoi (conf->getValue ("startup_delay").c_str ()) * 1000;
|
||||
if (startup_delay > 0 && delayed == 0) {
|
||||
delayed = 1;
|
||||
pandoraLog ("Delaying startup %d miliseconds", startup_delay);
|
||||
|
@ -1175,7 +1261,7 @@ Pandora_Windows_Service::pandora_run () {
|
|||
|
||||
/* Check for configuration changes */
|
||||
if (getPandoraDebug () == false) {
|
||||
this->checkConfig ();
|
||||
this->checkConfig (config);
|
||||
this->checkCollections ();
|
||||
}
|
||||
|
||||
|
@ -1196,7 +1282,71 @@ Pandora_Windows_Service::pandora_run () {
|
|||
if (exe == 0) return;
|
||||
|
||||
pandoraDebug ("Run %s", module->getName ().c_str ());
|
||||
if (module->checkCron () == 1) {
|
||||
module->run ();
|
||||
Sleep(10);
|
||||
}
|
||||
|
||||
/* Save module data to an environment variable */
|
||||
if (!module->getSave().empty ()) {
|
||||
module->exportDataOutput ();
|
||||
}
|
||||
|
||||
/* Evaluate module conditions */
|
||||
module->evaluateConditions ();
|
||||
|
||||
this->modules->goNext ();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
Pandora_Windows_Service::pandora_run () {
|
||||
Pandora_Agent_Conf *conf = NULL;
|
||||
string server_addr, conf_file;
|
||||
int startup_delay = 0;
|
||||
static unsigned char delayed = 0;
|
||||
int exe = 1;
|
||||
int i, num;
|
||||
|
||||
pandoraDebug ("Run begin");
|
||||
|
||||
conf = this->getConf ();
|
||||
|
||||
/* Sleep if a startup delay was specified */
|
||||
startup_delay = atoi (conf->getValue ("startup_delay").c_str ()) * 1000;
|
||||
if (startup_delay > 0 && delayed == 0) {
|
||||
delayed = 1;
|
||||
pandoraLog ("Delaying startup %d miliseconds", startup_delay);
|
||||
Sleep (startup_delay);
|
||||
}
|
||||
|
||||
/* Check for configuration changes */
|
||||
if (getPandoraDebug () == false) {
|
||||
conf_file = Pandora::getPandoraInstallDir ();
|
||||
conf_file += "pandora_agent.conf";
|
||||
this->checkConfig (conf_file);
|
||||
this->checkCollections ();
|
||||
}
|
||||
|
||||
server_addr = conf->getValue ("server_ip");
|
||||
|
||||
execution_number++;
|
||||
|
||||
if (this->modules != NULL) {
|
||||
this->modules->goFirst ();
|
||||
|
||||
while (! this->modules->isLast ()) {
|
||||
Pandora_Module *module;
|
||||
|
||||
module = this->modules->getCurrentValue ();
|
||||
|
||||
exe = module->evaluatePreconditions ();
|
||||
|
||||
if (exe == 0) return;
|
||||
|
||||
pandoraDebug ("Run %s", module->getName ().c_str ());
|
||||
if (module->checkCron () == 1) {
|
||||
module->run ();
|
||||
Sleep(10);
|
||||
|
@ -1214,7 +1364,6 @@ Pandora_Windows_Service::pandora_run () {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
this->elapsed_transfer_time += this->interval;
|
||||
|
||||
if (this->elapsed_transfer_time >= this->transfer_interval) {
|
||||
|
@ -1227,6 +1376,16 @@ Pandora_Windows_Service::pandora_run () {
|
|||
/* Get the interval value (in minutes) */
|
||||
pandoraDebug ("Next execution on %d seconds", this->interval / 1000);
|
||||
|
||||
num = count_broker_agents();
|
||||
string all_conf[num];
|
||||
|
||||
check_broker_agents(all_conf);
|
||||
|
||||
for (i=0;i<num;i++){
|
||||
pandora_init_broker(all_conf[i]);
|
||||
pandora_run_broker(all_conf[i]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -73,8 +73,12 @@ namespace Pandora {
|
|||
int unzipCollection(string zip_path, string dest_dir);
|
||||
void checkCollections ();
|
||||
void addCollectionsPath();
|
||||
void checkConfig ();
|
||||
void checkConfig (string file);
|
||||
void purgeDiskCollections ();
|
||||
void pandora_init_broker (string file_conf);
|
||||
void pandora_run_broker (string config);
|
||||
int count_broker_agents();
|
||||
void check_broker_agents(string *all_conf);
|
||||
|
||||
Pandora_Windows_Service ();
|
||||
|
||||
|
|
Loading…
Reference in New Issue