4 from subprocess import PIPE, Popen
5 from select import select
6 # raise xmplrpclib.ProtocolError
13 def kill(self, signal = signal.SIGTERM):
14 os.kill(self.pid, signal)
16 def retrieve(url, cacert=None, postdata=None, timeout=90):
17 # options = ('/usr/bin/curl', '--fail', '--silent')
18 options = ('/usr/bin/curl', '--fail', )
19 if cacert: options += ('--cacert', cacert)
20 if postdata: options += ('--data', '@-')
22 options += ('--max-time', str(timeout))
23 options += ('--connect-timeout', str(timeout))
24 p = Sopen(options + (url,), stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
25 if postdata: p.stdin.write(postdata)
27 sout, sin, serr = select([p.stdout,p.stderr],[],[], timeout)
28 if len(sout) == 0 and len(sin) == 0 and len(serr) == 0:
29 logger.verbose("curlwrapper: timed out after %s" % timeout)
30 p.kill(signal.SIGKILL)
31 data = p.stdout.read()
35 # when this triggers, the error sometimes doesn't get printed
36 logger.log ("curlwrapper: retrieve, got stderr <%s>"%err)
37 raise xmlrpclib.ProtocolError(url, rc, err, postdata)