5 class ExceptionTimeout(Exception): pass
7 ssh_options = { 'StrictHostKeyChecking':'no',
9 'PasswordAuthentication':'no',
10 'ConnectTimeout':'%s' % COMMAND_TIMEOUT}
11 from select import select
15 class Sopen(subprocess.Popen):
16 def kill(self, signal = signal.SIGTERM):
17 os.kill(self.pid, signal)
19 def read_t(stream, count, timeout=COMMAND_TIMEOUT*2):
20 lin, lout, lerr = select([stream], [], [], timeout)
22 raise ExceptionTimeout("TIMEOUT Running: %s" % cmd)
24 return stream.read(count)
30 def run_noexcept(self, cmd, timeout=COMMAND_TIMEOUT*2):
32 #print "CMD.run_noexcept(%s)" % cmd
34 return CMD.run(self,cmd,timeout)
35 except ExceptionTimeout:
36 import traceback; print traceback.print_exc()
37 return ("", "SCRIPTTIMEOUT")
39 def system(self, cmd, timeout=COMMAND_TIMEOUT*2):
40 (o,e) = self.run(cmd, timeout)
43 if self.s.returncode is None:
45 return self.s.returncode
47 def run(self, cmd, timeout=COMMAND_TIMEOUT*2):
49 #print "CMD.run(%s)" % cmd
50 s = Sopen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
52 (f_in, f_out, f_err) = (s.stdin, s.stdout, s.stderr)
53 #print "calling select(%s)" % timeout
54 lout, lin, lerr = select([f_out], [], [f_err], timeout)
55 #print "TIMEOUT!!!!!!!!!!!!!!!!!!!"
56 if len(lin) == 0 and len(lout) == 0 and len(lerr) == 0:
57 # Reached a timeout! Nuke process so it does not hang.
59 s.kill(signal.SIGKILL)
60 raise ExceptionTimeout("TIMEOUT Running: %s" % cmd)
63 #print len(lin), len(lout), len(lerr)
69 o_value = f_out.read()
70 e_value = f_err.read()
72 #print "striping output"
73 o_value = o_value.strip()
74 e_value = e_value.strip()
76 #print "OUTPUT -%s-%s-" % (o_value, e_value)
78 #print "closing files"
85 #print "after s.kill()"
87 # no such process, due to it already exiting...
90 #print o_value, e_value
91 return (o_value, e_value)
93 def runargs(self, args, timeout=COMMAND_TIMEOUT*2):
95 #print "CMD.run(%s)" % " ".join(args)
96 s = Sopen(args, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
98 (f_in, f_out, f_err) = (s.stdin, s.stdout, s.stderr)
99 lout, lin, lerr = select([f_out], [], [f_err], timeout)
100 if len(lin) == 0 and len(lout) == 0 and len(lerr) == 0:
101 # Reached a timeout! Nuke process so it does not hang.
102 s.kill(signal.SIGKILL)
103 raise ExceptionTimeout("TIMEOUT Running: %s" % cmd)
104 o_value = f_out.read()
106 if o_value == "": # An error has occured
107 e_value = f_err.read()
109 o_value = o_value.strip()
110 e_value = e_value.strip()
118 # no such process, due to it already exiting...
121 return (o_value, e_value)
125 def __init__(self, user, host, port=22, options = ssh_options):
126 self.options = options
132 def __options_to_str(self):
134 for o,v in self.options.iteritems():
135 options = options + "-o %s=%s " % (o,v)
138 def run(self, cmd, timeout=COMMAND_TIMEOUT*2):
139 cmd = "ssh -p %s %s %s@%s '%s'" % (self.port, self.__options_to_str(),
140 self.user, self.host, cmd)
141 #print "SSH.run(%s)" % cmd
142 return CMD.run(self, cmd, timeout)
144 def get_file(self, rmt_filename, local_filename=None):
145 if local_filename == None:
146 local_filename = "./"
147 cmd = "scp -P %s -B %s %s@%s:%s %s" % (self.port, self.__options_to_str(),
148 self.user, self.host,
149 rmt_filename, local_filename)
151 # errors will be on stderr,
152 # success will have a blank stderr...
153 return CMD.run_noexcept(self, cmd)
155 def run_noexcept(self, cmd):
156 cmd = "ssh -p %s %s %s@%s '%s'" % (self.port, self.__options_to_str(),
157 self.user, self.host, cmd)
158 #print "SSH.run_noexcept(%s)" % cmd
159 return CMD.run_noexcept(self, cmd)
161 def run_noexcept2(self, cmd, timeout=COMMAND_TIMEOUT*2):
162 cmd = "ssh -p %s %s %s@%s %s" % (self.port, self.__options_to_str(),
163 self.user, self.host, cmd)
164 #print "SSH.run_noexcept2(%s)" % cmd
165 r = CMD.run_noexcept(self, cmd, timeout)
167 # XXX: this may be resulting in deadlocks... not sure.
168 #if self.s.returncode is None:
170 # self.s.kill(signal.SIGKILL)
172 # self.ret = self.s.returncode
177 def system2(self, cmd, timeout=COMMAND_TIMEOUT*2):
178 cmd = "ssh -p %s %s %s@%s %s" % (self.port, self.__options_to_str(),
179 self.user, self.host, cmd)
180 #print "SSH.system2(%s)" % cmd
181 return CMD.system(self, cmd, timeout)
184 cmd = "ssh -p %s %s %s@%s '%s'" % (self.port, self.__options_to_str(),
185 self.user, self.host, cmd)
188 (f_in, f_out, f_err) = os.popen3(cmd)
191 if value == "": # An error has occured
193 value = value.strip()
196 print " == %s" % value
205 self.start = time.time()
208 self.end = time.time()
209 t = self.end-self.start
213 self.end = time.time()
214 t = self.end-self.start
215 self.start = self.end