X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplc%2Fplshell.py;h=d2cd9cd3e615b8daa5df763442a3e9701f9a7d32;hb=04255538dbacfa52a45e8439b9c9ea590a82dc47;hp=ef2abb0bc40149023b1dbf8daa801ec74cf829dd;hpb=a772af7fc570de7a2c194f3b8ffe7d30350f950d;p=sfa.git diff --git a/sfa/plc/plshell.py b/sfa/plc/plshell.py index ef2abb0b..d2cd9cd3 100644 --- a/sfa/plc/plshell.py +++ b/sfa/plc/plshell.py @@ -1,4 +1,7 @@ +import sys import xmlrpclib +import socket +from urlparse import urlparse from sfa.util.sfalogging import logger @@ -26,33 +29,49 @@ class PlShell: 'get_nodes':'GetNodes', } + + # use the 'capability' auth mechanism for higher performance when the PLC db is local def __init__ ( self, config ) : - self.url = config.SFA_PLC_URL - # xxx attempt to use the 'capability' auth mechanism for higher performance - # when the PLC db is local - # xxx todo - is_local = False + url = config.SFA_PLC_URL + # try to figure if the url is local + hostname=urlparse(url).hostname + is_local=False + if hostname == 'localhost': is_local=True + # otherwise compare IP addresses; + # this might fail for any number of reasons, so let's harden that + try: + # xxx todo this seems to result in a DNS request for each incoming request to the AM + # should be cached or improved + url_ip=socket.gethostbyname(hostname) + local_ip=socket.gethostbyname(socket.gethostname()) + if url_ip==local_ip: is_local=True + except: + pass + if is_local: try: + # too bad this is not installed properly + plcapi_path="/usr/share/plc_api" + if plcapi_path not in sys.path: sys.path.append(plcapi_path) import PLC.Shell plc_direct_access=True except: plc_direct_access=False if is_local and plc_direct_access: - logger.info('plshell - capability access') + logger.debug('plshell access - capability') self.plauth = { 'AuthMethod': 'capability', - 'UserName': config.SFA_PLC_USER, + 'Username': config.SFA_PLC_USER, 'AuthString': config.SFA_PLC_PASSWORD, } self.proxy = PLC.Shell.Shell () else: - logger.info('plshell - xmlrpc access') + logger.debug('plshell access - xmlrpc') self.plauth = { 'AuthMethod': 'password', 'Username': config.SFA_PLC_USER, 'AuthString': config.SFA_PLC_PASSWORD, } - self.proxy = xmlrpclib.Server(self.url, verbose = 0, allow_none = True) + self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True) def __getattr__(self, name): def func(*args, **kwds): @@ -62,6 +81,6 @@ class PlShell: if not actual_name: raise Exception, "Illegal method call %s for PL driver"%(name) result=getattr(self.proxy, actual_name)(self.plauth, *args, **kwds) - logger.info('%s (%s) returned ... %s'%(name,actual_name,result)) + logger.debug('PlShell %s (%s) returned ... '%(name,actual_name)) return result return func