+ Must be called before quitting the program and while exactly one thread is
+ running.
+
+ """
+ pycurl.global_cleanup()
+
+
+def _ConfigRpcCurl(curl):
+ noded_cert = str(constants.NODED_CERT_FILE)
+
+ curl.setopt(pycurl.FOLLOWLOCATION, False)
+ curl.setopt(pycurl.CAINFO, noded_cert)
+ curl.setopt(pycurl.SSL_VERIFYHOST, 0)
+ curl.setopt(pycurl.SSL_VERIFYPEER, True)
+ curl.setopt(pycurl.SSLCERTTYPE, "PEM")
+ curl.setopt(pycurl.SSLCERT, noded_cert)
+ curl.setopt(pycurl.SSLKEYTYPE, "PEM")
+ curl.setopt(pycurl.SSLKEY, noded_cert)
+ curl.setopt(pycurl.CONNECTTIMEOUT, _RPC_CONNECT_TIMEOUT)
+
+
+class _RpcThreadLocal(threading.local):
+ def GetHttpClientPool(self):
+ """Returns a per-thread HTTP client pool.
+
+ @rtype: L{http.client.HttpClientPool}
+
+ """
+ try:
+ pool = self.hcp
+ except AttributeError:
+ pool = http.client.HttpClientPool(_ConfigRpcCurl)
+ self.hcp = pool
+
+ return pool
+
+
+_thread_local = _RpcThreadLocal()
+
+
+def _RpcTimeout(secs):
+ """Timeout decorator.
+
+ When applied to a rpc call_* function, it updates the global timeout
+ table with the given function/timeout.