29c29
< import os, re, sys
---
> import os, popen2, re, sys
31,38c31,33
< def ssh(host, script, tty = False, user = ''):
< args = [ 'ssh', '-x' ]
< if user:
< args.append('-l' + user)
< if tty:
< args.append('-t')
< args.append(host)
< args.append(script)
---
> class MyPOpen(object):
> def __init__(self, cmd, input = None, output = None, bufsize = -1):
> self.sts = -1
40c35,48
< return os.spawnvp(os.P_WAIT, args[0], args)
---
> if input is None:
> p2c_read, p2c_write = os.pipe()
> self.tochild = os.fdopen(p2c_write, 'w', bufsize)
> else:
> p2c_write = None
> if isinstance(input, file):
> p2c_read = input.fileno()
> elif isinstance(input, str):
> input = file(input, 'r')
> p2c_read = input.fileno()
> elif isinstance(input, int):
> p2c_read = input
> else:
> raise AttributeError
41a50,99
> if output is None:
> c2p_read, c2p_write = os.pipe()
> self.fromchild = os.fdopen(c2p_read, 'r', bufsize)
> else:
> c2p_read = None
> if isinstance(output, file):
> c2p_write = output.fileno()
> elif isinstance(output, str):
> output = file(output, 'w')
> c2p_write = output.fileno()
> elif isinstance(output, int):
> c2p_write = output
> else:
> raise AttributeError
>
> self.pid = os.fork()
> if self.pid == 0:
> os.dup2(p2c_read, 0)
> os.dup2(c2p_write, 1)
> os.dup2(c2p_write, 2)
> if isinstance(cmd, basestring):
> cmd = ['/bin/sh', '-c', cmd]
> if False:
> for i in range(3, MAXFD):
> try:
> os.close(i)
> except OSError:
> pass
> try:
> os.execvp(cmd[0], cmd)
> finally:
> os._exit(1)
>
> os.close(p2c_read)
> os.close(c2p_write)
>
> def poll(self):
> if self.sts < 0:
> pid, sts = os.waitpid(self.pid, os.WNOHANG)
> if pid == self.pid:
> self.sts = sts
> return self.sts
>
> def wait(self):
> if self.sts < 0:
> pid, sts = os.waitpid(self.pid, 0)
> if pid == self.pid:
> self.sts = sts
> return self.sts
>
59,60d116
< self.onlyecho = False
< self.verbose = False
62,63c118,119
< def do(self, script, ):
< args = [self.qsub]
---
> def build(self, script, args = []):
> self.cmd = [ self.qsub ]
68c124
< args.append(arg)
---
> self.cmd.append(arg)
71c127
< args.append('-h')
---
> self.cmd.append('-h')
74c130
< args.append('-olocalhost:' + self.stdout)
---
> self.cmd.append('-olocalhost:' + self.stdout)
77c133
< args.append('-koe')
---
> self.cmd.append('-koe')
79c135
< args.append('-ko')
---
> self.cmd.append('-ko')
81c137
< args.append('-ke')
---
> self.cmd.append('-ke')
83c139
< args.append('-kn')
---
> self.cmd.append('-kn')
86c142
< args.append('-joe')
---
> self.cmd.append('-joe')
89c145
< args.append('-lnodes=' + self.node_type)
---
> self.cmd.append('-lnodes=' + self.node_type)
100c156
< args.append('-m ' + flags)
---
> self.cmd.append('-m ' + flags)
103c159
< args.append("-N%s" % self.name)
---
> self.cmd.append("-N%s" % self.name)
106c162
< args.append('-p' + self.priority)
---
> self.cmd.append('-p' + self.priority)
109c165
< args.append('-q' + self.queue)
---
> self.cmd.append('-q' + self.queue)
111c167,169
< args.append(script)
---
> self.cmd.extend(args)
> self.script = script
> self.command = ' '.join(self.cmd + [ self.script ])
113,114c171,174
< if self.verbose or self.onlyecho:
< print >>sys.stderr, 'PBS Command: ', ' '.join(args)
---
> def do(self):
> pbs = MyPOpen(self.cmd + [ self.script ])
> self.result = pbs.fromchild.read()
> ec = pbs.wait()
116,117c176,182
< if self.onlyecho:
< return 0
---
> if ec != 0 and self.pbshost:
> cmd = ' '.join(self.cmd + [ '-' ])
> cmd = [ 'ssh', '-x', self.pbshost, cmd ]
> self.command = ' '.join(cmd)
> ssh = MyPOpen(cmd, input = self.script)
> self.result = ssh.fromchild.read()
> ec = ssh.wait()
119,125d183
< print >>sys.stderr, 'PBS Jobid: ',
<
< ec = os.spawnvp(os.P_WAIT, args[0], args)
<
< if ec != 0 and len(self.pbshost):
< ec = ssh(self.pbshost, ' '.join(args))
<