mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-07-30 17:25:26 +02:00
2010-04-21 Ramon Novoa <rnovoa@artica.es>
* main.cc: Updated headers after tinyxml removal. * modules/pandora_module_list.cc, modules/pandora_module_factory.cc: Added support for plugin modules. * modules/pandora_module_exec.cc, modules/pandora_module.h, modules/pandora_module.cc: Added the module_timeout configuration token and replaced tinyxml related code. * bin/pandora_agent.conf: Added a sample plugin module. Added the group configuration token (was missing). * modules/pandora_module_plugin.cc, modules/pandora_module_plugin.h: Added to repository. Plugin module. * bin/util/df.vbs, bin/util/ps.vbs: Added to repository. Sample VBScript plugins. * pandora_windows_service.cc, pandora_windows_service.h, modules/pandora_module_inventory.cc, ssh/pandora_ssh_test.cc, ftp/pandora_ftp_test.cc, modules/pandora_module_inventory.h: Replaced tinyxml related code. * tinyxml, tinyxml/tinyxmlerror.cpp, tinyxml/tinystr.h, tinyxml/tinyxmlparser.cpp, tinyxml/tinyxml.cpp, tinyxml/tinyxml.h, tinyxml/tinystr.cpp: Removed from repository. No longer used. * installer/pandora.mpi, pandora.cc: Updated build to RC1. * Makefile.am: Updated sources. Removed tinyxml and added the plugin module. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2584 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
f2ab3ea2de
commit
75f93793ed
@ -1,3 +1,38 @@
|
|||||||
|
2010-04-21 Ramon Novoa <rnovoa@artica.es>
|
||||||
|
|
||||||
|
* main.cc: Updated headers after tinyxml removal.
|
||||||
|
|
||||||
|
* modules/pandora_module_list.cc,
|
||||||
|
modules/pandora_module_factory.cc: Added support for plugin modules.
|
||||||
|
|
||||||
|
* modules/pandora_module_exec.cc, modules/pandora_module.h,
|
||||||
|
modules/pandora_module.cc: Added the module_timeout configuration
|
||||||
|
token and replaced tinyxml related code.
|
||||||
|
|
||||||
|
* bin/pandora_agent.conf: Added a sample plugin module. Added the
|
||||||
|
group configuration token (was missing).
|
||||||
|
|
||||||
|
* modules/pandora_module_plugin.cc,
|
||||||
|
modules/pandora_module_plugin.h: Added to repository. Plugin module.
|
||||||
|
|
||||||
|
* bin/util/df.vbs, bin/util/ps.vbs: Added to repository. Sample
|
||||||
|
VBScript plugins.
|
||||||
|
|
||||||
|
* pandora_windows_service.cc, pandora_windows_service.h,
|
||||||
|
modules/pandora_module_inventory.cc, ssh/pandora_ssh_test.cc,
|
||||||
|
ftp/pandora_ftp_test.cc, modules/pandora_module_inventory.h: Replaced
|
||||||
|
tinyxml related code.
|
||||||
|
|
||||||
|
* tinyxml, tinyxml/tinyxmlerror.cpp, tinyxml/tinystr.h,
|
||||||
|
tinyxml/tinyxmlparser.cpp, tinyxml/tinyxml.cpp,
|
||||||
|
tinyxml/tinyxml.h, tinyxml/tinystr.cpp: Removed from repository. No
|
||||||
|
longer used.
|
||||||
|
|
||||||
|
* installer/pandora.mpi, pandora.cc: Updated build to RC1.
|
||||||
|
|
||||||
|
* Makefile.am: Updated sources. Removed tinyxml and added the plugin
|
||||||
|
module.
|
||||||
|
|
||||||
2010-04-16 Ramon Novoa <rnovoa@artica.es>
|
2010-04-16 Ramon Novoa <rnovoa@artica.es>
|
||||||
|
|
||||||
* windows/pandora_wmi.cc: fixed getOSVersion. Crashed in Windows 2008
|
* windows/pandora_wmi.cc: fixed getOSVersion. Crashed in Windows 2008
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
bin_PROGRAMS = PandoraAgent
|
bin_PROGRAMS = PandoraAgent
|
||||||
if DEBUG
|
if DEBUG
|
||||||
PandoraAgent_SOURCES = misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_odbc.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc tinyxml/tinyxmlerror.cpp tinyxml/tinyxml.cpp tinyxml/tinyxmlparser.cpp tinyxml/tinystr.cpp misc/md5.c windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc debug_new.cpp
|
PandoraAgent_SOURCES = misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_odbc.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc debug_new.cpp
|
||||||
PandoraAgent_CXXFLAGS=-g -O0 -DCURL_STATICLIB -D__DEBUG__
|
PandoraAgent_CXXFLAGS=-g -O0 -DCURL_STATICLIB -D__DEBUG__
|
||||||
else
|
else
|
||||||
PandoraAgent_SOURCES = misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_odbc.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc tinyxml/tinyxmlerror.cpp tinyxml/tinyxml.cpp tinyxml/tinyxmlparser.cpp tinyxml/tinystr.cpp misc/md5.c windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc
|
PandoraAgent_SOURCES = misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_odbc.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc
|
||||||
PandoraAgent_CXXFLAGS=-O2 -DCURL_STATICLIB
|
PandoraAgent_CXXFLAGS=-O2 -DCURL_STATICLIB
|
||||||
endif
|
endif
|
||||||
|
@ -26,6 +26,9 @@ temporal "$AgentTemp$"
|
|||||||
|
|
||||||
#agent_name My_Custom_Agent_name
|
#agent_name My_Custom_Agent_name
|
||||||
|
|
||||||
|
# Group assigned for this agent (descriptive, p.e: Servers)
|
||||||
|
#group Servers
|
||||||
|
|
||||||
# This limits operation if temporal dir has not enough free disk.
|
# This limits operation if temporal dir has not enough free disk.
|
||||||
#temporal_min_size 1024
|
#temporal_min_size 1024
|
||||||
|
|
||||||
@ -184,3 +187,6 @@ module_end
|
|||||||
#process_firefox_stop killall firefox
|
#process_firefox_stop killall firefox
|
||||||
#service_messenger 1
|
#service_messenger 1
|
||||||
|
|
||||||
|
# Example plugin to retrieve drive usage
|
||||||
|
# module_plugin cscript.exe //B "C:\Program Files\pandora_agent\util\df.vbs"
|
||||||
|
|
||||||
|
32
pandora_agents/win32/bin/util/df.vbs
Normal file
32
pandora_agents/win32/bin/util/df.vbs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
' df.vbs
|
||||||
|
' Returns free space for avaible drives.
|
||||||
|
' --------------------------------------
|
||||||
|
|
||||||
|
Option Explicit
|
||||||
|
On Error Resume Next
|
||||||
|
|
||||||
|
' Variables
|
||||||
|
Dim objWMIService, objItem, colItems, argc, argv, i
|
||||||
|
|
||||||
|
' Parse command line parameters
|
||||||
|
argc = Wscript.Arguments.Count
|
||||||
|
Set argv = CreateObject("Scripting.Dictionary")
|
||||||
|
For i = 0 To argc - 1
|
||||||
|
argv.Add Wscript.Arguments(i), i
|
||||||
|
Next
|
||||||
|
|
||||||
|
' Get drive information
|
||||||
|
Set objWMIService = GetObject ("winmgmts:\\.\root\cimv2")
|
||||||
|
Set colItems = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
|
||||||
|
|
||||||
|
For Each objItem in colItems
|
||||||
|
If argc = 0 Or argv.Exists(objItem.Name) Then
|
||||||
|
If objItem.FreeSpace <> "" Then
|
||||||
|
Wscript.StdOut.WriteLine "<module>"
|
||||||
|
Wscript.StdOut.WriteLine " <name><![CDATA[" & objItem.Name & "]]></name>"
|
||||||
|
Wscript.StdOut.WriteLine " <description><![CDATA[Drive " & objItem.Name & " free space in MB]]></description>"
|
||||||
|
Wscript.StdOut.WriteLine " <data><![CDATA[" & Int(objItem.FreeSpace /1048576) & "]]></data>"
|
||||||
|
Wscript.StdOut.WriteLine "</module>"
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Next
|
33
pandora_agents/win32/bin/util/ps.vbs
Normal file
33
pandora_agents/win32/bin/util/ps.vbs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
' ps.vbs
|
||||||
|
' Returns the status of the given processes.
|
||||||
|
' -----------------------------------------
|
||||||
|
|
||||||
|
Option Explicit
|
||||||
|
'On Error Resume Next
|
||||||
|
|
||||||
|
' Variables
|
||||||
|
Dim objWMIService, objItem, colItems, argc, ps, i
|
||||||
|
|
||||||
|
' Get and hash process information
|
||||||
|
Set objWMIService = GetObject ("winmgmts:\\.\root\cimv2")
|
||||||
|
Set colItems = objWMIService.ExecQuery ("Select * from Win32_Process")
|
||||||
|
Set ps = CreateObject("Scripting.Dictionary")
|
||||||
|
For Each objItem in colItems
|
||||||
|
if Not ps.Exists(objItem.Name) Then
|
||||||
|
ps.Add objItem.Name, 1
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
' Parse command line parameters and check each process
|
||||||
|
argc = Wscript.Arguments.Count
|
||||||
|
For i = 0 To argc - 1
|
||||||
|
Wscript.StdOut.WriteLine "<module>"
|
||||||
|
Wscript.StdOut.WriteLine " <name><![CDATA[" & Wscript.Arguments(i) & "]]></name>"
|
||||||
|
Wscript.StdOut.WriteLine " <description><![CDATA[Process " & Wscript.Arguments(i) & " status]]></description>"
|
||||||
|
If argc = 0 Or ps.Exists(Wscript.Arguments(i)) Then
|
||||||
|
Wscript.StdOut.WriteLine " <data><![CDATA[" & 1 & "]]></data>"
|
||||||
|
Else
|
||||||
|
Wscript.StdOut.WriteLine " <data><![CDATA[" & 0 & "]]></data>"
|
||||||
|
End If
|
||||||
|
Wscript.StdOut.WriteLine "</module>"
|
||||||
|
Next
|
@ -19,7 +19,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pandora_ftp_test.h"
|
#include "pandora_ftp_test.h"
|
||||||
#include "../tinyxml/tinyxml.h"
|
|
||||||
#include "../misc/pandora_file.h"
|
#include "../misc/pandora_file.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <dir.h>
|
#include <dir.h>
|
||||||
@ -73,13 +72,13 @@ Pandora_FTP_Test::~Pandora_FTP_Test () {
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Pandora_FTP_Test::test () {
|
Pandora_FTP_Test::test () {
|
||||||
|
string data_xml;
|
||||||
string password, tmp_filename;
|
string password, tmp_filename;
|
||||||
string remote_host, remote_filepath, tmp_filepath;
|
string remote_host, remote_filepath, tmp_filepath;
|
||||||
TiXmlDocument *doc;
|
|
||||||
TiXmlDeclaration *decl;
|
|
||||||
bool saved;
|
bool saved;
|
||||||
char *err;
|
char *err;
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
|
FILE *conf_fh = NULL;
|
||||||
|
|
||||||
remote_host = this->conf->getValue ("server_ip");
|
remote_host = this->conf->getValue ("server_ip");
|
||||||
cout << "Connecting with " << remote_host << "..." << endl;
|
cout << "Connecting with " << remote_host << "..." << endl;
|
||||||
@ -115,23 +114,16 @@ Pandora_FTP_Test::test () {
|
|||||||
}
|
}
|
||||||
tmp_filepath += tmp_filename;
|
tmp_filepath += tmp_filename;
|
||||||
|
|
||||||
decl = new TiXmlDeclaration( "1.0", "ISO-8859-1", "" );
|
data_xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
|
||||||
doc = new TiXmlDocument (tmp_filepath);
|
conf_fh = fopen (tmp_filepath.c_str (), "w");
|
||||||
doc->InsertEndChild (*decl);
|
if (conf_fh == NULL) {
|
||||||
saved = doc->SaveFile();
|
Pandora::Pandora_Exception e;
|
||||||
if (!saved) {
|
|
||||||
Pandora_Exception e;
|
|
||||||
cout << "Error when saving the XML in " << tmp_filepath << endl;
|
cout << "Error when saving the XML in " << tmp_filepath << endl;
|
||||||
if (doc->Error ()) {
|
|
||||||
cout << "Reason: " << doc->ErrorDesc () << endl;
|
|
||||||
}
|
|
||||||
cout << "Check the configuration file" << endl;
|
cout << "Check the configuration file" << endl;
|
||||||
delete doc;
|
|
||||||
delete ftp_client;
|
|
||||||
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
delete doc;
|
fprintf (conf_fh, "%s", data_xml.c_str ());
|
||||||
|
fclose (conf_fh);
|
||||||
|
|
||||||
cout << "Created a blank XML file in " << tmp_filepath<< endl;
|
cout << "Created a blank XML file in " << tmp_filepath<< endl;
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ AllowLanguageSelection
|
|||||||
{Yes}
|
{Yes}
|
||||||
|
|
||||||
AppName
|
AppName
|
||||||
{Pandora FMS Windows Agent v3.0}
|
{Pandora FMS Windows Agent v3.1RC1}
|
||||||
|
|
||||||
ApplicationID
|
ApplicationID
|
||||||
{17E3D2CF-CA02-406B-8A80-9D31C17BD08F}
|
{17E3D2CF-CA02-406B-8A80-9D31C17BD08F}
|
||||||
@ -36,7 +36,7 @@ CompressionMethod
|
|||||||
{zlib}
|
{zlib}
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
{2004-2009}
|
{2004-2010}
|
||||||
|
|
||||||
DefaultDirectoryLocation
|
DefaultDirectoryLocation
|
||||||
{}
|
{}
|
||||||
@ -75,7 +75,7 @@ InstallPassword
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
InstallVersion
|
InstallVersion
|
||||||
{3.0.3.999}
|
{3.1.0.0}
|
||||||
|
|
||||||
Language,ca
|
Language,ca
|
||||||
{No}
|
{No}
|
||||||
@ -186,7 +186,7 @@ UpgradeApplicationID
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
Version
|
Version
|
||||||
{091218}
|
{100421}
|
||||||
|
|
||||||
ViewReadme
|
ViewReadme
|
||||||
{Yes}
|
{Yes}
|
||||||
@ -1033,7 +1033,7 @@ array set Properties {
|
|||||||
{<%InstallDir%>}
|
{<%InstallDir%>}
|
||||||
|
|
||||||
946FC43B-0E32-4C38-86EF-4F9252C67E16,FileSize
|
946FC43B-0E32-4C38-86EF-4F9252C67E16,FileSize
|
||||||
{9043742}
|
{8990281}
|
||||||
|
|
||||||
946FC43B-0E32-4C38-86EF-4F9252C67E16,Name
|
946FC43B-0E32-4C38-86EF-4F9252C67E16,Name
|
||||||
{Program Files}
|
{Program Files}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include "pandora.h"
|
#include "pandora.h"
|
||||||
#include "pandora_windows_service.h"
|
#include "pandora_windows_service.h"
|
||||||
#include "ssh/pandora_ssh_test.h"
|
#include "ssh/pandora_ssh_test.h"
|
||||||
|
@ -37,6 +37,7 @@ Pandora_Module::Pandora_Module (string name) {
|
|||||||
this->module_name = name;
|
this->module_name = name;
|
||||||
this->executions = 0;
|
this->executions = 0;
|
||||||
this->module_interval = 1;
|
this->module_interval = 1;
|
||||||
|
this->module_timeout = 15000;
|
||||||
this->max = 0;
|
this->max = 0;
|
||||||
this->min = 0;
|
this->min = 0;
|
||||||
this->has_limits = false;
|
this->has_limits = false;
|
||||||
@ -155,6 +156,8 @@ Pandora_Module::parseModuleKindFromString (string kind) {
|
|||||||
return MODULE_TCPCHECK;
|
return MODULE_TCPCHECK;
|
||||||
} else if (kind == module_regexp_str) {
|
} else if (kind == module_regexp_str) {
|
||||||
return MODULE_REGEXP;
|
return MODULE_REGEXP;
|
||||||
|
} else if (kind == module_plugin_str) {
|
||||||
|
return MODULE_PLUGIN;
|
||||||
} else {
|
} else {
|
||||||
return MODULE_0;
|
return MODULE_0;
|
||||||
}
|
}
|
||||||
@ -353,103 +356,76 @@ Pandora_Module::run () {
|
|||||||
* @return A pointer to the TiXmlElement if successful which has to be
|
* @return A pointer to the TiXmlElement if successful which has to be
|
||||||
* freed by the caller. NULL if the XML could not be created.
|
* freed by the caller. NULL if the XML could not be created.
|
||||||
*/
|
*/
|
||||||
TiXmlElement *
|
string
|
||||||
Pandora_Module::getXml () {
|
Pandora_Module::getXml () {
|
||||||
|
string module_xml, data_clean;
|
||||||
TiXmlElement *root;
|
|
||||||
TiXmlElement *element;
|
|
||||||
TiXmlElement *data_list_element;
|
|
||||||
TiXmlElement *data_element;
|
|
||||||
TiXmlText *text;
|
|
||||||
string item_clean, data_clean, desc_clean;
|
|
||||||
Pandora_Data *data;
|
Pandora_Data *data;
|
||||||
|
|
||||||
pandoraDebug ("%s getXML begin", module_name.c_str ());
|
pandoraDebug ("%s getXML begin", module_name.c_str ());
|
||||||
|
|
||||||
|
/* No data */
|
||||||
if (!this->has_output || this->data_list == NULL) {
|
if (!this->has_output || this->data_list == NULL) {
|
||||||
return NULL;
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
root = new TiXmlElement ("module");
|
/* Compose the module XML */
|
||||||
|
module_xml = "<module>\n\t<name><![CDATA[";
|
||||||
element = new TiXmlElement ("name");
|
module_xml += this->module_name;
|
||||||
text = new TiXmlText (this->module_name);
|
module_xml += "]]></name>\n\t<type><![CDATA[";
|
||||||
element->InsertEndChild (*text);
|
module_xml += this->module_type_str;
|
||||||
root->InsertEndChild (*element);
|
module_xml += "]]></type>\n";
|
||||||
delete element;
|
if (this->module_description != "") {
|
||||||
delete text;
|
module_xml += "\t<description><![CDATA[";
|
||||||
|
module_xml += this->module_description;
|
||||||
element = new TiXmlElement ("type");
|
module_xml += "]]></description>\n";
|
||||||
text = new TiXmlText (this->module_type_str);
|
}
|
||||||
element->InsertEndChild (*text);
|
|
||||||
root->InsertEndChild (*element);
|
|
||||||
delete element;
|
|
||||||
delete text;
|
|
||||||
|
|
||||||
|
/* Write module data */
|
||||||
if (this->data_list && this->data_list->size () > 1) {
|
if (this->data_list && this->data_list->size () > 1) {
|
||||||
list<Pandora_Data *>::iterator iter;
|
list<Pandora_Data *>::iterator iter;
|
||||||
|
|
||||||
data_list_element = new TiXmlElement ("datalist");
|
module_xml += "\t<datalist>\n";
|
||||||
|
|
||||||
iter = this->data_list->begin ();
|
iter = this->data_list->begin ();
|
||||||
for (iter = this->data_list->begin ();
|
for (iter = this->data_list->begin ();
|
||||||
iter != this->data_list->end ();
|
iter != this->data_list->end ();
|
||||||
iter++) {
|
iter++) {
|
||||||
data = *iter;
|
data = *iter;
|
||||||
data_element = new TiXmlElement ("data");
|
|
||||||
element = new TiXmlElement ("value");
|
|
||||||
try {
|
try {
|
||||||
data_clean = strreplace (this->getDataOutput (data),
|
data_clean = strreplace (this->getDataOutput (data),
|
||||||
"%", "%%" );
|
"%", "%%" );
|
||||||
} catch (Output_Error e) {
|
} catch (Output_Error e) {
|
||||||
delete element;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
text = new TiXmlText (data_clean);
|
module_xml += "\t\t<data>\n\t\t\t<value><![CDATA[";
|
||||||
text->SetCDATA (true);
|
module_xml += data_clean;
|
||||||
element->InsertEndChild (*text);
|
module_xml += "]]></value>\n\t\t\t<timestamp><![CDATA[";
|
||||||
data_element->InsertEndChild (*element);
|
module_xml += data->getTimestamp ();
|
||||||
delete text;
|
module_xml += "]]></timestamp>\n\t\t</data>\n";
|
||||||
delete element;
|
|
||||||
|
|
||||||
element = new TiXmlElement ("timestamp");
|
|
||||||
text = new TiXmlText (data->getTimestamp ());
|
|
||||||
element->InsertEndChild (*text);
|
|
||||||
data_element->InsertEndChild (*element);
|
|
||||||
delete text;
|
|
||||||
delete element;
|
|
||||||
|
|
||||||
data_list_element->InsertEndChild (*data_element);
|
|
||||||
delete data_element;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
root->InsertEndChild (*data_list_element);
|
module_xml += "\t</datalist>\n";
|
||||||
delete data_list_element;
|
|
||||||
} else {
|
} else {
|
||||||
data = data_list->front ();
|
data = data_list->front ();
|
||||||
element = new TiXmlElement ("data");
|
|
||||||
try {
|
try {
|
||||||
data_clean = strreplace (this->getDataOutput (data), "%", "%%" );
|
data_clean = strreplace (this->getDataOutput (data), "%", "%%" );
|
||||||
text = new TiXmlText (data_clean);
|
module_xml += "\t<data><![CDATA[";
|
||||||
element->InsertEndChild (*text);
|
module_xml += data_clean;
|
||||||
root->InsertEndChild (*element);
|
module_xml += "]]></data>\n";
|
||||||
delete text;
|
} catch (Output_Error e) {
|
||||||
} catch (Output_Error e) {
|
}
|
||||||
}
|
|
||||||
delete element;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
element = new TiXmlElement ("description");
|
/* Close the module tag */
|
||||||
text = new TiXmlText (this->module_description);
|
module_xml += "</module>\n";
|
||||||
element->InsertEndChild (*text);
|
|
||||||
root->InsertEndChild (*element);
|
|
||||||
delete text;
|
|
||||||
delete element;
|
|
||||||
|
|
||||||
|
/* Clean up */
|
||||||
this->cleanDataList ();
|
this->cleanDataList ();
|
||||||
|
|
||||||
pandoraDebug ("%s getXML end", module_name.c_str ());
|
pandoraDebug ("%s getXML end", module_name.c_str ());
|
||||||
return root;
|
return module_xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -523,6 +499,22 @@ Pandora_Module::setInterval (int interval) {
|
|||||||
this->module_interval = interval;
|
this->module_interval = interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the execution timeout.
|
||||||
|
*
|
||||||
|
* @param timeout Execution timeout.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Pandora_Module::setTimeout (int timeout) {
|
||||||
|
|
||||||
|
if (timeout < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* WaitForSingleObject expects milliseconds */
|
||||||
|
this->module_timeout = timeout * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the execution interval.
|
* Get the execution interval.
|
||||||
*
|
*
|
||||||
@ -533,6 +525,16 @@ Pandora_Module::getInterval () {
|
|||||||
return this->module_interval;
|
return this->module_interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the execution timeout.
|
||||||
|
*
|
||||||
|
* @return The execution timeout.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Pandora_Module::getTimeout () {
|
||||||
|
return this->module_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the module description.
|
* Set the module description.
|
||||||
*
|
*
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include "../pandora.h"
|
#include "../pandora.h"
|
||||||
#include "pandora_data.h"
|
#include "pandora_data.h"
|
||||||
#include "../tinyxml/tinyxml.h"
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -84,7 +83,8 @@ namespace Pandora_Modules {
|
|||||||
MODULE_WMIQUERY, /**< The module runs WQL queries */
|
MODULE_WMIQUERY, /**< The module runs WQL queries */
|
||||||
MODULE_PERFCOUNTER, /**< The module reads performance counters */
|
MODULE_PERFCOUNTER, /**< The module reads performance counters */
|
||||||
MODULE_TCPCHECK, /**< The module checks whether a tcp port is open */
|
MODULE_TCPCHECK, /**< The module checks whether a tcp port is open */
|
||||||
MODULE_REGEXP /**< The module searches a file for matches of a regular expression */
|
MODULE_REGEXP, /**< The module searches a file for matches of a regular expression */
|
||||||
|
MODULE_PLUGIN /**< Plugin */
|
||||||
} Module_Kind;
|
} Module_Kind;
|
||||||
|
|
||||||
const string module_exec_str = "module_exec";
|
const string module_exec_str = "module_exec";
|
||||||
@ -102,6 +102,7 @@ namespace Pandora_Modules {
|
|||||||
const string module_perfcounter_str = "module_perfcounter";
|
const string module_perfcounter_str = "module_perfcounter";
|
||||||
const string module_tcpcheck_str = "module_tcpcheck";
|
const string module_tcpcheck_str = "module_tcpcheck";
|
||||||
const string module_regexp_str = "module_regexp";
|
const string module_regexp_str = "module_regexp";
|
||||||
|
const string module_plugin_str = "module_plugin";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pandora module super-class exception.
|
* Pandora module super-class exception.
|
||||||
@ -131,15 +132,18 @@ namespace Pandora_Modules {
|
|||||||
class Pandora_Module {
|
class Pandora_Module {
|
||||||
private:
|
private:
|
||||||
int module_interval;
|
int module_interval;
|
||||||
|
int module_timeout;
|
||||||
int executions;
|
int executions;
|
||||||
int max, min;
|
int max, min;
|
||||||
bool has_limits;
|
bool has_limits;
|
||||||
Module_Type module_type;
|
Module_Type module_type;
|
||||||
string module_kind_str;
|
string module_kind_str;
|
||||||
Module_Kind module_kind;
|
Module_Kind module_kind;
|
||||||
list<Pandora_Data *> *data_list;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
list<Pandora_Data *> *data_list;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates if the module generated output in
|
* Indicates if the module generated output in
|
||||||
* his last execution.
|
* his last execution.
|
||||||
@ -185,8 +189,10 @@ namespace Pandora_Modules {
|
|||||||
|
|
||||||
void setInterval (int interval);
|
void setInterval (int interval);
|
||||||
int getInterval ();
|
int getInterval ();
|
||||||
|
void setTimeout (int timeout);
|
||||||
|
int getTimeout ();
|
||||||
|
|
||||||
virtual TiXmlElement *getXml ();
|
virtual string getXml ();
|
||||||
|
|
||||||
|
|
||||||
virtual void run ();
|
virtual void run ();
|
||||||
|
@ -122,8 +122,7 @@ Pandora_Module_Exec::run () {
|
|||||||
ResumeThread (pi.hThread);
|
ResumeThread (pi.hThread);
|
||||||
|
|
||||||
/* Wait until process exits. */
|
/* Wait until process exits. */
|
||||||
/* TODO: The time should be an attribute*/
|
WaitForSingleObject (pi.hProcess, this->getTimeout ());
|
||||||
WaitForSingleObject (pi.hProcess, 15000);
|
|
||||||
|
|
||||||
GetExitCodeProcess (pi.hProcess, &retval);
|
GetExitCodeProcess (pi.hProcess, &retval);
|
||||||
if (retval != 0) {
|
if (retval != 0) {
|
||||||
@ -132,8 +131,14 @@ Pandora_Module_Exec::run () {
|
|||||||
GetLastError ());
|
GetLastError ());
|
||||||
}
|
}
|
||||||
|
|
||||||
pandoraLog ("Pandora_Module_Exec: %s did not executed well (retcode: %d)",
|
/* STILL_ACTIVE */
|
||||||
this->module_name.c_str (), retval);
|
if (retval == 259) {
|
||||||
|
pandoraLog ("Pandora_Module_Exec: %s timed out (retcode: 259)",
|
||||||
|
this->module_name.c_str ());
|
||||||
|
} else {
|
||||||
|
pandoraLog ("Pandora_Module_Exec: %s did not executed well (retcode: %d)",
|
||||||
|
this->module_name.c_str (), retval);
|
||||||
|
}
|
||||||
this->has_output = false;
|
this->has_output = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "pandora_module_perfcounter.h"
|
#include "pandora_module_perfcounter.h"
|
||||||
#include "pandora_module_tcpcheck.h"
|
#include "pandora_module_tcpcheck.h"
|
||||||
#include "pandora_module_regexp.h"
|
#include "pandora_module_regexp.h"
|
||||||
|
#include "pandora_module_plugin.h"
|
||||||
#include "../pandora_strutils.h"
|
#include "../pandora_strutils.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
@ -78,6 +79,7 @@ using namespace Pandora_Strutils;
|
|||||||
#define TOKEN_PORT ("module_port ")
|
#define TOKEN_PORT ("module_port ")
|
||||||
#define TOKEN_TIMEOUT ("module_timeout ")
|
#define TOKEN_TIMEOUT ("module_timeout ")
|
||||||
#define TOKEN_REGEXP ("module_regexp ")
|
#define TOKEN_REGEXP ("module_regexp ")
|
||||||
|
#define TOKEN_PLUGIN ("module_plugin ")
|
||||||
|
|
||||||
string
|
string
|
||||||
parseLine (string line, string token) {
|
parseLine (string line, string token) {
|
||||||
@ -120,6 +122,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
string module_retries, module_startdelay, module_retrydelay;
|
string module_retries, module_startdelay, module_retrydelay;
|
||||||
string module_perfcounter, module_tcpcheck;
|
string module_perfcounter, module_tcpcheck;
|
||||||
string module_port, module_timeout, module_regexp;
|
string module_port, module_timeout, module_regexp;
|
||||||
|
string module_plugin;
|
||||||
Pandora_Module *module;
|
Pandora_Module *module;
|
||||||
bool numeric;
|
bool numeric;
|
||||||
Module_Type type;
|
Module_Type type;
|
||||||
@ -155,6 +158,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
module_port = "";
|
module_port = "";
|
||||||
module_timeout = "";
|
module_timeout = "";
|
||||||
module_regexp = "";
|
module_regexp = "";
|
||||||
|
module_plugin = "";
|
||||||
|
|
||||||
stringtok (tokens, definition, "\n");
|
stringtok (tokens, definition, "\n");
|
||||||
|
|
||||||
@ -273,6 +277,9 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
if (module_regexp == "") {
|
if (module_regexp == "") {
|
||||||
module_regexp = parseLine (line, TOKEN_REGEXP);
|
module_regexp = parseLine (line, TOKEN_REGEXP);
|
||||||
}
|
}
|
||||||
|
if (module_plugin == "") {
|
||||||
|
module_plugin = parseLine (line, TOKEN_PLUGIN);
|
||||||
|
}
|
||||||
|
|
||||||
iter++;
|
iter++;
|
||||||
}
|
}
|
||||||
@ -281,6 +288,10 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
if (module_exec != "") {
|
if (module_exec != "") {
|
||||||
module = new Pandora_Module_Exec (module_name,
|
module = new Pandora_Module_Exec (module_name,
|
||||||
module_exec);
|
module_exec);
|
||||||
|
if (module_timeout != "") {
|
||||||
|
module->setTimeout (atoi (module_timeout.c_str ()));
|
||||||
|
}
|
||||||
|
|
||||||
} else if (module_proc != "") {
|
} else if (module_proc != "") {
|
||||||
module = new Pandora_Module_Proc (module_name,
|
module = new Pandora_Module_Proc (module_name,
|
||||||
module_proc);
|
module_proc);
|
||||||
@ -358,6 +369,8 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
module = new Pandora_Module_Tcpcheck (module_name, module_tcpcheck, module_port, module_timeout);
|
module = new Pandora_Module_Tcpcheck (module_name, module_tcpcheck, module_port, module_timeout);
|
||||||
} else if (module_regexp != "") {
|
} else if (module_regexp != "") {
|
||||||
module = new Pandora_Module_Regexp (module_name, module_regexp, module_pattern);
|
module = new Pandora_Module_Regexp (module_name, module_regexp, module_pattern);
|
||||||
|
} else if (module_plugin != "") {
|
||||||
|
module = new Pandora_Module_Plugin (module_name, module_plugin);
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -370,30 +383,36 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
|||||||
module->setAsync (true);
|
module->setAsync (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
type = Pandora_Module::parseModuleTypeFromString (module_type);
|
/* Plugins do not have a module type */
|
||||||
switch (type) {
|
if (module_plugin == "") {
|
||||||
case TYPE_GENERIC_DATA:
|
type = Pandora_Module::parseModuleTypeFromString (module_type);
|
||||||
case TYPE_GENERIC_DATA_INC:
|
switch (type) {
|
||||||
case TYPE_GENERIC_PROC:
|
case TYPE_GENERIC_DATA:
|
||||||
case TYPE_ASYNC_DATA:
|
case TYPE_GENERIC_DATA_INC:
|
||||||
case TYPE_ASYNC_PROC:
|
case TYPE_GENERIC_PROC:
|
||||||
module->setType (module_type);
|
case TYPE_ASYNC_DATA:
|
||||||
numeric = true;
|
case TYPE_ASYNC_PROC:
|
||||||
|
module->setType (module_type);
|
||||||
|
numeric = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TYPE_GENERIC_DATA_STRING:
|
case TYPE_GENERIC_DATA_STRING:
|
||||||
case TYPE_ASYNC_STRING:
|
case TYPE_ASYNC_STRING:
|
||||||
module->setType (module_type);
|
module->setType (module_type);
|
||||||
|
numeric = false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pandoraDebug ("Bad module type \"%s\" while parsing %s module",
|
||||||
|
module_type.c_str (), module_name.c_str ());
|
||||||
|
|
||||||
|
delete module;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
module->setType ("generic_data_string");
|
||||||
numeric = false;
|
numeric = false;
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
pandoraDebug ("Bad module type \"%s\" while parsing %s module",
|
|
||||||
module_type.c_str (), module_name.c_str ());
|
|
||||||
|
|
||||||
delete module;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numeric) {
|
if (numeric) {
|
||||||
|
@ -300,23 +300,18 @@ Pandora_Module_Inventory::setOutput (string output, string data_origin) {
|
|||||||
* @overrides TiXmlElement* Pandora_Module::getXml()
|
* @overrides TiXmlElement* Pandora_Module::getXml()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TiXmlElement *
|
string
|
||||||
Pandora_Module_Inventory::getXml() {
|
Pandora_Module_Inventory::getXml() {
|
||||||
TiXmlElement *root;
|
string module_xml, data_clean, current_module, prev_module;
|
||||||
TiXmlElement *element, *inventory_module;
|
|
||||||
TiXmlElement *inventory_list_element = NULL;
|
|
||||||
TiXmlElement *data_element;
|
|
||||||
TiXmlText *text;
|
|
||||||
string item_clean, data_clean, desc_clean, submodule;
|
|
||||||
Pandora_Data *data;
|
Pandora_Data *data;
|
||||||
|
|
||||||
pandoraDebug ("Pandora_Module_Inventory::getXML begin\n");
|
pandoraDebug ("Pandora_Module_Inventory::getXML begin\n");
|
||||||
|
|
||||||
if (!this->has_output || this->inventory_list == NULL) {
|
if (!this->has_output || this->inventory_list == NULL) {
|
||||||
return NULL;
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
root = new TiXmlElement ("inventory");
|
module_xml = "\t<inventory>\n";
|
||||||
inventory_module = new TiXmlElement("inventory_module");
|
|
||||||
|
|
||||||
if (this->inventory_list && this->inventory_list->size () > 1) {
|
if (this->inventory_list && this->inventory_list->size () > 1) {
|
||||||
list<Pandora_Data *>::iterator iter;
|
list<Pandora_Data *>::iterator iter;
|
||||||
@ -325,82 +320,45 @@ Pandora_Module_Inventory::getXml() {
|
|||||||
iter != this->inventory_list->end ();
|
iter != this->inventory_list->end ();
|
||||||
iter++) {
|
iter++) {
|
||||||
data = *iter;
|
data = *iter;
|
||||||
if (submodule != data->getDataOrigin()){
|
|
||||||
if (inventory_list_element != NULL)
|
|
||||||
{
|
|
||||||
inventory_module->InsertEndChild (*inventory_list_element);
|
|
||||||
delete inventory_list_element;
|
|
||||||
inventory_list_element = NULL;
|
|
||||||
root->InsertEndChild(*inventory_module);
|
|
||||||
delete inventory_module;
|
|
||||||
inventory_module = new TiXmlElement("inventory_module");
|
|
||||||
}
|
|
||||||
|
|
||||||
submodule = data->getDataOrigin();
|
current_module = data->getDataOrigin();
|
||||||
element = new TiXmlElement ("name");
|
|
||||||
text = new TiXmlText (submodule);
|
|
||||||
element->InsertEndChild (*text);
|
|
||||||
inventory_module->InsertEndChild (*element);
|
|
||||||
delete element;
|
|
||||||
delete text;
|
|
||||||
|
|
||||||
element = new TiXmlElement ("type");
|
if (current_module != prev_module) {
|
||||||
text = new TiXmlText (this->module_type_str);
|
|
||||||
element->InsertEndChild (*text);
|
|
||||||
inventory_module->InsertEndChild (*element);
|
|
||||||
delete element;
|
|
||||||
delete text;
|
|
||||||
|
|
||||||
inventory_list_element = new TiXmlElement ("datalist");
|
/* Close the previous datalist */
|
||||||
}
|
if (prev_module != "") {
|
||||||
data_element = new TiXmlElement ("data");
|
module_xml += "\t\t\t</datalist>\n";
|
||||||
try {
|
}
|
||||||
data_clean = strreplace (this->getDataOutput (data),
|
module_xml += "\t\t<inventory_module>\n\t\t\t<name><![CDATA[";
|
||||||
"%", "%%" );
|
module_xml += data->getDataOrigin();
|
||||||
} catch (Output_Error e) {
|
module_xml += "]]></name>\n";
|
||||||
delete data_element;
|
|
||||||
continue;
|
module_xml += "\t\t\t<type><![CDATA[";
|
||||||
|
module_xml += this->module_type_str;
|
||||||
|
module_xml += "]]></type>\n";
|
||||||
|
|
||||||
|
module_xml += "\t\t\t<datalist>\n";
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
data_clean = strreplace (this->getDataOutput (data),
|
||||||
|
"%", "%%" );
|
||||||
|
} catch (Output_Error e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
module_xml += "\t\t\t\t<data><![CDATA[";
|
||||||
|
module_xml += data_clean;
|
||||||
|
module_xml += "]]></data>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
text = new TiXmlText (data_clean);
|
prev_module = current_module;
|
||||||
data_element->InsertEndChild (*text);
|
|
||||||
delete text;
|
|
||||||
|
|
||||||
inventory_list_element->InsertEndChild (*data_element);
|
|
||||||
delete data_element;
|
|
||||||
}
|
}
|
||||||
if (inventory_list_element != NULL)
|
|
||||||
{
|
|
||||||
inventory_module->InsertEndChild (*inventory_list_element);
|
|
||||||
delete inventory_list_element;
|
|
||||||
inventory_list_element = NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data = inventory_list->front ();
|
|
||||||
element = new TiXmlElement ("data");
|
|
||||||
try {
|
|
||||||
data_clean = strreplace (this->getDataOutput (data), "%", "%%" );
|
|
||||||
text = new TiXmlText (data_clean);
|
|
||||||
element->InsertEndChild (*text);
|
|
||||||
inventory_module->InsertEndChild (*element);
|
|
||||||
delete text;
|
|
||||||
} catch (Output_Error e) {
|
|
||||||
}
|
|
||||||
delete element;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
element = new TiXmlElement ("description");
|
/* Clean up */
|
||||||
text = new TiXmlText (this->module_description);
|
|
||||||
element->InsertEndChild (*text);
|
|
||||||
inventory_module->InsertEndChild (*element);
|
|
||||||
delete text;
|
|
||||||
delete element;
|
|
||||||
|
|
||||||
root->InsertEndChild(*inventory_module);
|
|
||||||
delete inventory_module;
|
|
||||||
|
|
||||||
this->cleanDataList ();
|
this->cleanDataList ();
|
||||||
|
|
||||||
pandoraDebug ("%s Pandora_Module_Inventory::getXML end", module_name.c_str ());
|
pandoraDebug ("%s Pandora_Module_Inventory::getXML end", module_name.c_str ());
|
||||||
return root;
|
return module_xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ namespace Pandora_Modules {
|
|||||||
Pandora_Module_Inventory (string name, string options);
|
Pandora_Module_Inventory (string name, string options);
|
||||||
|
|
||||||
void run ();
|
void run ();
|
||||||
TiXmlElement *getXml ();
|
string getXml ();
|
||||||
void setOutput (string output, string data_origin);
|
void setOutput (string output, string data_origin);
|
||||||
void setOutput (string output);
|
void setOutput (string output);
|
||||||
};
|
};
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "pandora_module_perfcounter.h"
|
#include "pandora_module_perfcounter.h"
|
||||||
#include "pandora_module_tcpcheck.h"
|
#include "pandora_module_tcpcheck.h"
|
||||||
#include "pandora_module_regexp.h"
|
#include "pandora_module_regexp.h"
|
||||||
|
#include "pandora_module_plugin.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -65,6 +66,8 @@ Pandora_Modules::Pandora_Module_List::Pandora_Module_List (string filename) {
|
|||||||
|
|
||||||
/* Ignore blank or commented lines */
|
/* Ignore blank or commented lines */
|
||||||
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
|
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
|
||||||
|
|
||||||
|
/* Module */
|
||||||
pos = buffer.find ("module_begin");
|
pos = buffer.find ("module_begin");
|
||||||
if (pos != string::npos) {
|
if (pos != string::npos) {
|
||||||
string str_module = buffer + "\n";
|
string str_module = buffer + "\n";
|
||||||
@ -81,7 +84,16 @@ Pandora_Modules::Pandora_Module_List::Pandora_Module_List (string filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->parseModuleDefinition (str_module);
|
this->parseModuleDefinition (str_module);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Plugin */
|
||||||
|
pos = buffer.find ("module_plugin");
|
||||||
|
if (pos != string::npos) {
|
||||||
|
this->parseModuleDefinition (buffer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file.close ();
|
file.close ();
|
||||||
@ -149,6 +161,7 @@ Pandora_Modules::Pandora_Module_List::parseModuleDefinition (string definition)
|
|||||||
Pandora_Module_Perfcounter *module_perfcounter;
|
Pandora_Module_Perfcounter *module_perfcounter;
|
||||||
Pandora_Module_Tcpcheck *module_tcpcheck;
|
Pandora_Module_Tcpcheck *module_tcpcheck;
|
||||||
Pandora_Module_Regexp *module_regexp;
|
Pandora_Module_Regexp *module_regexp;
|
||||||
|
Pandora_Module_Plugin *module_plugin;
|
||||||
|
|
||||||
module = Pandora_Module_Factory::getModuleFromDefinition (definition);
|
module = Pandora_Module_Factory::getModuleFromDefinition (definition);
|
||||||
|
|
||||||
@ -224,6 +237,10 @@ Pandora_Modules::Pandora_Module_List::parseModuleDefinition (string definition)
|
|||||||
module_regexp = (Pandora_Module_Regexp *) module;
|
module_regexp = (Pandora_Module_Regexp *) module;
|
||||||
modules->push_back (module_regexp);
|
modules->push_back (module_regexp);
|
||||||
break;
|
break;
|
||||||
|
case MODULE_PLUGIN:
|
||||||
|
module_plugin = (Pandora_Module_Plugin *) module;
|
||||||
|
modules->push_back (module_plugin);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
62
pandora_agents/win32/modules/pandora_module_plugin.cc
Normal file
62
pandora_agents/win32/modules/pandora_module_plugin.cc
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* Pandora exec module. These modules exec a command.
|
||||||
|
|
||||||
|
Copyright (C) 2010 Artica ST.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pandora_module_plugin.h"
|
||||||
|
#include "../pandora_strutils.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
using namespace Pandora;
|
||||||
|
using namespace Pandora_Strutils;
|
||||||
|
using namespace Pandora_Modules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Pandora_Module_Plugin object.
|
||||||
|
*
|
||||||
|
* @param name Module name
|
||||||
|
* @param plugin Command to be executed.
|
||||||
|
*/
|
||||||
|
Pandora_Module_Plugin::Pandora_Module_Plugin (string name, string plugin)
|
||||||
|
: Pandora_Module_Exec ("plugin", plugin) {
|
||||||
|
this->setKind (module_plugin_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin output.
|
||||||
|
*
|
||||||
|
* @return A pointer to the TiXmlElement if successful which has to be
|
||||||
|
* freed by the caller. NULL if the XML could not be created.
|
||||||
|
*/
|
||||||
|
string
|
||||||
|
Pandora_Module_Plugin::getXml () {
|
||||||
|
string value;
|
||||||
|
Pandora_Data *data = NULL;
|
||||||
|
|
||||||
|
pandoraDebug ("%s getXML begin", module_name.c_str ());
|
||||||
|
|
||||||
|
if (this->data_list) {
|
||||||
|
data = data_list->front ();
|
||||||
|
if (data != NULL) {
|
||||||
|
value = data->getValue ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->cleanDataList ();
|
||||||
|
|
||||||
|
pandoraDebug ("%s getXML end", module_name.c_str ());
|
||||||
|
return value;
|
||||||
|
}
|
40
pandora_agents/win32/modules/pandora_module_plugin.h
Normal file
40
pandora_agents/win32/modules/pandora_module_plugin.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* Pandora exec module. These modules exec a command
|
||||||
|
|
||||||
|
Copyright (C) 2010 Artica ST.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PANDORA_MODULE_PLUGIN_H__
|
||||||
|
#define __PANDORA_MODULE_PLUGIN_H__
|
||||||
|
|
||||||
|
#include "pandora_module_exec.h"
|
||||||
|
|
||||||
|
namespace Pandora_Modules {
|
||||||
|
/**
|
||||||
|
* Module to execute a custom command using the Windows command
|
||||||
|
* line.
|
||||||
|
*
|
||||||
|
* Any custom order that want to be executed can be put in
|
||||||
|
* the <code>util</code> directory into the Pandora agent path.
|
||||||
|
*/
|
||||||
|
class Pandora_Module_Plugin : public Pandora_Module_Exec {
|
||||||
|
public:
|
||||||
|
Pandora_Module_Plugin (string name, string plugin);
|
||||||
|
virtual string getXml ();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -30,7 +30,7 @@ using namespace Pandora;
|
|||||||
using namespace Pandora_Strutils;
|
using namespace Pandora_Strutils;
|
||||||
|
|
||||||
#define PATH_SIZE _MAX_PATH+1
|
#define PATH_SIZE _MAX_PATH+1
|
||||||
#define PANDORA_VERSION ("3.0(Build 091218)")
|
#define PANDORA_VERSION ("3.1RC1(Build 100421)")
|
||||||
|
|
||||||
string pandora_path;
|
string pandora_path;
|
||||||
string pandora_dir;
|
string pandora_dir;
|
||||||
|
@ -180,53 +180,48 @@ Pandora_Windows_Service::pandora_init () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TiXmlElement *
|
string
|
||||||
Pandora_Windows_Service::getXmlHeader () {
|
Pandora_Windows_Service::getXmlHeader () {
|
||||||
TiXmlElement *agent;
|
|
||||||
char timestamp[20];
|
char timestamp[20];
|
||||||
string value;
|
string agent_name, os_name, os_version, encoding, value;
|
||||||
time_t ctime;
|
time_t ctime;
|
||||||
struct tm *ctime_tm = NULL;
|
struct tm *ctime_tm = NULL;
|
||||||
|
|
||||||
agent = new TiXmlElement ("agent_data");
|
// Get agent name
|
||||||
|
agent_name = conf->getValue ("agent_name");
|
||||||
value = conf->getValue ("agent_name");
|
if (agent_name == "") {
|
||||||
if (value == "") {
|
agent_name = Pandora_Windows_Info::getSystemName ();
|
||||||
value = Pandora_Windows_Info::getSystemName ();
|
|
||||||
}
|
}
|
||||||
agent->SetAttribute ("agent_name", value);
|
|
||||||
|
|
||||||
value = conf->getValue ("description");
|
// Get timestamp
|
||||||
agent->SetAttribute ("description", value);
|
|
||||||
|
|
||||||
agent->SetAttribute ("version", getPandoraAgentVersion ());
|
|
||||||
|
|
||||||
// Get current time
|
|
||||||
ctime = time(0);
|
ctime = time(0);
|
||||||
ctime_tm = localtime(&ctime);
|
ctime_tm = localtime(&ctime);
|
||||||
|
|
||||||
value = conf->getValue ("autotime");
|
value = conf->getValue ("autotime");
|
||||||
if (value != "1") {
|
if (value != "1") {
|
||||||
sprintf (timestamp, "%d-%02d-%02d %02d:%02d:%02d", ctime_tm->tm_year + 1900,
|
sprintf (timestamp, "%d-%02d-%02d %02d:%02d:%02d", ctime_tm->tm_year + 1900,
|
||||||
ctime_tm->tm_mon + 1, ctime_tm->tm_mday, ctime_tm->tm_hour,
|
ctime_tm->tm_mon + 1, ctime_tm->tm_mday, ctime_tm->tm_hour,
|
||||||
ctime_tm->tm_min, ctime_tm->tm_sec);
|
ctime_tm->tm_min, ctime_tm->tm_sec);
|
||||||
|
|
||||||
agent->SetAttribute ("timestamp", timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value = conf->getValue ("interval");
|
// Get OS name and version
|
||||||
agent->SetAttribute ("interval", value);
|
os_name = Pandora_Windows_Info::getOSName ();
|
||||||
|
os_version = os_name + Pandora_Windows_Info::getOSVersion ();
|
||||||
|
|
||||||
value = Pandora_Windows_Info::getOSName ();
|
// Get encoding
|
||||||
agent->SetAttribute ("os_name", value);
|
encoding = conf->getValue ("encoding");
|
||||||
|
if (encoding == "") {
|
||||||
|
encoding = "ISO-8859-1";
|
||||||
|
}
|
||||||
|
|
||||||
value = value + Pandora_Windows_Info::getOSVersion ();
|
return "<?xml version=\"1.0\" encoding=\"" + encoding + "\" ?>\n" +
|
||||||
agent->SetAttribute ("os_version", value);
|
"<agent_data agent_name=\"" + agent_name +
|
||||||
|
"\" description=\"" + conf->getValue ("description") +
|
||||||
value = conf->getValue ("group");
|
"\" version=\"" + getPandoraAgentVersion () +
|
||||||
agent->SetAttribute ("group", value);
|
"\" timestamp=\"" + timestamp +
|
||||||
|
"\" interval=\"" + conf->getValue ("interval") +
|
||||||
return agent;
|
"\" os_name=\"" + os_name +
|
||||||
|
"\" os_version=\"" + os_version +
|
||||||
|
"\" group=\"" + conf->getValue ("group") + "\">\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -705,17 +700,15 @@ Pandora_Windows_Service::checkConfig () {
|
|||||||
int
|
int
|
||||||
Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
|
Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
|
||||||
int rc = 0, xml_buffer;
|
int rc = 0, xml_buffer;
|
||||||
TiXmlDeclaration *decl;
|
string data_xml;
|
||||||
TiXmlDocument *doc;
|
|
||||||
TiXmlElement *local_xml, *agent;
|
|
||||||
string xml_filename, random_integer;
|
string xml_filename, random_integer;
|
||||||
string tmp_filename, tmp_filepath;
|
string tmp_filename, tmp_filepath;
|
||||||
string encoding;
|
string encoding;
|
||||||
bool saved;
|
|
||||||
static HANDLE mutex = 0;
|
static HANDLE mutex = 0;
|
||||||
ULARGE_INTEGER free_bytes;
|
ULARGE_INTEGER free_bytes;
|
||||||
double min_free_bytes = 0;
|
double min_free_bytes = 0;
|
||||||
Pandora_Agent_Conf *conf = NULL;
|
Pandora_Agent_Conf *conf = NULL;
|
||||||
|
FILE *conf_fh = NULL;
|
||||||
|
|
||||||
conf = this->getConf ();
|
conf = this->getConf ();
|
||||||
min_free_bytes = 1024 * atoi (conf->getValue ("temporal_min_size").c_str ());
|
min_free_bytes = 1024 * atoi (conf->getValue ("temporal_min_size").c_str ());
|
||||||
@ -728,8 +721,9 @@ Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
|
|||||||
/* Wait for the mutex to be opened */
|
/* Wait for the mutex to be opened */
|
||||||
WaitForSingleObject (mutex, INFINITE);
|
WaitForSingleObject (mutex, INFINITE);
|
||||||
|
|
||||||
agent = getXmlHeader ();
|
data_xml = getXmlHeader ();
|
||||||
|
|
||||||
|
/* Write module data */
|
||||||
if (modules != NULL) {
|
if (modules != NULL) {
|
||||||
modules->goFirst ();
|
modules->goFirst ();
|
||||||
|
|
||||||
@ -737,17 +731,14 @@ Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
|
|||||||
Pandora_Module *module;
|
Pandora_Module *module;
|
||||||
|
|
||||||
module = modules->getCurrentValue ();
|
module = modules->getCurrentValue ();
|
||||||
|
data_xml += module->getXml ();
|
||||||
local_xml = module->getXml ();
|
|
||||||
if (local_xml != NULL) {
|
|
||||||
agent->InsertEndChild (*local_xml);
|
|
||||||
|
|
||||||
delete local_xml;
|
|
||||||
}
|
|
||||||
modules->goNext ();
|
modules->goNext ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Close the XML header */
|
||||||
|
data_xml += "</agent_data>";
|
||||||
|
|
||||||
/* Generate temporal filename */
|
/* Generate temporal filename */
|
||||||
random_integer = inttostr (rand());
|
random_integer = inttostr (rand());
|
||||||
tmp_filename = conf->getValue ("agent_name");
|
tmp_filename = conf->getValue ("agent_name");
|
||||||
@ -763,27 +754,16 @@ Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
|
|||||||
tmp_filepath = xml_filename + tmp_filename;
|
tmp_filepath = xml_filename + tmp_filename;
|
||||||
|
|
||||||
/* Copy the XML to temporal file */
|
/* Copy the XML to temporal file */
|
||||||
encoding = conf->getValue ("encoding");
|
|
||||||
if (encoding == "") {
|
|
||||||
encoding = "ISO-8859-1";
|
|
||||||
}
|
|
||||||
|
|
||||||
pandoraDebug ("Copying XML on %s", tmp_filepath.c_str ());
|
pandoraDebug ("Copying XML on %s", tmp_filepath.c_str ());
|
||||||
decl = new TiXmlDeclaration ("1.0", encoding.c_str(), "");
|
conf_fh = fopen (tmp_filepath.c_str (), "w");
|
||||||
doc = new TiXmlDocument (tmp_filepath);
|
if (conf_fh == NULL) {
|
||||||
doc->InsertEndChild (*decl);
|
|
||||||
doc->InsertEndChild (*agent);
|
|
||||||
saved = doc->SaveFile();
|
|
||||||
delete doc;
|
|
||||||
delete decl;
|
|
||||||
delete agent;
|
|
||||||
|
|
||||||
if (!saved) {
|
|
||||||
pandoraLog ("Error when saving the XML in %s",
|
pandoraLog ("Error when saving the XML in %s",
|
||||||
tmp_filepath.c_str ());
|
tmp_filepath.c_str ());
|
||||||
ReleaseMutex (mutex);
|
ReleaseMutex (mutex);
|
||||||
return PANDORA_EXCEPTION;
|
return PANDORA_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
fprintf (conf_fh, "%s", data_xml.c_str ());
|
||||||
|
fclose (conf_fh);
|
||||||
|
|
||||||
/* Only send if debug is not activated */
|
/* Only send if debug is not activated */
|
||||||
if (getPandoraDebug () == false) {
|
if (getPandoraDebug () == false) {
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include "windows_service.h"
|
#include "windows_service.h"
|
||||||
#include "tinyxml/tinyxml.h"
|
|
||||||
#include "pandora_agent_conf.h"
|
#include "pandora_agent_conf.h"
|
||||||
#include "modules/pandora_module_list.h"
|
#include "modules/pandora_module_list.h"
|
||||||
#include "ssh/pandora_ssh_client.h"
|
#include "ssh/pandora_ssh_client.h"
|
||||||
@ -46,7 +45,7 @@ namespace Pandora {
|
|||||||
bool started;
|
bool started;
|
||||||
void *udp_server;
|
void *udp_server;
|
||||||
|
|
||||||
TiXmlElement *getXmlHeader ();
|
string getXmlHeader ();
|
||||||
int copyDataFile (string filename);
|
int copyDataFile (string filename);
|
||||||
int copyTentacleDataFile (string host,
|
int copyTentacleDataFile (string host,
|
||||||
string filename,
|
string filename,
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pandora_ssh_test.h"
|
#include "pandora_ssh_test.h"
|
||||||
#include "../tinyxml/tinyxml.h"
|
|
||||||
#include "../misc/pandora_file.h"
|
#include "../misc/pandora_file.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
@ -70,11 +69,11 @@ Pandora_SSH_Test::~Pandora_SSH_Test () {
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Pandora_SSH_Test::test () {
|
Pandora_SSH_Test::test () {
|
||||||
|
string data_xml;
|
||||||
string pubkey_file, privkey_file, tmp_filename;
|
string pubkey_file, privkey_file, tmp_filename;
|
||||||
string remote_host, remote_filepath, tmp_filepath;
|
string remote_host, remote_filepath, tmp_filepath;
|
||||||
TiXmlDocument *doc;
|
|
||||||
TiXmlDeclaration *decl;
|
|
||||||
bool saved;
|
bool saved;
|
||||||
|
FILE *conf_fh = NULL;
|
||||||
|
|
||||||
pubkey_file = Pandora::getPandoraInstallDir ();
|
pubkey_file = Pandora::getPandoraInstallDir ();
|
||||||
pubkey_file += "key\\id_dsa.pub";
|
pubkey_file += "key\\id_dsa.pub";
|
||||||
@ -138,17 +137,16 @@ Pandora_SSH_Test::test () {
|
|||||||
}
|
}
|
||||||
tmp_filepath += tmp_filename;
|
tmp_filepath += tmp_filename;
|
||||||
|
|
||||||
decl = new TiXmlDeclaration( "1.0", "ISO-8859-1", "" );
|
data_xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
|
||||||
doc = new TiXmlDocument (tmp_filepath);
|
conf_fh = fopen (tmp_filepath.c_str (), "w");
|
||||||
doc->InsertEndChild (*decl);
|
if (conf_fh == NULL) {
|
||||||
saved = doc->SaveFile();
|
|
||||||
delete doc;
|
|
||||||
if (!saved) {
|
|
||||||
Pandora::Pandora_Exception e;
|
Pandora::Pandora_Exception e;
|
||||||
cout << "Error when saving the XML in " << tmp_filepath << endl;
|
cout << "Error when saving the XML in " << tmp_filepath << endl;
|
||||||
cout << "Check the configuration file" << endl;
|
cout << "Check the configuration file" << endl;
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
fprintf (conf_fh, "%s", data_xml.c_str ());
|
||||||
|
fclose (conf_fh);
|
||||||
|
|
||||||
cout << "Created a blank XML file in " << tmp_filepath<< endl;
|
cout << "Created a blank XML file in " << tmp_filepath<< endl;
|
||||||
|
|
||||||
|
@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
www.sourceforge.net/projects/tinyxml
|
|
||||||
Original file by Yves Berquin.
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any
|
|
||||||
damages arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any
|
|
||||||
purpose, including commercial applications, and to alter it and
|
|
||||||
redistribute it freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must
|
|
||||||
not claim that you wrote the original software. If you use this
|
|
||||||
software in a product, an acknowledgment in the product documentation
|
|
||||||
would be appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and
|
|
||||||
must not be misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef TIXML_USE_STL
|
|
||||||
|
|
||||||
#include "tinystr.h"
|
|
||||||
|
|
||||||
// Error value for find primitive
|
|
||||||
const TiXmlString::size_type TiXmlString::npos = static_cast< size_type >(-1);
|
|
||||||
|
|
||||||
// Null rep.
|
|
||||||
TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, '\0' };
|
|
||||||
|
|
||||||
|
|
||||||
void TiXmlString::reserve (size_type cap)
|
|
||||||
{
|
|
||||||
if (cap > capacity())
|
|
||||||
{
|
|
||||||
TiXmlString tmp;
|
|
||||||
tmp.init(length(), cap);
|
|
||||||
memcpy(tmp.start(), data(), length());
|
|
||||||
swap(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TiXmlString& TiXmlString::assign(const char* str, size_type len)
|
|
||||||
{
|
|
||||||
size_type cap = capacity();
|
|
||||||
if (len > cap || cap > 3*(len + 8))
|
|
||||||
{
|
|
||||||
TiXmlString tmp;
|
|
||||||
tmp.init(len);
|
|
||||||
memcpy(tmp.start(), str, len);
|
|
||||||
swap(tmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memmove(start(), str, len);
|
|
||||||
set_size(len);
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TiXmlString& TiXmlString::append(const char* str, size_type len)
|
|
||||||
{
|
|
||||||
size_type newsize = length() + len;
|
|
||||||
if (newsize > capacity())
|
|
||||||
{
|
|
||||||
reserve (newsize + capacity());
|
|
||||||
}
|
|
||||||
memmove(finish(), str, len);
|
|
||||||
set_size(newsize);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b)
|
|
||||||
{
|
|
||||||
TiXmlString tmp;
|
|
||||||
tmp.reserve(a.length() + b.length());
|
|
||||||
tmp += a;
|
|
||||||
tmp += b;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
TiXmlString operator + (const TiXmlString & a, const char* b)
|
|
||||||
{
|
|
||||||
TiXmlString tmp;
|
|
||||||
TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );
|
|
||||||
tmp.reserve(a.length() + b_len);
|
|
||||||
tmp += a;
|
|
||||||
tmp.append(b, b_len);
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
TiXmlString operator + (const char* a, const TiXmlString & b)
|
|
||||||
{
|
|
||||||
TiXmlString tmp;
|
|
||||||
TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );
|
|
||||||
tmp.reserve(a_len + b.length());
|
|
||||||
tmp.append(a, a_len);
|
|
||||||
tmp += b;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // TIXML_USE_STL
|
|
@ -1,319 +0,0 @@
|
|||||||
/*
|
|
||||||
www.sourceforge.net/projects/tinyxml
|
|
||||||
Original file by Yves Berquin.
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any
|
|
||||||
damages arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any
|
|
||||||
purpose, including commercial applications, and to alter it and
|
|
||||||
redistribute it freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must
|
|
||||||
not claim that you wrote the original software. If you use this
|
|
||||||
software in a product, an acknowledgment in the product documentation
|
|
||||||
would be appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and
|
|
||||||
must not be misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
|
|
||||||
*
|
|
||||||
* - completely rewritten. compact, clean, and fast implementation.
|
|
||||||
* - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
|
|
||||||
* - fixed reserve() to work as per specification.
|
|
||||||
* - fixed buggy compares operator==(), operator<(), and operator>()
|
|
||||||
* - fixed operator+=() to take a const ref argument, following spec.
|
|
||||||
* - added "copy" constructor with length, and most compare operators.
|
|
||||||
* - added swap(), clear(), size(), capacity(), operator+().
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TIXML_USE_STL
|
|
||||||
|
|
||||||
#ifndef TIXML_STRING_INCLUDED
|
|
||||||
#define TIXML_STRING_INCLUDED
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* The support for explicit isn't that universal, and it isn't really
|
|
||||||
required - it is used to check that the TiXmlString class isn't incorrectly
|
|
||||||
used. Be nice to old compilers and macro it here:
|
|
||||||
*/
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1200 )
|
|
||||||
// Microsoft visual studio, version 6 and higher.
|
|
||||||
#define TIXML_EXPLICIT explicit
|
|
||||||
#elif defined(__GNUC__) && (__GNUC__ >= 3 )
|
|
||||||
// GCC version 3 and higher.s
|
|
||||||
#define TIXML_EXPLICIT explicit
|
|
||||||
#else
|
|
||||||
#define TIXML_EXPLICIT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
TiXmlString is an emulation of a subset of the std::string template.
|
|
||||||
Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
|
|
||||||
Only the member functions relevant to the TinyXML project have been implemented.
|
|
||||||
The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
|
|
||||||
a string and there's no more room, we allocate a buffer twice as big as we need.
|
|
||||||
*/
|
|
||||||
class TiXmlString
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
// The size type used
|
|
||||||
typedef size_t size_type;
|
|
||||||
|
|
||||||
// Error value for find primitive
|
|
||||||
static const size_type npos; // = -1;
|
|
||||||
|
|
||||||
|
|
||||||
// TiXmlString empty constructor
|
|
||||||
TiXmlString () : rep_(&nullrep_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// TiXmlString copy constructor
|
|
||||||
TiXmlString ( const TiXmlString & copy)
|
|
||||||
{
|
|
||||||
init(copy.length());
|
|
||||||
memcpy(start(), copy.data(), length());
|
|
||||||
}
|
|
||||||
|
|
||||||
// TiXmlString constructor, based on a string
|
|
||||||
TIXML_EXPLICIT TiXmlString ( const char * copy)
|
|
||||||
{
|
|
||||||
init( static_cast<size_type>( strlen(copy) ));
|
|
||||||
memcpy(start(), copy, length());
|
|
||||||
}
|
|
||||||
|
|
||||||
// TiXmlString constructor, based on a string
|
|
||||||
TIXML_EXPLICIT TiXmlString ( const char * str, size_type len)
|
|
||||||
{
|
|
||||||
init(len);
|
|
||||||
memcpy(start(), str, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TiXmlString destructor
|
|
||||||
~TiXmlString ()
|
|
||||||
{
|
|
||||||
quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
// = operator
|
|
||||||
TiXmlString& operator = (const char * copy)
|
|
||||||
{
|
|
||||||
return assign( copy, (size_type)strlen(copy));
|
|
||||||
}
|
|
||||||
|
|
||||||
// = operator
|
|
||||||
TiXmlString& operator = (const TiXmlString & copy)
|
|
||||||
{
|
|
||||||
return assign(copy.start(), copy.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// += operator. Maps to append
|
|
||||||
TiXmlString& operator += (const char * suffix)
|
|
||||||
{
|
|
||||||
return append(suffix, static_cast<size_type>( strlen(suffix) ));
|
|
||||||
}
|
|
||||||
|
|
||||||
// += operator. Maps to append
|
|
||||||
TiXmlString& operator += (char single)
|
|
||||||
{
|
|
||||||
return append(&single, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// += operator. Maps to append
|
|
||||||
TiXmlString& operator += (const TiXmlString & suffix)
|
|
||||||
{
|
|
||||||
return append(suffix.data(), suffix.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Convert a TiXmlString into a null-terminated char *
|
|
||||||
const char * c_str () const { return rep_->str; }
|
|
||||||
|
|
||||||
// Convert a TiXmlString into a char * (need not be null terminated).
|
|
||||||
const char * data () const { return rep_->str; }
|
|
||||||
|
|
||||||
// Return the length of a TiXmlString
|
|
||||||
size_type length () const { return rep_->size; }
|
|
||||||
|
|
||||||
// Alias for length()
|
|
||||||
size_type size () const { return rep_->size; }
|
|
||||||
|
|
||||||
// Checks if a TiXmlString is empty
|
|
||||||
bool empty () const { return rep_->size == 0; }
|
|
||||||
|
|
||||||
// Return capacity of string
|
|
||||||
size_type capacity () const { return rep_->capacity; }
|
|
||||||
|
|
||||||
|
|
||||||
// single char extraction
|
|
||||||
const char& at (size_type index) const
|
|
||||||
{
|
|
||||||
assert( index < length() );
|
|
||||||
return rep_->str[ index ];
|
|
||||||
}
|
|
||||||
|
|
||||||
// [] operator
|
|
||||||
char& operator [] (size_type index) const
|
|
||||||
{
|
|
||||||
assert( index < length() );
|
|
||||||
return rep_->str[ index ];
|
|
||||||
}
|
|
||||||
|
|
||||||
// find a char in a string. Return TiXmlString::npos if not found
|
|
||||||
size_type find (char lookup) const
|
|
||||||
{
|
|
||||||
return find(lookup, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// find a char in a string from an offset. Return TiXmlString::npos if not found
|
|
||||||
size_type find (char tofind, size_type offset) const
|
|
||||||
{
|
|
||||||
if (offset >= length()) return npos;
|
|
||||||
|
|
||||||
for (const char* p = c_str() + offset; *p != '\0'; ++p)
|
|
||||||
{
|
|
||||||
if (*p == tofind) return static_cast< size_type >( p - c_str() );
|
|
||||||
}
|
|
||||||
return npos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear ()
|
|
||||||
{
|
|
||||||
//Lee:
|
|
||||||
//The original was just too strange, though correct:
|
|
||||||
// TiXmlString().swap(*this);
|
|
||||||
//Instead use the quit & re-init:
|
|
||||||
quit();
|
|
||||||
init(0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function to reserve a big amount of data when we know we'll need it. Be aware that this
|
|
||||||
function DOES NOT clear the content of the TiXmlString if any exists.
|
|
||||||
*/
|
|
||||||
void reserve (size_type cap);
|
|
||||||
|
|
||||||
TiXmlString& assign (const char* str, size_type len);
|
|
||||||
|
|
||||||
TiXmlString& append (const char* str, size_type len);
|
|
||||||
|
|
||||||
void swap (TiXmlString& other)
|
|
||||||
{
|
|
||||||
Rep* r = rep_;
|
|
||||||
rep_ = other.rep_;
|
|
||||||
other.rep_ = r;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void init(size_type sz) { init(sz, sz); }
|
|
||||||
void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
|
|
||||||
char* start() const { return rep_->str; }
|
|
||||||
char* finish() const { return rep_->str + rep_->size; }
|
|
||||||
|
|
||||||
struct Rep
|
|
||||||
{
|
|
||||||
size_type size, capacity;
|
|
||||||
char str[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
void init(size_type sz, size_type cap)
|
|
||||||
{
|
|
||||||
if (cap)
|
|
||||||
{
|
|
||||||
// Lee: the original form:
|
|
||||||
// rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
|
|
||||||
// doesn't work in some cases of new being overloaded. Switching
|
|
||||||
// to the normal allocation, although use an 'int' for systems
|
|
||||||
// that are overly picky about structure alignment.
|
|
||||||
const size_type bytesNeeded = sizeof(Rep) + cap;
|
|
||||||
const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int );
|
|
||||||
rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );
|
|
||||||
|
|
||||||
rep_->str[ rep_->size = sz ] = '\0';
|
|
||||||
rep_->capacity = cap;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rep_ = &nullrep_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void quit()
|
|
||||||
{
|
|
||||||
if (rep_ != &nullrep_)
|
|
||||||
{
|
|
||||||
// The rep_ is really an array of ints. (see the allocator, above).
|
|
||||||
// Cast it back before delete, so the compiler won't incorrectly call destructors.
|
|
||||||
delete [] ( reinterpret_cast<int*>( rep_ ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rep * rep_;
|
|
||||||
static Rep nullrep_;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
|
|
||||||
inline bool operator == (const TiXmlString & a, const TiXmlString & b)
|
|
||||||
{
|
|
||||||
return ( a.length() == b.length() ) // optimization on some platforms
|
|
||||||
&& ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare
|
|
||||||
}
|
|
||||||
inline bool operator < (const TiXmlString & a, const TiXmlString & b)
|
|
||||||
{
|
|
||||||
return strcmp(a.c_str(), b.c_str()) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
|
|
||||||
inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }
|
|
||||||
inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
|
|
||||||
inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
|
|
||||||
|
|
||||||
inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
|
|
||||||
inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
|
|
||||||
inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
|
|
||||||
inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
|
|
||||||
|
|
||||||
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
|
|
||||||
TiXmlString operator + (const TiXmlString & a, const char* b);
|
|
||||||
TiXmlString operator + (const char* a, const TiXmlString & b);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
|
|
||||||
Only the operators that we need for TinyXML have been developped.
|
|
||||||
*/
|
|
||||||
class TiXmlOutStream : public TiXmlString
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
// TiXmlOutStream << operator.
|
|
||||||
TiXmlOutStream & operator << (const TiXmlString & in)
|
|
||||||
{
|
|
||||||
*this += in;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TiXmlOutStream << operator.
|
|
||||||
TiXmlOutStream & operator << (const char * in)
|
|
||||||
{
|
|
||||||
*this += in;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif // TIXML_STRING_INCLUDED
|
|
||||||
#endif // TIXML_USE_STL
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
www.sourceforge.net/projects/tinyxml
|
|
||||||
Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any
|
|
||||||
damages arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any
|
|
||||||
purpose, including commercial applications, and to alter it and
|
|
||||||
redistribute it freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must
|
|
||||||
not claim that you wrote the original software. If you use this
|
|
||||||
software in a product, an acknowledgment in the product documentation
|
|
||||||
would be appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and
|
|
||||||
must not be misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tinyxml.h"
|
|
||||||
|
|
||||||
// The goal of the seperate error file is to make the first
|
|
||||||
// step towards localization. tinyxml (currently) only supports
|
|
||||||
// english error messages, but the could now be translated.
|
|
||||||
//
|
|
||||||
// It also cleans up the code a bit.
|
|
||||||
//
|
|
||||||
|
|
||||||
const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
|
|
||||||
{
|
|
||||||
"No error",
|
|
||||||
"Error",
|
|
||||||
"Failed to open file",
|
|
||||||
"Memory allocation failed.",
|
|
||||||
"Error parsing Element.",
|
|
||||||
"Failed to read Element name",
|
|
||||||
"Error reading Element value.",
|
|
||||||
"Error reading Attributes.",
|
|
||||||
"Error: empty tag.",
|
|
||||||
"Error reading end tag.",
|
|
||||||
"Error parsing Unknown.",
|
|
||||||
"Error parsing Comment.",
|
|
||||||
"Error parsing Declaration.",
|
|
||||||
"Error document empty.",
|
|
||||||
"Error null (0) or unexpected EOF found in input stream.",
|
|
||||||
"Error parsing CDATA.",
|
|
||||||
};
|
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user