示例#1
0
class AuthenticationHandler(Daemon):
    def __init__(self, useSSL=True):

        Daemon.__init__(self, useSSL)

        self.__MIN_ID = 100000
        self.__MAX_ID = 100000000
        self.__SESSION_TIMEOUT_HOURS = 48

        self.__loggedInUsers = {}
        self.__reverseLoggedInUsers = {}
        self.__userProtocols = {}

        self.__systemProtocol = Protocol(None)
        self.__controlProtocol = Protocol(None)

        try:
            self.__systemProtocol.open(DaemonLocations.systemDaemon[0],
                                       DaemonLocations.systemDaemon[1])
        except:
            print "warning, could not connect to system daemon"
        try:
            self.__controlProtocol.open(DaemonLocations.controlDaemon[0],
                                        DaemonLocations.controlDaemon[1])
        except:
            print "warning, could not connect to control daemon"

        self.registerMethodHandler("login", self.login)
        self.registerMethodHandler("logout", self.logout)
        self.registerMethodHandler("system", self.systemOperation)
        self.registerMethodHandler("control", self.controlOperation)

        self.__consoleOperationReply = None
        self.__controlOperationReply = None
        self.__systemOperationReply = None

        self.__ldapClient = LDAPClient("ldap://henldap:389")

    def login(self, prot, seq, ln, payload):
        (username, password) = pickle.loads(payload)
        validLogin = self.__ldapClient.authenticate(username, password)
        groups = None
        if (validLogin):
            ldapInfo = self.__ldapClient.getUserInfoByLogin(username)
            groups = ldapInfo.getGroups()
            email = ldapInfo.getEmail()
            loggedInID = random.randint(self.__MIN_ID, self.__MAX_ID)
            loginDate = datetime.datetime.now()
            loggedInUser =  LoggedInUser(username, loggedInID, email, \
                                         loginDate, groups)
            self.__loggedInUsers[loggedInID] = loggedInUser
            self.__reverseLoggedInUsers[username] = loggedInID
            prot.sendReply(200, seq, str(loggedInID))
        else:
            prot.sendReply(421, seq, "")

    def logout(self, prot, seq, ln, payload):
        loggedInID = int(pickle.loads(payload))
        if (self.__loggedInUsers.has_key(loggedInID)):
            del self.__loggedInUsers[loggedInID]

        if (self.__reverseLoggedInUsers.has_key(loggedInID)):
            del self.__reverseLoggedInUsers[loggedInID]

        if (self.__userProtocols.has_key(loggedInID)):
            del self.__userProtocols[loggedInID]

        prot.sendReply(200, seq, "")

    def systemOperation(self, prot, seq, ln, payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)
        if (not self.__isLoggedIn(loggedInID, prot, seq)):
            return

        username = self.__loggedInUsers[loggedInID].getUsername()
        groups = self.__loggedInUsers[loggedInID].getGroups()

        result = self.__systemProtocol.doSynchronousCall(operation, \
                                             pickle.dumps((username, groups, parameters)))

        resID = len(result) - 1
        if resID < 0:
            prot.sendReply(500, seq, "Got 0 result from systemdaemon!")
            return
        else:
            prot.sendReply(result[resID][0], seq, result[resID][2])

    def controlOperation(self, prot, seq, ln, payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)
        print loggedInID, operation, parameters

        # Special console case
        if ((operation == "console") or (operation == "console_output")):
            self.__console(prot, seq, ln, payload)
            return

        if (not self.__isLoggedIn(loggedInID, prot, seq)):
            return

        username = self.__loggedInUsers[loggedInID].getUsername()
        groups = self.__loggedInUsers[loggedInID].getGroups()

        result = self.__controlProtocol.doSynchronousCall(operation, \
                                             pickle.dumps((username, groups, parameters)))
        resID = len(result) - 1
        #print "got result",result
        if resID < 0:
            prot.sendReply(500, seq, "Got 0 result from controldaemon!")
            return
        else:
            prot.sendReply(result[resID][0], seq, result[resID][2])

    def __console(self, prot, seq, ln, payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)

        # Request from hm client
        if (operation == "console"):
            if (not self.__isLoggedIn(loggedInID, prot, seq)):
                return

            username = self.__loggedInUsers[loggedInID].getUsername()
            groups = self.__loggedInUsers[loggedInID].getGroups()
            action = parameters[0]

            # Record client protocol so we can later reply to it
            if (not self.__userProtocols.has_key(loggedInID)):
                self.__userProtocols[loggedInID] = prot

            self.__controlProtocol.sendRequest("console", \
                                               pickle.dumps((username, groups, parameters)), \
                                               self.__consoleOperationReplyHandler)
            if (action == "open" or action == "close"):
                self.__controlProtocol.readAndProcess()
                prot.sendReply(self.__consoleOperationReply[0], seq,
                               self.__consoleOperationReply[3])

        # Request from control daemon, forward to console client
        elif (operation == "console_output"):
            (username, operation, parameters) = pickle.loads(payload)
            consoleOutput = parameters[0]
            loggedInID = self.__reverseLoggedInUsers[username]
            payload = pickle.dumps((200, consoleOutput))
            self.__userProtocols[loggedInID].sendRequest(
                "console", payload, self.__consoleOperationReplyHandler)
        else:
            print "unknown console operation received"
            return

        prot.sendRequest("console", self.__consoleOperationReply[3],
                         self.__consoleOperationReplyHandler)

    def __consoleOperationReplyHandler(self, code, seq, sz, payload):
        self.__consoleOperationReply = (code, seq, sz, payload)

    def __isLoggedIn(self, loggedInID, prot, seq):
        if ((not self.__loggedInUsers.has_key(loggedInID)) or \
            self.__hasSessionExpired(loggedInID)):
            print "not logged in"
            prot.sendReply(400, seq, "")
            return False
        return True

    def __hasSessionExpired(self, loggedInID):
        loginDate = self.__loggedInUsers[loggedInID].getLoginDate()
        now = datetime.datetime.now()

        difference = now - loginDate
        minutes, seconds = divmod(difference.seconds, 60)
        hours, minutes = divmod(minutes, 60)

        sessionTime = hours + (24 * difference.days)
        if (sessionTime > self.__SESSION_TIMEOUT_HOURS):
            return True

        return False
示例#2
0
import logging
import os.path
import pickle
from stat import *
from auxiliary.daemonlocations import DaemonLocations
from auxiliary.protocol import Protocol
import datetime

powerdaemon = Protocol(None)
powerdaemon.open(DaemonLocations.powerDaemon[0],
                 DaemonLocations.powerDaemon[1])
version = powerdaemon.doSynchronousCall("get_config_version", "")
print "Version is " + str(version[0][2])
tics = os.stat('/usr/local/hen/etc/physical/topology.xml')[ST_MTIME]
t = datetime.datetime.fromtimestamp(tics)
lastAccess = str(t.strftime('%Y-%m-%d'))
print "Last access time is " + lastAccess
if (str(lastAccess) != str(version[0][2])):
    print "Setting new config"
    from henmanager import HenManager
    hm = HenManager()
    payload = lastAccess + "," + pickle.dumps(hm.getNodes("all"))
    print "Result is:" + str(
        powerdaemon.doSynchronousCall("set_config", payload))


def addLink(tag, action, old, new):
    print "AddLink got " + tag, action, old, new


def removeLink(tag, action, old, new):
示例#3
0
文件: backend.py 项目: benroeder/HEN
import logging
import os.path
import pickle
from stat import *
from auxiliary.daemonlocations import DaemonLocations
from auxiliary.protocol import Protocol
import datetime

powerdaemon = Protocol(None)
powerdaemon.open(DaemonLocations.powerDaemon[0], DaemonLocations.powerDaemon[1])
version = powerdaemon.doSynchronousCall("get_config_version","")
print "Version is "+str(version[0][2])
tics = os.stat('/usr/local/hen/etc/physical/topology.xml')[ST_MTIME]
t = datetime.datetime.fromtimestamp(tics)
lastAccess=str(t.strftime('%Y-%m-%d'))
print "Last access time is "+lastAccess
if (str(lastAccess)!=str(version[0][2])):
	print "Setting new config"
	from henmanager import HenManager
	hm = HenManager()
	payload = lastAccess + ","+ pickle.dumps(hm.getNodes("all"))
	print "Result is:"+str(powerdaemon.doSynchronousCall("set_config",payload))
	

def addLink(tag,action,old,new):
    print "AddLink got "+tag,action,old,new

def removeLink(tag,action,old,new):
    print "RemoveLink got "+tag,action,old,new
    
def changePowerState(tag,action,node,attr):
示例#4
0
class AuthenticationHandler(Daemon):

    def __init__(self, useSSL=True):

        Daemon.__init__(self, useSSL)

        self.__MIN_ID = 100000
        self.__MAX_ID = 100000000
        self.__SESSION_TIMEOUT_HOURS = 48

        self.__loggedInUsers = {}
        self.__reverseLoggedInUsers = {}
        self.__userProtocols = {}

        self.__systemProtocol = Protocol(None)
        self.__controlProtocol = Protocol(None)

        try:
            self.__systemProtocol.open(DaemonLocations.systemDaemon[0], DaemonLocations.systemDaemon[1])
        except:
            print "warning, could not connect to system daemon"
        try:
            self.__controlProtocol.open(DaemonLocations.controlDaemon[0], DaemonLocations.controlDaemon[1])
        except:
            print "warning, could not connect to control daemon"
        
        self.registerMethodHandler("login", self.login)
        self.registerMethodHandler("logout", self.logout)
        self.registerMethodHandler("system", self.systemOperation)
        self.registerMethodHandler("control", self.controlOperation)

        self.__consoleOperationReply = None
        self.__controlOperationReply = None        
        self.__systemOperationReply = None
        
        self.__ldapClient = LDAPClient("ldap://henldap:389")

    def login(self,prot,seq,ln,payload):
        (username, password) = pickle.loads(payload)
        validLogin = self.__ldapClient.authenticate(username, password)
        groups = None
        if (validLogin):
            ldapInfo =  self.__ldapClient.getUserInfoByLogin(username)
            groups = ldapInfo.getGroups()
            email = ldapInfo.getEmail()
            loggedInID = random.randint(self.__MIN_ID, self.__MAX_ID)
            loginDate = datetime.datetime.now()
            loggedInUser =  LoggedInUser(username, loggedInID, email, \
                                         loginDate, groups)
            self.__loggedInUsers[loggedInID] = loggedInUser
            self.__reverseLoggedInUsers[username] = loggedInID
            prot.sendReply(200, seq, str(loggedInID))
        else:
            prot.sendReply(421, seq, "")
        
    def logout(self,prot,seq,ln,payload):
        loggedInID = int(pickle.loads(payload))
        if (self.__loggedInUsers.has_key(loggedInID)):
            del self.__loggedInUsers[loggedInID]

        if (self.__reverseLoggedInUsers.has_key(loggedInID)):
            del self.__reverseLoggedInUsers[loggedInID]            
        
        if (self.__userProtocols.has_key(loggedInID)):
            del self.__userProtocols[loggedInID]
            
        prot.sendReply(200,seq,"")

    def systemOperation(self,prot,seq,ln,payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)        
        if (not self.__isLoggedIn(loggedInID, prot, seq)):
            return

        username = self.__loggedInUsers[loggedInID].getUsername()
        groups = self.__loggedInUsers[loggedInID].getGroups()
        
	result = self.__systemProtocol.doSynchronousCall(operation, \
                                      pickle.dumps((username, groups, parameters)))

	resID = len(result)-1
	if resID<0:
		prot.sendReply(500,seq,"Got 0 result from systemdaemon!")
		return
	else:
		prot.sendReply(result[resID][0],seq,result[resID][2])
       
        
    def controlOperation(self,prot,seq,ln,payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)
        print loggedInID, operation, parameters
        
        # Special console case
        if ((operation == "console") or (operation == "console_output")):
            self.__console(prot,seq,ln,payload)
            return
        
        if (not self.__isLoggedIn(loggedInID, prot, seq)):
            return

        username = self.__loggedInUsers[loggedInID].getUsername()
        groups = self.__loggedInUsers[loggedInID].getGroups()
        
	result = self.__controlProtocol.doSynchronousCall(operation, \
                                      pickle.dumps((username, groups, parameters))) 
	resID = len(result)-1
	#print "got result",result
	if resID<0:
		prot.sendReply(500,seq,"Got 0 result from controldaemon!")
		return
	else:
		prot.sendReply(result[resID][0],seq,result[resID][2])

    def __console(self,prot,seq,ln,payload):
        (loggedInID, operation, parameters) = pickle.loads(payload)
        
        # Request from hm client
        if (operation == "console"):
            if (not self.__isLoggedIn(loggedInID, prot, seq)):
                return

            username = self.__loggedInUsers[loggedInID].getUsername()
            groups = self.__loggedInUsers[loggedInID].getGroups()
            action = parameters[0]
            
            # Record client protocol so we can later reply to it            
            if (not self.__userProtocols.has_key(loggedInID)):
                self.__userProtocols[loggedInID] = prot

            self.__controlProtocol.sendRequest("console", \
                                               pickle.dumps((username, groups, parameters)), \
                                               self.__consoleOperationReplyHandler)
            if (action == "open" or action == "close"):
                self.__controlProtocol.readAndProcess()
                prot.sendReply(self.__consoleOperationReply[0], seq, self.__consoleOperationReply[3])
            
        # Request from control daemon, forward to console client
        elif (operation == "console_output"):
            (username, operation, parameters) = pickle.loads(payload)
            consoleOutput = parameters[0]
            loggedInID = self.__reverseLoggedInUsers[username]
            payload = pickle.dumps((200, consoleOutput))
            self.__userProtocols[loggedInID].sendRequest("console", payload, self.__consoleOperationReplyHandler)
        else:
            print "unknown console operation received"
            return
        
        prot.sendRequest("console", self.__consoleOperationReply[3], self.__consoleOperationReplyHandler)    
            
    def __consoleOperationReplyHandler(self, code, seq, sz, payload):
        self.__consoleOperationReply = (code, seq, sz, payload)
        
    def __isLoggedIn(self, loggedInID, prot, seq):
        if ((not self.__loggedInUsers.has_key(loggedInID)) or \
            self.__hasSessionExpired(loggedInID)):
            print "not logged in"
            prot.sendReply(400,seq,"")
            return False
        return True
    
    def __hasSessionExpired(self, loggedInID):
        loginDate = self.__loggedInUsers[loggedInID].getLoginDate()
        now = datetime.datetime.now()

        difference = now - loginDate
        minutes, seconds = divmod(difference.seconds, 60)
        hours, minutes = divmod(minutes, 60)

        sessionTime = hours + (24 * difference.days)
        if (sessionTime > self.__SESSION_TIMEOUT_HOURS):
            return True

        return False