From 21791d9feea1317e5d1b9168f7534f4bf6bcc729 Mon Sep 17 00:00:00 2001 From: Francois Henrotte <francois.henrotte@ulg.ac.be> Date: Mon, 20 Jan 2014 10:41:24 +0000 Subject: [PATCH] tools upload download and call for non native remote and local clients --- contrib/onelab/python/onelab.py | 114 +++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 25 deletions(-) diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py index 9547de9331..fdbdd57bd0 100755 --- a/contrib/onelab/python/onelab.py +++ b/contrib/onelab/python/onelab.py @@ -27,7 +27,7 @@ Please report all bugs and problems to the public mailing list <gmsh@geuz.org>. """ -import socket, struct, os, sys +import socket, struct, os, sys, subprocess _VERSION = '1.05' def file_exist(filename): @@ -37,11 +37,21 @@ def file_exist(filename): except IOError: return False -def path(ref, inp): +def path(ref,inp=''): + # ref is reference directory name + # inp is an optional file or directory name + dirname = os.path.dirname(ref) + if not inp: + if dirname: + return dirname + else : + return '.' if inp[0] == '/' or inp[0] == '\\' or (len(inp) > 2 and inp[1] == '\:'): return inp # do nothing, inp is an absolute path - else: # append inp to the path of the reference file - return os.path.dirname(ref) + os.sep + inp + if dirname: + return dirname + os.sep + inp # append inp to the path of the reference file + else: + return inp class _parameter() : _membersbase = [ @@ -143,6 +153,8 @@ class client : return t, msg def _send(self, t, msg) : + if not self.socket : + return m = msg.encode('utf-8') try: if self.socket.send(struct.pack('ii%is' %len(m), t, len(m), m)) == 0 : @@ -249,35 +261,29 @@ class client : elif t == self._GMSH_PARAMETER_NOT_FOUND : print ('Unknown parameter %s' %(name)) - def openGeometry(self, filename) : - if not self.socket or not filename : - return - #if self.action == 'compute' and self.getString('Gmsh/MergedGeo', False) == filename : - if self.getString('Gmsh/MergedGeo', False) == filename : - return - else : - self.setString('Gmsh/MergedGeo', value=filename) -# if filename[0] != '/' : -# filename = os.getcwd() + "/" + filename - self._send(self._GMSH_MERGE_FILE, filename) - - def mesh(self, filename) : - if not self.socket : - return - if filename[0] != '/' : - filename = os.getcwd() + "/" + filename - self._send(self._GMSH_PARSE_STRING, 'Mesh 3; Save "' + filename + '";') - def sendCommand(self, command) : if not self.socket : return self._send(self._GMSH_PARSE_STRING, command) def mergeFile(self, filename) : - if not self.socket : + if not self.socket or not filename : return self._send(self._GMSH_MERGE_FILE, filename) + def reloadGeometry(self, filename) : + if not self.socket or not filename : + return + if os.path.splitext(filename)[1] == '.geo' : + self._send(self._GMSH_PARSE_STRING, "Delete All;") + self._send(self._GMSH_MERGE_FILE, filename) + + def mesh(self, filename) : + if not self.socket or not filename : + return + self._send(self._GMSH_PARSE_STRING, 'Mesh 3; Save "' + filename + ' ;') + self._send(self._GMSH_MERGE_FILE, filename) + def sendInfo(self, msg) : if not self.socket : print (msg) @@ -303,7 +309,7 @@ class client : (t, msg) = self._receive() if t == self._GMSH_OLPARSE : print (msg) - + def _createSocket(self) : addr = self.addr if '/' in addr or '\\' in addr or ':' not in addr : @@ -364,3 +370,61 @@ class client : def __del__(self): self.finalize() + + def call(self, cmdline, remote='', rundir='', logfile=''): + cwd = None + if not remote : + argv = cmdline.rsplit(' ') + if rundir : + cwd = rundir + else : + argv=['ssh', remote , "cd %s ; %s" %(rundir,cmdline) ] + + if logfile: + call = subprocess.Popen(argv, bufsize=1, cwd=cwd, + stdout=open(logfile,"w"), + stderr=subprocess.PIPE) + else: + call = subprocess.Popen(argv, bufsize=1, cwd=cwd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for line in iter(call.stdout.readline, b''): + print(line.rstrip()) + result = call.wait() + if result == 0 : + self._send(self._GMSH_INFO, 'call \"' + ''.join(argv) + '\"') + else : + self._send(self._GMSH_ERROR, 'call failed !!\n' + call.stderr.read().encode('utf-8')) + + def upload(self, here, there, remote='') : + if not here or not there : + return + if remote : + argv=['rsync','-e','ssh','-auv', here, remote + ':' + there] + else : + argv=['cp','-f', here, there] + + call = subprocess.Popen(argv, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + result = call.wait() + if result == 0 : + self._send(self._GMSH_INFO, 'upload: ' + ' '.join(argv)) + else : + print call.stderr.read() + ## self._send(self._GMSH_ERROR, 'upload failed !!\n' + call.stderr.read().encode('utf-8')) + + def download(self, here, there, remote='') : + if not here or not there : + return + if remote : + argv=['rsync','-e','ssh','-auv', remote + ':' + there, here] + else : + argv=['cp','-f', there, here] + + call = subprocess.Popen(argv, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + result = call.wait() + if result == 0 : + self._send(self._GMSH_INFO, 'download: ' + ' '.join(argv)) + else : + print call.stderr.read() + ##self._send(self._GMSH_ERROR, 'download failed !!\n' + call.stderr.read().encode('utf-8')) + -- GitLab