diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp index c56b7f887f1ece8cfb32e74e5df939525df07029..fe88b7c4c706b009a3cdf7134fde36c229a40b58 100644 --- a/contrib/onelab/OnelabClients.cpp +++ b/contrib/onelab/OnelabClients.cpp @@ -18,33 +18,34 @@ class onelabMetaModelServer : public GmshServer{ : GmshServer(), _client(client) {} ~onelabMetaModelServer(){} - int NonBlockingSystemCall(const char *str){ return SystemCall(str); } + int NonBlockingSystemCall(const char *str){ + std::cout << "Calling now : " << str << std::endl; + return SystemCall(str); + } int NonBlockingWait(double waitint, double timeout, int socket) { double start = GetTimeInSeconds(); while(1){ if(timeout > 0 && GetTimeInSeconds() - start > timeout) return 2; // timeout - // if(_client->getPid() < 0 || (_client->getCommandLine().empty() && - // !CTX::instance()->solver.listen)) - if(_client->getPid() < 0 || (_client->getCommandLine().empty())) - return 1; // process has been killed or we stopped listening + + if(_client->getPid() < 0 /*|| (_client->getCommandLine().empty())*/) + return 1; // process has been killed + // check if there is data (call select with a zero timeout to // return immediately, i.e., do polling) int ret = Select(0, 0, socket); + if(ret == 0){ // nothing available // wait at most waitint seconds and respond to FLTK events - //FlGui::instance()->wait(waitint); void (*waitFct)(double) = OLMsg::GetGuiWaitFunction(); if(waitFct) waitFct(waitint); } else if(ret > 0){ return 0; // data is there! } - else{ - // ret<0 an error happened + else{ // ret<0 an error happened _client->setPid(-1); - _client->setGmshServer(0); return 1; } } @@ -83,14 +84,223 @@ std::string localNetworkSolverClient::appendArguments(){ return command; } +bool localNetworkSolverClient::receiveMessage(){ + double timer = GetTimeInSeconds(); + + if(!getGmshServer()){ + OLMsg::Error("Abnormal server termination (no valid server)"); + return false; + } + + int type, length, swap; + if(!getGmshServer()->ReceiveHeader(&type, &length, &swap)){ + OLMsg::Error("Abnormal server termination (did not receive message header)"); + return false; + } + else if(_socketMsg) + OLMsg::Info("Received header <%d>",type); + + std::string message(length, ' '); + if(!getGmshServer()->ReceiveMessage(length, &message[0])){ + OLMsg::Error("Abnormal server termination (did not receive message body)r"); + return false; + } + else if(_socketMsg) + OLMsg::Info("Received message <%s>",message.c_str()); + + switch (type) { + case GmshSocket::GMSH_START: + setPid(atoi(message.c_str())); + break; + case GmshSocket::GMSH_STOP: + setPid(-1); + break; + case GmshSocket::GMSH_PARAMETER: + { + std::string version, type, name; + onelab::parameter::getInfoFromChar(message, version, type, name); + if(onelab::parameter::version() != version){ + OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", + message.c_str(), onelab::parameter::version().c_str(), version.c_str()); + } + if(type == "number"){ + onelab::number p; p.fromChar(message); set(p); + } + else if(type == "string"){ + onelab::string p; p.fromChar(message); set(p); + } + else if(type == "region"){ + onelab::region p; p.fromChar(message); set(p); + } + else if(type == "function"){ + onelab::function p; p.fromChar(message); set(p); + } + else + OLMsg::Error("FIXME query not done for this parameter type: <%s>", + message.c_str()); + } + break; + case GmshSocket::GMSH_PARAMETER_QUERY: + { + std::string version, type, name, reply; + onelab::parameter::getInfoFromChar(message, version, type, name); + if(onelab::parameter::version() != version){ + OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", + message.c_str(), onelab::parameter::version().c_str(), version.c_str()); + } + else if(type == "number"){ + std::vector<onelab::number> par; get(par, name); + if(par.size() == 1) reply = par[0].toChar(); + } + else if(type == "string"){ + std::vector<onelab::string> par; get(par, name); + if(par.size() == 1) reply = par[0].toChar(); + } + else if(type == "region"){ + std::vector<onelab::region> par; get(par, name); + if(par.size() == 1) par[0].toChar(); + } + else if(type == "function"){ + std::vector<onelab::function> par; get(par, name); + if(par.size() == 1) reply = par[0].toChar(); + } + else + OLMsg::Error("Unknown OneLab parameter type in query: %s", + type.c_str()); + + if(reply.size()){ + getGmshServer()->SendMessage(GmshSocket::GMSH_PARAMETER, + reply.size(), &reply[0]); + } + else{ + reply = "OneLab parameter '" + name + "' not found"; + getGmshServer()->SendMessage(GmshSocket::GMSH_INFO, reply.size(), &reply[0]); + } + } + break; + case GmshSocket::GMSH_PARAM_QUERY_ALL: + { + std::string version, type, name, reply; + std::vector<std::string> replies; + onelab::parameter::getInfoFromChar(message, version, type, name); + if(onelab::parameter::version() != version){ + OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", + message.c_str(), onelab::parameter::version().c_str(), version.c_str()); + } + else if(type == "number"){ + std::vector<onelab::number> numbers; get(numbers); + for(std::vector<onelab::number>::iterator it = numbers.begin(); + it != numbers.end(); it++) replies.push_back((*it).toChar()); + } + else if(type == "string"){ + std::vector<onelab::string> strings; get(strings); + for(std::vector<onelab::string>::iterator it = strings.begin(); + it != strings.end(); it++) replies.push_back((*it).toChar()); + } + else if(type == "region"){ + std::vector<onelab::region> regions; get(regions); + for(std::vector<onelab::region>::iterator it = regions.begin(); + it != regions.end(); it++) replies.push_back((*it).toChar()); + } + else if(type == "function"){ + std::vector<onelab::function> functions; get(functions); + for(std::vector<onelab::function>::iterator it = functions.begin(); + it != functions.end(); it++) replies.push_back((*it).toChar()); + } + else + OLMsg::Error("Unknown OneLab parameter type in query: %s", + type.c_str()); + + for(unsigned int i = 0; i < replies.size(); i++) + getGmshServer()->SendMessage(GmshSocket::GMSH_PARAM_QUERY_ALL, + replies[i].size(), &replies[i][0]); + reply = "Sent all OneLab " + type + "s"; + getGmshServer()->SendMessage(GmshSocket::GMSH_PARAM_QUERY_END, + reply.size(), &reply[0]); + } + break; + case GmshSocket::GMSH_PROGRESS: + OLMsg::StatusBar(2, false, "%s %s", _name.c_str(), message.c_str()); + break; + case GmshSocket::GMSH_INFO: + OLMsg::Direct("%-8.8s: %s", _name.c_str(), message.c_str()); + break; + case GmshSocket::GMSH_WARNING: + OLMsg::Direct(2, "%-8.8s: %s", _name.c_str(), message.c_str()); + break; + case GmshSocket::GMSH_ERROR: + OLMsg::Error("%-8.8s: %s", _name.c_str(), message.c_str()); + break; + case GmshSocket::GMSH_MERGE_FILE: + // if(CTX::instance()->solver.autoMergeFile){ + // unsigned int n = PView::list.size(); + // MergePostProcessingFile(message, CTX::instance()->solver.autoShowLastStep, + // CTX::instance()->solver.autoHideNewViews, true); + // drawContext::global()->draw(); + // if(FlGui::available() && n != PView::list.size()){ + // FlGui::instance()->rebuildTree(); + // FlGui::instance()->openModule("Post-processing"); + // } + // } + break; + case GmshSocket::GMSH_PARSE_STRING: + // ParseString(message); + // drawContext::global()->draw(); + break; + case GmshSocket::GMSH_SPEED_TEST: + OLMsg::Info("got %d Mb message in %g seconds", + length / 1024 / 1024, GetTimeInSeconds() - timer); + break; + case GmshSocket::GMSH_VERTEX_ARRAY: + { + // int n = PView::list.size(); + // PView::fillVertexArray(this, length, &message[0], swap); + // if(FlGui::available()) + // FlGui::instance()->updateViews(n != (int)PView::list.size()); + // drawContext::global()->draw(); + } + break; + case GmshSocket::GMSH_CONNECT: + { + // const std::string clientName = message; + // std::cout << "client name =" << clientName << std::endl; + // onelab::localNetworkClient *subClient = findClient(clientName); + // if (!subClient) { + // subClient = new gmshLocalNetworkClient(clientName, ""); + // } + // else + // std::cout << "Gmsh has " << addClient(subClient) << " clients\n"; + // subClient->getGmshServer()->LaunchClient(); + } + break; + case GmshSocket::GMSH_OLPARSE: + { +#if defined(HAVE_ONELAB_METAMODEL) + localSolverClient *c = new InterfacedClient("OLParser","",""); + std::string ofileName = message ; + std::ofstream outfile(ofileName.c_str()); + if (outfile.is_open()) + c->convert_onefile(ofileName + ".ol",outfile); + else + OLMsg::Error("The file <%s> cannot be opened",ofileName.c_str()); + outfile.close(); + delete c; +#endif + } + break; + default: + OLMsg::Warning("Received unknown message type (%d)", type); + break; + } + return true; +} + bool localNetworkSolverClient::run() { new_connection: - _pid = 0; - _gmshServer = 0; - - onelabMetaModelServer *server = new onelabMetaModelServer(this); + setPid(0); + // Choose socket type (Unix or TCP/IP) #if defined(WIN32) std::string socketName = ":"; #else @@ -103,201 +313,75 @@ bool localNetworkSolverClient::run() std::string sockname; std::ostringstream tmp; - if(!strstr(socketName.c_str(), ":")){ - // Unix socket + if(!strstr(socketName.c_str(), ":")){ // Unix socket tmp << socketName << getId(); sockname = FixWindowsPath(tmp.str()); } - else{ - // TCP/IP socket + else{ // TCP/IP socket if(socketName.size() && socketName[0] == ':') - // prepend hostname if only the port number is given - tmp << GetHostName(); + tmp << GetHostName(); // prepend hostname if only the port number is given tmp << socketName ; sockname = tmp.str(); } - _socketMsg = OLMsg::GetOnelabNumber("SHOWSOCKETMESSAGES")?true:false; + // Build the commande line std::string command = buildCommandLine(); - if(command.size()) command.append(appendArguments()); + if(command.size()) + command.append(appendArguments()); + else + return false; + + // Create socket connection and launch client + onelabMetaModelServer *socketConnection = new onelabMetaModelServer(this); + + std::cout << "commandline = " << command << std::endl; int sock; try{ - sock = server->Start(command.c_str(), sockname.c_str(), 10); + sock = socketConnection->Start(command.c_str(), sockname.c_str(), 10); } catch(const char *err){ OLMsg::Error("%s (on socket '%s')", err, sockname.c_str()); sock = -1; } - if(sock < 0){ - server->Shutdown(); - delete server; + std::cout << "sock = " << sock << std::endl; + + if(sock < 0){ //could not establish connection: aborting + socketConnection->Shutdown(); + delete socketConnection; + OLMsg::Error("Connection failed on socket <%s>", sockname.c_str()); return false; } - //OLMsg::StatusBar(2, true, "Now running client <%s>", _name.c_str()); + OLMsg::StatusBar(2, true, "Now running client <%s> on socket <%d>", _name.c_str(), sock); + _socketMsg = OLMsg::GetOnelabNumber("SHOWSOCKETMESSAGES")?true:false; + + setGmshServer(socketConnection); while(1) { - if(_pid < 0) break; + bool stop = false, haveData = false; - int stop = server->NonBlockingWait(sock, 0.0001, 0.); - if(stop || _pid < 0) { - OLMsg::Info("Stop=%d _pid=%d",stop, _pid); - break; - } - int type, length, swap; - if(!server->ReceiveHeader(&type, &length, &swap)){ - OLMsg::Error("Did not receive message header: stopping server"); - break; + if(getPid() < 0) { stop = true; break; } + if(!getGmshServer()){ + OLMsg::Error("Abnormal server termination (no valid server)"); + stop = true; } - else if(_socketMsg) - OLMsg::Info("Received header <%d>",type); - - std::string message(length, ' '); - if(!server->ReceiveMessage(length, &message[0])){ - OLMsg::Error("Did not receive message body: stopping server"); - break; + else if(!getGmshServer()->NonBlockingWait(0.001, 0., sock)){ + haveData = true; + std::cout << "Have data" << std::endl; } - else if(_socketMsg) - OLMsg::Info("Received message <%s>",message.c_str()); - - switch (type) { - case GmshSocket::GMSH_START: - _pid = atoi(message.c_str()); - _gmshServer = server; - break; - case GmshSocket::GMSH_STOP: - _pid = -1; - _gmshServer = 0; - break; - case GmshSocket::GMSH_PARAMETER: - { - std::string version, type, name; - onelab::parameter::getInfoFromChar(message, version, type, name); - if(onelab::parameter::version() != version){ - OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", - message.c_str(), onelab::parameter::version().c_str(), version.c_str()); - } - if(type == "number"){ - onelab::number p; p.fromChar(message); set(p); - } - else if(type == "string"){ - onelab::string p; p.fromChar(message); set(p); - } - else if(type == "region"){ - onelab::region p; p.fromChar(message); set(p); - } - else if(type == "function"){ - onelab::function p; p.fromChar(message); set(p); - } - else - OLMsg::Error("FIXME query not done for this parameter type: <%s>", - message.c_str()); - } - break; - case GmshSocket::GMSH_PARAMETER_QUERY: - { - std::string version, type, name, reply; - onelab::parameter::getInfoFromChar(message, version, type, name); - if(onelab::parameter::version() != version){ - OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", - message.c_str(), onelab::parameter::version().c_str(), version.c_str()); - } - else if(type == "number"){ - std::vector<onelab::number> par; get(par, name); - if(par.size() == 1) reply = par[0].toChar(); - } - else if(type == "string"){ - std::vector<onelab::string> par; get(par, name); - if(par.size() == 1) reply = par[0].toChar(); - } - else if(type == "region"){ - std::vector<onelab::region> par; get(par, name); - if(par.size() == 1) par[0].toChar(); - } - else if(type == "function"){ - std::vector<onelab::function> par; get(par, name); - if(par.size() == 1) reply = par[0].toChar(); - } - else - OLMsg::Error("Unknown OneLab parameter type in query: %s", - type.c_str()); - - if(reply.size()){ - server->SendMessage(GmshSocket::GMSH_PARAMETER, - reply.size(), &reply[0]); - } - else{ - reply = "OneLab parameter '" + name + "' not found"; - server->SendMessage(GmshSocket::GMSH_INFO, reply.size(), &reply[0]); - } - } - break; - case GmshSocket::GMSH_PARAM_QUERY_ALL: - { - std::string version, type, name, reply; - std::vector<std::string> replies; - onelab::parameter::getInfoFromChar(message, version, type, name); - if(onelab::parameter::version() != version){ - OLMsg::Error("OneLab version mismatch for %s (server: %s / client: %s)", - message.c_str(), onelab::parameter::version().c_str(), version.c_str()); - } - else if(type == "number"){ - std::vector<onelab::number> numbers; get(numbers); - for(std::vector<onelab::number>::iterator it = numbers.begin(); - it != numbers.end(); it++) replies.push_back((*it).toChar()); - } - else if(type == "string"){ - std::vector<onelab::string> strings; get(strings); - for(std::vector<onelab::string>::iterator it = strings.begin(); - it != strings.end(); it++) replies.push_back((*it).toChar()); - } - else if(type == "region"){ - std::vector<onelab::region> regions; get(regions); - for(std::vector<onelab::region>::iterator it = regions.begin(); - it != regions.end(); it++) replies.push_back((*it).toChar()); - } - else if(type == "function"){ - std::vector<onelab::function> functions; get(functions); - for(std::vector<onelab::function>::iterator it = functions.begin(); - it != functions.end(); it++) replies.push_back((*it).toChar()); - } - else - OLMsg::Error("Unknown OneLab parameter type in query: %s", - type.c_str()); - - for(unsigned int i = 0; i < replies.size(); i++) - server->SendMessage(GmshSocket::GMSH_PARAM_QUERY_ALL, - replies[i].size(), &replies[i][0]); - reply = "Sent all OneLab " + type + "s"; - server->SendMessage(GmshSocket::GMSH_PARAM_QUERY_END, - reply.size(), &reply[0]); - } - break; - case GmshSocket::GMSH_PROGRESS: - OLMsg::StatusBar(2, false, "%s %s", _name.c_str(), message.c_str()); - break; - case GmshSocket::GMSH_INFO: - OLMsg::Direct("%-8.8s: %s", _name.c_str(), message.c_str()); - break; - case GmshSocket::GMSH_WARNING: - OLMsg::Direct(2, "%-8.8s: %s", _name.c_str(), message.c_str()); - break; - case GmshSocket::GMSH_ERROR: - //OLMsg::Direct(1, "%-8.8s: %s", _name.c_str(), message.c_str()); - OLMsg::Error("%-8.8s: %s", _name.c_str(), message.c_str()); - break; - case GmshSocket::GMSH_MERGE_FILE: - break; - default: - OLMsg::Warning("Received unknown message type (%d)", type); - break; + else{// an error occurred + stop = true; } + if(stop) break; + if(haveData && !receiveMessage()) break; + if(getPid() < 0) break; } - server->Shutdown(); - delete server; + socketConnection->Shutdown(); + delete socketConnection; + setGmshServer(0); OLMsg::StatusBar(2, true, "Done running '%s'", _name.c_str()); if(command.empty()){ @@ -310,14 +394,14 @@ bool localNetworkSolverClient::run() bool localNetworkSolverClient::kill() { - if(_pid > 0) { - if(KillProcess(_pid)){ - OLMsg::Info("Killed '%s' (pid %d)", _name.c_str(), _pid); - _pid = -1; + if(getPid() > 0) { + if(KillProcess(getPid())){ + OLMsg::Info("Killed '%s' (pid %d)", _name.c_str(), getPid()); + setPid(-1); return true; } } - _pid = -1; + setPid(-1); return false; } @@ -412,9 +496,7 @@ bool localSolverClient::checkCommandLine(){ if(isNative()){ // native clients checked by initializing setAction("initialize"); if(!run()){ // initializes native clients, false otherwise - OLMsg::Error("Invalid commandline <%s> for client <%s>", - getCommandLine().c_str(), getName().c_str()); - success=false; + success = false; } } else{ @@ -422,7 +504,7 @@ bool localSolverClient::checkCommandLine(){ commandLine.assign(QuoteExecPath(getCommandLine())); // check whether the executable exists as a file - success=checkIfPresent(getCommandLine()); + success = checkIfPresent(getCommandLine()); // resolve a possible linux link #if not defined(WIN32) @@ -454,7 +536,7 @@ bool localSolverClient::checkCommandLine(){ OLMsg::Info("Command line ok"); } else{ - OLMsg::Error("Invalid command line <%s> for client <%s>", + OLMsg::Error("Invalid commandline <%s> for client <%s>", getCommandLine().c_str(), getName().c_str()); //setCommandLine(""); OLMsg::SetOnelabString(getName() + "/CommandLine", getCommandLine(), true); diff --git a/contrib/onelab/OnelabClients.h b/contrib/onelab/OnelabClients.h index 9775d37e84b9fca30b4fff833a49bd747f3ce2ed..4e4a20986c4a76f051783fbef3cda1d726bb5d01 100644 --- a/contrib/onelab/OnelabClients.h +++ b/contrib/onelab/OnelabClients.h @@ -190,7 +190,7 @@ class localNetworkSolverClient : public localSolverClient{ int _pid; // underlying GmshServer GmshServer *_gmshServer; - // flag indicating whether socket communication should be shown + // flag indicating whether socket communication should be monitored bool _socketMsg; public: localNetworkSolverClient(const std::string &name, const std::string &cmdl, const std::string &wdir) @@ -204,6 +204,7 @@ class localNetworkSolverClient : public localSolverClient{ void setPid(int pid){ _pid = pid; } GmshServer *getGmshServer(){ return _gmshServer; } void setGmshServer(GmshServer *server){ _gmshServer = server; } + bool receiveMessage(); bool isNative() { return true; } virtual std::string buildCommandLine(); diff --git a/contrib/onelab/OnelabMessage.h b/contrib/onelab/OnelabMessage.h index d94612e7a298f2b1b91fe0cfd5c1fa21d487dc77..383afe79915c2e2eea36434026498568f6048778 100644 --- a/contrib/onelab/OnelabMessage.h +++ b/contrib/onelab/OnelabMessage.h @@ -14,6 +14,7 @@ class GmshClient; +#ifndef _GMSH_MESSAGE_H_ // the external message handler class GmshMessage{ public: @@ -21,6 +22,7 @@ class GmshMessage{ virtual ~GmshMessage(){} virtual void operator()(std::string level, std::string message){} }; +#endif class fullNameLessThan{ public: diff --git a/contrib/onelab/python/OnelabClient.py b/contrib/onelab/python/OnelabClient.py index 257f8fcb534c09c3096e14d73f55624b5966a13a..8bfe3d240d0ccde3f4a6dd243e457bcbfc1f1fc7 100755 --- a/contrib/onelab/python/OnelabClient.py +++ b/contrib/onelab/python/OnelabClient.py @@ -1,6 +1,14 @@ import socket, struct, os, sys _VERSION = '1.05' +def file_exist(filename): + try: + with open(filename) as f: + return True + except IOError: + return False + + class _parameter() : _membersbase = [ ('name', 'string'), ('label', 'string', ''), ('help', 'string', ''), @@ -13,7 +21,8 @@ class _parameter() : ('value', 'string'), ('kind', 'string', 'generic'), ('choices', ('list', 'string'), []) ], 'number' : _membersbase + [ - ('value', 'float'), ('min', 'float', -sys.float_info.max), ('max', 'float', sys.float_info.max), + ('value', 'float'), + ('min', 'float', -sys.float_info.max), ('max', 'float', sys.float_info.max), ('step', 'float', 0.), ('index', 'int', -1), ('choices', ('list', 'float'), []), ('labels', ('dict', 'float', 'string'), {}) ] @@ -67,7 +76,9 @@ class client : _GMSH_PARAMETER = 23 _GMSH_PARAMETER_QUERY = 24 _GMSH_CONNECT = 27 - + _GMSH_OLPARSE = 28 + _GMSH_PARAM_NOT_FOUND = 29 + def _receive(self) : def buffered_receive(l) : msg = b'' @@ -89,34 +100,60 @@ class client : if self.socket.send(struct.pack('ii%is' %len(m), t, len(m), m)) == 0 : RuntimeError('onelab socket closed') - def _get_parameter(self, param) : + def _def_parameter(self, param) : if not self.socket : return self._send(self._GMSH_PARAMETER_QUERY, param.tochar()) (t, msg) = self._receive() if t == self._GMSH_PARAMETER : param.fromchar(msg) - elif t == self._GMSH_INFO : + elif t == self._GMSH_PARAM_NOT_FOUND : self._send(self._GMSH_PARAMETER, param.tochar()) - def get_string(self, name, value, **param): + def def_string(self, name, value, **param): param = _parameter('string', name=name, value=value, **param) - self._get_parameter(param) + self._def_parameter(param) return param.value - def get_number(self, name, value, **param): + def def_number(self, name, value, **param): if "labels" in param : param["choices"] = param["labels"].keys() p = _parameter('number', name=name, value=value, **param) - self._get_parameter(p) + self._def_parameter(p) return p.value + def _get_parameter(self, param) : + if not self.socket : + return + self._send(self._GMSH_PARAMETER_QUERY, param.tochar()) + (t, msg) = self._receive() + if t == self._GMSH_PARAMETER : + param.fromchar(msg) + elif t == self._GMSH_PARAM_NOT_FOUND : + print 'Unknown parameter %s' %(name) + + def get_number(self, name): + param = _parameter('number', name=name, value=0) + self._get_parameter(param) + return param.value + + def get_string(self, name): + param = _parameter('string', name=name, value='void') + self._get_parameter(param) + return param.value + def sub_client(self, name, command): - self._send(self._GMSH_CONNECT, name) + print 'Defining the subclient ' + name + msg = [name, command] + ## msg.append(name + '\0') + ## msg.append(command + '\0') + if not self.socket : + return + self._send(self._GMSH_CONNECT, '\0'.join(msg)) (t, msg) = self._receive() print ("python receive : ", t, msg) if t == self._GMSH_CONNECT and msg : - print "python launch : "+ command + " -onelab "+ msg + print "python launch : "+ command + " -onelab " + name + " " + msg os.system(command + " -onelab " + name + " " + msg) def merge_file(self, filename) : @@ -126,6 +163,13 @@ class client : filename = os.getcwd() + "/" + filename; self._send(self._GMSH_PARSE_STRING, 'Merge "'+filename+'";') + def convert_olfile(self, filename) : + if not self.socket : + return + if filename and filename[0] != '/' : + filename = os.getcwd() + "/" + filename; + self._send(self._GMSH_OLPARSE, filename) + def __init__(self): self.socket = None self.name = "" @@ -139,7 +183,7 @@ class client : self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect(sys.argv[i + 2]) self._send(self._GMSH_START, str(os.getpid)) - self.action = self.get_string(self.name + '/Action', 'compute') + self.action = self.get_string('python/Action') if self.action == "initialize": exit(0) def __del__(self) : diff --git a/contrib/onelab/python/test.py b/contrib/onelab/python/test.py index f2c1b840582a6781c7e210f0ee5f3e8722a39751..311f66846cb736cc8daae35b098c539b7697c2ba 100755 --- a/contrib/onelab/python/test.py +++ b/contrib/onelab/python/test.py @@ -5,11 +5,11 @@ import OnelabClient oc = OnelabClient.client() #name and default value are required -A = oc.get_number('A', 10) +A = oc.def_number('A', 10) #other attributes are optionals -B = oc.get_number('Group/B', 0, min = -10, max = 10, step = 1) -C = oc.get_number('Group/C', 2, choices = [0, 1, 2, 3], attributes={'Highlight':'Pink'}) -D = oc.get_number('Group/D', 2, labels = {0:'zero', 1:'un', 2:'deux', 3:'trois'}, attributes={'Highlight':'Blue'}) +B = oc.def_number('Group/B', 0, min = -10, max = 10, step = 1) +C = oc.def_number('Group/C', 2, choices = [0, 1, 2, 3], attributes={'Highlight':'Pink'}) +D = oc.def_number('Group/D', 2, labels = {0:'zero', 1:'un', 2:'deux', 3:'trois'}, attributes={'Highlight':'Blue'}) #utf-8 are allowed everywhere (should be prefixed by 'u' in python 2, not required in python 3) #Omega = oc.get_string(u'Ω', u'∫(∂φ/∂α)³dx', help=u'ask someone@universe.org', choices = ['oui', 'non', u'peut-être']) @@ -17,11 +17,20 @@ modelName = 'coin' oc.merge_file(modelName + '.geo') -print('Action=%s pour %s' %(oc.action,'python')) -if oc.action != 'compute' : - exit(0) +#print('Action=%s pour %s' %(oc.action,'python')) +print('Action=%s' %(oc.get_string('python/Action'))) oc.sub_client('gmsh', 'gmsh ' + modelName + '.geo -2') oc.merge_file(modelName + '.msh') +oc.convert_olfile(modelName + '.txt') + +oc.sub_client('python', 'python ' + modelName + '.py') + +if oc.action != 'compute' : + exit(0) + +## insert here the client's script + +exit(0)