run curl without the silent flag; provide more details when cannot connect
[nodemanager.git] / curlwrapper.py
1 # $Id$
2 # $URL$
3
4 from subprocess import PIPE, Popen
5 from select import select
6 # raise xmplrpclib.ProtocolError
7 import xmlrpclib
8 import signal
9 import os
10 import logger
11
12 class Sopen(Popen):
13     def kill(self, signal = signal.SIGTERM):
14         os.kill(self.pid, signal)
15
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', '@-')
21     if timeout: 
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)
26     p.stdin.close()
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()
32     err = p.stderr.read()
33     rc = p.wait()
34     if rc != 0: 
35         # when this triggers, the error sometimes doesn't get printed
36         logger.log ("in curlwrapper.retrieve, got stderr <%s>"%err)
37         raise xmlrpclib.ProtocolError(url, rc, err, postdata)
38     else: 
39         return data