From ed134b442ca19eda21bf0289b898e21f97e1736f Mon Sep 17 00:00:00 2001 From: esanchezm Date: Fri, 25 Aug 2006 13:02:03 +0000 Subject: [PATCH] 2006-08-15 Esteban Sanchez * autogen.sh, configure.in, Makefile.am, Doxyfile.in: Added to repository. They are used to generate documentation, not to compile. * main.cc: Added some comments. Style correction. * pandora.[cc,h]: Added documentation comments. Changed visibility of some attributes. * pandora_agent_conf.[cc,h]: Added to Pandora namespace. Added documentation comments. * pandora_windows_service.[cc,h], pandora_strutils.[cc,h], windows/pandora_windows_infp.[cc,h], ssh/pandora_ssh_test.[cc,h]: Added documentation comments. * ssh/pandora_ssh_client.[cc,h]:Added documentation comments. Removed old method to connect with user and password. Style correction. * misc/pandora_file.[cc,h]: Added documentation comments. Renamed some parameters. * modules/pandora_module.[cc,h]: Added documentation comments. Put a name to the enumerators. Added a new class to agroupate all exceptions produced by Pandora_Module child class objects. Changed visibility of some attributes. Added some new methods and renamed others. * modules/pandora_module_cpuusage.[cc,h], modules/pandora_module_exec.[cc,h], modules/pandora_module_freememory.[cc,h], modules/pandora_module_freedisk.[cc,h], modules/pandora_module_proc.[cc,h], modules/pandora_module_service.[cc,h]: Added documentation comments. Some changes to adapt the objects to the Pandora_Module changes. * modules/pandora_module_list.[cc,h]: Added documentation comments. Some changes to adapt the objects to the Pandora_Module changes. Added to Pandora_Modules namespace. * windows/pandora_windows_wmi.[cc,h]: Added documentation comments. Renamed Pandora_Wmi_Error to Pandora_Wmi_Exception. * windows_service.[cc,h]: Added documentation comments. Changed visibility of some attributes. Style correction. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@150 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f --- pandora_agents/win32/ChangeLog | 45 +++++ pandora_agents/win32/Doxyfile.in | 183 ++++++++++++++++++ pandora_agents/win32/Makefile.am | 0 pandora_agents/win32/autogen.sh | 43 ++++ pandora_agents/win32/configure.in | 10 + pandora_agents/win32/main.cc | 29 ++- pandora_agents/win32/misc/pandora_file.cc | 38 +++- pandora_agents/win32/misc/pandora_file.h | 25 ++- .../win32/modules/pandora_module.cc | 178 ++++++++++++++++- pandora_agents/win32/modules/pandora_module.h | 159 ++++++++++----- .../win32/modules/pandora_module_cpuusage.cc | 13 +- .../win32/modules/pandora_module_cpuusage.h | 3 + .../win32/modules/pandora_module_exec.cc | 14 +- .../win32/modules/pandora_module_exec.h | 7 + .../win32/modules/pandora_module_factory.cc | 17 +- .../win32/modules/pandora_module_factory.h | 4 +- .../win32/modules/pandora_module_freedisk.cc | 13 +- .../win32/modules/pandora_module_freedisk.h | 4 + .../modules/pandora_module_freememory.cc | 12 +- .../win32/modules/pandora_module_freememory.h | 3 + .../win32/modules/pandora_module_list.cc | 58 ++++-- .../win32/modules/pandora_module_list.h | 58 +++--- .../win32/modules/pandora_module_proc.cc | 11 +- .../win32/modules/pandora_module_proc.h | 3 + .../win32/modules/pandora_module_service.cc | 11 +- .../win32/modules/pandora_module_service.h | 4 + pandora_agents/win32/pandora.cc | 98 +++++++++- pandora_agents/win32/pandora.h | 24 ++- pandora_agents/win32/pandora_agent_conf.cc | 34 +++- pandora_agents/win32/pandora_agent_conf.h | 34 ++-- pandora_agents/win32/pandora_strutils.cc | 63 +++++- pandora_agents/win32/pandora_strutils.h | 19 +- .../win32/pandora_windows_service.cc | 23 ++- .../win32/pandora_windows_service.h | 37 ++-- .../win32/ssh/pandora_ssh_client.cc | 99 +++++++--- pandora_agents/win32/ssh/pandora_ssh_client.h | 88 ++++++--- pandora_agents/win32/ssh/pandora_ssh_test.cc | 36 +++- pandora_agents/win32/ssh/pandora_ssh_test.h | 10 +- .../win32/windows/pandora_windows_info.cc | 25 +++ .../win32/windows/pandora_windows_info.h | 3 + pandora_agents/win32/windows/pandora_wmi.cc | 63 +++++- pandora_agents/win32/windows/pandora_wmi.h | 8 +- pandora_agents/win32/windows_service.cc | 73 ++++++- pandora_agents/win32/windows_service.h | 63 +++--- 44 files changed, 1441 insertions(+), 304 deletions(-) create mode 100644 pandora_agents/win32/Doxyfile.in create mode 100644 pandora_agents/win32/Makefile.am create mode 100755 pandora_agents/win32/autogen.sh create mode 100644 pandora_agents/win32/configure.in diff --git a/pandora_agents/win32/ChangeLog b/pandora_agents/win32/ChangeLog index e72bab1c2c..4b241d689c 100644 --- a/pandora_agents/win32/ChangeLog +++ b/pandora_agents/win32/ChangeLog @@ -1,3 +1,48 @@ +2006-08-15 Esteban Sanchez + + * autogen.sh, configure.in, Makefile.am, Doxyfile.in: Added to + repository. They are used to generate documentation, not to compile. + + * main.cc: Added some comments. Style correction. + + * pandora.[cc,h]: Added documentation comments. Changed visibility of + some attributes. + + * pandora_agent_conf.[cc,h]: Added to Pandora namespace. Added + documentation comments. + + * pandora_windows_service.[cc,h], pandora_strutils.[cc,h], + windows/pandora_windows_infp.[cc,h], ssh/pandora_ssh_test.[cc,h]: + Added documentation comments. + + * ssh/pandora_ssh_client.[cc,h]:Added documentation comments. Removed + old method to connect with user and password. Style correction. + + * misc/pandora_file.[cc,h]: Added documentation comments. Renamed some + parameters. + + * modules/pandora_module.[cc,h]: Added documentation comments. Put a + name to the enumerators. Added a new class to agroupate all exceptions + produced by Pandora_Module child class objects. Changed visibility of + some attributes. Added some new methods and renamed others. + + * modules/pandora_module_cpuusage.[cc,h], + modules/pandora_module_exec.[cc,h], + modules/pandora_module_freememory.[cc,h], + modules/pandora_module_freedisk.[cc,h], modules/pandora_module_proc.[cc,h], + modules/pandora_module_service.[cc,h]: Added documentation comments. + Some changes to adapt the objects to the Pandora_Module changes. + + * modules/pandora_module_list.[cc,h]: Added documentation comments. + Some changes to adapt the objects to the Pandora_Module changes. Added + to Pandora_Modules namespace. + + * windows/pandora_windows_wmi.[cc,h]: Added documentation comments. + Renamed Pandora_Wmi_Error to Pandora_Wmi_Exception. + + * windows_service.[cc,h]: Added documentation comments. Changed + visibility of some attributes. Style correction. + 2006-07-17 Esteban Sanchez * main.cc: Added "--help" option. diff --git a/pandora_agents/win32/Doxyfile.in b/pandora_agents/win32/Doxyfile.in new file mode 100644 index 0000000000..eb89bfe265 --- /dev/null +++ b/pandora_agents/win32/Doxyfile.in @@ -0,0 +1,183 @@ +# Doxyfile 0.1 + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = pandora-agent-win32 +PROJECT_NUMBER = @VERSION@ +OUTPUT_DIRECTORY = doc/api +OUTPUT_LANGUAGE = English +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +INTERNAL_DOCS = NO +STRIP_CODE_COMMENTS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = YES +SHOW_INCLUDE_FILES = YES +JAVADOC_AUTOBRIEF = YES +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +OPTIMIZE_OUTPUT_FOR_C = YES +SHOW_USED_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = NO +WARN_IF_UNDOCUMENTED = NO +WARN_FORMAT = +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = @top_srcdir@/ +FILE_PATTERNS = *.cc *.h +RECURSIVE = YES +EXCLUDE = ssh/libssh2 tinyxml windows/wmi + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = Makefile.* ChangeLog CHANGES CHANGES.* README \ + README.* *.png AUTHORS DESIGN DESIGN.* *.desktop \ + DESKTOP* COMMENTS HOWTO magic NOTES TODO THANKS \ + + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = YES +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = YES +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = "PANDORA_BEGIN_DECLS=" \ + "PANDORA_END_DECLS=" \ + "DOXYGEN_SHOULD_SKIP_THIS" \ + "_PANDORA_DEFINE_GLOBAL_LOCK(name)=" \ + "_PANDORA_GNUC_PRINTF(from,to)=" +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +PERL_PATH = +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +TEMPLATE_RELATIONS = YES +HIDE_UNDOC_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +GRAPHICAL_HIERARCHY = YES +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 640 +MAX_DOT_GRAPH_HEIGHT = 1024 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +DOT_IMAGE_FORMAT = png +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/pandora_agents/win32/Makefile.am b/pandora_agents/win32/Makefile.am new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pandora_agents/win32/autogen.sh b/pandora_agents/win32/autogen.sh new file mode 100755 index 0000000000..286c49b20e --- /dev/null +++ b/pandora_agents/win32/autogen.sh @@ -0,0 +1,43 @@ +#! /bin/sh + +# $Id: autogen.sh,v 1.4 2002/12/02 01:39:49 murrayc Exp $ +# +# Copyright (c) 2002 Daniel Elstner +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License VERSION 2 as +# published by the Free Software Foundation. You are not allowed to +# use any other version of the license; unless you got the explicit +# permission from the author to do so. +# +# 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 + +dir=`echo "$0" | sed 's,[^/]*$,,'` +test "x${dir}" = "x" && dir='.' + +if test "x`cd "${dir}" 2>/dev/null && pwd`" != "x`pwd`" +then + echo "This script must be executed directly from the source directory." + exit 1 +fi + +rm -f config.cache acconfig.h + +echo "- Running aclocal." && \ +aclocal && \ +echo "- Running autoconf." && \ +autoconf && \ +echo "- Running automake." && \ +automake --add-missing --gnu && \ +echo && \ +./configure "$@" && exit 0 + +exit 1 + diff --git a/pandora_agents/win32/configure.in b/pandora_agents/win32/configure.in new file mode 100644 index 0000000000..f52386be2f --- /dev/null +++ b/pandora_agents/win32/configure.in @@ -0,0 +1,10 @@ +AC_PREREQ(2.59) + +AC_INIT([pandora-agent-win32], [1.0.0]) + +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) + +AC_OUTPUT([ +Doxyfile +Makefile +]) diff --git a/pandora_agents/win32/main.cc b/pandora_agents/win32/main.cc index a7f16ab0be..62e25838d9 100644 --- a/pandora_agents/win32/main.cc +++ b/pandora_agents/win32/main.cc @@ -44,19 +44,25 @@ main (int argc, char *argv[]) { pos = aux.rfind ("\\"); aux.erase (pos + 1); Pandora::setPandoraInstallDir (aux); - + + /* Check the parameters */ for (int i = 1; i < argc; i++) { if (_stricmp(argv[i], SERVICE_INSTALL_CMDLINE_PARAM) == 0) { + /* Install parameter */ service->install (Pandora::getPandoraInstallPath ().c_str ()); delete service; + return 0; } else if (_stricmp(argv[i], SERVICE_UNINSTALL_CMDLINE_PARAM) == 0) { + /* Uninstall parameter */ service->uninstall (); delete service; + return 0; } else if (_stricmp(argv[i], SSH_TEST_CMDLINE_PARAM) == 0) { + /* SSH test parameter */ SSH::Pandora_SSH_Test ssh_test; delete service; @@ -66,24 +72,33 @@ main (int argc, char *argv[]) { } catch (Pandora_Exception e) { return 1; } + return 0; } else if (_stricmp(argv[i], HELP_CMDLINE_PARAM) == 0) { + /* Help parameter */ cout << "Usage: " << argv[0] << " [OPTION]" << endl << endl; cout << "Available options are:" << endl; - cout << "\t" << SERVICE_INSTALL_CMDLINE_PARAM << ": Install the Pandora Agent service." << endl; - cout << "\t" << SERVICE_UNINSTALL_CMDLINE_PARAM << ": Uninstall the Pandora Agent service." << endl; - cout << "\t" << SSH_TEST_CMDLINE_PARAM << ": Test the SSH Pandora Agent configuration." << endl; + cout << "\t" << SERVICE_INSTALL_CMDLINE_PARAM; + cout << ": Install the Pandora Agent service." << endl; + cout << "\t" << SERVICE_UNINSTALL_CMDLINE_PARAM; + cout << ": Uninstall the Pandora Agent service." << endl; + cout << "\t" << SSH_TEST_CMDLINE_PARAM; + cout << ": Test the SSH Pandora Agent configuration." << endl; return 0; } else { - cout << "Usage: " << argv[0] << " [" << SERVICE_INSTALL_CMDLINE_PARAM - << "] [" << SERVICE_UNINSTALL_CMDLINE_PARAM << "]" << endl; - cerr << "Run " << argv[0] << "with " << HELP_CMDLINE_PARAM << " parameter for more info." << endl; + /* No parameter recognized */ + cout << "Usage: " << argv[0] << " [" << SERVICE_INSTALL_CMDLINE_PARAM; + cout << "] [" << SERVICE_UNINSTALL_CMDLINE_PARAM << "]" << endl; + cout << "Run " << argv[0] << "with " << HELP_CMDLINE_PARAM; + cout << " parameter for more info." << endl; + return 1; } } service->run (); delete service; + return 0; } diff --git a/pandora_agents/win32/misc/pandora_file.cc b/pandora_agents/win32/misc/pandora_file.cc index 0dc96b54f4..c2fca02bb6 100644 --- a/pandora_agents/win32/misc/pandora_file.cc +++ b/pandora_agents/win32/misc/pandora_file.cc @@ -25,10 +25,20 @@ using namespace std; +/** + * Reads a file and returns its content. + * + * @param filepath Path of the file to read. + * + * @return File content. + * + * @exception File_Not_Found throwed if the path is incorrect or the + * file does not exists or could not be opened. + **/ string -Pandora_File::readFile (const string filename) { +Pandora_File::readFile (const string filepath) { string line, result; - ifstream myfile (filename.c_str ()); + ifstream myfile (filepath.c_str ()); if (! myfile.is_open ()) { throw File_Not_Found (); @@ -44,16 +54,32 @@ Pandora_File::readFile (const string filename) { return result; } +/** + * Delete a file from a directory. + * + * @param filepath Path of the file to delete. + * + * @exception Delete_Error if the file could not be deleted. + */ void -Pandora_File::removeFile (const string filename) { - if (remove (filename.c_str ()) == -1) { +Pandora_File::removeFile (const string filepath) { + if (remove (filepath.c_str ()) == -1) { throw Delete_Error (); } } +/** + * Write data into a text file. + * + * @param filepath Path of the file to write in. + * @param data Data to be written. + * + * @exception File_Not_Found throwed if the path is incorrect or the + * file does not exists or could not be opened. + */ void -Pandora_File::writeFile (const string filename, const string data) { - ofstream file (filename.c_str ()); +Pandora_File::writeFile (const string filepath, const string data) { + ofstream file (filepath.c_str ()); if (! file.is_open ()) { throw File_Not_Found (); diff --git a/pandora_agents/win32/misc/pandora_file.h b/pandora_agents/win32/misc/pandora_file.h index 54323135e9..a2a6afdb74 100644 --- a/pandora_agents/win32/misc/pandora_file.h +++ b/pandora_agents/win32/misc/pandora_file.h @@ -26,13 +26,30 @@ using namespace std; +/** + * File operations. + */ namespace Pandora_File { - class File_Not_Found : Pandora::Pandora_Exception { + /** + * File super-class exception. + */ + class File_Exception : Pandora::Pandora_Exception { }; - - class Delete_Error : Pandora::Pandora_Exception { + + /** + * Exception throwed when a file could not be found when doing + * a file operation. + */ + class File_Not_Found : Pandora_File::File_Exception { }; - + + /** + * Exception throwed when a file could not be deleted on a delete + * operation. + */ + class Delete_Error : Pandora_File::File_Exception { + }; + string readFile (const string filename); void removeFile (const string filename); void writeFile (const string filename, const string data); diff --git a/pandora_agents/win32/modules/pandora_module.cc b/pandora_agents/win32/modules/pandora_module.cc index 249c0a159b..24760e0db6 100644 --- a/pandora_agents/win32/modules/pandora_module.cc +++ b/pandora_agents/win32/modules/pandora_module.cc @@ -26,6 +26,13 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module. + * + * Initializes all attributes. The default interval is set to 1 loop. + * + * @param name Module name. + */ Pandora_Module::Pandora_Module (string name) { this->module_name = name; this->executions = 0; @@ -36,11 +43,23 @@ Pandora_Module::Pandora_Module (string name) { this->has_limits = false; } +/** + * Virtual destructor of Pandora_Module. + * + * Should be redefined by child classes. + */ Pandora_Module::~Pandora_Module () { } -int -Pandora_Module::getModuleType (string type) { +/** + * Get the Module_Type from a string type. + * + * @param type String type. + * + * @return The Module_Type which represents the type. + */ +Module_Type +Pandora_Module::parseModuleTypeFromString (string type) { if (type == module_generic_data_str) { return TYPE_GENERIC_DATA; } else if (type == module_generic_data_inc_str) { @@ -54,26 +73,104 @@ Pandora_Module::getModuleType (string type) { } } +/** + * Get the Module_Kind from a string Kind. + * + * @param kind String Kind. + * + * @return The Module_Kind which represents the Kind. + */ +Module_Kind +Pandora_Module::parseModuleKindFromString (string kind) { + if (kind == module_exec_str) { + return MODULE_EXEC; + } else if (kind == module_proc_str) { + return MODULE_PROC; + } else if (kind == module_service_str) { + return MODULE_SERVICE; + } else if (kind == module_freedisk_str) { + return MODULE_FREEDISK; + } else if (kind == module_freememory_str) { + return MODULE_FREEMEMORY; + } else if (kind == module_cpuusage_str) { + return MODULE_CPUUSAGE; + } else { + return MODULE_0; + } +} + +/** + * Get the name of the module. + * + * @return The name of the module. + */ string Pandora_Module::getName () const { return this->module_name; } +/** + * Get the description of the module. + * + * @return The module description. + */ +string +Pandora_Module::getDescription () const { + return this->module_description; +} + +/** + * Get the module type in a human readable string. + * + * @return The module type.. + */ string Pandora_Module::getTypeString () const { return this->module_type_str; } -int +/** + * Get the module type in a integer value. + * + * @return The module type in a integer value. + */ +Module_Type Pandora_Module::getTypeInt () const { return this->module_type; } -int +/** + * Get the kind of the module in a integer_value. + * + * @return The module kind in a integer value. + */ +Module_Kind Pandora_Module::getModuleKind () const { return this->module_kind; } +/** + * Get the type of the module in a integer_value. + * + * @return The module type in a integer value. + */ +Module_Type +Pandora_Module::getModuleType () const { + return this->module_type; +} + +/** + * Get the module output. + * + * After running the module, this function will return the output, + * based on the module_type and the interval. + * + * @return The output in a string. + * + * @exception Output_Error Throwed if the module_type is not correct. + * @exception Value_Error Throwed when the output is not in + * the interval range. + */ string Pandora_Module::getOutput () const { switch (this->module_type) { @@ -90,7 +187,7 @@ Pandora_Module::getOutput () const { if (this->has_limits) { if (value >= this->max || value <= this->min) { - throw Interval_Error (); + throw Value_Error (); } } @@ -100,6 +197,16 @@ Pandora_Module::getOutput () const { } } +/** + * Run the module and generates the output. + * + * It is used by the child classes to check the execution interval + * value and increment the executions variable. + * + * @exception Interval_Not_Fulfilled Throwed when the execution + * interval value indicates that the module doesn't have + * to execute. + */ void Pandora_Module::run () { @@ -120,6 +227,23 @@ Pandora_Module::run () { has_output = true; } +/** + * Get the XML output of the value. + * + * The output is a element of the TinyXML library. A sample output of + * a module is: + * @verbatim + + Conexiones abiertas + generic_data + 5 + Conexiones abiertas + + @endverbatim + * + * @return A pointer to the TiXmlElement if successful which has to be + * freed by the caller. NULL if the XML could not be created. + */ TiXmlElement * Pandora_Module::getXml () { string data; @@ -141,7 +265,7 @@ Pandora_Module::getXml () { this->module_name.c_str ()); return NULL; - } catch (Interval_Error e) { + } catch (Value_Error e) { pandoraLog ("The returned value was not in the interval on module %s", this->module_name.c_str ()); @@ -183,29 +307,69 @@ Pandora_Module::getXml () { return root; } +/** + * Set the max value the module can have. + * + * The range is closed, so the value is included. + * + * @param value Max value to set. + */ void Pandora_Module::setMax (int value) { this->has_limits = true; this->max = value; } +/** + * Set the min value the module can have. + * + * The range is closed, so the value is included. + * + * @param value Min value to set. + */ void Pandora_Module::setMin (int value) { this->has_limits = true; this->min = value; } +/** + * Set the module type from a string type. + * + * @param type String type. + */ void Pandora_Module::setType (string type) { this->module_type_str = type; - this->module_type = getModuleType (type); + this->module_type = parseModuleTypeFromString (type); } +/** + * Set the module kind from a string kind. + * + * @param kind String kind. + */ +void +Pandora_Module::setKind (string kind) { + this->module_kind_str = kind; + this->module_kind = parseModuleKindFromString (kind); +} + +/** + * Set the interval execution. + * + * @param interval Interval between executions. + */ void Pandora_Module::setInterval (int interval) { this->module_interval = interval; } +/** + * Set the module description. + * + * @param description Description of the module. + */ void Pandora_Module::setDescription (string description) { this->module_description = description; diff --git a/pandora_agents/win32/modules/pandora_module.h b/pandora_agents/win32/modules/pandora_module.h index 8ca64da795..00c30e92dd 100644 --- a/pandora_agents/win32/modules/pandora_module.h +++ b/pandora_agents/win32/modules/pandora_module.h @@ -26,30 +26,47 @@ #include #include +/** + * Definition of Pandora modules. + */ namespace Pandora_Modules { - enum { - TYPE_0, - TYPE_GENERIC_DATA, - TYPE_GENERIC_DATA_INC, - TYPE_GENERIC_PROC, - TYPE_GENERIC_DATA_STRING - }; + /** + * Defines the type of the module. + * + * The type of a module is the value type the module can have. + */ + typedef enum { + TYPE_0, /**< Invalid value */ + TYPE_GENERIC_DATA, /**< The value is an integer */ + TYPE_GENERIC_DATA_INC, /**< The value is an integer with + * incremental diferences */ + TYPE_GENERIC_PROC, /**< The value is a 0 or a 1 */ + TYPE_GENERIC_DATA_STRING /**< The value is a string */ + } Module_Type; const string module_generic_data_str = "generic_data"; const string module_generic_data_inc_str = "generic_data_inc"; const string module_generic_proc_str = "generic_proc"; const string module_generic_data_string_str = "generic_data_string"; - enum { - MODULE_0, - MODULE_EXEC, - MODULE_PROC, - MODULE_SERVICE, - MODULE_FREEDISK, - MODULE_CPUUSAGE, - MODULE_FREEMEMORY - }; + /** + * Defines the kind of the module. + * + * The kind of a module is the work the module does. + */ + typedef enum { + MODULE_0, /**< Invalid kind */ + MODULE_EXEC, /**< The module run a custom command */ + MODULE_PROC, /**< The module checks for a running + * process */ + MODULE_SERVICE, /**< The module checks for a running + * service */ + MODULE_FREEDISK, /**< The module checks the free */ + MODULE_CPUUSAGE, /**< The module checks the CPU usage */ + MODULE_FREEMEMORY /**< The module checks the amount of + * freememory in the system */ + } Module_Kind; const string module_exec_str = "module_exec"; const string module_proc_str = "module_proc"; @@ -58,49 +75,89 @@ namespace Pandora_Modules { const string module_freememory_str = "module_freememory"; const string module_cpuusage_str = "module_cpuusage"; - class Output_Error : public Pandora::Pandora_Exception { }; - class Interval_Error : public Pandora::Pandora_Exception { }; - class Interval_Not_Fulfilled : public Pandora::Pandora_Exception { }; - + /** + * Pandora module super-class exception. + */ + class Module_Exception : public Pandora::Pandora_Exception { }; + + /** + * An error happened with the module output. + */ + class Output_Error : public Pandora_Modules::Module_Exception { }; + + /** + * The module value is not correct, usually beacause of the limits. + */ + class Value_Error : public Pandora_Modules::Module_Exception { }; + + /** + * The module does not satisfy its interval. + */ + class Interval_Not_Fulfilled : public Pandora_Modules::Module_Exception { }; + + /** + * Pandora module super-class. + * + * Every defined module must inherit of this class. + */ class Pandora_Module { + private: + int module_interval; + int executions; + int max, min; + bool has_limits; + string module_type_str; + Module_Type module_type; + string module_kind_str; + Module_Kind module_kind; protected: - string module_name; - string module_type_str; - int module_type; - string module_kind_str; - string module_description; - int module_kind; - int module_interval; - int executions; - string output; - int max, min; - bool has_limits; - bool has_output; + /** + * Module output generated at execution. + */ + string output; + /** + * Indicates if the module generated output in + * his last execution. + */ + bool has_output; + /** + * The name of the module. + */ + string module_name; + /** + * The description of the module. + */ + string module_description; public: - Pandora_Module (string name); - virtual ~Pandora_Module (); + Pandora_Module (string name); + virtual ~Pandora_Module (); + + static Module_Type + parseModuleTypeFromString (string type); + + static Module_Kind + parseModuleKindFromString (string kind); + + void setInterval (int interval); - static int getModuleType (string type); + TiXmlElement *getXml (); - void setInterval (int interval); + virtual void run (); - /* Get the XML output of the agent. */ - TiXmlElement *getXml (); + virtual string getOutput () const; - /* Execute the agent */ - virtual void run (); + string getName () const; + string getDescription () const; + string getTypeString () const; + Module_Type getTypeInt () const; + Module_Type getModuleType () const; + Module_Kind getModuleKind () const; - virtual string getOutput () const; - - string getName () const; - string getTypeString () const; - int getTypeInt () const; - int getModuleKind () const; - - void setType (string type); - void setDescription (string description); - void setMax (int value); - void setMin (int value); + void setType (string type); + void setKind (string kind); + void setDescription (string description); + void setMax (int value); + void setMin (int value); }; } diff --git a/pandora_agents/win32/modules/pandora_module_cpuusage.cc b/pandora_agents/win32/modules/pandora_module_cpuusage.cc index 1b0191a24f..e72f7f3cbd 100644 --- a/pandora_agents/win32/modules/pandora_module_cpuusage.cc +++ b/pandora_agents/win32/modules/pandora_module_cpuusage.cc @@ -27,13 +27,18 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module_Cpuusage object. + * + * @param name Module name. + * @param cpu_id CPU id to control. It's 0 in monoprocessor systems. + */ Pandora_Module_Cpuusage::Pandora_Module_Cpuusage (string name, int cpu_id) : Pandora_Module (name) { this->cpu_id = cpu_id; - this->module_kind_str = module_cpuusage_str; - this->module_kind = MODULE_CPUUSAGE; + this->setKind (module_cpuusage_str); } void @@ -49,8 +54,8 @@ Pandora_Module_Cpuusage::run () { try { res = Pandora_Wmi::getCpuUsagePercentage (this->cpu_id); - output = inttostr (res); - } catch (Pandora_Wmi::Pandora_Wmi_Error e) { + this->output = inttostr (res); + } catch (Pandora_Wmi::Pandora_Wmi_Exception e) { this->has_output = false; } } diff --git a/pandora_agents/win32/modules/pandora_module_cpuusage.h b/pandora_agents/win32/modules/pandora_module_cpuusage.h index f4c54c4be4..efbcc0d49f 100644 --- a/pandora_agents/win32/modules/pandora_module_cpuusage.h +++ b/pandora_agents/win32/modules/pandora_module_cpuusage.h @@ -25,6 +25,9 @@ #include "pandora_module.h" namespace Pandora_Modules { + /** + * Module to retrieve the CPU usage percentage. + */ class Pandora_Module_Cpuusage : public Pandora_Module { private: int cpu_id; diff --git a/pandora_agents/win32/modules/pandora_module_exec.cc b/pandora_agents/win32/modules/pandora_module_exec.cc index 6b9ad5bf3f..4bfccaf10b 100644 --- a/pandora_agents/win32/modules/pandora_module_exec.cc +++ b/pandora_agents/win32/modules/pandora_module_exec.cc @@ -28,12 +28,17 @@ using namespace Pandora; using namespace Pandora_Strutils; using namespace Pandora_Modules; +/** + * Creates a Pandora_Module_Exec object. + * + * @param name Module name + * @param exec Command to be executed. + */ Pandora_Module_Exec::Pandora_Module_Exec (string name, string exec) : Pandora_Module (name) { this->module_exec = "cmd.exe /c \"" + exec + "\""; - this->module_kind_str = module_exec_str; - this->module_kind = MODULE_EXEC; + this->setKind (module_exec_str); } void @@ -48,6 +53,7 @@ Pandora_Module_Exec::run () { try { Pandora_Module::run (); } catch (Interval_Not_Fulfilled e) { + this->has_output = false; return; } @@ -62,6 +68,7 @@ Pandora_Module_Exec::run () { job = CreateJobObject (&attributes, this->module_name.c_str ()); if (job == NULL) { pandoraLog ("CreateJobObject bad. Err: %d", GetLastError ()); + this->has_output = false; return; } @@ -70,6 +77,7 @@ Pandora_Module_Exec::run () { if (! CreatePipe (&out_read, &new_stdout, &attributes, 0)) { pandoraLog ("CreatePipe failed. Err: %d", GetLastError ()); + this->has_output = false; return; } @@ -100,6 +108,7 @@ Pandora_Module_Exec::run () { working_dir.c_str (), &si, &pi)) { pandoraLog ("Pandora_Module_Exec: %s CreateProcess failed. Err: %d", this->module_name.c_str (), GetLastError ()); + this->has_output = false; } else { char buffer[BUFSIZE + 1]; unsigned long read, avail; @@ -123,6 +132,7 @@ Pandora_Module_Exec::run () { pandoraLog ("Pandora_Module_Exec: %s did not executed well (retcode: %d)", this->module_name.c_str (), retval); + this->has_output = false; } PeekNamedPipe (out_read, buffer, BUFSIZE, &read, &avail, NULL); diff --git a/pandora_agents/win32/modules/pandora_module_exec.h b/pandora_agents/win32/modules/pandora_module_exec.h index 5b1c4c23b8..686f723402 100644 --- a/pandora_agents/win32/modules/pandora_module_exec.h +++ b/pandora_agents/win32/modules/pandora_module_exec.h @@ -24,6 +24,13 @@ #include "pandora_module.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 util directory into the Pandora agent path. + */ class Pandora_Module_Exec : public Pandora_Module { private: string module_exec; diff --git a/pandora_agents/win32/modules/pandora_module_factory.cc b/pandora_agents/win32/modules/pandora_module_factory.cc index 7bdbcb7a80..fdbf25615a 100644 --- a/pandora_agents/win32/modules/pandora_module_factory.cc +++ b/pandora_agents/win32/modules/pandora_module_factory.cc @@ -62,6 +62,14 @@ parseLine (string line, string token) { return retstr; } +/** + * Creates a Pandora_Module object based on a string definition. + * + * @param definition Module definition readed from the configuration file. + * + * @return A new Pandora_Module object. NULL if the definition is + * incorrect. + */ Pandora_Module * Pandora_Module_Factory::getModuleFromDefinition (string definition) { list tokens; @@ -72,6 +80,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { string module_freedisk, module_cpuusage, module_freememory; Pandora_Module *module; bool numeric; + Module_Type type; module_name = ""; module_type = ""; @@ -82,8 +91,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { module_exec = ""; module_proc = ""; module_service = ""; - - + stringtok (tokens, definition, "\n"); /* Pick the first and the last value of the token list */ @@ -171,8 +179,9 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { if (module_description != "") { module->setDescription (module_description); } - - switch (Pandora_Module::getModuleType (module_type)) { + + type = Pandora_Module::parseModuleTypeFromString (module_type); + switch (type) { case TYPE_GENERIC_DATA: case TYPE_GENERIC_DATA_INC: case TYPE_GENERIC_PROC: diff --git a/pandora_agents/win32/modules/pandora_module_factory.h b/pandora_agents/win32/modules/pandora_module_factory.h index 5eae7412d1..78b02936bc 100644 --- a/pandora_agents/win32/modules/pandora_module_factory.h +++ b/pandora_agents/win32/modules/pandora_module_factory.h @@ -28,9 +28,11 @@ using namespace std; using namespace Pandora_Modules; +/** + * Factoy to create Pandora_Module objects by parsing a definition. + */ namespace Pandora_Module_Factory { Pandora_Module * getModuleFromDefinition (string definition); - string getModuleResult (Pandora_Module *module); } #endif diff --git a/pandora_agents/win32/modules/pandora_module_freedisk.cc b/pandora_agents/win32/modules/pandora_module_freedisk.cc index 4badf4cb38..825066cf71 100644 --- a/pandora_agents/win32/modules/pandora_module_freedisk.cc +++ b/pandora_agents/win32/modules/pandora_module_freedisk.cc @@ -29,6 +29,12 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module_Freedisk object. + * + * @param name Module name. + * @param disk_id Logical drive id to be monitorized. Usually it's "C:" + */ Pandora_Module_Freedisk::Pandora_Module_Freedisk (string name, string disk_id) : Pandora_Module (name) { @@ -37,8 +43,7 @@ Pandora_Module_Freedisk::Pandora_Module_Freedisk (string name, string disk_id) transform (disk_id.begin (), disk_id.end (), this->disk_id.begin (), (int (*) (int)) toupper); - this->module_kind_str = module_freedisk_str; - this->module_kind = MODULE_FREEDISK; + this->setKind (module_freedisk_str); } void @@ -54,8 +59,8 @@ Pandora_Module_Freedisk::run () { try { res = Pandora_Wmi::getDiskFreeSpace (this->disk_id); - output = longtostr (res); - } catch (Pandora_Wmi::Pandora_Wmi_Error e) { + this->output = longtostr (res); + } catch (Pandora_Wmi::Pandora_Wmi_Exception e) { this->has_output = false; } } diff --git a/pandora_agents/win32/modules/pandora_module_freedisk.h b/pandora_agents/win32/modules/pandora_module_freedisk.h index 13369eae2b..c7b9893999 100644 --- a/pandora_agents/win32/modules/pandora_module_freedisk.h +++ b/pandora_agents/win32/modules/pandora_module_freedisk.h @@ -25,6 +25,10 @@ #include "pandora_module.h" namespace Pandora_Modules { + /** + * Module to retrieve the free space available in a logical volume + * disk. + */ class Pandora_Module_Freedisk : public Pandora_Module { private: string disk_id; diff --git a/pandora_agents/win32/modules/pandora_module_freememory.cc b/pandora_agents/win32/modules/pandora_module_freememory.cc index 61e4d1dfa6..d8992adc2b 100644 --- a/pandora_agents/win32/modules/pandora_module_freememory.cc +++ b/pandora_agents/win32/modules/pandora_module_freememory.cc @@ -27,11 +27,15 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module_Freememory object. + * + * @param name Module name. + */ Pandora_Module_Freememory::Pandora_Module_Freememory (string name) : Pandora_Module (name) { - this->module_kind_str = module_freememory_str; - this->module_kind = MODULE_FREEMEMORY; + this->setKind (module_freememory_str); } void @@ -47,8 +51,8 @@ Pandora_Module_Freememory::run () { try { res = Pandora_Wmi::getFreememory (); - output = longtostr (res); - } catch (Pandora_Wmi::Pandora_Wmi_Error e) { + this->output = longtostr (res); + } catch (Pandora_Wmi::Pandora_Wmi_Exception e) { this->has_output = false; } } diff --git a/pandora_agents/win32/modules/pandora_module_freememory.h b/pandora_agents/win32/modules/pandora_module_freememory.h index c2ad0014f3..8bac0bb1bc 100644 --- a/pandora_agents/win32/modules/pandora_module_freememory.h +++ b/pandora_agents/win32/modules/pandora_module_freememory.h @@ -24,6 +24,9 @@ #include "pandora_module.h" namespace Pandora_Modules { + /** + * Module to retrieve the free memory amount of the system. + */ class Pandora_Module_Freememory : public Pandora_Module { public: Pandora_Module_Freememory (string name); diff --git a/pandora_agents/win32/modules/pandora_module_list.cc b/pandora_agents/win32/modules/pandora_module_list.cc index f98315c90f..4793789d98 100644 --- a/pandora_agents/win32/modules/pandora_module_list.cc +++ b/pandora_agents/win32/modules/pandora_module_list.cc @@ -29,9 +29,16 @@ #include using namespace std; -using namespace Pandora; -Pandora_Module_List::Pandora_Module_List (string filename) { +/** + * Read and set a key-value set from a file. + * + * It parses the file and create a Pandora_Module object with + * + * @param filename Path to the configuration file that includes the + * module definitions. + */ +Pandora_Modules::Pandora_Module_List::Pandora_Module_List (string filename) { ifstream file (filename.c_str ()); string buffer; unsigned int pos; @@ -74,7 +81,12 @@ Pandora_Module_List::Pandora_Module_List (string filename) { *current = modules->begin (); } -Pandora_Module_List::~Pandora_Module_List () { +/** + * Destroy the list. + * + * Note it also deletes all modules from the list. + */ +Pandora_Modules::Pandora_Module_List::~Pandora_Module_List () { Pandora_Module *module; std::list::iterator iter; @@ -93,7 +105,7 @@ Pandora_Module_List::~Pandora_Module_List () { } void -Pandora_Module_List::parseModuleDefinition (string definition) { +Pandora_Modules::Pandora_Module_List::parseModuleDefinition (string definition) { Pandora_Module *module; Pandora_Module_Exec *module_exec; Pandora_Module_Proc *module_proc; @@ -144,49 +156,73 @@ Pandora_Module_List::parseModuleDefinition (string definition) { } } + +/** + * Get the Pandora_Module that is pointed by the internal current pointer. + * + * @return The current Pandora_Module. + */ Pandora_Module * -Pandora_Module_List::getCurrentValue () { +Pandora_Modules::Pandora_Module_List::getCurrentValue () { return *(*current); } +/** + * Move the current pointer to the first element of the list. + */ void -Pandora_Module_List::goFirst () { +Pandora_Modules::Pandora_Module_List::goFirst () { if (modules != NULL) { *current = modules->begin (); } } +/** + * Move the current pointer to the last element of the list. + */ void -Pandora_Module_List::goLast () { +Pandora_Modules::Pandora_Module_List::goLast () { if (modules != NULL) { *current = modules->end (); } } +/** + * Move the current pointer to the next element of the list. + */ void -Pandora_Module_List::goNext () { +Pandora_Modules::Pandora_Module_List::goNext () { if (current != NULL && !isLast ()) { (*current)++; } } +/** + * Move the current pointer to the previous element of the list. + */ void -Pandora_Module_List::goPrev () { +Pandora_Modules::Pandora_Module_List::goPrev () { if (current != NULL && !isFirst ()) { (*current)--; } } +/** + * Check if the current pointer is the last one of the list. + */ bool -Pandora_Module_List::isLast () { +Pandora_Modules::Pandora_Module_List::isLast () { if (current == NULL || modules == NULL) { return true; } return *current == modules->end (); } +/** + * Check if the current pointer is the first one of the list. + */ bool -Pandora_Module_List::isFirst () { +Pandora_Modules::Pandora_Module_List::isFirst () { if (current == NULL || modules == NULL) { return true; } diff --git a/pandora_agents/win32/modules/pandora_module_list.h b/pandora_agents/win32/modules/pandora_module_list.h index 65d5c6717d..6c83289ae5 100644 --- a/pandora_agents/win32/modules/pandora_module_list.h +++ b/pandora_agents/win32/modules/pandora_module_list.h @@ -28,32 +28,36 @@ using namespace std; using namespace Pandora; -using namespace Pandora_Modules; - -class Pandora_Module_List { -protected: - list *modules; - list::iterator *current; -private: - void parseModuleDefinition (string definition); -public: - /* Read and set a key-value set from a file. */ - Pandora_Module_List (string filename); - - ~Pandora_Module_List (); - - Pandora_Module * getCurrentValue (); - - /* Move to the first element of the list */ - void goFirst (); - - /* Move to the last element of the list */ - void goLast (); - void goNext (); - void goPrev (); - - bool isLast (); - bool isFirst (); -}; +namespace Pandora_Modules { + /** + * Class to handle a list of Pandora_Module objects. + * + * It provides a set of methods to iterate through the list + * by using a internal "current module" pointer. + */ + class Pandora_Module_List { + private: + list *modules; + list::iterator *current; + void parseModuleDefinition (string definition); + public: + Pandora_Module_List (string filename); + + ~Pandora_Module_List (); + + Pandora_Module * getCurrentValue (); + + /* Move to the first element of the list */ + void goFirst (); + + /* Move to the last element of the list */ + void goLast (); + void goNext (); + void goPrev (); + + bool isLast (); + bool isFirst (); + }; +} #endif /* __PANDORA_MODULE_LIST_H__ */ diff --git a/pandora_agents/win32/modules/pandora_module_proc.cc b/pandora_agents/win32/modules/pandora_module_proc.cc index 3934cab2f9..e2d06b87ad 100644 --- a/pandora_agents/win32/modules/pandora_module_proc.cc +++ b/pandora_agents/win32/modules/pandora_module_proc.cc @@ -28,6 +28,12 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module_Proc object. + * + * @param name Module name. + * @param process_name Process name to check. + */ Pandora_Module_Proc::Pandora_Module_Proc (string name, string process_name) : Pandora_Module (name) { @@ -35,8 +41,7 @@ Pandora_Module_Proc::Pandora_Module_Proc (string name, string process_name) transform (process_name.begin (), process_name.end (), this->process_name.begin (), (int (*) (int)) tolower); - this->module_kind_str = module_proc_str; - this->module_kind = MODULE_PROC; + this->setKind (module_proc_str); } void @@ -51,5 +56,5 @@ Pandora_Module_Proc::run () { res = Pandora_Wmi::isProcessRunning (this->process_name); - output = inttostr (res); + this->output = inttostr (res); } diff --git a/pandora_agents/win32/modules/pandora_module_proc.h b/pandora_agents/win32/modules/pandora_module_proc.h index 0e833ed134..da89db024d 100644 --- a/pandora_agents/win32/modules/pandora_module_proc.h +++ b/pandora_agents/win32/modules/pandora_module_proc.h @@ -24,6 +24,9 @@ #include "pandora_module.h" namespace Pandora_Modules { + /** + * Module to check that a process is running on the system. + */ class Pandora_Module_Proc : public Pandora_Module { private: string process_name; diff --git a/pandora_agents/win32/modules/pandora_module_service.cc b/pandora_agents/win32/modules/pandora_module_service.cc index 9d6c87fbf8..881d84be95 100644 --- a/pandora_agents/win32/modules/pandora_module_service.cc +++ b/pandora_agents/win32/modules/pandora_module_service.cc @@ -29,6 +29,12 @@ using namespace Pandora; using namespace Pandora_Modules; using namespace Pandora_Strutils; +/** + * Creates a Pandora_Module_Service object. + * + * @param name Module name. + * @param service_name Service internal name to check. + */ Pandora_Module_Service::Pandora_Module_Service (string name, string service_name) : Pandora_Module (name) { @@ -37,8 +43,7 @@ Pandora_Module_Service::Pandora_Module_Service (string name, string service_name transform (service_name.begin (), service_name.end (), this->service_name.begin (), (int (*) (int)) tolower); - this->module_kind_str = module_service_str; - this->module_kind = MODULE_SERVICE; + this->setKind (module_service_str); } void @@ -52,5 +57,5 @@ Pandora_Module_Service::run () { } res = Pandora_Wmi::isServiceRunning (this->service_name); - output = inttostr (res); + this->output = inttostr (res); } diff --git a/pandora_agents/win32/modules/pandora_module_service.h b/pandora_agents/win32/modules/pandora_module_service.h index 47ccb97c56..5aaa7ab7de 100644 --- a/pandora_agents/win32/modules/pandora_module_service.h +++ b/pandora_agents/win32/modules/pandora_module_service.h @@ -25,6 +25,10 @@ #include "pandora_module.h" namespace Pandora_Modules { + /** + * Module to check that a windows service is running on the + * system. + */ class Pandora_Module_Service : public Pandora_Module { private: string service_name; diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 43bd7ddd1d..5c910b8033 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -37,6 +37,13 @@ string pandora_dir; bool pandora_debug; string pandora_version = PANDORA_VERSION; +/** + * Parses a string and initialize the key and the value. + * + * The string should be in the format: + * - key value + * - key "value with blankspaces" + */ void Key_Value::parseLine (string str) { unsigned int pos; @@ -68,11 +75,21 @@ Key_Value::parseLine (string str) { } } +/** + * Get the key of the object. + * + * @return The key + */ string Key_Value::getKey () { return key; } +/** + * Get the value of the object. + * + * @return The value + */ string Key_Value::getValue () { return value; @@ -104,6 +121,15 @@ pandoraWriteLog (string filename, string line) { cout << line << endl; } +/** + * Write a message in the log file. + * + * The log file is used to write the output of errors and problems of the + * agent. + * + * @param format String output format. + * @param ... Variable argument list + */ void Pandora::pandoraLog (char *format, ...) { va_list args; @@ -116,6 +142,15 @@ Pandora::pandoraLog (char *format, ...) { pandoraWriteLog ("pandora-log.log", (char *) msg); } +/** + * Write a message in the debug file. + * + * The log file is used to write the output of debugging information of the + * agent. + * + * @param format String output format. + * @param ... Variable argument list + */ void Pandora::pandoraDebug (char *format, ...) { if (pandora_debug) { @@ -131,38 +166,95 @@ Pandora::pandoraDebug (char *format, ...) { return; } +/** + * Secure free of a pointer. + * + * @param pointer pointer to free. + */ void -Pandora::pandoraFree (void * e) { - if (e != NULL) - free (e); +Pandora::pandoraFree (void * pointer) { + if (pointer != NULL) + free (pointer); return; } +/** + * Set the installation directory of the application. + * + * This directory is the path to the directory which holds + * the binary file. + * + * @param dir The path to the directory. + * + * @see getPandoraInstallDir + */ void Pandora::setPandoraInstallDir (string dir) { pandora_dir = dir; } +/** + * Get the installation directory of the application. + * + * This directory is the path to the directory which holds + * the binary file. + * + * @return The path to the directory. + * + * @see setPandoraInstallDir + */ string Pandora::getPandoraInstallDir () { return pandora_dir; } +/** + * Set the installation path of the application. + * + * This the complete path to the binary file. + * + * @param path The path to the binary file. + * + * @see getPandoraInstallPath + */ void Pandora::setPandoraInstallPath (string path) { pandora_path = path; } +/** + * Get the installation path of the application. + * + * This the complete path to the binary file. + * + * @return The path. + * + * @see setPandoraInstallPath + */ string Pandora::getPandoraInstallPath () { return pandora_path; } +/** + * Set the debug flag. + * + * If the flag is false output wil be generated. + * + * @param dbg Turns the debug flag on/off. + * + * @see pandoraDebug + */ void Pandora::setPandoraDebug (bool dbg) { pandora_debug = dbg; } +/** + * Get the version of the agent. + * + * @return The version. + */ string Pandora::getPandoraAgentVersion () { return pandora_version; diff --git a/pandora_agents/win32/pandora.h b/pandora_agents/win32/pandora.h index b094d2a551..f918b9ec8c 100644 --- a/pandora_agents/win32/pandora.h +++ b/pandora_agents/win32/pandora.h @@ -29,12 +29,18 @@ using namespace std; #define PANDORA_DEBUG 1 +/** + * Main application. + */ namespace Pandora { - + /** + * A Key_Value object holds a relation between a value and a + * unique key value. + */ class Key_Value { - protected: - string key; - string value; + private: + string key; + string value; public: void parseLine (string str); string getKey (); @@ -45,7 +51,7 @@ namespace Pandora { const char * const name = "PandoraAgent"; const char * const display_name = "Pandora agent"; const char * const description = "The Pandora Agent service"; - + void setPandoraInstallDir (string dir); string getPandoraInstallDir (); void setPandoraInstallPath (string path); @@ -56,7 +62,13 @@ namespace Pandora { void pandoraDebug (char *format, ...); void pandoraLog (char *format, ...); void pandoraFree (void * e); - + + /** + * Super-class exception. + * + * Other exceptions generated in the application should inherate from + * this class. This allow a easier handling on throw and catch blocks. + */ class Pandora_Exception { }; } diff --git a/pandora_agents/win32/pandora_agent_conf.cc b/pandora_agents/win32/pandora_agent_conf.cc index 742010b64d..673ad0128c 100644 --- a/pandora_agents/win32/pandora_agent_conf.cc +++ b/pandora_agents/win32/pandora_agent_conf.cc @@ -23,10 +23,22 @@ #include "pandora.h" using namespace std; +using namespace Pandora; #define MAX_KEYS 100 -Pandora_Agent_Conf::Pandora_Agent_Conf (string filename) { +/** + * Creates a new Pandora_Agent_Conf. + * + * It parses the filename and initialize the internal structures + * of configuration values. The configuration file consist of a number of + * lines of some of these forms: + * - name value + * - name "value with blankspaces" + * + * @param filename Configuration file to open. + */ +Pandora::Pandora_Agent_Conf::Pandora_Agent_Conf (string filename) { ifstream file (filename.c_str ()); string buffer; unsigned int pos; @@ -56,12 +68,26 @@ Pandora_Agent_Conf::Pandora_Agent_Conf (string filename) { file.close (); } -Pandora_Agent_Conf::~Pandora_Agent_Conf () { - delete key_values; +/** + * Destroy a Pandora_Agent_Conf object. + */ +Pandora::Pandora_Agent_Conf::~Pandora_Agent_Conf () { + delete key_values; } +/** + * Queries for a configuration value. + * + * This method search in the key_values attribute for a + * configuration value which match the key supplied. + * + * @param key Key to look for. + * + * @return The value of the configuration key looked for. + * If it could not be found then an empty string is returned. + */ string -Pandora_Agent_Conf::getValue (const string key) { +Pandora::Pandora_Agent_Conf::getValue (const string key) { std::list::iterator i = key_values->begin (); while (i != key_values->end ()) { diff --git a/pandora_agents/win32/pandora_agent_conf.h b/pandora_agents/win32/pandora_agent_conf.h index 41af2d096f..6ac5ac0429 100644 --- a/pandora_agents/win32/pandora_agent_conf.h +++ b/pandora_agents/win32/pandora_agent_conf.h @@ -26,19 +26,25 @@ #include using namespace std; -using namespace Pandora; -class Pandora_Agent_Conf { -protected: - list *key_values; /* Key-value list */ -public: - /* Read and set a key-value set from a file. */ - Pandora_Agent_Conf (string filename); - - ~Pandora_Agent_Conf (); - - /* Get the value of a key from a key-value set. */ - string getValue (const string key); -}; +namespace Pandora { + /** + * Agent main configuration class. + * + * Stores a list of Key_Value objects with the agent configuration. + * It parses a configuration file and supplies a function to get the + * configuration values. + */ + class Pandora_Agent_Conf { + private: + list *key_values; + public: + Pandora_Agent_Conf (string filename); + + ~Pandora_Agent_Conf (); + + string getValue (const string key); + }; +} -#endif /* __BABEL_AGENT_CONF_H__ */ +#endif /* __PANDORA_AGENT_CONF_H__ */ diff --git a/pandora_agents/win32/pandora_strutils.cc b/pandora_agents/win32/pandora_strutils.cc index df79337d6e..b401de9280 100644 --- a/pandora_agents/win32/pandora_strutils.cc +++ b/pandora_agents/win32/pandora_strutils.cc @@ -27,6 +27,15 @@ using namespace Pandora; +/** + * Removes heading and tailing blank spaces from a string. + * + * The blank spaces removed are " ", "\t", "\r" and "\n". + * + * @param str String to be trimmed. + * + * @return The trimmed string. + */ string Pandora_Strutils::trim (const string str) { char * delims = " \t\r\n"; @@ -47,11 +56,25 @@ Pandora_Strutils::trim (const string str) { return result; } +/** + * Transform an integer variable into a string. + * + * @param i Integer to transform. + * + * @return A string with the integer value. + */ string Pandora_Strutils::inttostr (const int i) { return longtostr (i); } +/** + * Transform a long variable into a string. + * + * @param i Long variable to transform + * + * @return A string with the long value. + */ string Pandora_Strutils::longtostr (const long i) { std::ostringstream o; @@ -61,6 +84,13 @@ Pandora_Strutils::longtostr (const long i) { return o.str(); } +/** + * Transform a long variable into hexadecimal. + * + * @param i Long variable to transform. + * + * @return The hexadecimal value of the long variable. + */ string Pandora_Strutils::longtohex (const long i) { std::ostringstream o; @@ -69,6 +99,16 @@ Pandora_Strutils::longtohex (const long i) { return o.str(); } +/** + * Tranform a string into a integer. + * + * @param str String to convert. + * + * @return The integer value of the string. + * + * @exception Invalid_Conversion throwed if the string has non- + * decimal values. + */ int Pandora_Strutils::strtoint (const string str) { int result; @@ -79,6 +119,15 @@ Pandora_Strutils::strtoint (const string str) { return result; } +/** + * Replace every occurence of a pattern in a string with other substring. + * + * @param in Objective string. + * @param pattern Pattern to be replaced. + * @param rep Substring that replace every occurence of the pattern. + * + * @return The input string with all pattern occurence replaced. + */ string Pandora_Strutils::strreplace (string in, string pattern, string rep) { int i = in.find (pattern); @@ -107,9 +156,19 @@ isseparator (char c, char const * const wstr) { return (strchr (wstr, c) != NULL); } +/** + * Split a string into diferent tokens, divided by one or many + * field separators. + * + * @param l Returned string list with every tokens. Must be initialized + * before calling the function. + * @param s Input string. + * @param separators Field separators string. I.e. " \t" will separate + * with every " " and "\t". Can be ommited and will be " \t\n". + */ void Pandora_Strutils::stringtok (list &l, string const &s, - char const * const separators) { + char const * const separators) { const string::size_type strsize = s.size(); string::size_type i = 0; @@ -136,5 +195,3 @@ Pandora_Strutils::stringtok (list &l, string const &s, i = j + 1; } } - - diff --git a/pandora_agents/win32/pandora_strutils.h b/pandora_agents/win32/pandora_strutils.h index 10ec226187..d063e326f1 100644 --- a/pandora_agents/win32/pandora_strutils.h +++ b/pandora_agents/win32/pandora_strutils.h @@ -27,13 +27,22 @@ using namespace std; +/** + * Operations with strings. + */ namespace Pandora_Strutils { - class Invalid_Conversion : Pandora::Pandora_Exception {}; - - /* Strip blank spaces characters from the end and the beginning of a - string. */ + /** + * String super-class exception. + */ + class String_Exception : Pandora::Pandora_Exception {}; + + /** + * Exception throwed when a conversion could no be successful. + */ + class Invalid_Conversion : Pandora_Strutils::String_Exception {}; + string trim (const string str); - + string inttostr (const int i); string longtostr (const long i); string longtohex (const long i); diff --git a/pandora_agents/win32/pandora_windows_service.cc b/pandora_agents/win32/pandora_windows_service.cc index 1e1aa73a5d..0fc333afe3 100644 --- a/pandora_agents/win32/pandora_windows_service.cc +++ b/pandora_agents/win32/pandora_windows_service.cc @@ -38,18 +38,31 @@ using namespace Pandora_Strutils; string enabled_values[] = {"enabled", "1", "on", "yes", "si", "sí", "ok", ""}; +/** + * Creates a new Pandora_Windows_Service. + * + * @param svc_name Internal service name + * @param svc_display_name Service name that will appear in the + * Windows service administration tool. + * @param svc_description Long description of the service. + */ Pandora_Windows_Service::Pandora_Windows_Service (const char * svc_name, - const char * svc_display_name, - const char * svc_description) + const char * svc_display_name, + const char * svc_description) : Windows_Service (svc_name, svc_display_name, svc_description) { - this->setInitFunction ((void (Windows_Service::*) ()) &Pandora_Windows_Service::pandora_init); - this->setRunFunction ((void (Windows_Service::*) ()) &Pandora_Windows_Service::pandora_run); + this->setInitFunction ((void (Windows_Service::*) ()) + &Pandora_Windows_Service::pandora_init); + this->setRunFunction ((void (Windows_Service::*) ()) + &Pandora_Windows_Service::pandora_run); execution_number = 0; this->modules = NULL; this->conf = NULL; } +/** + * Destroys a Pandora_Windows_Service object. + */ Pandora_Windows_Service::~Pandora_Windows_Service () { if (this->conf != NULL) { delete this->conf; @@ -86,7 +99,7 @@ Pandora_Windows_Service::pandora_init () { conf_file = Pandora::getPandoraInstallDir (); conf_file += "pandora_agent.conf"; - this->conf = new Pandora_Agent_Conf (conf_file); + this->conf = new Pandora::Pandora_Agent_Conf (conf_file); this->modules = new Pandora_Module_List (conf_file); /* Get the interval value (in minutes) and set it to the service */ diff --git a/pandora_agents/win32/pandora_windows_service.h b/pandora_agents/win32/pandora_windows_service.h index 7ac534fd73..83f7e18d9b 100644 --- a/pandora_agents/win32/pandora_windows_service.h +++ b/pandora_agents/win32/pandora_windows_service.h @@ -30,23 +30,28 @@ using namespace std; -class Pandora_Windows_Service : public Windows_Service { -private: - SSH::Pandora_Ssh_Client *ssh_client; - Pandora_Agent_Conf *conf; - Pandora_Module_List *modules; - long execution_number; - string agent_name; +namespace Pandora { + /** + * Class to implement the Pandora Windows service. + */ + class Pandora_Windows_Service : public Windows_Service { + private: + SSH::Pandora_Ssh_Client *ssh_client; + Pandora_Agent_Conf *conf; + Pandora_Modules::Pandora_Module_List *modules; + long execution_number; + string agent_name; - TiXmlElement * getXmlHeader (); + TiXmlElement *getXmlHeader (); - void pandora_run (); - void pandora_init (); -public: - Pandora_Windows_Service (const char * svc_name, - const char * svc_display_name, - const char * svc_description); - ~Pandora_Windows_Service (); -}; + void pandora_run (); + void pandora_init (); + public: + Pandora_Windows_Service (const char * svc_name, + const char * svc_display_name, + const char * svc_description); + ~Pandora_Windows_Service (); + }; +} #endif diff --git a/pandora_agents/win32/ssh/pandora_ssh_client.cc b/pandora_agents/win32/ssh/pandora_ssh_client.cc index 20299682f9..0c182ae0a1 100644 --- a/pandora_agents/win32/ssh/pandora_ssh_client.cc +++ b/pandora_agents/win32/ssh/pandora_ssh_client.cc @@ -36,18 +36,37 @@ using namespace std; using namespace SSH; using namespace Pandora; +/** + * Creates a Connection_Failed exception. + * + * @param e Numeric error code. + */ Connection_Failed::Connection_Failed (int e) { err_number = e; } +/** + * Get the numeric error code. + * + * @return The numeric code. + */ int Connection_Failed::getError () { return err_number; } + +/** + * Creates a Scp_Failed exception. + * + * @param e Error description. + */ Scp_Failed::Scp_Failed (char *e) { errmsg = strdup (e); } +/** + * Creates a SSH client object and initialize its attributes. + */ Pandora_Ssh_Client::Pandora_Ssh_Client () { sock = 0; fingerprint = ""; @@ -56,6 +75,13 @@ Pandora_Ssh_Client::Pandora_Ssh_Client () { return; } +/** + * Destroy a SSH client object. + * + * It also disconnect the client from the host if connected. + * + * @see disconnect + */ Pandora_Ssh_Client::~Pandora_Ssh_Client () { if (session != NULL) { disconnect (); @@ -64,7 +90,11 @@ Pandora_Ssh_Client::~Pandora_Ssh_Client () { return; } -/* Disconnects from remote host. It will close all open connections and channels. */ +/** + * Disconnects from remote host. + * + * It will close all open connections and channels. + */ void Pandora_Ssh_Client::disconnect () { if (channel != NULL) { @@ -142,28 +172,22 @@ Pandora_Ssh_Client::newConnection (const string host, const int port) { fingerprint.erase (fingerprint.length () - 1, 2); } -/* Connects to specified host and port using a username and a password */ -void -Pandora_Ssh_Client::connectWithUserPass (const string host, const int port, - const string username, const string passwd) { - try { - newConnection (host, port); - } catch (Session_Already_Opened e) { - } - - if (session != NULL) { - if (libssh2_userauth_password (session, username.c_str (), - passwd.c_str ())) { - disconnect (); - throw Authentication_Failed (); - } - } - return; -} - -/* Connects to specified host and port using a username and a public/private key. +/** + * Connects to specified host and port using a username and a public/private key. + * * The keys are the filename that contains the public and the private keys. - * The passphrase is the password for these keys. */ + * The passphrase is the password for these keys. + * + * @param host Remote host to connect to. + * @param port Remote port to connect to. + * @param username Remote host username to connect to. + * @param filename_pubkey Path to the public key file. + * @param filename_privkey Path to the private key file. + * @param passphrase Passphrase of the keys. + * + * @exception Authentication_Failed throwed when the atuhentication could not + * be done. + */ void Pandora_Ssh_Client::connectWithPublicKey (const string host, const int port, const string username, const string filename_pubkey, @@ -186,13 +210,28 @@ Pandora_Ssh_Client::connectWithPublicKey (const string host, const int port, return; } -/* Copy a file using a SSH connection (scp). +/** + * Copy a file using a SSH connection via scp method. + * * The function receives a filename in the local filesystem and copies all * its content to the remote host. The remote filename will be the * basename of the local file and will be copied in the remote actual - * directory. */ + * directory. + * + * @param remote_filename Remote path to copy the local file in. + * @param filename Path to the local file. + * + * @exception Session_Not_Opened Throwed if the session was not opened before + * calling this function. + * @exception Pandora_File::File_Not_Found Throwed if the local file does not + * exists. + * @exception Channel_Error Throwd if there was an error with the SSH channel. + * @exception Scp_Failed Throwed if the scp operations failed when copying the + * file. + */ void -Pandora_Ssh_Client::scpFileFilename (const string remote_filename, const string filename) { +Pandora_Ssh_Client::scpFileFilename (const string remote_filename, + const string filename) { LIBSSH2_CHANNEL *scp_channel; size_t to_send, sent; char *errmsg; @@ -207,7 +246,7 @@ Pandora_Ssh_Client::scpFileFilename (const string remote_filename, const string } catch (Pandora_File::File_Not_Found e) { pandoraLog ("Pandora_Ssh_Client: File %s not found", filename.c_str()); - return; + throw e; } to_send = buffer.length (); @@ -243,6 +282,14 @@ Pandora_Ssh_Client::scpFileFilename (const string remote_filename, const string libssh2_channel_free (scp_channel); } +/** + * Get the fingerprint of the remote host. + * + * The finger print is a unical identifier of the host. It's a method + * to ensure that the host is the host we supposed. + * + * @return The fingerprint of the remote host. + */ string Pandora_Ssh_Client::getFingerprint () { return this->fingerprint; diff --git a/pandora_agents/win32/ssh/pandora_ssh_client.h b/pandora_agents/win32/ssh/pandora_ssh_client.h index 877d0b7454..d87813f3ca 100644 --- a/pandora_agents/win32/ssh/pandora_ssh_client.h +++ b/pandora_agents/win32/ssh/pandora_ssh_client.h @@ -27,41 +27,81 @@ using namespace std; +/** + * SSH connection classes. + */ namespace SSH { - /* SSH Client exceptions */ - class Session_Already_Opened : public Pandora::Pandora_Exception { + /** + * A SSH super-class exception. + */ + class SSH_Exception : public Pandora::Pandora_Exception { + }; + + /** + * A SSH session has already be opened and a new + * connection is attemped without closing it. + */ + class Session_Already_Opened : public SSH::SSH_Exception { }; - class Session_Not_Opened : public Pandora::Pandora_Exception { + /** + * A SSH operations is tried and a session + * has still not be opened. + */ + class Session_Not_Opened : public SSH::SSH_Exception { }; - class Session_Error : public Pandora::Pandora_Exception { + /** + * There were unknown problems with the SSH session. + */ + class Session_Error : public SSH::SSH_Exception { }; - - class Authentication_Failed : public Pandora::Pandora_Exception { + + /** + * The SSH authentication fails when connecting. + */ + class Authentication_Failed : public SSH::SSH_Exception { }; - class Resolv_Failed : public Pandora::Pandora_Exception { + /** + * The host could not be resolved. + */ + class Resolv_Failed : public SSH::SSH_Exception { }; - class Socket_Error : public Pandora::Pandora_Exception { + /** + * Unknown socket error. + */ + class Socket_Error : public SSH::SSH_Exception { }; - - class File_Error : public Pandora::Pandora_Exception { + + /** + * An error happened with a file. + */ + class File_Error : public SSH::SSH_Exception { }; - - class Channel_Error : public Pandora::Pandora_Exception { + + /** + * An error occured with the SSH channel. + */ + class Channel_Error : public SSH::SSH_Exception { }; - - class Connection_Failed : public Pandora::Pandora_Exception { + + /** + * Connection failed with the host. + */ + class Connection_Failed : public SSH::SSH_Exception { private: int err_number; public: Connection_Failed (int e); int getError (); }; - - class Scp_Failed : public Pandora::Pandora_Exception { + + /** + * The scp operation failed due to some unknow error. + */ + class Scp_Failed : public SSH::SSH_Exception { private: char *errmsg; public: @@ -69,7 +109,9 @@ namespace SSH { ~Scp_Failed () { Pandora::pandoraFree (errmsg); }; }; - /* SSH Client class */ + /** + * Client to perform a SSH connection to a host. + */ class Pandora_Ssh_Client { private: int sock; @@ -82,21 +124,11 @@ namespace SSH { Pandora_Ssh_Client (); ~Pandora_Ssh_Client (); - /* Connects to specified host and port using a username and a password - * - * Throws: Authentication_Failed */ - void connectWithUserPass (const string host, const int port, - const string username, const string passwd); - /* Connects to specified host and port using a username and a public/private key. - * The keys are the filename that contains the public and the private keys. - * The passphrase is the password for these keys. - * - * Throws: Authentication_Failed */ void connectWithPublicKey (const string host, const int port, const string username, const string filename_pubkey, const string filename_privkey, const string passphrase); - /* Disconnects from remote host. It will close all open connections and channels. */ + void disconnect (); /* Copy a file using a SSH connection (scp). diff --git a/pandora_agents/win32/ssh/pandora_ssh_test.cc b/pandora_agents/win32/ssh/pandora_ssh_test.cc index 4135af47cd..bc0ba5a468 100644 --- a/pandora_agents/win32/ssh/pandora_ssh_test.cc +++ b/pandora_agents/win32/ssh/pandora_ssh_test.cc @@ -26,21 +26,47 @@ using namespace std; using namespace SSH; +/** + * Creates a Pandora_SSH_Test. + * + * It will read the configuration file and prepares + * all the information to perform a SSH test. + */ Pandora_SSH_Test::Pandora_SSH_Test () { string conf_file; conf_file = Pandora::getPandoraInstallDir (); conf_file += "pandora_agent.conf"; - conf = new Pandora_Agent_Conf (conf_file); + conf = new Pandora::Pandora_Agent_Conf (conf_file); ssh_client = new SSH::Pandora_Ssh_Client (); } +/** + * Deletes a Pandora_SSH_Test object. + */ Pandora_SSH_Test::~Pandora_SSH_Test () { delete conf; delete ssh_client; } +/** + * Executes a SSH test. + * + * It will generate a lot of output to the stdout. + * + * @exception Authentication_Failed Throwed if the authentication process + * failed when connecting to the host. + * @exception Socket_Error Throwed when something goes bad with the sockets. + * @exception Resolv_Failed Throwed when the remote host could not be resolved + * to a valid IP. + * @exception Connection_Failed Throwed if the TCP/IP connection to the host + * failed or could not be done. It includes timeouts, route failures, + * etc + * @exception Session_Error Throwed if there was problem with the SSH session. + * @exception Pandora::Pandora_Exception Throwed if there was an unespecified + * error. + */ void Pandora_SSH_Test::test () { string pubkey_file, privkey_file, tmp_filename; @@ -107,7 +133,7 @@ Pandora_SSH_Test::test () { saved = doc->SaveFile(); delete doc; if (!saved) { - Pandora_Exception e; + Pandora::Pandora_Exception e; cout << "Error when saving the XML in " << tmp_filepath << endl; cout << "Check the configuration file" << endl; throw e; @@ -131,7 +157,7 @@ Pandora_SSH_Test::test () { cout << "Check the network configuration." << endl; try { Pandora_File::removeFile (tmp_filepath); - } catch (Pandora_Exception e) { + } catch (Pandora::Pandora_Exception e) { } throw e; } catch (Scp_Failed e) { @@ -140,10 +166,10 @@ Pandora_SSH_Test::test () { cout << "Check the network configuration." << endl; try { Pandora_File::removeFile (tmp_filepath); - } catch (Pandora_Exception e) { + } catch (Pandora::Pandora_Exception e) { } throw e; - } catch (Pandora_Exception e) { + } catch (Pandora::Pandora_Exception e) { ssh_client->disconnect(); cout << "An unhandled exception happened." << endl; throw e; diff --git a/pandora_agents/win32/ssh/pandora_ssh_test.h b/pandora_agents/win32/ssh/pandora_ssh_test.h index 6ae69d3583..7af3a45138 100644 --- a/pandora_agents/win32/ssh/pandora_ssh_test.h +++ b/pandora_agents/win32/ssh/pandora_ssh_test.h @@ -25,10 +25,16 @@ #include "../pandora_agent_conf.h" namespace SSH { + /** + * Class to perform a test of the SSH configuration. + * + * An object of this class will read the configuration file + * and copy a blank xml file into remote server path. + */ class Pandora_SSH_Test { private: - Pandora_Ssh_Client *ssh_client; - Pandora_Agent_Conf *conf; + Pandora_Ssh_Client *ssh_client; + Pandora::Pandora_Agent_Conf *conf; public: Pandora_SSH_Test (); ~Pandora_SSH_Test (); diff --git a/pandora_agents/win32/windows/pandora_windows_info.cc b/pandora_agents/win32/windows/pandora_windows_info.cc index 64d6fb2ad7..306edc7e61 100644 --- a/pandora_agents/win32/windows/pandora_windows_info.cc +++ b/pandora_agents/win32/windows/pandora_windows_info.cc @@ -26,26 +26,51 @@ using namespace Pandora_Strutils; using namespace Pandora_Windows_Info; +/** + * Get the name of the running operating system. + * + * @return The name of the operating system. + */ string Pandora_Windows_Info::getOSName () { return Pandora_Wmi::getOSName (); } +/** + * Get the versioof the running operating system. + * + * @return The version of the operating system. + */ string Pandora_Windows_Info::getOSVersion () { return Pandora_Wmi::getOSVersion (); } +/** + * Get the build of the running operating system. + * + * @return The build of the operating system. + */ string Pandora_Windows_Info::getOSBuild () { return Pandora_Wmi::getOSBuild(); } +/** + * Get the system name of the running operating system. + * + * @return The system name of the operating system. + */ string Pandora_Windows_Info::getSystemName () { return Pandora_Wmi::getSystemName (); } +/** + * Get the system path of the running operating system. + * + * @return The system path of the operating system. + */ string Pandora_Windows_Info::getSystemPath () { char buffer[MAX_PATH]; diff --git a/pandora_agents/win32/windows/pandora_windows_info.h b/pandora_agents/win32/windows/pandora_windows_info.h index 169effe31f..7abb9e5f60 100644 --- a/pandora_agents/win32/windows/pandora_windows_info.h +++ b/pandora_agents/win32/windows/pandora_windows_info.h @@ -30,6 +30,9 @@ using namespace Pandora; using namespace std; +/** + * Windows information functions. + */ namespace Pandora_Windows_Info { string getOSName (); diff --git a/pandora_agents/win32/windows/pandora_wmi.cc b/pandora_agents/win32/windows/pandora_wmi.cc index ba58dae1a5..1b1b53d121 100644 --- a/pandora_agents/win32/windows/pandora_wmi.cc +++ b/pandora_agents/win32/windows/pandora_wmi.cc @@ -45,6 +45,13 @@ getWmiStr (LPCWSTR computer) { return wmi_str; } +/** + * Check if a process is running. + * + * @param process_name Name of the process with extension. + * + * @return Number of instances of the process running. + */ int Pandora_Wmi::isProcessRunning (string process_name) { CDhInitialize init; @@ -83,6 +90,14 @@ Pandora_Wmi::isProcessRunning (string process_name) { return result; } +/** + * Check if a Windows service is running. + * + * @param service_name Internal name of the service to check. + * + * @retval 1 The service is running + * @retval 0 The service is stopped + */ int Pandora_Wmi::isServiceRunning (string service_name) { CDhInitialize init; @@ -128,6 +143,13 @@ Pandora_Wmi::isServiceRunning (string service_name) { return 0; } +/** + * Get the free space in a logical disk drive. + * + * @param disk_id Disk drive letter (C. + * + * @return Free space amount in MB. + */ long Pandora_Wmi::getDiskFreeSpace (string disk_id) { CDhInitialize init; @@ -162,7 +184,7 @@ Pandora_Wmi::getDiskFreeSpace (string disk_id) { try { space = Pandora_Strutils::strtoint (space_str); } catch (Pandora_Exception e) { - throw Pandora_Wmi_Error (); + throw Pandora_Wmi_Exception (); } return space / 1024 / 1024; @@ -173,9 +195,16 @@ Pandora_Wmi::getDiskFreeSpace (string disk_id) { pandoraLog ("getDiskFreeSpace error. %s", errstr.c_str ()); } - throw Pandora_Wmi_Error (); + throw Pandora_Wmi_Exception (); } +/** + * Get the CPU usage percentage in the last minutes. + * + * @param cpu_id CPU identifier. + * + * @return The usage percentage of the CPU. + */ int Pandora_Wmi::getCpuUsagePercentage (int cpu_id) { CDhInitialize init; @@ -216,10 +245,14 @@ Pandora_Wmi::getCpuUsagePercentage (int cpu_id) { pandoraLog ("getCpuUsagePercentage error. %s", errstr.c_str ()); } - throw Pandora_Wmi_Error (); + throw Pandora_Wmi_Exception (); } - +/** + * Get the amount of free memory in the system + * + * @return The amount of free memory in MB. + */ long Pandora_Wmi::getFreememory () { CDhInitialize init; @@ -247,9 +280,14 @@ Pandora_Wmi::getFreememory () { pandoraLog ("getFreememory error. %s", errstr.c_str ()); } - throw Pandora_Wmi_Error (); + throw Pandora_Wmi_Exception (); } +/** + * Get the name of the operating system. + * + * @return The name of the operating system. + */ string Pandora_Wmi::getOSName () { CDhInitialize init; @@ -282,6 +320,11 @@ Pandora_Wmi::getOSName () { return ret; } +/** + * Get the version of the operating system. + * + * @return The version of the operaing system. + */ string Pandora_Wmi::getOSVersion () { CDhInitialize init; @@ -314,6 +357,11 @@ Pandora_Wmi::getOSVersion () { return ret; } +/** + * Get the build of the operating system. + * + * @return The build of the operating system. + */ string Pandora_Wmi::getOSBuild () { CDhInitialize init; @@ -346,6 +394,11 @@ Pandora_Wmi::getOSBuild () { return ret; } +/** + * Get the system name of the operating system. + * + * @return The system name of the operating system. + */ string Pandora_Wmi::getSystemName () { CDhInitialize init; diff --git a/pandora_agents/win32/windows/pandora_wmi.h b/pandora_agents/win32/windows/pandora_wmi.h index 21f2dd785e..8700715919 100644 --- a/pandora_agents/win32/windows/pandora_wmi.h +++ b/pandora_agents/win32/windows/pandora_wmi.h @@ -29,8 +29,14 @@ using namespace Pandora; using namespace std; +/** + * Operations with the Windows Management Instrumentation (WMI) + */ namespace Pandora_Wmi { - class Pandora_Wmi_Error : public Pandora_Exception { }; + /** + * Exception super-class when doing a WMI operation. + */ + class Pandora_Wmi_Exception : public Pandora_Exception { }; int isProcessRunning (string process_name); int isServiceRunning (string service_name); diff --git a/pandora_agents/win32/windows_service.cc b/pandora_agents/win32/windows_service.cc index 92cdf022d6..e3f12f1f71 100644 --- a/pandora_agents/win32/windows_service.cc +++ b/pandora_agents/win32/windows_service.cc @@ -40,12 +40,24 @@ static void SetWindowsServiceStatus (DWORD dwCurrentState, DWORD dwWaitHint); static void ErrorStopService (LPTSTR lpszAPI); +/** + * Set the values of the service to run. + * + * All the attributes are set to NULL. + */ Windows_Service::Windows_Service () { service_name = NULL; service_display_name = NULL; service_description = NULL; } - +/** + * Set the values of the service to run. + * + * @param svc_name Internal service name. + * @param svc_display_name Service name to display in the Windows + * service administration utility. + * @param svc_description Long description of the service. + */ Windows_Service::Windows_Service (const char * svc_name, const char * svc_display_name, const char * svc_description) { @@ -59,21 +71,44 @@ Windows_Service::Windows_Service (const char * svc_name, current_service = this; } +/** + * Destroy the service + */ Windows_Service::~Windows_Service () { } +/** + * Set the function to run on service execution. + * + * @param f Pointer to execution function. + */ void Windows_Service::setRunFunction (void (Windows_Service::*f) ()) { run_function = f; current_service->run_function = f; } +/** + * Set the function to initialize the service. + * + * This functions is executed before the run function. + * + * @param f Pointer to init function. + */ void Windows_Service::setInitFunction (void (Windows_Service::*f) ()) { init_function = f; current_service->init_function = f; } +/** + * Exec the run function. + * + * If the sleep_time is set to a greater value than 0, then the + * function will execute infinitely. + * Notice: This function does not have to be called from the main + * function + */ void Windows_Service::execRunFunction () { if (run_function != NULL) { @@ -86,6 +121,9 @@ Windows_Service::execRunFunction () { } } +/** + * Exec the init function. + */ void Windows_Service::execInitFunction () { if (init_function != NULL) { @@ -93,17 +131,36 @@ Windows_Service::execInitFunction () { } } +/** + * Get the internal service name. + * + * @return The internal service name. + */ LPSTR Windows_Service::getServiceName () { return service_name; } +/** + * Set the time between executions. + * + * If it's set to 0 (default value), the service will execute + * the run function once. Else it's executed infinitely every + * s seconds + * + * @param s Seconds between executions. + */ void Windows_Service::setSleepTime (unsigned int s) { sleep_time = s; current_service->sleep_time = sleep_time; } +/** + * Install the service in the Windows services system. + * + * @param application_binary_path Path to binary file. + */ void Windows_Service::install (LPCTSTR application_binary_path) { SC_HANDLE sc_manager; @@ -225,6 +282,9 @@ Windows_Service::install (LPCTSTR application_binary_path) { CloseServiceHandle (sc_manager); } +/** + * Uninstall the service from the system. + */ void Windows_Service::uninstall () { SC_HANDLE sc_manager, sc_service; @@ -336,8 +396,13 @@ Windows_Service::uninstall () { } -/* this is the entry point which is called from main() */ -int +/** + * Run the service. + * + * This function must be called from main function to + * start the service when started by Windows services system. + */ +void Windows_Service::run () { SERVICE_TABLE_ENTRY ste_dispatch_table[] = { @@ -353,8 +418,6 @@ Windows_Service::run () { memset (msg, sizeof (msg), '\0'); svc_format_message (msg, sizeof (msg)); } - - return (0); } static void WINAPI diff --git a/pandora_agents/win32/windows_service.h b/pandora_agents/win32/windows_service.h index 20ba606e67..c97c4eb71a 100644 --- a/pandora_agents/win32/windows_service.h +++ b/pandora_agents/win32/windows_service.h @@ -25,57 +25,44 @@ #include #include /* for Service stuff */ +/** + * Class to install and use a Windows service easily. + * + * If you want to use it, create a child class that + * set the init_function and run_function. Then use + * install function to perform the service installation + * and the run function on the main function to start it. + * Notice: A program can have only one object of this class. + */ class Windows_Service { -protected: +private: char *service_name; char *service_display_name; char *service_description; HANDLE stop_event; int sleep_time; SC_HANDLE sc_service; - /* Pointer to functions that will run the service */ + void (Windows_Service::*run_function) (); void (Windows_Service::*init_function) (); public: - Windows_Service (); + Windows_Service (); - /* Set the values of the service to run. - Notice: A program can have ONLY ONE object of this class. */ - Windows_Service (const char * svc_name, const char * svc_display_name, - const char * svc_description); + Windows_Service (const char * svc_name, + const char * svc_display_name, + const char * svc_description); - ~Windows_Service (); + ~Windows_Service (); - /* Install the service in the Windows registry. */ - void install (LPCTSTR application_binary_path); - - /* Uninstall the service, removint the key in the Windows registry. */ - void uninstall (); - - /* Run the service, which has to be installed previously. - * The service will execute the function indicated in the - * setRunFunction */ - int run (); - - /* Set the function that will be called on service start. This - * is called the "run function" */ - void setRunFunction (void (Windows_Service::*f) ()); - - /* Set the function that will be called on service init. This - * is called the "init function" */ - void setInitFunction (void (Windows_Service::*f) ()); + void install (LPCTSTR application_binary_path); + void uninstall (); + void run (); + void setRunFunction (void (Windows_Service::*f) ()); + void setInitFunction (void (Windows_Service::*f) ()); + LPSTR getServiceName (); + void setSleepTime (unsigned int s); - /* Calls the functions. There's no need to be called from the outside of this - * class. They are used in a internal method because of another Windows - * matter... */ - void execRunFunction (); - void execInitFunction (); - - LPSTR getServiceName (); - - /* Set the time that the service will sleep between each execution of - * the work funtion. If this value is not set, the service will run this - * function once. */ - void setSleepTime (unsigned int s); + void execRunFunction (); + void execInitFunction (); }; #endif /* __WINDOWS_SERVICE_H__ */