Add failover to the XML-RPC client
433506
This commit is contained in:
1 parent
c367b917d7
commit
8f0d4a8ed3
4 files changed
+38
-11
No files matched your search
@@ -23,6 +23,7 @@ from optparse import OptionParser
|
||||
import krbV
|
||||
import socket
|
||||
import ipa.dnsclient
|
||||
import re
|
||||
|
||||
class IPAConfigError(Exception):
|
||||
def __init__(self, msg=''):
|
||||
@@ -37,7 +38,7 @@ class IPAConfigError(Exception):
|
||||
class IPAConfig:
|
||||
def __init__(self):
|
||||
self.default_realm = None
|
||||
self.default_server = None
|
||||
self.default_server = []
|
||||
|
||||
def get_realm(self):
|
||||
if self.default_realm:
|
||||
@@ -62,7 +63,8 @@ def __parse_config():
|
||||
if not config.default_realm:
|
||||
config.default_realm = p.get("defaults", "realm")
|
||||
if not config.default_server:
|
||||
config.default_server = p.get("defaults", "server")
|
||||
s = p.get("defaults", "server")
|
||||
config.default_server = re.sub("\s+", "", s).split(',')
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -95,12 +97,12 @@ def __discover_config():
|
||||
for r in rs:
|
||||
if r.dns_type == ipa.dnsclient.DNS_T_SRV:
|
||||
rsrv = r.rdata.server.rstrip(".")
|
||||
# we take only the first one returned for now
|
||||
config.default_server = rsrv
|
||||
return True
|
||||
config.default_server.append(rsrv)
|
||||
|
||||
#if none found
|
||||
return False
|
||||
if config.default_server:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
+22
-3
@@ -20,6 +20,7 @@
|
||||
import xmlrpclib
|
||||
import socket
|
||||
import config
|
||||
import errno
|
||||
from krbtransport import KerbTransport
|
||||
from kerberos import GSSError
|
||||
from ipa import ipaerror, ipautil
|
||||
@@ -31,16 +32,34 @@ from ipa import config
|
||||
class RPCClient:
|
||||
|
||||
def __init__(self):
|
||||
self.server = None
|
||||
config.init_config()
|
||||
|
||||
def server_url(self):
|
||||
def server_url(self, server):
|
||||
"""Build the XML-RPC server URL from our configuration"""
|
||||
return "https://" + config.config.get_server() + "/ipa"
|
||||
return "https://" + server + "/ipa"
|
||||
|
||||
def setup_server(self):
|
||||
"""Create our XML-RPC server connection using kerberos
|
||||
authentication"""
|
||||
return xmlrpclib.ServerProxy(self.server_url(), KerbTransport())
|
||||
if not self.server:
|
||||
serverlist = config.config.get_server()
|
||||
|
||||
# Try each server until we succeed or run out of servers to try
|
||||
# Guaranteed by ipa.config to have at least 1 in the list
|
||||
for s in serverlist:
|
||||
try:
|
||||
self.server = s
|
||||
remote = xmlrpclib.ServerProxy(self.server_url(s), KerbTransport())
|
||||
result = remote.ping()
|
||||
break
|
||||
except socket.error, e:
|
||||
if (e[0] == errno.ECONNREFUSED) or (e[0] == errno.ECONNREFUSED) or (e[0] == errno.EHOSTDOWN) or (e[0] == errno.EHOSTUNREACH):
|
||||
continue
|
||||
else:
|
||||
raise e
|
||||
|
||||
return xmlrpclib.ServerProxy(self.server_url(self.server), KerbTransport())
|
||||
|
||||
# Higher-level API
|
||||
|
||||
|
||||
Reference in new issue
Block a user