Salome HOME
Added constants to represent job status uniformly. Fixed some errors under Windows...
[tools/libbatch.git] / src / Core / Batch_CommunicationProtocol.cxx
1 //  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 /*
23  *  Batch_CommunicationProtocol.cxx :
24  *
25  *  Created on: 14 sept. 2009
26  *  Author : Renaud BARATE - EDF R&D
27  */
28
29 #include <stdlib.h>
30 #include <iostream>
31 #include <stdlib.h>
32
33 #include <Batch_config.h>
34
35 #include "Batch_CommunicationProtocol.hxx"
36 #include "Batch_CommunicationProtocolRSH.hxx"
37 #include "Batch_CommunicationProtocolSH.hxx"
38 #include "Batch_CommunicationProtocolSSH.hxx"
39 #include "Batch_APIInternalFailureException.hxx"
40 #include "Batch_RunTimeException.hxx"
41
42 using namespace std;
43
44 namespace Batch {
45
46   CommunicationProtocol::~CommunicationProtocol()
47   {
48   }
49
50   const CommunicationProtocol & CommunicationProtocol::getInstance(CommunicationProtocolType protocolType)
51   {
52     if (protocolType == SH) {
53 #ifdef HAS_SH
54       static CommunicationProtocolSH instanceSH;
55       return instanceSH;
56 #else
57       throw RunTimeException("Can't use SH protocol (SH tools were "
58                              "not found on the system at compile time).");
59 #endif
60     } else if (protocolType == RSH) {
61 #ifdef HAS_RSH
62       static CommunicationProtocolRSH instanceRSH;
63       return instanceRSH;
64 #else
65       throw RunTimeException("Can't use RSH protocol (RSH tools were "
66                              "not found on the system at compile time).");
67 #endif
68     } else if (protocolType == SSH) {
69 #ifdef HAS_SSH
70       static CommunicationProtocolSSH instanceSSH;
71       return instanceSSH;
72 #else
73       throw RunTimeException("Can't use SSH protocol (SSH tools were "
74                              "not found on the system at compile time).");
75 #endif
76     } else
77       throw APIInternalFailureException("Unknown communication protocol.");
78   }
79
80   string CommunicationProtocol::getExecCommand(const string & subCommand,
81                                                const string & host,
82                                                const string & user) const
83   {
84     return commandStringFromArgs(getExecCommandArgs(subCommand, host, user));
85   }
86
87   int CommunicationProtocol::copyFile(const std::string & sourcePath,
88                                       const std::string & sourceHost,
89                                       const std::string & sourceUser,
90                                       const std::string & destinationPath,
91                                       const std::string & destinationHost,
92                                       const std::string & destinationUser) const
93   {
94     string command = commandStringFromArgs(getCopyCommandArgs(sourcePath, sourceHost, sourceUser,
95                                                               destinationPath, destinationHost,
96                                                               destinationUser));
97     cout << command.c_str() << endl;
98     int status = system(command.c_str());
99     return status;
100   }
101
102   string CommunicationProtocol::getRemoveSubCommand(const string & path) const
103   {
104     return string("rm ") + path;
105   }
106
107   int CommunicationProtocol::removeFile(const std::string & path,
108                                         const std::string & host,
109                                         const std::string & user) const
110   {
111     string command = getExecCommand(getRemoveSubCommand(path), host, user);
112     cout << command.c_str() << endl;
113     int status = system(command.c_str());
114     return status;
115   }
116
117   string CommunicationProtocol::commandStringFromArgs(const vector<string> & commandArgs) const
118   {
119     string commandStr;
120
121     // On Windows we surround the whole command with quotes to avoid problems when
122     // we have several quoted arguments.
123 #ifdef WIN32
124     commandStr += "\"";
125 #endif
126
127     for (unsigned int i=0 ; i<commandArgs.size() ; i++) {
128       if (i != 0) commandStr += " ";
129
130       // if the argument contains spaces, we surround it with simple quotes (Linux)
131       // or double quotes (Windows)
132       if (commandArgs[i].find(' ') != string::npos) {
133 #ifdef WIN32
134         commandStr += string("\"") + commandArgs[i] + "\"";
135 #else
136         commandStr += string("\'") + commandArgs[i] + "\'";
137 #endif
138       } else {
139         commandStr += commandArgs[i];
140       }
141     }
142
143 #ifdef WIN32
144     commandStr += "\"";
145 #endif
146
147     return commandStr;
148   }
149
150 }