コード例 #1
0
 def nodeIsOn(self, node):
     """\brief Checks if given node is on.
     \param nodeInstance - Instance of node to check
     \return result - 0 = off, 1 = on, -1 = unknown/unsupported
     XXX TODO: Use powerd for query, removing dependance on having a ref to
                 henmanager
     XXX Small leaking here, as powerSilent creates node instances...
     """
     self.__powerStatusCallbackEvent.clear()
     p = Protocol(None)
     if DaemonStatus().powerDaemonIsOnline(5):
         p.open(DaemonLocations.monitorDaemon[0], \
                DaemonLocations.monitorDaemon[1])
         p.sendRequest("get_power_status", node.getNodeID(), \
                       self.powerStatusHandler)
         p.readAndProcess()
         self.__powerStatusCallbackEvent.wait(POWER_STATUS_TIMEOUT)
         p.close()
     try:
         pnodeid = node.getPowerNodeID()
         if (pnodeid == "None" or pnodeid == "none"):
             return -1
         if self.__powerResults:
             (st, msg) = (0, self.__powerResults)
         else:
             (st,msg) = self.__hen_manager.powerSilent(node.getNodeID(), \
                                                       "status", pnodeid)
         if (st == 0 and msg == "on"):
             return 1
         if (st == 0 and msg == "off"):
             return 0
     except Exception, e:
         log.debug("nodeIsOn Exception: %s" % str(e))
コード例 #2
0
ファイル: authenticationdaemon.py プロジェクト: benroeder/HEN
    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")
コード例 #3
0
ファイル: workerthread.py プロジェクト: benroeder/HEN
 def nodeIsOn(self, node):
     """\brief Checks if given node is on.
     \param nodeInstance - Instance of node to check
     \return result - 0 = off, 1 = on, -1 = unknown/unsupported
     XXX TODO: Use powerd for query, removing dependance on having a ref to
                 henmanager
     XXX Small leaking here, as powerSilent creates node instances...
     """
     self.__powerStatusCallbackEvent.clear()
     p = Protocol(None)
     if DaemonStatus().powerDaemonIsOnline(5):
         p.open(DaemonLocations.monitorDaemon[0], \
                DaemonLocations.monitorDaemon[1])
         p.sendRequest("get_power_status", node.getNodeID(), \
                       self.powerStatusHandler)
         p.readAndProcess()
         self.__powerStatusCallbackEvent.wait(POWER_STATUS_TIMEOUT)
         p.close()
     try:
         pnodeid = node.getPowerNodeID()
         if (pnodeid == "None" or pnodeid == "none"):
             return -1
         if self.__powerResults:
             (st,msg) = (0, self.__powerResults)
         else:
             (st,msg) = self.__hen_manager.powerSilent(node.getNodeID(), \
                                                       "status", pnodeid)
         if (st == 0 and msg == "on"):
             return 1
         if (st == 0 and msg == "off"):
             return 0
     except Exception, e:
         log.debug("nodeIsOn Exception: %s" % str(e))
コード例 #4
0
    def addSocket(self,sock):
        """\brief Accepts a new customer
        \param socket (\c socket) The opened socket
        """
        self.sock_list.append(sock)
        prot = Protocol(sock, self.__useSSL)

        for i in self.__handlers:
            prot.registerMethodHandler(i,self.__handlers[i])
            
        self.protocol_list.append(prot)
コード例 #5
0
ファイル: consoledaemon.py プロジェクト: benroeder/HEN
    def console(self,prot,seq,ln,payload):
        print "in console"
        if (self.__controlProtocol == None):
            self.__controlProtocol = Protocol(None)        
            self.__controlProtocol.open(DaemonLocations.controlDaemon[0], DaemonLocations.controlDaemon[1])        
        (action, username, nodeID, consoleInput) = pickle.loads(payload)
        print action, username, nodeID, consoleInput


        (serialID, serialPort) = self.__getPort(nodeID)
        # Replies are needed by doSynchronous call in control daemon
        if (action == "open"):
            terminalServerConnection = TerminalServerConnection(username, serialPort, self.__terminalServerNodes[serialID])
            self.__terminalServerConnections[terminalServerConnection.getSocket()] = terminalServerConnection
            self.__terminalServerSockets.append(terminalServerConnection.getSocket())
            self.sock_list.append(terminalServerConnection.getSocket())
            prot.sendReply(200, seq, "")
            return
        elif (action == "close"):
            for connection in self.__terminalServerConnections.values():
                if (connection.getUserID() == username):
                    connection.close()
                    self.sock_list.remove(connection.getSocket())
                    self.__terminalServerSockets.remove(connection.getSocket())
                    del self.__terminalServerConnections[connection.getSocket()]
                    break            
            prot.sendReply(200, seq, "")
            return
        elif (action == "forward"):
            for connection in self.__terminalServerConnections.values():
                if (connection.getUserID() == username):
                    connection.send(consoleInput)
        else:
            print "unrecognized action:", action
コード例 #6
0
ファイル: emergencydaemon.py プロジェクト: sohonet/HEN
 def runChecker(self):
     log.debug("runChecker() called.")
     log.debug("Acquiring checker lock.")
     self.__checker_lock.acquire()
     p = Protocol(None)
     if DaemonStatus().monitorDaemonIsOnline(5):
         p.open(MONITORD_HOST, MONITORD_PORT)
         p.sendRequest("get_currentsensorreadings", "",
                       self.nodeStatusHandler)
         p.readAndProcess()
     else:
         log.info("Monitor Daemon is not online!")  # TODO: Email
     self.__checker_lock.release()
     log.debug("Released checker lock.")
コード例 #7
0
ファイル: emergencydaemon.py プロジェクト: benroeder/HEN
 def runChecker(self):
     log.debug("runChecker() called.")
     log.debug("Acquiring checker lock.")
     self.__checker_lock.acquire()
     p = Protocol(None)
     if DaemonStatus().monitorDaemonIsOnline(5):
         p.open(MONITORD_HOST, MONITORD_PORT)
         p.sendRequest("get_currentsensorreadings","",self.nodeStatusHandler)
         p.readAndProcess()
     else:
         log.info("Monitor Daemon is not online!") # TODO: Email
     self.__checker_lock.release()
     log.debug("Released checker lock.")
コード例 #8
0
ファイル: authenticationdaemon.py プロジェクト: sohonet/HEN
    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")
コード例 #9
0
ファイル: authenticationdaemon.py プロジェクト: sohonet/HEN
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
コード例 #10
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):
コード例 #11
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):
コード例 #12
0
ファイル: authenticationdaemon.py プロジェクト: benroeder/HEN
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
コード例 #13
0
ファイル: consoledaemon.py プロジェクト: benroeder/HEN
class ConsoleControl(Daemon):
    """\brief Implements basic console daemon functionality.
    """
    def __init__(self, configFilePath='/usr/local/hen/etc/configs/config'):
        Daemon.__init__(self)

        self.__version = "Console Daemon v0.2 (dumb)"
        self.__terminalServerConnections = {}
        self.__terminalServerSockets = []
        self.__configFilePath = configFilePath
        self.__configFile = ConfigParser.ConfigParser()
        self.__configFile.read(configFilePath)
        self.__henPhysicalTopology = self.__configFile.get('MAIN','PHYSICAL_TOPOLOGY')
        self.__henLogPath = self.__configFile.get('MAIN', 'LOG_PATH')
        self.__parser = HenParser(self.__henPhysicalTopology, \
                                  None, \
                                  None, \
                                  self.__henLogPath, \
                                  None,
                                  None,
                                  None, \
                                  None)

        self.__controlProtocol = None

        # Create instances for all terminal servers in the testbed
        self.__terminalServerNodes = {}
        for terminalServerNode in self.__parser.getNodes("serial", "all").values():
            self.__terminalServerNodes[terminalServerNode.getNodeID()] = terminalServerNode.getInstance()
        self.__computerNodes = self.__parser.getNodes("computer", "all")
                                
        self.__registerMethods()

    def __registerMethods(self):
        self.registerMethodHandler("console", self.console)

    def __getPort(self, nodeID):
        return (self.__computerNodes[nodeID].getSerialNodeID(), self.__computerNodes[nodeID].getSerialNodePort())
        
    def console(self,prot,seq,ln,payload):
        print "in console"
        if (self.__controlProtocol == None):
            self.__controlProtocol = Protocol(None)        
            self.__controlProtocol.open(DaemonLocations.controlDaemon[0], DaemonLocations.controlDaemon[1])        
        (action, username, nodeID, consoleInput) = pickle.loads(payload)
        print action, username, nodeID, consoleInput


        (serialID, serialPort) = self.__getPort(nodeID)
        # Replies are needed by doSynchronous call in control daemon
        if (action == "open"):
            terminalServerConnection = TerminalServerConnection(username, serialPort, self.__terminalServerNodes[serialID])
            self.__terminalServerConnections[terminalServerConnection.getSocket()] = terminalServerConnection
            self.__terminalServerSockets.append(terminalServerConnection.getSocket())
            self.sock_list.append(terminalServerConnection.getSocket())
            prot.sendReply(200, seq, "")
            return
        elif (action == "close"):
            for connection in self.__terminalServerConnections.values():
                if (connection.getUserID() == username):
                    connection.close()
                    self.sock_list.remove(connection.getSocket())
                    self.__terminalServerSockets.remove(connection.getSocket())
                    del self.__terminalServerConnections[connection.getSocket()]
                    break            
            prot.sendReply(200, seq, "")
            return
        elif (action == "forward"):
            for connection in self.__terminalServerConnections.values():
                if (connection.getUserID() == username):
                    connection.send(consoleInput)
        else:
            print "unrecognized action:", action

    def processTerminalServerData(self, sock):
        connection = self.__terminalServerConnections[sock]
        if (connection.recv()):
            self.__controlProtocol.sendRequest("console", \
                                               pickle.dumps((connection.getUserID(), \
                                                             connection.getAndDeleteBuffer(), \
                                                             ["console_output"])), \
                                               self.terminalServerDataReplyHandler)

    def terminalServerDataReplyHandler(self, code, seq, sz, payload):
        pass
    
    def stopDaemon(self,prot,seq,ln,payload):
        """\brief Stops the daemon and all threads
        This method will first stop any more incoming queries, then wait for
        any update tasks to complete, before stopping itself.
        """
        log.info("stopDaemon called.")
        prot.sendReply(200, seq, "Accepted stop request.")
        log.debug("Sending stopDaemon() response")
        self.acceptConnections(False)
        log.info("Stopping ConsoleDaemon (self)")
        self.stop()

    def run(self):
        """\brief Main daemon loop
        Waits for messages from clients and processes them. Only sleeps for two
        seconds, to accept new clients also.
        """
        while not self.isStopped:
            #select sockets
            (read,write,exc) = select.select(self.sock_list,[],self.sock_list,2)
            for i in read:
                s = None

                if (i in self.__terminalServerSockets):
                    self.processTerminalServerData(i)
                    continue

                # Process regular socket
                try:
                    s = i.recv(1000000,0)
                # Process SSL socket
                except:
                    try:
                        s = i.read(1000000)
                    except:
                        s = []
                try:
                    #log.debug("Read from socket:"+s.replace("\r","\\r"))

                    if (len(s)==0):
                        #log.debug("removing")
                        idx = self.sock_list.index(i)
                        del self.sock_list[idx]
                        del self.protocol_list[idx]
                    else:
                        self.protocol_list[self.sock_list.index(i)].processPacket(s)
                except Exception,e:
                    idx = self.sock_list.index(i)
                    del self.sock_list[idx]
                    del self.protocol_list[idx]
                    traceback.print_exc()
            for i in exc:
                log.debug ("exc",i)