2008-07-09 Esteban Sanchez <estebans@artica.es>

* pandora_strutils.[cc,h]: Added strUnicodeToAnsi().

        * modules/pandora_module_logevent.cc, pandora_windows_service.[cc,h],
        windows/pandora_wmi.h: Tabs and blankspace style correction.

        * windows/pandora_wmi.cc: Convert result in getEventList() to ANSI,
        which was causing some BADXML errors on server. Tabs and blankspace 
        style correction.

        * bin/PandoraAgent.exe: Updated to last commit.



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@946 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
esanchezm 2008-07-09 12:46:22 +00:00
parent 8e9b10cdc2
commit 654405d451
9 changed files with 423 additions and 373 deletions

View File

@ -1,3 +1,16 @@
2008-07-09 Esteban Sanchez <estebans@artica.es>
* pandora_strutils.[cc,h]: Added strUnicodeToAnsi().
* modules/pandora_module_logevent.cc, pandora_windows_service.[cc,h],
windows/pandora_wmi.h: Tabs and blankspace style correction.
* windows/pandora_wmi.cc: Convert result in getEventList() to ANSI,
which was causing some BADXML errors on server. Tabs and blankspace
style correction.
* bin/PandoraAgent.exe: Updated to last commit.
2008-06-11 Esteban Sanchez <estebans@artica.es>
* bin/PandoraAgent.exe: Updated to commit, fixed an error when

View File

@ -43,50 +43,50 @@ Pandora_Module_Logevent::Pandora_Module_Logevent (string name, string source, st
void
Pandora_Module_Logevent::run () {
int interval, module_interval;
string value;
list<string> event_list;
list<string>::iterator event;
int interval, module_interval;
string value;
list<string> event_list;
list<string>::iterator event;
Pandora_Agent_Conf::Pandora_Agent_Conf *conf;
SYSTEMTIME system_time;
SYSTEMTIME system_time;
conf = Pandora_Agent_Conf::getInstance ();
// Get execution interval
value = conf->getValue ("interval");
interval = atoi(value.c_str ());
module_interval = this->getInterval ();
if (module_interval > 0) {
interval *= module_interval;
}
// Get execution interval
value = conf->getValue ("interval");
interval = atoi(value.c_str ());
module_interval = this->getInterval ();
if (module_interval > 0) {
interval *= module_interval;
}
// Run
try {
Pandora_Module::run ();
} catch (Interval_Not_Fulfilled e) {
return;
}
Pandora_Wmi::getEventList (this->source, this->type, this->pattern, interval, event_list);
Pandora_Module::run ();
} catch (Interval_Not_Fulfilled e) {
return;
}
Pandora_Wmi::getEventList (this->source, this->type, this->pattern, interval, event_list);
// No data
if (event_list.size () < 1) {
this->setOutput ("");
return;
}
for(event = event_list.begin (); event != event_list.end(); ++event) {
// No WMI timestamp?
if (event->size () < 26) {
this->setOutput (*event);
continue;
}
// Get the timestamp
Pandora_Wmi::convertWMIDate(event->substr (0, 26), &system_time);
// Store the data
this->setOutput (event->substr (26), &system_time);
}
if (event_list.size () < 1) {
this->setOutput ("");
return;
}
for (event = event_list.begin (); event != event_list.end(); ++event) {
// No WMI timestamp?
if (event->size () < 26) {
this->setOutput (*event);
continue;
}
// Get the timestamp
Pandora_Wmi::convertWMIDate (event->substr (0, 26), &system_time);
// Store the data
this->setOutput (event->substr (26), &system_time);
}
}

View File

@ -42,12 +42,12 @@ Pandora_Strutils::trim (const string str) {
string result = str;
string::size_type index = result.find_last_not_of (delims);
if(index != string::npos) {
if (index != string::npos) {
result.erase (++index);
}
index = result.find_first_not_of (delims);
if(index != std::string::npos) {
if (index != std::string::npos) {
result.erase (0, index);
} else {
result.erase ();
@ -56,6 +56,41 @@ Pandora_Strutils::trim (const string str) {
return result;
}
/**
* Convert an unicode string to a ANSI string.
*
* @param s String to convert
*
* @return String converted into ANSI code
*/
LPSTR
Pandora_Strutils::strUnicodeToAnsi (LPCWSTR s) {
if (s == NULL)
return NULL;
int cw = lstrlenW (s);
if (cw == 0) {
CHAR *psz = new CHAR[1];
*psz='\0';
return psz;
}
int cc = WideCharToMultiByte (CP_ACP,0, s, cw, NULL, 0, NULL, NULL);
if (cc==0)
return NULL;
CHAR *psz = new CHAR[cc+1];
cc = WideCharToMultiByte (CP_ACP, 0, s, cw, psz, cc, NULL, NULL);
if (cc == 0) {
delete[] psz;
return NULL;
}
psz[cc]='\0';
return psz;
}
/**
* Transform an integer variable into a string.
*

View File

@ -43,6 +43,8 @@ namespace Pandora_Strutils {
string trim (const string str);
LPSTR strUnicodeToAnsi (LPCWSTR s);
string inttostr (const int i);
string longtostr (const long i);
string longtohex (const long i);

View File

@ -51,16 +51,15 @@ string enabled_values[] = {"enabled", "1", "on", "yes", "si", "sí", "ok", ""};
Pandora_Windows_Service::Pandora_Windows_Service (const char * svc_name,
const char * svc_display_name,
const char * svc_description)
: Windows_Service (svc_name, svc_display_name, svc_description) {
this->setInitFunction ((void (Windows_Service::*) ())
: Windows_Service (svc_name, svc_display_name, svc_description) {
this->setInitFunction ((void (Windows_Service::*) ())
&Pandora_Windows_Service::pandora_init);
this->setRunFunction ((void (Windows_Service::*) ())
this->setRunFunction ((void (Windows_Service::*) ())
&Pandora_Windows_Service::pandora_run);
execution_number = 0;
this->modules = NULL;
this->conf = NULL;
execution_number = 0;
this->modules = NULL;
this->conf = NULL;
this->interval = 60000;
this->transfer_interval = this->interval;
this->elapsed_transfer_time = 0;
@ -70,60 +69,60 @@ Pandora_Windows_Service::Pandora_Windows_Service (const char * svc_name,
* Destroys a Pandora_Windows_Service object.
*/
Pandora_Windows_Service::~Pandora_Windows_Service () {
if (this->conf != NULL) {
delete this->conf;
}
if (this->conf != NULL) {
delete this->conf;
}
if (this->modules != NULL) {
delete this->modules;
}
if (this->modules != NULL) {
delete this->modules;
}
pandoraLog ("Pandora agent stopped");
}
bool
is_enabled (string value) {
int i = 0;
if (value == "") {
return false;
}
while (enabled_values[i] != "") {
if (enabled_values[i] == value) {
return true;
}
i++;
}
return false;
int i = 0;
if (value == "") {
return false;
}
while (enabled_values[i] != "") {
if (enabled_values[i] == value) {
return true;
}
i++;
}
return false;
}
void
Pandora_Windows_Service::pandora_init () {
string conf_file, interval, debug, transfer_interval;
setPandoraDebug (true);
conf_file = Pandora::getPandoraInstallDir ();
conf_file += "pandora_agent.conf";
this->conf = Pandora::Pandora_Agent_Conf::getInstance ();
this->conf->setFile (conf_file);
this->modules = new Pandora_Module_List (conf_file);
string conf_file, interval, debug, transfer_interval;
setPandoraDebug (true);
conf_file = Pandora::getPandoraInstallDir ();
conf_file += "pandora_agent.conf";
this->conf = Pandora::Pandora_Agent_Conf::getInstance ();
this->conf->setFile (conf_file);
this->modules = new Pandora_Module_List (conf_file);
/* Get the interval value (in seconds) and set it to the service */
interval = conf->getValue ("interval");
/* Get the interval value (in seconds) and set it to the service */
interval = conf->getValue ("interval");
transfer_interval = conf->getValue ("transfer_interval");
debug = conf->getValue ("debug");
setPandoraDebug (is_enabled (debug));
setPandoraDebug (is_enabled (debug));
if (interval != "") {
if (interval != "") {
try {
/* miliseconds */
this->interval = strtoint (interval) * 1000;
} catch (Invalid_Conversion e) {
}
}
}
if (transfer_interval == "") {
this->transfer_interval = this->interval;
@ -136,65 +135,65 @@ Pandora_Windows_Service::pandora_init () {
}
}
srand ((unsigned) time (0));
this->setSleepTime (this->interval);
pandoraLog ("Pandora agent started");
srand ((unsigned) time (0));
this->setSleepTime (this->interval);
pandoraLog ("Pandora agent started");
}
TiXmlElement *
Pandora_Windows_Service::getXmlHeader () {
TiXmlElement *agent;
SYSTEMTIME st;
char timestamp[20];
string value;
agent = new TiXmlElement ("agent_data");
value = conf->getValue ("agent_name");
if (value == "") {
value = Pandora_Windows_Info::getSystemName ();
}
agent->SetAttribute ("agent_name", value);
agent->SetAttribute ("version", getPandoraAgentVersion ());
GetSystemTime(&st);
sprintf (timestamp, "%d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
TiXmlElement *agent;
SYSTEMTIME st;
char timestamp[20];
string value;
agent = new TiXmlElement ("agent_data");
value = conf->getValue ("agent_name");
if (value == "") {
value = Pandora_Windows_Info::getSystemName ();
}
agent->SetAttribute ("agent_name", value);
agent->SetAttribute ("version", getPandoraAgentVersion ());
GetSystemTime(&st);
sprintf (timestamp, "%d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
agent->SetAttribute ("timestamp", timestamp);
agent->SetAttribute ("timestamp", timestamp);
value = conf->getValue ("interval");
agent->SetAttribute ("interval", value);
agent->SetAttribute ("interval", value);
value = Pandora_Windows_Info::getOSName ();
agent->SetAttribute ("os", value);
agent->SetAttribute ("os", value);
value = Pandora_Windows_Info::getOSVersion ();
agent->SetAttribute ("os_version", value);
return agent;
agent->SetAttribute ("os_version", value);
return agent;
}
void
Pandora_Windows_Service::copyTentacleDataFile (string host,
string filename)
string filename)
{
int rc;
string var, filepath;
string tentacle_cmd;
var = conf->getValue ("temporal");
if (var[var.length () - 1] != '\\') {
var += "\\";
}
filepath = var + filename;
filepath = var + filename;
/* Build the command to launch the Tentacle client */
tentacle_cmd = "tentacle_client.exe -a " + host;
var = conf->getValue ("server_port");
if (var != "") {
tentacle_cmd += " -p " + var;
@ -216,29 +215,29 @@ Pandora_Windows_Service::copyTentacleDataFile (string host,
}
tentacle_cmd += " " + filepath;
/* Copy the file */
pandoraDebug ("Remote copying XML %s on server %s",
filepath.c_str (), host.c_str ());
filepath.c_str (), host.c_str ());
pandoraDebug ("Command %s", tentacle_cmd.c_str());
rc = system (tentacle_cmd.c_str());
switch (rc) {
/* system() error */
case -1:
pandoraLog ("Unable to copy %s", filename.c_str ());
throw Pandora_Exception ();
case -1:
pandoraLog ("Unable to copy %s", filename.c_str ());
throw Pandora_Exception ();
/* tentacle_client.exe returned OK */
case 0:
break;
case 0:
break;
/* tentacle_client.exe error */
default:
pandoraDebug ("Tentacle client was unable to copy %s",
filename.c_str ());
throw Pandora_Exception ();
default:
pandoraDebug ("Tentacle client was unable to copy %s",
filename.c_str ());
throw Pandora_Exception ();
}
return;
@ -254,47 +253,47 @@ Pandora_Windows_Service::copyScpDataFile (string host,
string pubkey_file, privkey_file;
tmp_dir = conf->getValue ("temporal");
if (tmp_dir[tmp_dir.length () - 1] != '\\') {
tmp_dir += "\\";
}
filepath = tmp_dir + filename;
pandoraDebug ("Connecting with %s", host.c_str ());
try {
pubkey_file = Pandora::getPandoraInstallDir ();
pubkey_file += "key\\id_dsa.pub";
privkey_file = Pandora::getPandoraInstallDir ();
privkey_file += "key\\id_dsa";
ssh_client.connectWithPublicKey (host.c_str (), 22, "pandora",
pubkey_file, privkey_file, "");
} catch (SSH::Authentication_Failed e) {
pandoraLog ("Pandora Agent: Authentication Failed "
"when connecting to %s",
host.c_str ());
throw e;
} catch (Pandora_Exception e) {
pandoraLog ("Pandora Agent: Failed when copying to %s",
host.c_str ());
throw e;
}
pandoraDebug ("Remote copying XML %s on server %s at %s%s",
filepath.c_str (), host.c_str (),
remote_path.c_str (), filename.c_str ());
try {
ssh_client.scpFileFilename (remote_path + filename,
filepath);
} catch (Pandora_Exception e) {
pandoraLog ("Unable to copy at %s%s", remote_path.c_str (),
filename.c_str ());
ssh_client.disconnect();
if (tmp_dir[tmp_dir.length () - 1] != '\\') {
tmp_dir += "\\";
}
filepath = tmp_dir + filename;
pandoraDebug ("Connecting with %s", host.c_str ());
try {
pubkey_file = Pandora::getPandoraInstallDir ();
pubkey_file += "key\\id_dsa.pub";
privkey_file = Pandora::getPandoraInstallDir ();
privkey_file += "key\\id_dsa";
ssh_client.connectWithPublicKey (host.c_str (), 22, "pandora",
pubkey_file, privkey_file, "");
} catch (SSH::Authentication_Failed e) {
pandoraLog ("Pandora Agent: Authentication Failed "
"when connecting to %s",
host.c_str ());
throw e;
}
ssh_client.disconnect();
} catch (Pandora_Exception e) {
pandoraLog ("Pandora Agent: Failed when copying to %s",
host.c_str ());
throw e;
}
pandoraDebug ("Remote copying XML %s on server %s at %s%s",
filepath.c_str (), host.c_str (),
remote_path.c_str (), filename.c_str ());
try {
ssh_client.scpFileFilename (remote_path + filename,
filepath);
} catch (Pandora_Exception e) {
pandoraLog ("Unable to copy at %s%s", remote_path.c_str (),
filename.c_str ());
ssh_client.disconnect();
throw e;
}
ssh_client.disconnect();
}
void
@ -305,15 +304,15 @@ Pandora_Windows_Service::copyFtpDataFile (string host,
FTP::Pandora_Ftp_Client ftp_client;
string filepath;
string password;
filepath = conf->getValue ("temporal");
if (filepath[filepath.length () - 1] != '\\') {
filepath += "\\";
}
filepath += filename;
if (filepath[filepath.length () - 1] != '\\') {
filepath += "\\";
}
filepath += filename;
password = conf->getValue ("server_pwd");
ftp_client.connect (host,
22,
"pandora",
@ -330,16 +329,16 @@ Pandora_Windows_Service::copyFtpDataFile (string host,
} catch (FTP::Authentication_Failed e) {
pandoraLog ("Pandora Agent: Authentication Failed "
"when connecting to %s (%s)",
host.c_str (), ftp_client.getError ().c_str ());
host.c_str (), ftp_client.getError ().c_str ());
ftp_client.disconnect ();
throw e;
} catch (FTP::FTP_Exception e) {
pandoraLog ("Pandora Agent: Failed when copying to %s (%s)",
host.c_str (), ftp_client.getError ().c_str ());
host.c_str (), ftp_client.getError ().c_str ());
ftp_client.disconnect ();
throw e;
}
ftp_client.disconnect ();
}
@ -347,14 +346,14 @@ void
Pandora_Windows_Service::copyDataFile (string filename)
{
string mode, host, remote_path;
mode = conf->getValue ("transfer_mode");
host = conf->getValue ("server_ip");
remote_path = conf->getValue ("server_path");
if (remote_path[remote_path.length () - 1] != '/') {
remote_path += "/";
}
if (remote_path[remote_path.length () - 1] != '/') {
remote_path += "/";
}
try {
if (mode == "ftp") {
copyFtpDataFile (host, remote_path, filename);
@ -367,7 +366,7 @@ Pandora_Windows_Service::copyDataFile (string filename)
"Please recheck transfer_mode option "
"in configuration file.");
}
pandoraDebug ("Successfuly copied XML file to server.");
} catch (Pandora_Exception e) {
}
@ -375,7 +374,7 @@ Pandora_Windows_Service::copyDataFile (string filename)
void
Pandora_Windows_Service::recvTentacleDataFile (string host,
string filename)
string filename)
{
int rc;
string var;
@ -390,7 +389,7 @@ Pandora_Windows_Service::recvTentacleDataFile (string host,
/* Build the command to launch the Tentacle client */
tentacle_cmd = "tentacle_client.exe -g -a " + host;
var = conf->getValue ("server_port");
if (var != "") {
tentacle_cmd += " -p " + var;
@ -415,26 +414,26 @@ Pandora_Windows_Service::recvTentacleDataFile (string host,
/* Copy the file */
pandoraDebug ("Requesting file %s from server %s",
filename.c_str (), host.c_str ());
filename.c_str (), host.c_str ());
pandoraDebug ("Command %s", tentacle_cmd.c_str());
rc = system (tentacle_cmd.c_str());
switch (rc) {
/* system() error */
case -1:
pandoraLog ("Unable to receive file %s", filename.c_str ());
throw Pandora_Exception ();
case -1:
pandoraLog ("Unable to receive file %s", filename.c_str ());
throw Pandora_Exception ();
/* tentacle_client.exe returned OK */
case 0:
break;
case 0:
break;
/* tentacle_client.exe error */
default:
pandoraDebug ("Tentacle client was unable to receive file %s",
filename.c_str ());
throw Pandora_Exception ();
default:
pandoraDebug ("Tentacle client was unable to receive file %s",
filename.c_str ());
throw Pandora_Exception ();
}
return;
@ -443,14 +442,14 @@ Pandora_Windows_Service::recvTentacleDataFile (string host,
void
Pandora_Windows_Service::recvDataFile (string filename) {
string mode, host, remote_path;
mode = conf->getValue ("transfer_mode");
host = conf->getValue ("server_ip");
remote_path = conf->getValue ("server_path");
if (remote_path[remote_path.length () - 1] != '/') {
remote_path += "/";
}
try {
if (mode == "tentacle") {
recvTentacleDataFile (host, filename);
@ -468,12 +467,12 @@ void
Pandora_Windows_Service::checkConfig () {
int i, conf_size;
char *conf_str = NULL, *remote_conf_str = NULL, *remote_conf_md5 = NULL;
char agent_md5[33], conf_md5[33], flag;
char agent_md5[33], conf_md5[33], flag;
string conf_file, conf_tmp_file, md5_tmp_file, temp_dir, tmp;
tmp = conf->getValue ("remote_config");
if (tmp != "1") {
pandoraDebug ("Pandora_Windows_Service::checkConfig: Remote configuration disabled");
pandoraDebug ("Pandora_Windows_Service::checkConfig: Remote configuration disabled");
return;
}
@ -485,33 +484,33 @@ Pandora_Windows_Service::checkConfig () {
/* Get base install directory */
conf_file = Pandora::getPandoraInstallDir ();
conf_file += "pandora_agent.conf";
conf_file += "pandora_agent.conf";
/* Get agent name */
tmp = conf->getValue ("agent_name");
if (tmp == "") {
tmp = Pandora_Windows_Info::getSystemName ();
}
Pandora_File::md5 (tmp.c_str(), tmp.size(), agent_md5);
/* Calculate md5 hashes */
/* Calculate md5 hashes */
try {
conf_size = Pandora_File::readBinFile (conf_file, &conf_str);
Pandora_File::md5 (conf_str, conf_size, conf_md5);
} catch (...) {
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error calculating configuration md5");
if (conf_str != NULL) {
delete[] conf_str;
}
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error calculating configuration md5");
if (conf_str != NULL) {
delete[] conf_str;
}
return;
}
/* Compose file names from the agent name hash */
conf_tmp_file = agent_md5;
conf_tmp_file += ".conf";
md5_tmp_file = agent_md5;
md5_tmp_file += ".md5";
conf_tmp_file = agent_md5;
conf_tmp_file += ".conf";
md5_tmp_file = agent_md5;
md5_tmp_file += ".md5";
/* Get md5 file from server */
try {
@ -524,7 +523,7 @@ Pandora_Windows_Service::checkConfig () {
Pandora_File::writeBinFile (tmp, conf_str, conf_size);
copyDataFile (conf_tmp_file);
Pandora_File::removeFile (tmp);
tmp = temp_dir;
tmp += md5_tmp_file;
Pandora_File::writeBinFile (tmp, conf_md5, 32);
@ -533,49 +532,49 @@ Pandora_Windows_Service::checkConfig () {
} catch (...) {
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error uploading configuration to server");
}
delete[] conf_str;
return;
}
delete[] conf_str;
conf_str = NULL;
/* Read remote configuration file md5 */
try {
tmp = temp_dir;
tmp += md5_tmp_file;
if (Pandora_File::readBinFile (tmp, &remote_conf_md5) < 32) {
pandoraDebug ("Pandora_Windows_Service::checkConfig: Invalid remote md5", tmp.c_str());
if (remote_conf_md5 != NULL) {
delete[] remote_conf_md5;
}
if (remote_conf_md5 != NULL) {
delete[] remote_conf_md5;
}
return;
}
}
Pandora_File::removeFile (tmp);
} catch (...) {
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error checking remote configuration md5", tmp.c_str());
pandoraDebug ("Pandora_Windows_Service::checkConfig: Error checking remote configuration md5", tmp.c_str());
return;
}
/* Check for configuration changes */
flag = 0;
for (i = 0; i < 32; i++) {
if (remote_conf_md5[i] != conf_md5[i]) {
flag = 1;
break;
}
if (remote_conf_md5[i] != conf_md5[i]) {
flag = 1;
break;
}
}
delete[] remote_conf_md5;
/* Configuration has not changed */
if (flag == 0) {
return;
}
pandoraLog("Pandora_Windows_Service::checkConfig: Configuration has changed");
/* Get configuration file from server */
try {
recvDataFile (conf_tmp_file);
@ -587,12 +586,12 @@ Pandora_Windows_Service::checkConfig () {
Pandora_File::writeBinFile (conf_file, conf_str, conf_size);
} catch (...) {
pandoraDebug("Pandora_Windows_Service::checkConfig: Error retrieving configuration file from server");
if (conf_str != NULL) {
delete[] conf_str;
}
if (conf_str != NULL) {
delete[] conf_str;
}
return;
}
delete[] conf_str;
/* Reload configuration */
@ -601,59 +600,59 @@ Pandora_Windows_Service::checkConfig () {
void
Pandora_Windows_Service::pandora_run () {
TiXmlDeclaration *decl;
TiXmlDocument *doc;
TiXmlElement *local_xml, *agent;
string xml_filename, random_integer;
TiXmlDeclaration *decl;
TiXmlDocument *doc;
TiXmlElement *local_xml, *agent;
string xml_filename, random_integer;
string tmp_filename, tmp_filepath;
string encoding;
bool saved;
pandoraDebug ("Run begin");
/* Check for configuration changes */
this->checkConfig ();
string encoding;
bool saved;
execution_number++;
pandoraDebug ("Run begin");
if (this->modules != NULL) {
this->modules->goFirst ();
while (! this->modules->isLast ()) {
Pandora_Module *module;
module = this->modules->getCurrentValue ();
pandoraDebug ("Run %s", module->getName ().c_str ());
module->run ();
this->modules->goNext ();
}
}
/* Check for configuration changes */
this->checkConfig ();
this->elapsed_transfer_time += interval;
execution_number++;
if (this->modules != NULL) {
this->modules->goFirst ();
while (! this->modules->isLast ()) {
Pandora_Module *module;
module = this->modules->getCurrentValue ();
pandoraDebug ("Run %s", module->getName ().c_str ());
module->run ();
this->modules->goNext ();
}
}
this->elapsed_transfer_time += interval;
if (this->elapsed_transfer_time >= this->transfer_interval) {
agent = getXmlHeader ();
if (this->modules != NULL) {
this->modules->goFirst ();
while (! this->modules->isLast ()) {
Pandora_Module *module;
module = this->modules->getCurrentValue ();
local_xml = module->getXml ();
if (local_xml != NULL) {
agent->InsertEndChild (*local_xml);
delete local_xml;
}
this->modules->goNext ();
}
}
this->elapsed_transfer_time = 0;
/* Generate temporal filename */
random_integer = inttostr (rand());
@ -662,19 +661,19 @@ Pandora_Windows_Service::pandora_run () {
tmp_filename = Pandora_Windows_Info::getSystemName ();
}
tmp_filename += "." + random_integer + ".data";
xml_filename = conf->getValue ("temporal");
if (xml_filename[xml_filename.length () - 1] != '\\') {
xml_filename += "\\";
}
tmp_filepath = xml_filename + tmp_filename;
/* Copy the XML to temporal file */
encoding = conf->getValue ("encoding");
if (encoding == "") {
encoding = "ISO-8859-1";
}
encoding = "ISO-8859-1";
}
pandoraDebug ("Copying XML on %s", tmp_filepath.c_str ());
decl = new TiXmlDeclaration( "1.0", encoding.c_str(), "" );
doc = new TiXmlDocument (tmp_filepath);
@ -689,20 +688,20 @@ Pandora_Windows_Service::pandora_run () {
tmp_filepath.c_str ());
return;
}
/* Only send if debug is not activated */
if (getPandoraDebug () == false) {
this->copyDataFile (tmp_filename);
try {
Pandora_File::removeFile (tmp_filepath);
} catch (Pandora_File::Delete_Error e) {
}
}
}
/* Get the interval value (in minutes) */
pandoraDebug ("Next execution on %d seconds", this->interval / 1000);
return;
pandoraDebug ("Next execution on %d seconds", this->interval / 1000);
return;
}

View File

@ -44,20 +44,20 @@ namespace Pandora {
long interval;
long elapsed_transfer_time;
long transfer_interval;
TiXmlElement *getXmlHeader ();
void copyDataFile (string filename);
void copyTentacleDataFile (string host,
string filename);
string filename);
void copyScpDataFile (string host,
string remote_path,
string filename);
void copyFtpDataFile (string host,
string remote_path,
string filename);
void recvDataFile (string filename);
void recvDataFile (string filename);
void recvTentacleDataFile (string host,
string filename);
string filename);
void checkConfig ();
public:
void pandora_run ();

View File

@ -392,23 +392,25 @@ Pandora_Wmi::getEventList (string source, string type, string pattern, int inter
CDhInitialize init;
CDispPtr wmi_svc, quickfixes;
char *value = NULL;
WCHAR *unicode_value;
string event, limit, message, query, timestamp;
limit = getTimestampLimit(interval);
if (limit.empty()) {
char *encode;
limit = getTimestampLimit (interval);
if (limit.empty()) {
pandoraDebug ("Pandora_Wmi::getEventList: getTimestampLimit error");
return;
}
return;
}
// Build the WQL query
query = "SELECT * FROM Win32_NTLogEvent WHERE TimeWritten >= '" + limit + "'";
if (! source.empty()) {
query += " AND Logfile = '" + source + "'";
}
if (! type.empty()) {
query += " AND Type = '" + type + "'";
}
if (! source.empty()) {
query += " AND Logfile = '" + source + "'";
}
if (! type.empty()) {
query += " AND Type = '" + type + "'";
}
try {
dhCheck (dhGetObject (getWmiStr (L"."), NULL, &wmi_svc));
dhCheck (dhGetValue (L"%o", &quickfixes, wmi_svc,
@ -416,30 +418,29 @@ Pandora_Wmi::getEventList (string source, string type, string pattern, int inter
query.c_str()));
FOR_EACH (quickfix, quickfixes, NULL) {
// Timestamp
// Timestamp
dhGetValue (L"%s", &value, quickfix,
L".TimeWritten");
timestamp = value;
dhFreeString (value);
// Message
dhGetValue (L"%s", &value, quickfix,
// Message
dhGetValue (L"%S", &unicode_value, quickfix,
L".Message");
message = value;
value = Pandora_Strutils::strUnicodeToAnsi (unicode_value);
message = Pandora_Strutils::trim (value);
dhFreeString (value);
// LIKE is not always available, we have to filter ourselves
if (pattern.empty() || (message.find(pattern) != string::npos)) {
event = timestamp + " " + message;
event_list.push_back(event);
}
// LIKE is not always available, we have to filter ourselves
if (pattern.empty () || (message.find (pattern) != string::npos)) {
event = timestamp + " " + message;
event_list.push_back(event);
}
} NEXT_THROW (quickfix);
} catch (string errstr) {
pandoraDebug ("Pandora_Wmi::getEventList: error: %s", errstr.c_str ());
}
return;
}
/**
@ -449,59 +450,62 @@ Pandora_Wmi::getEventList (string source, string type, string pattern, int inter
*/
string
Pandora_Wmi::getTimestampLimit (int interval) {
char limit_str[26], diff_sign;
time_t limit_time, limit_time_utc, limit_diff;
struct tm *limit_tm = NULL, *limit_tm_utc = NULL;
// Get current time
limit_time = time(0);
if (limit_time == (time_t)-1) {
return "";
}
// Get UTC time
limit_tm_utc = gmtime (&limit_time);
limit_time_utc = mktime (limit_tm_utc);
// Calculate the difference in minutes
limit_diff = limit_time - limit_time_utc;
if (limit_diff >= 0) {
diff_sign = '+';
}
else {
diff_sign = '-';
}
limit_diff = abs(limit_diff);
limit_diff /= 60;
// Substract the agent interval
limit_time_utc -= interval;
limit_tm = localtime (&limit_time_utc);
if (limit_tm == NULL) {
return "";
}
// WMI date format: yyyymmddHHMMSS.xxxxxx+UUU
snprintf (limit_str, 26, "%.4d%.2d%.2d%.2d%.2d%.2d.000000%c%.3d",
limit_tm->tm_year + 1900, limit_tm->tm_mon + 1,
limit_tm->tm_mday, limit_tm->tm_hour,
limit_tm->tm_min, limit_tm->tm_sec, diff_sign, limit_diff);
limit_str[25] = '\0';
return string (limit_str);
char limit_str[26], diff_sign;
time_t limit_time, limit_time_utc, limit_diff;
struct tm *limit_tm = NULL, *limit_tm_utc = NULL;
// Get current time
limit_time = time(0);
if (limit_time == (time_t)-1) {
return "";
}
// Get UTC time
limit_tm_utc = gmtime (&limit_time);
limit_time_utc = mktime (limit_tm_utc);
// Calculate the difference in minutes
limit_diff = limit_time - limit_time_utc;
if (limit_diff >= 0) {
diff_sign = '+';
}
else {
diff_sign = '-';
}
limit_diff = abs(limit_diff);
limit_diff /= 60;
// Substract the agent interval
limit_time_utc -= interval;
limit_tm = localtime (&limit_time_utc);
if (limit_tm == NULL) {
return "";
}
// WMI date format: yyyymmddHHMMSS.xxxxxx+UUU
snprintf (limit_str, 26, "%.4d%.2d%.2d%.2d%.2d%.2d.000000%c%.3d",
limit_tm->tm_year + 1900, limit_tm->tm_mon + 1,
limit_tm->tm_mday, limit_tm->tm_hour,
limit_tm->tm_min, limit_tm->tm_sec, diff_sign, limit_diff);
limit_str[25] = '\0';
return string (limit_str);
}
/*
/**
* Converts a date in WMI format to SYSTEMTIME format.
*
* @param wmi_date Date in WMI format
* @param system_time Output system time variable
*/
void
Pandora_Wmi::convertWMIDate (string wmi_date, SYSTEMTIME *system_time) {
system_time->wYear = atoi(wmi_date.substr (0, 4).c_str());
system_time->wMonth = atoi(wmi_date.substr (4, 2).c_str());
system_time->wDay = atoi(wmi_date.substr (6, 2).c_str());
system_time->wHour = atoi(wmi_date.substr (8, 2).c_str());
system_time->wMinute = atoi(wmi_date.substr (10, 2).c_str());
system_time->wSecond = atoi(wmi_date.substr (12, 2).c_str());
Pandora_Wmi::convertWMIDate (string wmi_date, SYSTEMTIME *system_time)
{
system_time->wYear = atoi (wmi_date.substr (0, 4).c_str());
system_time->wMonth = atoi (wmi_date.substr (4, 2).c_str());
system_time->wDay = atoi (wmi_date.substr (6, 2).c_str());
system_time->wHour = atoi (wmi_date.substr (8, 2).c_str());
system_time->wMinute = atoi (wmi_date.substr (10, 2).c_str());
system_time->wSecond = atoi (wmi_date.substr (12, 2).c_str());
}

View File

@ -36,23 +36,20 @@ namespace Pandora_Wmi {
/**
* Exception super-class when doing a WMI operation.
*/
class Pandora_Wmi_Exception : public Pandora_Exception { };
class Pandora_Wmi_Exception : public Pandora_Exception { };
int isProcessRunning (string process_name);
int isProcessRunning (string process_name);
int isServiceRunning (string service_name);
unsigned long getDiskFreeSpace (string disk_id);
int getCpuUsagePercentage (int cpu_id);
long getFreememory ();
string getOSName ();
string getOSVersion ();
string getOSBuild ();
string getSystemName ();
void getEventList (string source, string type, string pattern, int interval, list<string> &event_list);
string getTimestampLimit (int interval);
void convertWMIDate (string wmi_date, SYSTEMTIME *system_time);
string getOSVersion ();
string getOSBuild ();
string getSystemName ();
void getEventList (string source, string type, string pattern, int interval, list<string> &event_list);
string getTimestampLimit (int interval);
void convertWMIDate (string wmi_date, SYSTEMTIME *system_time);
};
#endif