Setting tag nodemanager-1.8-39
[nodemanager.git] / curlwrapper.py
1 # $Id$
2
3 from subprocess import PIPE, Popen
4 from select import select
5 # raise xmplrpclib.ProtocolError
6 import xmlrpclib
7 import signal
8 import os
9 import logger
10
11 class Sopen(Popen):
12     def kill(self, signal = signal.SIGTERM):
13         os.kill(self.pid, signal)
14
15 def retrieve(url, cacert=None, postdata=None, timeout=90):
16     options = ('/usr/bin/curl', '--fail', '--silent')
17     if cacert: options += ('--cacert', cacert)
18     if postdata: options += ('--data', '@-')
19     if timeout: 
20         options += ('--max-time', str(timeout))
21         options += ('--connect-timeout', str(timeout))
22     p = Sopen(options + (url,), stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
23     if postdata: p.stdin.write(postdata)
24     p.stdin.close()
25     sout, sin, serr = select([p.stdout,p.stderr],[],[], timeout)
26     if len(sout) == 0 and len(sin) == 0 and len(serr) == 0: 
27         logger.verbose("curlwrapper: timed out after %s" % timeout)
28         p.kill(signal.SIGKILL) 
29     data = p.stdout.read()
30     err = p.stderr.read()
31     rc = p.wait()
32     if rc != 0: 
33         # when this triggers, the error sometimes doesn't get printed
34         raise xmlrpclib.ProtocolError(url, rc, err, postdata)
35     else: 
36         return data