diff --git a/pandora_agents/win32/ChangeLog b/pandora_agents/win32/ChangeLog index d16868d571..ed85b086f4 100644 --- a/pandora_agents/win32/ChangeLog +++ b/pandora_agents/win32/ChangeLog @@ -1,3 +1,14 @@ +2007-08-16 Esteban Sanchez + + * ftp/pandora_ftp_test.[cc,h]: Added to repository. Implements a FTP + test to be run on command line. + + * main.cc: Added --test-ftp option to perform a FTP test. + + * PandoraAgent.dev: Added new files. + + * bin/PandoraAgent.exe: Updated to last commit. + 2007-08-16 Esteban Sanchez * pandora_windows_service.cc: Do not check debug flag if copying was diff --git a/pandora_agents/win32/PandoraAgent.dev b/pandora_agents/win32/PandoraAgent.dev index d04d601137..a610c7e9ca 100644 --- a/pandora_agents/win32/PandoraAgent.dev +++ b/pandora_agents/win32/PandoraAgent.dev @@ -1,7 +1,7 @@ [Project] FileName=PandoraAgent.dev Name=PandoraAgent -UnitCount=67 +UnitCount=69 Type=1 Ver=1 ObjFiles= @@ -717,3 +717,23 @@ Priority=1000 OverrideBuildCmd=0 BuildCmd= +[Unit68] +FileName=ftp\pandora_ftp_test.cc +CompileCpp=1 +Folder=FTP +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit69] +FileName=ftp\pandora_ftp_test.h +CompileCpp=1 +Folder=FTP +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/pandora_agents/win32/bin/PandoraAgent.exe b/pandora_agents/win32/bin/PandoraAgent.exe index 697533d518..87b03f6d56 100755 Binary files a/pandora_agents/win32/bin/PandoraAgent.exe and b/pandora_agents/win32/bin/PandoraAgent.exe differ diff --git a/pandora_agents/win32/ftp/pandora_ftp_test.cc b/pandora_agents/win32/ftp/pandora_ftp_test.cc new file mode 100644 index 0000000000..b73a684888 --- /dev/null +++ b/pandora_agents/win32/ftp/pandora_ftp_test.cc @@ -0,0 +1,179 @@ +/* Test module to prove FTP connection. + + Copyright (C) 2006 Artica ST. + Written by Esteban Sanchez. + + 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_ftp_test.h" +#include "../tinyxml/tinyxml.h" +#include "../misc/pandora_file.h" +#include +#include +#include + +using namespace std; +using namespace FTP; +using namespace Pandora; + +/** + * Creates a Pandora_FTP_Test object. + * + * It will read the configuration file and prepares + * all the information to perform a FTP test. + */ +Pandora_FTP_Test::Pandora_FTP_Test () { + string conf_file; + + conf_file = Pandora::getPandoraInstallDir (); + conf_file += "pandora_agent.conf"; + conf = new Pandora_Agent_Conf (conf_file); + + ftp_client = new FTP::Pandora_Ftp_Client (); +} + +/** + * Deletes a Pandora_FTP_Test object. + */ +Pandora_FTP_Test::~Pandora_FTP_Test () { + delete conf; + delete ftp_client; +} + +/** + * Executes a FTP 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 FTP session. + * @exception Pandora::Pandora_Exception Throwed if there was an unespecified + * error. + */ +void +Pandora_FTP_Test::test () { + string password, tmp_filename; + string remote_host, remote_filepath, tmp_filepath; + TiXmlDocument *doc; + TiXmlDeclaration *decl; + bool saved; + char *err; + DIR *dir; + + remote_host = this->conf->getValue ("server_ip"); + cout << "Connecting with " << remote_host << "..." << endl; + password = this->conf->getValue ("ftp_password"); + if (password == "") { + cout << "FTP password not found in configuration file." << endl; + cout << "Check that ftp_password variable is set." << endl; + return; + } + cout << "Username: pandora" << endl; + + ftp_client = new FTP::Pandora_Ftp_Client (); + ftp_client->connect (remote_host, + 22, + "pandora", + password); + + dir = opendir (conf->getValue ("temporal").c_str ()); + if (dir == NULL) { + cout << "Error when opening temporal directory." << endl; + cout << "Check that \"" << conf->getValue ("temporal") + << "\" exists" << endl; + delete ftp_client; + + return; + } + closedir (dir); + + tmp_filename = "ftp.test"; + tmp_filepath = conf->getValue ("temporal"); + if (tmp_filepath[tmp_filepath.length () - 1] != '\\') { + tmp_filepath += "\\"; + } + tmp_filepath += tmp_filename; + + decl = new TiXmlDeclaration( "1.0", "ISO-8859-1", "" ); + doc = new TiXmlDocument (tmp_filepath); + doc->InsertEndChild (*decl); + saved = doc->SaveFile(); + if (!saved) { + Pandora_Exception e; + cout << "Error when saving the XML in " << tmp_filepath << endl; + if (doc->Error ()) { + cout << "Reason: " << doc->ErrorDesc () << endl; + } + cout << "Check the configuration file" << endl; + delete doc; + delete ftp_client; + + throw e; + } + delete doc; + + cout << "Created a blank XML file in " << tmp_filepath<< endl; + + remote_filepath = conf->getValue ("server_path"); + if (remote_filepath[remote_filepath.length () - 1] != '/') { + remote_filepath += "/"; + } + cout << "Remote copying " << tmp_filepath << "on server " << remote_host + << " at " << remote_filepath << tmp_filename << endl; + + try { + ftp_client->ftpFileFilename (remote_filepath + tmp_filename, + tmp_filepath); + } catch (FTP::Unknown_Host e) { + cout << "Failed when copying to " << remote_host << " (" << + ftp_client->getError () << ")" << endl; + delete ftp_client; + + throw e; + } catch (FTP::Authentication_Failed e) { + cout << "Authentication Failed when connecting to " << remote_host << " (" + << ftp_client->getError () << ")" << endl; + delete ftp_client; + + throw e; + } catch (FTP::FTP_Exception e) { + cout << "Failed when copying to " << remote_host << + " (" << ftp_client->getError ()<< ")" << endl; + delete ftp_client; + + throw e; + } + + cout << "Successfuly file copied to remote host " << endl; + ftp_client->disconnect (); + delete ftp_client; + + cout << "Successfuly disconnected from remote host " << endl; + + try { + Pandora_File::removeFile (tmp_filepath); + } catch (Pandora_File::Delete_Error e) { + } + + cout << "The FTP test was successful!" << endl; +} diff --git a/pandora_agents/win32/ftp/pandora_ftp_test.h b/pandora_agents/win32/ftp/pandora_ftp_test.h new file mode 100644 index 0000000000..a899402b4f --- /dev/null +++ b/pandora_agents/win32/ftp/pandora_ftp_test.h @@ -0,0 +1,42 @@ +/* Test module to prove FTP connection. + + Copyright (C) 2006 Artica ST. + Written by Esteban Sanchez. + + 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_ftp_client.h" +#include "../pandora_agent_conf.h" + +using namespace Pandora; + +namespace FTP { + /** + * Class to perform a test of the FTP configuration. + * + * An object of this class will read the configuration file + * and copy a blank xml file into remote server path. + */ + class Pandora_FTP_Test { + private: + Pandora_Ftp_Client *ftp_client; + Pandora_Agent_Conf *conf; + public: + Pandora_FTP_Test (); + ~Pandora_FTP_Test (); + void test (); + }; +} diff --git a/pandora_agents/win32/main.cc b/pandora_agents/win32/main.cc index aa3518d88d..c4aab26299 100644 --- a/pandora_agents/win32/main.cc +++ b/pandora_agents/win32/main.cc @@ -21,11 +21,13 @@ #include "pandora.h" #include "pandora_windows_service.h" #include "ssh/pandora_ssh_test.h" +#include "ftp/pandora_ftp_test.h" #define PATH_SIZE _MAX_PATH+1 #define SERVICE_INSTALL_CMDLINE_PARAM "--install" #define SERVICE_UNINSTALL_CMDLINE_PARAM "--uninstall" #define SSH_TEST_CMDLINE_PARAM "--test-ssh" +#define FTP_TEST_CMDLINE_PARAM "--test-ftp" #define HELP_CMDLINE_PARAM "--help" int @@ -72,8 +74,22 @@ main (int argc, char *argv[]) { } catch (Pandora_Exception e) { return 1; } + + return 0; + } else if (_stricmp(argv[i], FTP_TEST_CMDLINE_PARAM) == 0) { + /* SSH test parameter */ + FTP::Pandora_FTP_Test ftp_test; + + delete service; + + try { + ftp_test.test (); + } 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; @@ -84,12 +100,17 @@ main (int argc, char *argv[]) { cout << ": Uninstall the Pandora Agent service." << endl; cout << "\t" << SSH_TEST_CMDLINE_PARAM; cout << ": Test the SSH Pandora Agent configuration." << endl; + cout << "\t" << FTP_TEST_CMDLINE_PARAM; + cout << ": Test the FTP Pandora Agent configuration." << endl; return 0; } else { /* No parameter recognized */ cout << "Usage: " << argv[0] << " [" << SERVICE_INSTALL_CMDLINE_PARAM; - cout << "] [" << SERVICE_UNINSTALL_CMDLINE_PARAM << "]" << endl; + cout << "] [" << SERVICE_UNINSTALL_CMDLINE_PARAM; + cout << "] [" << SSH_TEST_CMDLINE_PARAM; + cout << "] [" << FTP_TEST_CMDLINE_PARAM; + cout << endl; cout << "Run " << argv[0] << "with " << HELP_CMDLINE_PARAM; cout << " parameter for more info." << endl;