Exemplo n.º 1
0
def main():
    manager = HenManager()
    manager.initLogging()

    #    doc = minidom.Document()
    #    nodesTag = doc.createElement("nodes")
    #    doc.appendChild(nodesTag)
    #
    #    nodes = manager.getNodes("all")
    #    for nodeTypeDictionary in nodes.values():
    #        for node in nodeTypeDictionary.values():
    #
    #            nodeTag = doc.createElement("node")
    #            nodesTag.appendChild(nodeTag)
    #            targetNode = node.getNodeID()
    #            nodeTag.setAttribute("id", targetNode)
    #
    #    print doc.toprettyxml(indent = '    ')

    print "Cache-Control: no-store, no-cache, must-revalidate"
    print "Content-type: text/xml\n\n"

    print "<nodes>"
    nodes = manager.getNodes("all")
    for nodeTypeDictionary in nodes.values():
        for node in nodeTypeDictionary.values():
            print "\t<node id=\"" + node.getNodeID() + "\"/>"

    print "</nodes>"
Exemplo n.º 2
0
    def writeDHCPConfig(self):
        """\brief Writes the dhcp config file
        """
        dnsServer = self.getDHCPConfigInfo().getDomainNameServers()
        self.__outputFile = open(self.__outputFilename, "w")
        manager = HenManager()
        nodes = manager.getNodes("all", "all")
        #        if (not self.__parser):
        #            print "error: parser is null"
        #            return
        #        self.__parser.parseAll()
        #        nodes = self.__parser.getNodes("all", "all")

        # write initial block
        self.__writeStartingBlock()

        # process each subnet
        subnetInfoList = self.getDHCPConfigInfo().getSubnetInfoList()

        for subnetInfo in subnetInfoList:

            self.__writeSubnetBlock(subnetInfo)
            if (subnetInfo.getSubnetType() == "experimental"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("management")
                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface,
                                                 node.getNetbootable(),
                                                 dnsServer, node.getNodeType(),
                                                 subnetInfo.getDomainName())
            elif (subnetInfo.getSubnetType() == "infrastructure"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("infrastructure")
                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface,
                                                 node.getNetbootable(),
                                                 dnsServer, node.getNodeType(),
                                                 subnetInfo.getDomainName())
            elif (subnetInfo.getSubnetType() == "virtual"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("virtual")

                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface,
                                                 node.getNetbootable(),
                                                 dnsServer, node.getNodeType(),
                                                 subnetInfo.getDomainName())

            self.__writeEndingBlock()

        self.__closeFile()
        return 0
Exemplo n.º 3
0
def interfaceid_to_mac(node_str,interface_str):
    manager = HenManager()
    manager.initLogging()
    nodes = manager.getNodes("all","all")
    for nt in nodes:
        for nn in nodes[nt]:
            if nodes[nt][nn].getNodeID().upper() == str(node_str).upper():
                mac = getmac_from_interface(nodes[nt][nn],interface_str)
                return mac
    return None
Exemplo n.º 4
0
    def writeDHCPConfig(self):
        """\brief Writes the dhcp config file
        """
        dnsServer = self.getDHCPConfigInfo().getDomainNameServers()
        self.__outputFile = open(self.__outputFilename, "w")
        manager = HenManager()
        nodes = manager.getNodes("all","all")
#        if (not self.__parser):
#            print "error: parser is null"
#            return
#        self.__parser.parseAll()
#        nodes = self.__parser.getNodes("all", "all")

        # write initial block
	self.__writeStartingBlock()

        # process each subnet
        subnetInfoList = self.getDHCPConfigInfo().getSubnetInfoList()
        
        for subnetInfo in subnetInfoList:
            
            self.__writeSubnetBlock(subnetInfo)
            if (subnetInfo.getSubnetType() == "experimental"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("management")
                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface, node.getNetbootable(), dnsServer, node.getNodeType(), subnetInfo.getDomainName())
            elif (subnetInfo.getSubnetType() == "infrastructure"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("infrastructure")
                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface, node.getNetbootable(), dnsServer, node.getNodeType(), subnetInfo.getDomainName())
            elif (subnetInfo.getSubnetType() == "virtual"):
                for nodeType in nodes.keys():
                    for node in nodes[nodeType].values():
                        interfacesList = node.getInterfaces("virtual")
                        
                        if (interfacesList != None):
                            for interface in interfacesList:
                                self.__writeNode(node.getNodeID(), interface, node.getNetbootable(), dnsServer, node.getNodeType(), subnetInfo.getDomainName())

            self.__writeEndingBlock()

        self. __closeFile()
        return 0
Exemplo n.º 5
0
class ConfigReader(Daemon):
    """\brief Implements basic config daemon functionality.
    """
    __version = "Config Daemon v0.1 (simple)"
    __henManager = None
    
    def __init__(self):
        Daemon.__init__(self)
        self.__henManager = HenManager()
        self.__registerMethods()
        
    def __registerMethods(self):
        self.registerMethodHandler("get_object_for_id", self.getObjectForId)
        self.registerMethodHandler("stop_daemon", self.stopDaemon)
        
    def __sendReply(self,prot,code,seq,payload):
        if (code == 0):
            code = 200
        else:
            code = 422 # returnCodes[422] = "error executing command"
        prot.sendReply(code, seq, payload)

    def getObjectForId(self,prot,seq,ln,payload):
        nodes = self.__henManager.getNodes("all")
        for ntk in nodes:
            #print "ntk ",str(ntk)
            for nk in nodes[ntk]:
                #print "nk ",str(nk)
                if nodes[ntk][nk].getNodeID() == payload:
                    payload=pickle.dumps(nodes[ntk][nk])
                    code = 0
                    self.__sendReply(prot,code,seq,payload)
                    return
        payload = "not found"
        code = -1
        self.__sendReply(prot,code,seq,payload)        

    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 ConfigDaemon (self)")
        self.stop()
Exemplo n.º 6
0
class ConfigReader(Daemon):
    """\brief Implements basic config daemon functionality.
    """
    __version = "Config Daemon v0.1 (simple)"
    __henManager = None

    def __init__(self):
        Daemon.__init__(self)
        self.__henManager = HenManager()
        self.__registerMethods()

    def __registerMethods(self):
        self.registerMethodHandler("get_object_for_id", self.getObjectForId)
        self.registerMethodHandler("stop_daemon", self.stopDaemon)

    def __sendReply(self, prot, code, seq, payload):
        if (code == 0):
            code = 200
        else:
            code = 422  # returnCodes[422] = "error executing command"
        prot.sendReply(code, seq, payload)

    def getObjectForId(self, prot, seq, ln, payload):
        nodes = self.__henManager.getNodes("all")
        for ntk in nodes:
            #print "ntk ",str(ntk)
            for nk in nodes[ntk]:
                #print "nk ",str(nk)
                if nodes[ntk][nk].getNodeID() == payload:
                    payload = pickle.dumps(nodes[ntk][nk])
                    code = 0
                    self.__sendReply(prot, code, seq, payload)
                    return
        payload = "not found"
        code = -1
        self.__sendReply(prot, code, seq, payload)

    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 ConfigDaemon (self)")
        self.stop()
Exemplo n.º 7
0
def check_port(computer_str,interface_str):
	print computer_str,interface_str,
	switch_str = ""
        port_str = ""

        computer = None
        interface = None
        switch = None
        port = None

        switch_obj = None
        
        manager = HenManager()
        manager.initLogging()
        nodes = manager.getNodes("all")
        
        for node_type in nodes:
            for node in nodes[node_type]:
                if nodes[node_type][node].getNodeID() == computer_str:
                    computer = nodes[node_type][node]
                    break
                
        if computer != None:
            interfaces = computer.getInterfaces()
            for interface_type in interfaces:
                for iface in interfaces[interface_type]:
                    if iface.getInterfaceID() == interface_str:
                        switch_str = iface.getSwitch()
                        port_str = iface.getPort()

        for node_type in nodes:
            for node in nodes[node_type]:
                #print node,switch_str
                if nodes[node_type][node].getNodeID() == switch_str:
                    switch = nodes[node_type][node]
                    break

        if switch != None:
            switch_obj = switch.getInstance()
        
        if switch_obj != None:
	   port_internal_id = switch_obj.getPortInternalID(port_str)
           if (switch_obj.getPortStatus(port_str) == 1):
	      print "up",
	   else:
	      print "down"
	   #print switch_obj.getPortsSpeedByInternalID([port_internal_id])[0][1]
	   print switch_obj.getPortTdr(port_str)
Exemplo n.º 8
0
    def run(self,argv):
        if len(argv) != 2:
            print "Usage :"+argv[0]+" <powerswitch name>"
            sys.exit(1)

        self.target_name = argv[1]
        
        manager = HenManager()
        manager.initLogging()
        nodes = manager.getNodes("powerswitch","all")

        self.target = None
        for node in nodes.values():
            if (node.getNodeID() == self.target_name):
                self.target = node.getInstance()
                
        if self.target == None:
            print "Unknown powerswitch "+argv[1]
            sys.exit(1)

        self.run_tests()
Exemplo n.º 9
0
 def old(self):
     BASE_URL="cgi-bin/gui/components/network/"
     
     manager = HenManager()
     manager.initLogging()
     
     links = manager.getLinks("all","all")
     graph = pydot.Dot()
 
     switches = manager.getNodes("switch")
     for switch in switches.values():
         if self.__switchStatuses.has_key(switch.getNodeID()):
             if self.__switchStatuses[switch.getNodeID()] == 1:
                 graph.add_node(pydot.Node(switch.getNodeID(),URL=BASE_URL+\
                   "switchinfocgi.py?id="+switch.getNodeID(),\
                   style="filled",color="chartreuse1"))
             else:
                 graph.add_node(pydot.Node(switch.getNodeID(),URL=BASE_URL+\
                   "switchinfocgi.py?id="+switch.getNodeID(),\
                   style="filled",color="firebrick"))
         else:
             graph.add_node(pydot.Node(switch.getNodeID(),URL=BASE_URL+\
                               "switchinfocgi.py?id="+switch.getNodeID()))
     for linktype in links.values():
         for link in linktype.values():
             members = link.getLinkMembers()
             
             graph.add_edge(pydot.Edge(str(members[0].getDeviceId()),\
               str(members[1].getDeviceId()),label=link.getLinkId(),\
               arrowhead="none",headlabel=str(members[1].getDevicePort().\
               replace('GigabitEthernet ','').replace('Management','M')),\
               taillabel=str(members[0].getDevicePort().\
               replace('GigabitEthernet','')),fontsize=8,\
               tooltip=link.getLinkId(),\
               URL=BASE_URL+"linkinfocgi.py?id="+link.getLinkId()))
 
     # prog='circo' isn't bad
     print graph.create_svg(prog='dot')
Exemplo n.º 10
0
class DetectorDaemon(threading.Thread):
    def __init__(self, d, debug):
        self.__debug = debug
        self.__device_list = d
        self.__run = True
        self.__nodes = {}
        self.__running = []
        self.__man_ips = {}
        self.__inf_ips = {}
        self.__symlinksRoot = "/export/machines/"
        if self.__debug:
            self.__etcRoot = "/usr/local/hen/etc/daemons/autodetectiond/debug/"
        else:
            self.__etcRoot = "/usr/local/hen/etc/daemons/autodetectiond/"

        self.load_data()
        self.show_stats()

        threading.Thread.__init__(self)

    def show_stats(self):
        count = 0
        string = "Number of free management ips :"
        for i in self.__man_ips:
            if self.__man_ips[i] == "free":
                count = count + 1
        string = string + str(count)
        log.info(string)
        count = 0
        string = "Number of free infrastructure ips :"
        for i in self.__inf_ips:
            if self.__inf_ips[i] == "free":
                count = count + 1
        string = string + str(count)
        log.info(string)

    def load_data(self):
        log.info("Loading Data")
        self.__manager = HenManager()
        for i in range(1, 254):
            self.__man_ips["192.168.0." + str(i)] = "free"
            self.__inf_ips["192.168.1." + str(i)] = "free"

        n = self.__manager.getNodes("all", "all")
        for nt in n:
            for node in n[nt].values():
                try:
                    man_ip = node.getInterfaces("management")
                    inf_ip = node.getInterfaces("infrastructure")
                    if man_ip != []:
                        self.__nodes[man_ip[0].getIP()] = node
                        self.__man_ips[str(man_ip[0].getIP())] = node.getNodeID()
                    if inf_ip != []:
                        self.__nodes[inf_ip[0].getIP()] = node
                        self.__inf_ips[str(inf_ip[0].getIP())] = node.getNodeID()
                except:
                    pass
        self.show_stats()

    def getFreeIp(self, type_str):
        if type_str == "infrastructure":
            for i in self.__inf_ips:
                if self.__inf_ips[i] == "free":
                    return i
            return "no free infrastructure ip"
        elif type_str == "management":
            for i in self.__man_ips:
                if self.__man_ips[i] == "free":
                    return i
            return "no free infrastructure ip"
        else:
            return "unknown ip type " + type_str

    def writeXML(self, node, old=False):
        xmlstring = self.__manager.parser.writeNodePhysicalFileString(node, self.__debug)
        print xmlstring
        filename = self.__etcRoot + node.getNodeID() + ".xml"
        if old:
            filename = filename + ".old"
        try:
            if not self.__debug:
                theFile = open(filename, "w")
                theFile.write(xmlstring)
                theFile.close()
            else:
                print "Would write to file ", filename
                print xmlstring
        except Exception, e:
            log.info("error while writing xml file for " + str(node.getNodeID()))
            log.info(str(e))
            return -1
Exemplo n.º 11
0
class ComputerControl(Daemon):
    """\brief Implements basic computer daemon functionality.
    """

    __version = "Computer Daemon v0.1 (simple)"
    __henManager = None

    def __init__(self):
        Daemon.__init__(self)
        self.__henManager = HenManager()
        # Allow specialized instance dictionary to be created in hm
        # self.__henManager.createNodeInstances()
        self.__registerMethods()
        self.__computerID = self.__getComputerID()
        self.__computerInfo = self.__henManager.getNodes("computer")[self.__computerID]
        self.__ifaceIDtoNameMappings = self.__getIfaceMappings()

    def getComputerManagementIP(self):
        # Get the management ip address so that we can bind to it.
        interfaces = self.__computerInfo.getInterfaces("management")
        try:
            return interfaces[0].getIP()
        except:
            return "0.0.0.0"

    def __getComputerID(self):
        # Prints the name of the node that the script is run from. To do so it matches the mac addresses of
        # all running interfaces against the mac addresses in the testbed's database. Prints None if no match is found

        # First create a list containing the mac addresses of all the running interfaces
        macAddresses = []
        macAddressMatcher = re.compile("(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}")
        lines = commands.getstatusoutput("ifconfig")[1].splitlines()
        for line in lines:
            matchObject = macAddressMatcher.search(line)
            if matchObject:
                macAddresses.append(line[matchObject.start() : matchObject.end()].upper())

        # Now match the created list against all of the management mac addresses in the testbed's database
        # for computer nodes
        self.__henManager.initLogging()
        nodes = self.__henManager.getNodes("computer", "all")
        nodeName = None
        for node in nodes.values():
            for interface in node.getInterfaces("management"):
                for macAddress in macAddresses:
                    if macAddress == interface.getMAC().upper():
                        nodeName = node.getNodeID()
        if nodeName == None:
            nodes = self.__henManager.getNodes("virtualcomputer", "all")
            for node in nodes.values():
                for interface in node.getInterfaces("management"):
                    for macAddress in macAddresses:
                        if macAddress == interface.getMAC().upper():
                            nodeName = node.getNodeID()
        return nodeName

    def __getIfaceMappings(self):
        mappings = {}

        # Supports only Linux for now
        interfaces = self.__computerInfo.getInterfaces("experimental")
        ifacesInfo = commands.getstatusoutput("ifconfig -a | grep HWaddr")[1].splitlines()
        for interface in interfaces:
            for infoLine in ifacesInfo:
                if infoLine.find(interface.getMAC()) != -1:
                    mappings[interface.getInterfaceID()] = infoLine[: infoLine.find(" ")]
        return mappings

    def __registerMethods(self):
        self.registerMethodHandler("get_computer_id", self.getComputerID)
        self.registerMethodHandler("autodetect", self.autodetect)
        self.registerMethodHandler("execute_command", self.executeCommand)
        self.registerMethodHandler("gcc_compile", self.gccCompile)
        self.registerMethodHandler("cat", self.cat)
        self.registerMethodHandler("make", self.make)
        self.registerMethodHandler("mkdir", self.mkdir)
        self.registerMethodHandler("untar", self.untar)
        self.registerMethodHandler("add_route", self.addRoute)
        self.registerMethodHandler("delete_route", self.delRoute)
        self.registerMethodHandler("config_iface", self.configIface)
        self.registerMethodHandler("click-align", self.clickAlign)
        self.registerMethodHandler("click-install", self.clickInstall)
        self.registerMethodHandler("click-uninstall", self.clickUninstall)
        self.registerMethodHandler("load_module", self.loadModule)
        self.registerMethodHandler("unload_module", self.unloadModule)
        self.registerMethodHandler("linux_forwarding_on", self.linuxForwardingOn)
        self.registerMethodHandler("linux_forwarding_off", self.linuxForwardingOff)

    def __sendReply(self, prot, code, seq, payload):
        if code == 0:
            code = 200
        else:
            code = 422  # returnCodes[422] = "error executing command"
        prot.sendReply(code, seq, payload)

    def autodetect(self, prot, seq, ln, payload):
        pass

    def getComputerID(self, prot, seq, ln, payload):
        self.__sendReply(prot, "0", seq, self.__computerID)

    def executeCommand(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput(payload)
        self.__sendReply(prot, code, seq, payload)

    def gccCompile(self, prot, seq, ln, payload):
        (workDir, filename) = pickle.loads(payload)
        name = filename[: filename.find(".")]
        (code, payload) = commands.getstatusoutput("cd " + worDir + " ; g++ -o " + name + " " + filename)
        self.__sendReply(prot, code, seq, payload)

    def cat(self, prot, seq, ln, payload):
        # print "got cat command"
        payload = pickle.loads(payload)[0]
        (code, payload) = commands.getstatusoutput("cat " + str(payload))
        self.__sendReply(prot, code, seq, payload)

    def make(self, prot, seq, ln, payload):
        (workDir, makeTarget) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("cd " + workDir + " ; make -f " + makeTarget)
        self.__sendReply(prot, code, seq, payload)

    def mkdir(self, prot, seq, ln, payload):
        code = os.mkdir(payload)
        self.__sendReply(prot, code, seq, "")

    def untar(self, prot, seq, ln, payload):
        (tarPath, targetDir) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("tar -xf " + path + " -C " + targetDir)
        self.__sendReply(prot, code, seq, payload)

    def addRoute(self, prot, seq, ln, payload):
        (network, netmask, gateway, interface) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput(
            "route add -net " + network + " netmask " + netmask + " gw " + gateway + " dev " + interface
        )
        self.__sendReply(prot, code, seq, payload)

    def delRoute(self, prot, seq, ln, payload):
        (network, netmask) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("route del -net " + network + " netmask " + netmask)
        self.__sendReply(prot, code, seq, payload)

    def configIface(self, prot, seq, ln, payload):
        (interfaceID, address, mask, status) = pickle.loads(payload)
        try:
            cmd = "ifconfig " + self.__ifaceIDtoNameMappings[interfaceID] + " "
        except KeyError:
            log.error("Key error " + str(self.__ifaceIDtoNameMappings))
            (code, payload) = (400, "Key error for interface")
            self.__sendReply(prot, code, seq, payload)
            return
        if status == "on":
            cmd += address + " netmask " + mask + " up"
        else:
            cmd += "down"
        (code, payload) = commands.getstatusoutput(cmd)
        self.__sendReply(prot, code, seq, payload)

    def clickAlign(self, prot, seq, ln, payload):
        (clickAlignPath, configFile) = pickle.loads(payload)
        basePath = configFile[: configFile.rfind("/")]
        filename = configFile[configFile.rfind("/") + 1 : configFile.find(".")]
        newPathToFile = basePath + "/" + filename + "-aligned.click'"
        (code, payload) = commands.getstatusoutput(clickAlignPath + " " + configFile + " > " + newPathToFile)
        self.__sendReply(prot, code, seq, payload)

    def clickInstall(self, prot, seq, ln, payload):
        (clickInstallPath, configFile, numberThreads) = pickle.loads(payload)
        cmd = click - installPath + " "
        if int(numberThreads) != 0:
            cmd += "--threads=" + numberThreads + " "
        cmd += configFile
        (code, payload) = commands.getstatusoutput(cmd)
        self.__sendReply(prot, code, seq, payload)

    def clickUninstall(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput(payload)
        self.__sendReply(prot, code, seq, payload)

    def loadModule(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput("insmod " + payload)
        self.__sendReply(prot, code, seq, payload)

    def unloadModule(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput("rmmod " + payload)
        self.__sendReply(prot, code, seq, payload)

    def linuxForwardingOn(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput("echo '1' \> /proc/sys/net/ipv4/ip_forward")
        self.__sendReply(prot, code, seq, payload)

    def linuxForwardingOff(self, prot, seq, ln, payload):
        (code, payload) = commands.getstatusoutput("echo '0' \> /proc/sys/net/ipv4/ip_forward")
        self.__sendReply(prot, code, seq, payload)

    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 ComputerDaemon (self)")
        self.stop()
Exemplo n.º 12
0
def createVLAN(switch,name,id,ports=None):
	vlan = VLAN(name,id,ports,None)
	if switch.createVLAN(vlan) != 0:
		print "Error creating vlan"

def deleteVLAN(switch,name,id):
	vlan = VLAN(name,id,[],None)
	if switch.deleteVLAN(vlan) != 0:
		print "Error removing vlan"

print "Content-type: text/html\n\n"
print "<html><title></title><head>"

manager = HenManager()
manager.initLogging()
nodes = manager.getNodes("switch")

for n in nodes.values():
	portsBlackList = []
	s = n.getInstance()
	#s.setSwitchName(n.getNodeID())
	if s != None:
		#printVlans(s)
		deleteVLAN(s,"B",4)
		#createVLAN(s,"A",3,["GigabitEthernet2/1/1","GigabitEthernet2/1/2","GigabitEthernet2/1/3","GigabitEthernet2/1/4"])
		#createVLAN(s,"B",4,["GigabitEthernet2/1/5","GigabitEthernet2/1/6","GigabitEthernet2/1/7","GigabitEthernet2/1/8"])
		#addPorts(s,"vlana",["GigabitEthernet2/1/1","GigabitEthernet2/1/2","GigabitEthernet2/1/3"])
		#deletePorts(s,"vlana",["GigabitEthernet2/1/1","GigabitEthernet2/1/2","GigabitEthernet2/1/3"])
		#
		#addPorts(s,"henexp",[107,106,101])
		#deletePorts(s,"henexp",[108,109,110,111,112,115,116,117])
Exemplo n.º 13
0
Arquivo: hmd.py Projeto: benroeder/HEN
p = auxiliary.protocol.Protocol(None)

# read connection info from user
# host = raw_input("host name (localhost):")
# if (host==""):
#    host = "localhost"
# try:
#    port = int(raw_input("port (1105):"))
# except:
##    port = 1105
host = DaemonPorts().powerDaemonHost
port = DaemonPorts().powerDaemonPort
print "connecting to " + host + "port " + str(port)
p.open(host, port)

# send state!
payload = "10," + pickle.dumps(hm.getNodes("all"))

# p.sendRequest("set_config",payload,state_check)
# p.readAndProcess()
p.doSynchronousCall("set_config", payload)

# read smth from the user
while True:
    method = raw_input("method:")
    payload = raw_input("payload:")
    # p.sendRequest(method,payload,handler)
    # p.readAndProcess()
    print p.doSynchronousCall(method, payload)
Exemplo n.º 14
0
for i in temp:
    sys.path.append(i)

from henmanager import HenManager

###########################################################################################
#   Main execution
###########################################################################################            
print "Content-Type: text/xml"
print ""
print ""

print "<row>"
manager = HenManager("/usr/local/hen/etc/configs/config" )
racks = manager.getInfrastructures("rack")
nodes = manager.getNodes("all", "all")

rackNodes = {}

for key in racks.keys():
    rackNodes[key] = []

for nodeTypeDictionary in nodes.values():
    for node in nodeTypeDictionary.values():
        location = node.getPhysicalLocation()
        if (location != None):
            if rackNodes.has_key(location.getRackName()):
                s = '<node id="' + str(node.getNodeID())
                s += '" type="physicallocation-' + str(node.getNodeType())
                if (location.getRackStartUnit() != None):
                    s += '" rackstartunit="' + str(location.getRackStartUnit())
Exemplo n.º 15
0
class DetectorDaemon(threading.Thread):
    def __init__(self, d, debug):
        self.__debug = debug
        self.__device_list = d
        self.__run = True
        self.__nodes = {}
        self.__running = []
        self.__man_ips = {}
        self.__inf_ips = {}
        self.__symlinksRoot = "/export/machines/"
        if self.__debug:
            self.__etcRoot = "/usr/local/hen/etc/daemons/autodetectiond/debug/"
        else:
            self.__etcRoot = "/usr/local/hen/etc/daemons/autodetectiond/"

        self.load_data()
        self.show_stats()

        threading.Thread.__init__(self)

    def show_stats(self):
        count = 0
        string = "Number of free management ips :"
        for i in self.__man_ips:
            if self.__man_ips[i] == "free":
                count = count + 1
        string = string + str(count)
        log.info(string)
        count = 0
        string = "Number of free infrastructure ips :"
        for i in self.__inf_ips:
            if self.__inf_ips[i] == "free":
                count = count + 1
        string = string + str(count)
        log.info(string)

    def load_data(self):
        log.info("Loading Data")
        self.__manager = HenManager()
        for i in range(1, 254):
            self.__man_ips["192.168.0." + str(i)] = "free"
            self.__inf_ips["192.168.1." + str(i)] = "free"

        n = self.__manager.getNodes("all", "all")
        for nt in n:
            for node in n[nt].values():
                try:
                    man_ip = node.getInterfaces("management")
                    inf_ip = node.getInterfaces("infrastructure")
                    if man_ip != []:
                        self.__nodes[man_ip[0].getIP()] = node
                        self.__man_ips[str(
                            man_ip[0].getIP())] = node.getNodeID()
                    if inf_ip != []:
                        self.__nodes[inf_ip[0].getIP()] = node
                        self.__inf_ips[str(
                            inf_ip[0].getIP())] = node.getNodeID()
                except:
                    pass
        self.show_stats()

    def getFreeIp(self, type_str):
        if type_str == "infrastructure":
            for i in self.__inf_ips:
                if self.__inf_ips[i] == "free":
                    return i
            return "no free infrastructure ip"
        elif type_str == "management":
            for i in self.__man_ips:
                if self.__man_ips[i] == "free":
                    return i
            return "no free infrastructure ip"
        else:
            return "unknown ip type " + type_str

    def writeXML(self, node, old=False):
        xmlstring = self.__manager.parser.writeNodePhysicalFileString(
            node, self.__debug)
        print xmlstring
        filename = self.__etcRoot + node.getNodeID() + ".xml"
        if old:
            filename = filename + ".old"
        try:
            if not self.__debug:
                theFile = open(filename, "w")
                theFile.write(xmlstring)
                theFile.close()
            else:
                print "Would write to file ", filename
                print xmlstring
        except Exception, e:
            log.info("error while writing xml file for " +
                     str(node.getNodeID()))
            log.info(str(e))
            return -1
Exemplo n.º 16
0
#! /usr/bin/env python
from henmanager import HenManager
from auxiliary.hen import Node, SwitchNode, VLAN, Port

manager = HenManager()
manager.initLogging()
nodes = manager.getNodes("switch")

theSwitch = None
for node in nodes.values():
    #    print node
    if (node.getNodeID() == "switch1"):
        print node.getNodeID()
        theSwitch = node.getInstance()

vlans = theSwitch.getFullVLANInfo()
for vlan in vlans:
    print vlan

#res = theSwitch.getVLANToInterfacesTable()

#for p in res:
#    print str(p) + " res " + str(res[p])
Exemplo n.º 17
0
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):
	print "changePowerState got "+tag,action,node,attr
	id = node.xpath("ancestor::node")[0].attributes[(None,'id')].value

	param = str(id)+","+str(attr.value)
	print "Calling powerdaemon power with param "+param
Exemplo n.º 18
0
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):
    print "changePowerState got " + tag, action, node, attr
    id = node.xpath("ancestor::node")[0].attributes[(None, 'id')].value
Exemplo n.º 19
0
#!/usr/local/bin/python

from henmanager import HenManager
import time
import resource
import gc

manager = HenManager()
manager.initLogging()

switches = manager.getNodes("all","all")
alive_list =['switch14', 'switch5', 'serviceprocessor16', 'sensor1', 'serviceprocessor20','serviceprocessor22','serviceprocessor42','serviceprocessor43','serviceprocessor44', 'powerswitch3', 'switch1', 'switch2', 'switch3' , 'switch4' ,'switch8', 'computer71'  ]
switch = {}
#sn = {}
#switch_node = None
for a in switches.values():
    for sw in a.values():
        for h in alive_list:
            if sw.getNodeID() == h:
                
                try:
                    switch[sw.getNodeID()] = sw.getInstance()
                except:
                    
                    pass
num = 1
while True:
    print "run ",num
    for s in switch.keys():
        print s
        #sn[s] = switch[s].getSensorReadings()
Exemplo n.º 20
0
class HardwareDetectionRunner:

    __prot = None
    __host = None
    __port = None
    __hm = None
    __interfaceNames = None
    __data = None

    def __init__(self, host, port):
        self.__prot = auxiliary.protocol.Protocol(None)
        self.__host = host
        self.__port = port
        self.__data = ""
        self.__hm = HenManager()

    def run(self):
        """\brief Runs all the necessary detection methods."""
        print "Running hardware detection:"
        print "\tRetrieving experimental interface names..."
        self.getExperimentalInterfacesNames()
        print "\tPolling interfaces..."
        self.pollInterfaces()
        # Sometimes mii-tool will report no link if this sleep time is not here
        print "Waiting " + str(AUTONEGOTIATION_WAIT_TIME) + \
                " seconds for autonegotiation to finish",
        self.waitForAutonegotiation()
        print "Retrieving number of processors..."
        self.getNumberProcessors()
        print "Retrieving number of cores..."
        self.getNumberCores()
        print "Retrieving no-carrier-sense MACs..."
        self.getNoCarrierMACs()
        print "Retrieving output from lshw..."
        self.getLSHWOutput()
        print "Polling interfaces once to seed fdb"
        self.pollInterfaces()
        print "Sending results to AutodetectDaemon... "
        self.sendData()
        print "Polling interfaces continually..."
        while 1:
            self.pollInterfaces()
            time.sleep(POLL_INTERFACE_INTERVAL)

    def waitForAutonegotiation(self):
        """\brief Prints a dot per second whilst waiting for the number of
            seconds defined by AUTONEGOTIATION_WAIT_TIME
        """
        ticks = AUTONEGOTIATION_WAIT_TIME
        while ticks > 0:
            print '.',
            ticks -= 1
            time.sleep(1)

    def pollInterfaces(self):
        for interfaceName in self.__interfaceNames:
            cmd = "/sbin/ifconfig " + interfaceName + " up"
            os.system(cmd)
            cmd = "etherwake -i " + interfaceName + " 00:11:22:33:44:55"
            os.system(cmd)

    def getExperimentalInterfacesNames(self):
        # First create a list containing the mac addresses of all the interfaces
        macAddresses = []
        macAddressMatcher = re.compile('(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}')
        lines = commands.getstatusoutput("ifconfig -a")[1].splitlines()
        for line in lines:
            matchObject = macAddressMatcher.search(line)
            if (matchObject):
                macAddresses.append(\
                        line[matchObject.start():matchObject.end()].upper())

        # Find which of these is the management interface so we can filter it out
        nodes = self.__hm.getNodes("computer", "all")
        for node in nodes.values():
            managementMACAddress = \
                node.getInterfaces("management")[0].getMAC().upper()
            if (managementMACAddress in macAddresses):
                break

        self.__interfaceNames = []
        for macAddress in macAddresses:
            if (macAddress != managementMACAddress):
                # We need to convert the mac addresses to interface names
                self.__interfaceNames.append(commands.getstatusoutput(\
                                        "ifconfig -a | grep " + macAddress + \
                                        " | awk '{print $1}'")[1])

    def getNumberProcessors(self):
        data = commands.getstatusoutput(\
                "cat /proc/cpuinfo | grep 'physical id'")[1]
        data = data.split("\n")
        uniqueIDs = []
        for line in data:
            processorID = line[line.find(":") + 1:]
            if (processorID not in uniqueIDs):
                uniqueIDs.append(processorID)
        self.__data += "<numbercpus>%s</numbercpus>" % str(len(uniqueIDs))

    def getNumberCores(self):
        data = commands.getstatusoutput(\
                "cat /proc/cpuinfo | grep 'cpu cores'")[1]
        cores = 1
        try:
            data = data.split("\n")[0]
            cores = int(data[data.find(":") + 1:])
        except:
            pass
        self.__data += "<numbercorespercpu>%s</numbercorespercpu>" % str(cores)

    def getNoCarrierMACs(self):
        self.__data += "<nocarriermacs>"
        data = commands.getstatusoutput("mii-tool")[1]
        data = data.split("\n")
        counter = 0
        for line in data:
            if (line.find("no link") != -1):
                ifaceName = line[:line.find(":")]
                data = commands.getstatusoutput(\
                            "ifconfig " + ifaceName)[1].split("\n")[0]
                macAddress = data[data.find("HWaddr") + 7:].strip()
                self.__data += str(macAddress).upper()
                counter += 1
                if (counter != len(noCarrierMACs)):
                    self.__data += ","
        self.__data += "</nocarriermacs>"

    def getLSHWOutput(self):
        self.__data += commands.getstatusoutput("/usr/sbin/lshw -xml")[1]

    def sendData(self):
        """\brief Connects to the autodetectdaemon and sends the data created
            by the detection code.
        """
        self.__prot.open(self.__host, self.__port)
        self.__prot.sendRequest("receive_detectiondata", \
                                self.__data, \
                                self.responseHandler)
        self.__prot.readAndProcess()

    def responseHandler(self, code, seq, size, payload):
        """\brief Handles the response from the autodetectdaemon. We can add
            code here for re-sending the data, if need be.
        """
        if code == 200:
            print "Data successfully received by AutodetectDaemon"
            self.__prot.close()
        else:
            print "ERROR: Received code[%s] from daemon. Payload = %s" % \
                (str(code), str(payload))
Exemplo n.º 21
0
class AutodetectManager(Daemon):

    __hen_manager = None
    __hardware_processor = None

    def __init__(self):
        Daemon.__init__(self)
        self.__hen_manager = HenManager()
        self.__hen_manager.initLogging()
        self.__hardware_processor = LSHardwareProcessor(self.__hen_manager, \
                                                    self.__parseMacTableURL())
        self.__registerMethods()

    def __parseMacTableURL(self):
        """\brief Parses the Hen config file, and returns the MACTABLE_URL
            \return macTableURL - the value of MACTABLE_URL in the Hen config
        """
        configFile = ConfigParser.ConfigParser()
        configFile.read(HEN_CONFIG)
        return configFile.get('AUTODETECT', 'MACTABLE_URL')

    def __registerMethods(self):
        self.registerMethodHandler("receive_detectiondata", \
                                   self.receiveDetectionData)
        self.registerMethodHandler("enable_debug_mode", \
                                   self.enableDebugMode)
        self.registerMethodHandler("disable_debug_mode", \
                                   self.disableDebugMode)

    def enableDebugMode(self,prot,seq,ln,payload):
        self.__hardware_processor.enableDebugMode()
        prot.sendReply(200, seq, "")

    def disableDebugMode(self,prot,seq,ln,payload):
        self.__hardware_processor.disableDebugMode()
        prot.sendReply(200, seq, "")
        
    def receiveDetectionData(self,prot,seq,ln,payload):
        """\brief Method called when detection data is received from
            autodetectclient scripts being run on remote hosts.
        """
        log.debug("receiveDetectionData() called.")
        (nodeid, addr) = self.__ipAddressToNodeID(prot.getSocket())
        if not nodeid or not addr:
            log.warning("Bad results from __ipAddressToNodeID().")
            prot.sendReply(500, seq, \
                   "Failure: Daemon could not resolve IP to nodeid.")
            return
        log.info("received data from %s (%s)" % (str(addr), str(nodeid)))
        prot.sendReply(200, seq, "")
        self.__hardware_processor.parseFileAndPrint(nodeid, payload)


    def __ipAddressToNodeID(self, sock):
        """\brief Retrieves the IP address of the connected client, then tries
            to look up a nodeid for it from HenManager
            \param sock - socket on which the client is connected
            \return nodeid - id of node to which IP address belongs, -1 if not
                                found
        """
        try:
            (addr, port) = sock.getpeername()       
            log.debug("addr %" + str(addr))            
            computerNodes = self.__hen_manager.getNodes("computer", "all")
            for computerNode in computerNodes.values():
                interfaces = computerNode.getInterfaces("management")
                for interface in interfaces:
                    if (interface.getIP() == addr):
                        return (computerNode.getNodeID(), addr)
        except:
            pass
        return (None, None)
Exemplo n.º 22
0
class AutodetectManager(Daemon):

    __hen_manager = None
    __hardware_processor = None

    def __init__(self):
        Daemon.__init__(self)
        self.__hen_manager = HenManager()
        self.__hen_manager.initLogging()
        self.__hardware_processor = LSHardwareProcessor(self.__hen_manager, \
                                                    self.__parseMacTableURL())
        self.__registerMethods()

    def __parseMacTableURL(self):
        """\brief Parses the Hen config file, and returns the MACTABLE_URL
            \return macTableURL - the value of MACTABLE_URL in the Hen config
        """
        configFile = ConfigParser.ConfigParser()
        configFile.read(HEN_CONFIG)
        return configFile.get('AUTODETECT', 'MACTABLE_URL')

    def __registerMethods(self):
        self.registerMethodHandler("receive_detectiondata", \
                                   self.receiveDetectionData)
        self.registerMethodHandler("enable_debug_mode", \
                                   self.enableDebugMode)
        self.registerMethodHandler("disable_debug_mode", \
                                   self.disableDebugMode)

    def enableDebugMode(self, prot, seq, ln, payload):
        self.__hardware_processor.enableDebugMode()
        prot.sendReply(200, seq, "")

    def disableDebugMode(self, prot, seq, ln, payload):
        self.__hardware_processor.disableDebugMode()
        prot.sendReply(200, seq, "")

    def receiveDetectionData(self, prot, seq, ln, payload):
        """\brief Method called when detection data is received from
            autodetectclient scripts being run on remote hosts.
        """
        log.debug("receiveDetectionData() called.")
        (nodeid, addr) = self.__ipAddressToNodeID(prot.getSocket())
        if not nodeid or not addr:
            log.warning("Bad results from __ipAddressToNodeID().")
            prot.sendReply(500, seq, \
                   "Failure: Daemon could not resolve IP to nodeid.")
            return
        log.info("received data from %s (%s)" % (str(addr), str(nodeid)))
        prot.sendReply(200, seq, "")
        self.__hardware_processor.parseFileAndPrint(nodeid, payload)

    def __ipAddressToNodeID(self, sock):
        """\brief Retrieves the IP address of the connected client, then tries
            to look up a nodeid for it from HenManager
            \param sock - socket on which the client is connected
            \return nodeid - id of node to which IP address belongs, -1 if not
                                found
        """
        try:
            (addr, port) = sock.getpeername()
            log.debug("addr %" + str(addr))
            computerNodes = self.__hen_manager.getNodes("computer", "all")
            for computerNode in computerNodes.values():
                interfaces = computerNode.getInterfaces("management")
                for interface in interfaces:
                    if (interface.getIP() == addr):
                        return (computerNode.getNodeID(), addr)
        except:
            pass
        return (None, None)
Exemplo n.º 23
0
#!/usr/bin/env python
import os, sys, commands
from henmanager import HenManager

manager = HenManager()
nodes = manager.getNodes("computer")
user = ""

usage = "usage: reservations.py [computerid] [computerid]\n"
usage += "usage: reservations.py all\n"
usage += "usage: reservations.py model [dell2950|dell1950|dell1850|sunx4100|sunv20z|delloptiplex]\n"
usage += "usage: reservations.py user [username]"

if (len(sys.argv) < 2):
    print usage
    os._exit(0)

if (sys.argv[1] == "model"):

    if (len(sys.argv) != 3):
        print usage
        os._exit(0)
    elif (sys.argv[2] == "dell2950"):
        beginID = "computer81"
        endID = "computer100"
    elif (sys.argv[2] == "dell1950"):
        beginID = "computer56"
        endID = "computer80"
    elif (sys.argv[2] == "dell1850"):
        beginID = "computer21"
        endID = "computer25"
Exemplo n.º 24
0
class ReservationDBManager:
    def __init__(self,
                 filename,
                 rightsFilename,
                 notificationsFilename,
                 dbsRoot,
                 maxNumWeeks=2,
                 debug=False):
        self.__daemonEMail = "*****@*****.**"
        self.__filename = filename
        self.__rightsFilename = rightsFilename
        self.__notificationsFilename = notificationsFilename
        self.__notifications = {}
        self.__dbsRoot = dbsRoot
        self.__maxNumWeeks = maxNumWeeks
        self.__reservations = {}
        self.__rights = {}
        self.__nextID = 0
        self.__xmldoc = None
        self.__rightsXmldoc = None
        self.__henManager = HenManager()
        self.__symlinksRoot = "/export/machines/"
        self.__smtpServerName = "smtp.cs.ucl.ac.uk"
        self.__parser = ReservationDBParser(filename, rightsFilename,
                                            notificationsFilename,
                                            self.__dbsRoot)
        self.__notifier = None
        self.__debug = debug
        self.mytime = datetime.date.today()

        # Start the early notification thread
        self.__notifier = ReservationExpiryNotifier(self.__daemonEMail, \
                                                    self.__smtpServerName, \
                                                    self.__filename, \
                                                    self.__rightsFilename, \
                                                    self.__notificationsFilename, \
                                                    self.__dbsRoot,
                                                    self.__debug)
        if not self.__debug:
            self.__notifier.start()

    # used to test email sending
    def getNotifier(self):
        return self.__notifier

    def reloadHenDB(self):
        self.__henManager = HenManager()
        return 0

    def startDB(self):
        # First parse reservations database
        (result, self.__xmldoc) = self.__parser.openDB(self.__filename)
        if (result < 0):
            log.info("error while opening database!")
            return -1
        elif (result == 1):
            log.info(
                "warning: no database file found (one will be created when a reservation is made)"
            )
            self.__nextID = 1
        else:
            (result,
             self.__reservations) = self.__parser.parseDB(self.__xmldoc)
            # ignore -1, this means that there are no 'reservations' tags
            if (result < 0 and result != -1):
                log.info("error while parsing database!")
                return -1
            else:
                self.__nextID = self.__findHighestID() + 1

        self.cleanExpired()

        # Now parse reservation rights database
        (result,
         self.__rightsXmldoc) = self.__parser.openDB(self.__rightsFilename)
        if (result < 0 or result == 1):
            log.info("error while opening reservation rights database!")
            return -1

        (result,
         self.__rights) = self.__parser.parseRightsDB(self.__rightsXmldoc)
        if (result < 0):
            log.info("error while parsing rights database!")
            return -1

        return 0

    def release(self, username, reservationID):
        if (not self.__reservations.has_key(username)):
            return "unknown user"

        released = False
        reservationsBackup = self.__reservations
        userReservations = self.__reservations[username]
        for userReservation in userReservations:
            if (str(userReservation.getReservationID()) == str(reservationID)):
                userReservations.remove(userReservation)
                self.__removeNotifications(userReservation.getReservationID())
                released = True
                break

        if (not released):
            return "reservation id not found"

        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations = reservationsBackup
            return "error while writing to database, release failed"

        self.__nextID = self.__findHighestID() + 1
        return "reservation released"

    def releaseDevices(self, username, devices):
        if (not self.__reservations.has_key(username)):
            return "unknown user"

        reservationsBackup = self.__reservations
        released = []
        userReservations = self.__reservations[username]
        for userReservation in userReservations:
            for device in userReservation.getDevices():
                if (device in devices):
                    userReservation.getDevices().remove(device)
                    released.append(device)

        # Remove any reservations with no devices in them
        for x in range(len(userReservations) - 1, -1, -1):
            if (len(userReservations[x].getDevices()) == 0):
                del userReservations[x]

        if (len(released) == 0):
            return "none of the devices were found in your reservations"

        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations = reservationsBackup
            return "error while writing to database, release failed"

        self.__nextID = self.__findHighestID() + 1
        string = "released: "
        for device in released:
            string += str(device) + ", "
        string = string[:len(string) - 2]
        return string

    def renew(self, username, reservationID, endDate):
        # Check for expired reservations first and release them
        self.cleanExpired()

        currentDate = self.__getCurrentDate()  #datetime.date.today()
        if (endDate <= currentDate):
            return "renewal failed: supplied end date is in the past"

        maxDate = currentDate + timedelta(weeks=self.__getMaxWeeks(
            username, self.__getReservedDevicesByID(reservationID)))
        trimmedDate = False
        if (endDate > maxDate):
            endDate = maxDate
            trimmedDate = True

        if (self.__reservations.has_key(username)):
            for userReservation in self.__reservations[username]:
                if (int(userReservation.getReservationID()) == int(
                        reservationID)):
                    oldDate = userReservation.getEndDate()
                    userReservation.setEndDate(endDate)
                    self.__removeNotifications(
                        userReservation.getReservationID())
                    if (self.__parser.writeDBToDisk(self.__reservations) < 0):
                        userReservation.setEndDate(oldDate)
                        return "error while writing to database, renew failed"
                    message = "reservation renewed (new end date=" + str(
                        self.__convertDateToString(endDate)) + ")"
                    if (trimmedDate):
                        message += "\nnote: the desired date was ignored because the max allocation period is " + \
                                   str(self.__maxNumWeeks) + " week(s)"
                    return message

        return "no reservation found for id=" + str(
            reservationID) + " and username="******"add"):
            for device in devices:
                if (self.__isDeviceInUse(device)):
                    return "reservation failed: " + str(
                        device) + " already reserved"

        if (self.__reservations.has_key(username)):
            for userReservation in self.__reservations[username]:
                if (int(userReservation.getReservationID()) == int(
                        reservationID)):

                    oldDevices = userReservation.getEndDate()
                    oldEmail = userReservation.getEmail()
                    if (opType == "add"):
                        userReservation.appendDevices(devices)
                    elif (opType == "remove"):
                        userReservation.removeDevices(devices)

                    if (email != None):
                        userReservation.setEmail(email)
                    if (self.__parser.writeDBToDisk(self.__reservations) < 0):
                        userReservation.setDevices(oldDevices)
                        if (email != None):
                            userReservation.setEmail(oldEmail)
                        return "error while writing to database, update failed"
                    message = "reservation updated"
                    return message

        return "no reservation found for id=" + str(
            reservationID) + " and username="******"reservation failed: supplied end date is in the past"
        maxDate = currentDate + timedelta(
            weeks=self.__getMaxWeeks(username, devices))
        trimmedDate = False
        if (endDate > maxDate):
            endDate = maxDate
            trimmedDate = True

        # First make sure that the devices are free
        for device in devices:
            if (self.__isDeviceInUse(device)):
                return "reservation failed: " + str(
                    device) + " already reserved"

        # Add to in-memory db
        reservationID = self.__getNextID()
        if (not self.__reservations.has_key(username)):
            self.__reservations[username] = []
        entry = ReservationEntry(username, email, devices, endDate,
                                 reservationID)
        self.__reservations[username].append(entry)

        # Write-out to on-disk db
        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations[username].remove(entry)
            return "reservation failed: could not write database to disk"

        message = "reservation succeeded (id = " + str(reservationID) + ", " + \
                  "end date=" + str(self.__convertDateToString(endDate)) + ")"
        if (trimmedDate):
            message += "\nnote: the desired date was ignored because the max allocation period is " + \
                       str(self.__maxNumWeeks) + " week(s)"

        return message

    def getReservationsInfo(self, username):
        if username == "all":
            info = ""
            for name in self.__reservations:
                for reservation in self.__reservations[name]:
                    info += reservation.getInfoStr() + " " + str(name) + "\n"
            return info
        if (not self.__reservations.has_key(username)):
            return "no info"
        info = ""
        if len(self.__reservations[username]) == 0:
            return "no info"
        for reservation in self.__reservations[username]:
            info += reservation.getInfoStr() + "\n"
        info.rstrip('\n')
        return info

    def inUseBy(self, username):
        devices = []
        if (not self.__reservations.has_key(username)):
            return devices
        for reservation in self.__reservations[username]:
            for reservedDevice in reservation.getDevices():
                devices.append(reservedDevice)
        return devices

    def getFreeDevices(self):
        allDevices = self.__henManager.getNodes("computer").keys()
        allDevices.extend(self.__henManager.getNodes("virtualcomputer").keys())
        freeDevices = []
        reservedDevices = self.__getReservedDevices()
        for device in allDevices:
            if (device not in reservedDevices):
                freeDevices.append(device)
        return freeDevices

    def cleanExpired(self):
        currentDate = self.__getCurrentDate()  #datetime.date.today()
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                if (userReservation.getEndDate() < currentDate):
                    self.release(username, userReservation.getReservationID())
                    dirListing = self.__listDirectory(
                        userReservation.getDevices())
                    self.__removeNotifications(
                        userReservation.getReservationID())
                    self.__clearSymLinks(userReservation.getDevices())
                    self.__poweroff(userReservation.getDevices())
                    self.__sendEmailExpired(userReservation, dirListing)
                    log.info("cleaned expired reservation: " +
                             str(userReservation))
        return 0

    def getOwners(self, devices):
        results = []
        for device in devices:
            owner = self.__getOwner(device)
            results.append((device, owner))
        return results

    def __parseNotifications(self):
        (result, xmldoc) = self.__parser.openDB(self.__notificationsFilename)
        if (result < 0):
            log.info("error while opening notifications database!")
            return -1
        elif (result == 1):
            log.info("warning, no notifications database file found")
            return 1
        else:
            (result,
             self.__notifications) = self.__parser.parseNotificationsDB(xmldoc)
            # ignore -1, this means that there are no 'notifications' tags
            if (result < 0 and result != -1):
                log.info("error while parsing notifications database!")
                return -1
        return 0

    def __removeNotifications(self, reservationID):
        if (self.__parseNotifications() != 0):
            return
        try:
            del self.__notifications[int(reservationID)]
        except:
            log.info("warning: no notifications to delete for id=" +
                     str(reservationID))
        self.__parser.writeNotificationsDBToDisk(self.__notifications)

    def __getCurrentDate(self):
        if not self.__debug:
            return datetime.date.today()
        else:
            return self.mytime

    def __getMaxWeeks(self, username, devices):
        if (not self.__rights.has_key(username) or len(devices) == 0):
            return self.__maxNumWeeks

        minRightWeeks = 99999
        foundDevs = []
        rights = self.__rights[username]
        for device in devices:
            for right in rights:
                if (device in right.getDevices()):
                    foundDevs.append(device)
                    if (right.getMaxWeeks() < minRightWeeks):
                        minRightWeeks = right.getMaxWeeks()

        if (set(devices) == set(foundDevs)):
            return minRightWeeks

        return self.__maxNumWeeks

    def __listDirectory(self, devices):
        dirListing = ""
        for device in devices:
            dirListing += str(device) + " :\n"
            dirListing += commands.getoutput('find ' + self.__symlinksRoot +
                                             device + ' -print ')
            dirListing += "\n"
        return dirListing

    def __clearSymLinks(self, devices):
        # temp suspend clearing links , adam 12/08/2008
        return
        for device in devices:
            if not self.__debug:
                os.system("rm " + self.__symlinksRoot + device + "/*")
            else:
                print "would run : rm " + self.__symlinksRoot + device + "/*"

    def __poweroff(self, devices):
        # temp suspend poweroff , adam 12/08/2008
        return
        for device in devices:
            if not self.__debug:
                self.__henManager.powerSilent(device, "poweroff")
            else:
                print "would turn off " + str(device)

    def __sendEmailExpired(self, reservation, dirListing=None):
        subject = "Your reservation (id = " + str(
            reservation.getReservationID()) + ") has expired"
        body = "The reservation you had made has expired and has been removed from the system. " + \
               "If you still wish to use the devices you had reserved you will have to create a new " + \
               "reservation by logging on to hen.cs.ucl.ac.uk and running the command 'hm reservation'."
        if dirListing != None:
            body += "The directory listings for your machines were :\n"
            body += dirListing
        if not self.__debug:
            smtpClient = SMTPClient(self.__smtpServerName)
            smtpClient.sendEmail(reservation.getEmail(), self.__daemonEMail,
                                 subject, body)
            smtpClient.close()
        else:
            print "would send email."
            print "to :" + str(reservation.getEmail())
            print "subject :" + subject
            print "via :" + self.__smtpServerName
            print "body :" + body

    def __findHighestID(self):
        highestID = 0
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                if (int(userReservation.getReservationID()) > highestID):
                    highestID = int(userReservation.getReservationID())
        return highestID

    def __getNextID(self):
        theID = self.__nextID
        self.__nextID += 1
        return theID

    def __isDeviceInUse(self, device):
        return (self.__getOwner(device) != None)

    def __getOwner(self, device):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                for reservedDevice in userReservation.getDevices():
                    if (reservedDevice == device):
                        return username
        return None

    def __getReservedDevices(self):
        reservedDevices = []
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                for device in userReservation.getDevices():
                    reservedDevices.append(device)
        return reservedDevices

    def __getReservedDevicesByID(self, reservationID):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                if (userReservation.getReservationID() == reservationID):
                    return userReservation.getDevices()
        return []

    def __printReservations(self):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            email = userReservations[0].getEmail()
            log.info("\nuser: "******"(" + str(email) + ")" + \
                  "\n---------------------------------")
            for userReservation in userReservations:
                log.info(userReservation.getDateDevStr())

    def __printRights(self):
        for username in self.__rights.keys():
            userRights = self.__rights[username]
            email = userRights[0].getEmail()
            log.info("\nuser: "******"(" + str(email) + ")" + \
                  "\n---------------------------------")
            for userRight in userRights:
                log.info(userRight.getDebugStr())

    def __convertDateToString(self, date):
        return str(date.day) + "/" + str(date.month) + "/" + str(date.year)
Exemplo n.º 25
0
# First create a list containing the mac addresses of all the running interfaces
macAddresses = []
macAddressMatcher = re.compile('(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}')
lines = commands.getstatusoutput("ifconfig")[1].splitlines()
for line in lines:
    matchObject = macAddressMatcher.search(line)
    if (matchObject):
        macAddresses.append(
            line[matchObject.start():matchObject.end()].upper())

# Now match the created list against all of the management mac addresses in the testbed's database
# for computer nodes
manager = HenManager()
manager.initLogging()
nodes = manager.getNodes("computer", "all")
nodeName = None
for node in nodes.values():
    for interface in node.getInterfaces("management"):
        for macAddress in macAddresses:
            if (macAddress == interface.getMAC().upper()):
                nodeName = node.getNodeID()
if nodeName == None:
    nodes = manager.getNodes("virtualcomputer", "all")
    for node in nodes.values():
        for interface in node.getInterfaces("management"):
            for macAddress in macAddresses:
                if (macAddress == interface.getMAC().upper()):
                    nodeName = node.getNodeID()
print nodeName
Exemplo n.º 26
0
from henmanager import HenManager

# First create a list containing the mac addresses of all the running interfaces
macAddresses = []
macAddressMatcher = re.compile("(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}")
lines = commands.getstatusoutput("ifconfig")[1].splitlines()
for line in lines:
    matchObject = macAddressMatcher.search(line)
    if matchObject:
        macAddresses.append(line[matchObject.start() : matchObject.end()].upper())

# Now match the created list against all of the management mac addresses in the testbed's database
# for computer nodes
manager = HenManager()
manager.initLogging()
nodes = manager.getNodes("computer", "all")
nodeName = None
for node in nodes.values():
    for interface in node.getInterfaces("management"):
        for macAddress in macAddresses:
            if macAddress == interface.getMAC().upper():
                nodeName = node.getNodeID()
if nodeName == None:
    nodes = manager.getNodes("virtualcomputer", "all")
    for node in nodes.values():
        for interface in node.getInterfaces("management"):
            for macAddress in macAddresses:
                if macAddress == interface.getMAC().upper():
                    nodeName = node.getNodeID()
print nodeName
Exemplo n.º 27
0
#!/usr/local/bin/python

from henmanager import HenManager
import time
import resource
import gc

manager = HenManager()
manager.initLogging()

switches = manager.getNodes("switch", "all")

switch = None
#switch_node = None
for sw in switches.values():
    if sw.getNodeID() == "switch5":
        #switch_node = sw
        switch = sw.getInstance()
while True:

    sn = switch.getSensorReadings()
    print sn,
    print resource.getrusage(resource.RUSAGE_SELF)[2]
    try:
        pnodeid = switch.getPowerNodeID()
        if (pnodeid == "None" or pnodeid == "none"):
            pass
        (st,msg) = manager.powerSilent(switch.getNodeID(), "status", \
                                                    pnodeid)
        print "power status[%S], message[%s]" % (st, msg)
    except:
Exemplo n.º 28
0
for i in temp:
    sys.path.append(i)
#os.environ["PATH"] += ":/usr/local/bin:/usr/bin"
from henmanager import HenManager

###########################################################################################
#   Main execution
###########################################################################################
print "Content-Type: text/xml"
print ""
print ""

print "<row>"
manager = HenManager("/usr/local/hen/etc/configs/config")
racks = manager.getInfrastructures("rack", "all")
nodes = manager.getNodes("all", "all")

for key in racks.keys():
    r = manager.getInfrastructures("rack")[key]
    s = '<rack id="' + str(r.getID()) + \
        '" rowposition="' + str(r.getRowPosition()) + \
        '" height="' + str(r.getPhysicalSize().getNumberUnits())

    if (r.getPhysicalSize().getWidth() == "75"):
        s += '" width="wide" >'
    elif (r.getPhysicalSize().getWidth() == "60"):
        s += '" width="narrow" >'
    else:
        s += '" width="wide" >'
    print s
Exemplo n.º 29
0
class ReservationDBManager:
    def __init__(self, filename, rightsFilename, notificationsFilename, dbsRoot, maxNumWeeks=2,debug=False):
        self.__daemonEMail = "*****@*****.**"        
        self.__filename = filename
        self.__rightsFilename = rightsFilename
        self.__notificationsFilename = notificationsFilename
        self.__notifications = {}        
        self.__dbsRoot = dbsRoot
        self.__maxNumWeeks = maxNumWeeks
        self.__reservations = {}
        self.__rights = {}
        self.__nextID = 0
        self.__xmldoc = None
        self.__rightsXmldoc = None
        self.__henManager = HenManager()
        self.__symlinksRoot = "/export/machines/"
        self.__smtpServerName = "smtp.cs.ucl.ac.uk"
        self.__parser = ReservationDBParser(filename, rightsFilename, notificationsFilename, self.__dbsRoot)
        self.__notifier = None        
        self.__debug = debug
        self.mytime = datetime.date.today()
        
        # Start the early notification thread
        self.__notifier = ReservationExpiryNotifier(self.__daemonEMail, \
                                                    self.__smtpServerName, \
                                                    self.__filename, \
                                                    self.__rightsFilename, \
                                                    self.__notificationsFilename, \
                                                    self.__dbsRoot,
                                                    self.__debug)
        if not self.__debug:
            self.__notifier.start()
        
    # used to test email sending
    def getNotifier(self):
        return self.__notifier

    def reloadHenDB(self):
        self.__henManager = HenManager()
        return 0
    
    def startDB(self):
        # First parse reservations database
        (result, self.__xmldoc) = self.__parser.openDB(self.__filename)
        if (result < 0):
            log.info("error while opening database!")
            return -1
        elif (result == 1):
            log.info("warning: no database file found (one will be created when a reservation is made)")
            self.__nextID = 1
        else:
            (result, self.__reservations) = self.__parser.parseDB(self.__xmldoc)
            # ignore -1, this means that there are no 'reservations' tags
            if (result < 0 and result != -1):
                log.info("error while parsing database!")
                return -1
            else:
                self.__nextID = self.__findHighestID() + 1

        self.cleanExpired()

        # Now parse reservation rights database
        (result, self.__rightsXmldoc) = self.__parser.openDB(self.__rightsFilename)
        if (result < 0 or result == 1):
            log.info("error while opening reservation rights database!")
            return -1

        (result, self.__rights) = self.__parser.parseRightsDB(self.__rightsXmldoc)
        if (result < 0):
            log.info("error while parsing rights database!")
            return -1

        return 0

    def release(self, username, reservationID):
        if (not self.__reservations.has_key(username)):
            return "unknown user"

        released = False
        reservationsBackup = self.__reservations
        userReservations = self.__reservations[username]
        for userReservation in userReservations:
            if (str(userReservation.getReservationID()) == str(reservationID)):
                userReservations.remove(userReservation)
                self.__removeNotifications(userReservation.getReservationID())
                released = True
                break

        if (not released):
            return "reservation id not found"
        
        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations = reservationsBackup
            return "error while writing to database, release failed"            

        self.__nextID = self.__findHighestID() + 1
        return "reservation released"
        
    def releaseDevices(self, username, devices):
        if (not self.__reservations.has_key(username)):
            return "unknown user"
        
        reservationsBackup = self.__reservations
        released = []
        userReservations = self.__reservations[username]
        for userReservation in userReservations:
            for device in userReservation.getDevices():
                if (device in devices):
                    userReservation.getDevices().remove(device)
                    released.append(device)

        # Remove any reservations with no devices in them
        for x in range(len(userReservations) - 1, -1, -1):
            if (len(userReservations[x].getDevices()) == 0):
                del userReservations[x]
        
        if (len(released) == 0):
            return "none of the devices were found in your reservations"
        
        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations = reservationsBackup
            return "error while writing to database, release failed"

        self.__nextID = self.__findHighestID() + 1
        string = "released: "
        for device in released:
            string += str(device) + ", "
        string = string[:len(string) - 2]
        return string
        
    def renew(self, username, reservationID, endDate):
        # Check for expired reservations first and release them
        self.cleanExpired()
        
        currentDate = self.__getCurrentDate() #datetime.date.today()
        if (endDate <= currentDate):
            return "renewal failed: supplied end date is in the past"

        maxDate = currentDate + timedelta(weeks=self.__getMaxWeeks(username, self.__getReservedDevicesByID(reservationID)))
        trimmedDate = False
        if (endDate > maxDate):
            endDate = maxDate
            trimmedDate = True

        if (self.__reservations.has_key(username)):
            for userReservation in self.__reservations[username]:
                if (int(userReservation.getReservationID()) == int(reservationID)):
                    oldDate = userReservation.getEndDate()
                    userReservation.setEndDate(endDate)
                    self.__removeNotifications(userReservation.getReservationID())
                    if (self.__parser.writeDBToDisk(self.__reservations) < 0):
                        userReservation.setEndDate(oldDate)
                        return "error while writing to database, renew failed"
                    message = "reservation renewed (new end date=" + str(self.__convertDateToString(endDate)) + ")"
                    if (trimmedDate):
                        message += "\nnote: the desired date was ignored because the max allocation period is " + \
                                   str(self.__maxNumWeeks) + " week(s)"
                    return message
                                    
        return "no reservation found for id=" + str(reservationID) + " and username="******"add"):
            for device in devices:
                if (self.__isDeviceInUse(device)):
                    return "reservation failed: " + str(device) + " already reserved"
            
        if (self.__reservations.has_key(username)):
            for userReservation in self.__reservations[username]:
                if (int(userReservation.getReservationID()) == int(reservationID)):
                    
                    oldDevices = userReservation.getEndDate()
                    oldEmail = userReservation.getEmail()
                    if (opType == "add"):
                        userReservation.appendDevices(devices)
                    elif (opType == "remove"):
                        userReservation.removeDevices(devices)
                        
                    if (email != None):
                        userReservation.setEmail(email)
                    if (self.__parser.writeDBToDisk(self.__reservations) < 0):
                        userReservation.setDevices(oldDevices)
                        if (email != None):
                            userReservation.setEmail(oldEmail)
                        return "error while writing to database, update failed"
                    message = "reservation updated"
                    return message
                                    
        return "no reservation found for id=" + str(reservationID) + " and username="******"reservation failed: supplied end date is in the past"
        maxDate = currentDate + timedelta(weeks=self.__getMaxWeeks(username, devices))
        trimmedDate = False
        if (endDate > maxDate):
            endDate = maxDate
            trimmedDate = True
        
        # First make sure that the devices are free
        for device in devices:
            if (self.__isDeviceInUse(device)):
                return "reservation failed: " + str(device) + " already reserved"

        # Add to in-memory db
        reservationID = self.__getNextID()
        if (not self.__reservations.has_key(username)):
            self.__reservations[username] = []
        entry = ReservationEntry(username, email, devices, endDate, reservationID)
        self.__reservations[username].append(entry)
        
        # Write-out to on-disk db
        if (self.__parser.writeDBToDisk(self.__reservations) < 0):
            self.__reservations[username].remove(entry)
            return "reservation failed: could not write database to disk"

        message = "reservation succeeded (id = " + str(reservationID) + ", " + \
                  "end date=" + str(self.__convertDateToString(endDate)) + ")"
        if (trimmedDate):
            message += "\nnote: the desired date was ignored because the max allocation period is " + \
                       str(self.__maxNumWeeks) + " week(s)"

        return message

    def getReservationsInfo(self, username):
        if username == "all":
            info = ""
            for name in self.__reservations:
                for reservation in self.__reservations[name]:
                    info += reservation.getInfoStr() +" "+str(name)+"\n"
            return info
        if (not self.__reservations.has_key(username)):
            return "no info"
        info = ""
        if len(self.__reservations[username]) == 0:
            return "no info"
        for reservation in self.__reservations[username]:
            info += reservation.getInfoStr() + "\n"
        info.rstrip('\n')
        return info
    
    def inUseBy(self, username):
        devices = []
        if (not self.__reservations.has_key(username)):
            return devices
        for reservation in self.__reservations[username]:
            for reservedDevice in reservation.getDevices():
                devices.append(reservedDevice)
        return devices
    
    def getFreeDevices(self):
        allDevices = self.__henManager.getNodes("computer").keys()
        allDevices.extend(self.__henManager.getNodes("virtualcomputer").keys())
        freeDevices = []
        reservedDevices = self.__getReservedDevices()
        for device in allDevices:
            if (device not in reservedDevices):
                freeDevices.append(device)
        return freeDevices

    def cleanExpired(self):
        currentDate = self.__getCurrentDate() #datetime.date.today()
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                if (userReservation.getEndDate() < currentDate):
                    self.release(username, userReservation.getReservationID())
                    dirListing = self.__listDirectory(userReservation.getDevices())
                    self.__removeNotifications(userReservation.getReservationID())
                    self.__clearSymLinks(userReservation.getDevices())
                    self.__poweroff(userReservation.getDevices())
                    self.__sendEmailExpired(userReservation,dirListing)
                    log.info("cleaned expired reservation: " + str(userReservation))
        return 0
    
    def getOwners(self, devices):
        results = []
        for device in devices:
            owner = self.__getOwner(device)
            results.append((device, owner))
        return results

    def __parseNotifications(self):
        (result, xmldoc) = self.__parser.openDB(self.__notificationsFilename)
        if (result < 0):
            log.info("error while opening notifications database!")
            return -1        
        elif (result == 1):
            log.info("warning, no notifications database file found")
            return 1
        else:
            (result, self.__notifications) = self.__parser.parseNotificationsDB(xmldoc)
            # ignore -1, this means that there are no 'notifications' tags
            if (result < 0 and result != -1):
                log.info("error while parsing notifications database!")
                return -1
        return 0
    
    def __removeNotifications(self, reservationID):
        if (self.__parseNotifications() != 0):
            return
        try:
            del self.__notifications[int(reservationID)]
        except:
            log.info("warning: no notifications to delete for id=" + str(reservationID))
        self.__parser.writeNotificationsDBToDisk(self.__notifications)

    def __getCurrentDate(self):
        if not self.__debug:
            return datetime.date.today()
        else :
            return self.mytime
        
    def __getMaxWeeks(self, username, devices):
        if (not self.__rights.has_key(username) or len(devices) == 0):
            return self.__maxNumWeeks

        minRightWeeks = 99999
        foundDevs = []
        rights = self.__rights[username]        
        for device in devices:
            for right in rights:
                if (device in right.getDevices()):
                    foundDevs.append(device)
                    if (right.getMaxWeeks() < minRightWeeks):
                        minRightWeeks = right.getMaxWeeks()

        if (set(devices) == set(foundDevs)):
            return minRightWeeks
        
        return self.__maxNumWeeks

    def __listDirectory(self, devices):
        dirListing = ""
        for device in devices:
            dirListing += str(device)+" :\n"
            dirListing += commands.getoutput('find ' + self.__symlinksRoot + device + ' -print ')
            dirListing += "\n"
        return dirListing
        
    def __clearSymLinks(self, devices):
        # temp suspend clearing links , adam 12/08/2008
        return
        for device in devices:
            if not self.__debug:
                os.system("rm " + self.__symlinksRoot + device + "/*")
            else:
                print "would run : rm " + self.__symlinksRoot + device + "/*"

    def __poweroff(self, devices):
        # temp suspend poweroff , adam 12/08/2008
        return
        for device in devices:
            if not self.__debug:
                self.__henManager.powerSilent(device, "poweroff")
            else:
                print "would turn off "+str(device)
    
    def __sendEmailExpired(self, reservation,dirListing=None):
        subject = "Your reservation (id = " + str(reservation.getReservationID()) + ") has expired"
        body = "The reservation you had made has expired and has been removed from the system. " + \
               "If you still wish to use the devices you had reserved you will have to create a new " + \
               "reservation by logging on to hen.cs.ucl.ac.uk and running the command 'hm reservation'."
        if dirListing != None:
            body += "The directory listings for your machines were :\n"
            body += dirListing
        if not self.__debug:
            smtpClient = SMTPClient(self.__smtpServerName)
            smtpClient.sendEmail(reservation.getEmail(), self.__daemonEMail, subject, body)
            smtpClient.close()
        else:
            print "would send email."
            print "to :"+str(reservation.getEmail())
            print "subject :"+subject
            print "via :"+self.__smtpServerName
            print "body :"+body
        
    def __findHighestID(self):
        highestID = 0
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:        
                if (int(userReservation.getReservationID()) > highestID):
                    highestID = int(userReservation.getReservationID())
        return highestID
    
    def __getNextID(self):
        theID = self.__nextID
        self.__nextID += 1
        return theID
        
    def __isDeviceInUse(self, device):
        return (self.__getOwner(device) != None)
    
    def __getOwner(self, device):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                for reservedDevice in userReservation.getDevices():
                    if (reservedDevice == device):
                        return username
        return None
    
    def __getReservedDevices(self):
        reservedDevices = []
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                for device in userReservation.getDevices():
                    reservedDevices.append(device)
        return reservedDevices

    def __getReservedDevicesByID(self, reservationID):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            for userReservation in userReservations:
                if (userReservation.getReservationID() == reservationID):
                    return userReservation.getDevices()
        return []
    
    def __printReservations(self):
        for username in self.__reservations.keys():
            userReservations = self.__reservations[username]
            email = userReservations[0].getEmail()
            log.info("\nuser: "******"(" + str(email) + ")" + \
                  "\n---------------------------------")
            for userReservation in userReservations:
                log.info(userReservation.getDateDevStr())

    def __printRights(self):
        for username in self.__rights.keys():
            userRights = self.__rights[username]
            email = userRights[0].getEmail()
            log.info("\nuser: "******"(" + str(email) + ")" + \
                  "\n---------------------------------")
            for userRight in userRights:
                log.info(userRight.getDebugStr())
                
    def __convertDateToString(self, date):
        return str(date.day) + "/" + str(date.month) + "/" + str(date.year)
Exemplo n.º 30
0
class HardwareDetectionRunner:

    __prot = None
    __host = None
    __port = None
    __hm = None
    __interfaceNames = None
    __data = None

    def __init__(self, host, port):
        self.__prot = auxiliary.protocol.Protocol(None)
        self.__host = host
        self.__port = port
        self.__data = ""
        self.__hm = HenManager()

    def run(self):
        """\brief Runs all the necessary detection methods."""
        print "Running hardware detection:"
        print "\tRetrieving experimental interface names..."
        self.getExperimentalInterfacesNames()
        print "\tPolling interfaces..."
        self.pollInterfaces()
        # Sometimes mii-tool will report no link if this sleep time is not here
        print "Waiting " + str(AUTONEGOTIATION_WAIT_TIME) + \
                " seconds for autonegotiation to finish",
        self.waitForAutonegotiation()
        print "Retrieving number of processors..."
        self.getNumberProcessors()
        print "Retrieving number of cores..."
        self.getNumberCores()
        print "Retrieving no-carrier-sense MACs..."
        self.getNoCarrierMACs()
        print "Retrieving output from lshw..."
        self.getLSHWOutput()
        print "Polling interfaces once to seed fdb"
        self.pollInterfaces()
        print "Sending results to AutodetectDaemon... "
        self.sendData()
        print "Polling interfaces continually..."
        while 1:
            self.pollInterfaces()    
            time.sleep(POLL_INTERFACE_INTERVAL)

    def waitForAutonegotiation(self):
        """\brief Prints a dot per second whilst waiting for the number of
            seconds defined by AUTONEGOTIATION_WAIT_TIME
        """
        ticks = AUTONEGOTIATION_WAIT_TIME
        while ticks > 0:
            print '.',
            ticks -= 1
            time.sleep(1)

    def pollInterfaces(self):
        for interfaceName in self.__interfaceNames:
            cmd = "/sbin/ifconfig " + interfaceName + " up"
            os.system(cmd)
            cmd = "etherwake -i " + interfaceName + " 00:11:22:33:44:55"
            os.system(cmd)

    def getExperimentalInterfacesNames(self):
        # First create a list containing the mac addresses of all the interfaces
        macAddresses = []
        macAddressMatcher = re.compile('(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}')
        lines = commands.getstatusoutput("ifconfig -a")[1].splitlines()
        for line in lines:
            matchObject = macAddressMatcher.search(line)
            if (matchObject):
                macAddresses.append(\
                        line[matchObject.start():matchObject.end()].upper())

        # Find which of these is the management interface so we can filter it out
        nodes = self.__hm.getNodes("computer", "all")
        for node in nodes.values():
            managementMACAddress = \
                node.getInterfaces("management")[0].getMAC().upper()
            if (managementMACAddress in macAddresses):
                break

        self.__interfaceNames = []
        for macAddress in macAddresses:
            if (macAddress != managementMACAddress):
                # We need to convert the mac addresses to interface names
               self.__interfaceNames.append(commands.getstatusoutput(\
                                       "ifconfig -a | grep " + macAddress + \
                                       " | awk '{print $1}'")[1])

    def getNumberProcessors(self):
        data = commands.getstatusoutput(\
                "cat /proc/cpuinfo | grep 'physical id'")[1]
        data = data.split("\n")
        uniqueIDs = []
        for line in data:
            processorID = line[line.find(":") + 1:]
            if (processorID not in uniqueIDs):
                uniqueIDs.append(processorID)
        self.__data += "<numbercpus>%s</numbercpus>" % str(len(uniqueIDs))

    def getNumberCores(self):
        data = commands.getstatusoutput(\
                "cat /proc/cpuinfo | grep 'cpu cores'")[1]
        cores = 1
        try:
            data = data.split("\n")[0]
            cores =  int(data[data.find(":") + 1:])
        except:
            pass
        self.__data += "<numbercorespercpu>%s</numbercorespercpu>" % str(cores)

    def getNoCarrierMACs(self):
        self.__data += "<nocarriermacs>"
        data = commands.getstatusoutput("mii-tool")[1]
        data = data.split("\n")
        counter = 0
        for line in data:
            if (line.find("no link") != -1):
                ifaceName = line[:line.find(":")]
                data = commands.getstatusoutput(\
                            "ifconfig " + ifaceName)[1].split("\n")[0]
                macAddress = data[data.find("HWaddr") + 7:].strip()
                self.__data += str(macAddress).upper()
                counter += 1
                if (counter != len(noCarrierMACs)):
                    self.__data += ","
        self.__data += "</nocarriermacs>"

    def getLSHWOutput(self):
        self.__data += commands.getstatusoutput("/usr/sbin/lshw -xml")[1]

    def sendData(self):
        """\brief Connects to the autodetectdaemon and sends the data created
            by the detection code.
        """
        self.__prot.open(self.__host, self.__port)
        self.__prot.sendRequest("receive_detectiondata", \
                                self.__data, \
                                self.responseHandler)
        self.__prot.readAndProcess()

    def responseHandler(self,code,seq,size,payload):
        """\brief Handles the response from the autodetectdaemon. We can add
            code here for re-sending the data, if need be.
        """
        if code == 200:
            print "Data successfully received by AutodetectDaemon"
            self.__prot.close()
        else:
            print "ERROR: Received code[%s] from daemon. Payload = %s" % \
                (str(code), str(payload))
Exemplo n.º 31
0
Arquivo: hmd.py Projeto: sohonet/HEN
p = auxiliary.protocol.Protocol(None)

#read connection info from user
#host = raw_input("host name (localhost):")
#if (host==""):
#    host = "localhost"
#try:
#    port = int(raw_input("port (1105):"))
#except:
##    port = 1105
host = DaemonPorts().powerDaemonHost
port = DaemonPorts().powerDaemonPort
print "connecting to " + host + "port " + str(port)
p.open(host, port)

#send state!
payload = "10," + pickle.dumps(hm.getNodes("all"))

#p.sendRequest("set_config",payload,state_check)
#p.readAndProcess()
p.doSynchronousCall("set_config", payload)

#read smth from the user
while True:
    method = raw_input("method:")
    payload = raw_input("payload:")
    #p.sendRequest(method,payload,handler)
    #p.readAndProcess()
    print p.doSynchronousCall(method, payload)
Exemplo n.º 32
0
class ComputerControl(Daemon):
    """\brief Implements basic computer daemon functionality.
    """
    __version = "Computer Daemon v0.1 (simple)"
    __henManager = None
    
    def __init__(self):
        Daemon.__init__(self)
        self.__henManager = HenManager()
        # Allow specialized instance dictionary to be created in hm
        # self.__henManager.createNodeInstances()
        self.__registerMethods()
        self.__computerID = self.__getComputerID()
        self.__computerInfo = self.__henManager.getNodes("computer")[self.__computerID]
        self.__ifaceIDtoNameMappings = self.__getIfaceMappings()

    def getComputerManagementIP(self):
        # Get the management ip address so that we can bind to it.
        interfaces = self.__computerInfo.getInterfaces("management")
        try:
            return interfaces[0].getIP()
        except:
            return "0.0.0.0"
        
    def __getComputerID(self):
        # Prints the name of the node that the script is run from. To do so it matches the mac addresses of
        # all running interfaces against the mac addresses in the testbed's database. Prints None if no match is found

        # First create a list containing the mac addresses of all the running interfaces
        macAddresses = []
        macAddressMatcher = re.compile('(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}')
        lines = commands.getstatusoutput("ifconfig")[1].splitlines()
        for line in lines:
            matchObject = macAddressMatcher.search(line)
            if (matchObject):
                macAddresses.append(line[matchObject.start():matchObject.end()].upper())

        # Now match the created list against all of the management mac addresses in the testbed's database
        # for computer nodes
        self.__henManager.initLogging()
        nodes = self.__henManager.getNodes("computer","all")
        nodeName = None
        for node in nodes.values():
            for interface in node.getInterfaces("management"):
                for macAddress in macAddresses:
                    if (macAddress == interface.getMAC().upper()):
                        nodeName = node.getNodeID()
        if nodeName == None:
            nodes = self.__henManager.getNodes("virtualcomputer","all")
            for node in nodes.values():
                for interface in node.getInterfaces("management"):
                    for macAddress in macAddresses:
                        if (macAddress == interface.getMAC().upper()):
                            nodeName = node.getNodeID()
        return nodeName

    def __getIfaceMappings(self):
        mappings = {}

        # Supports only Linux for now
        interfaces = self.__computerInfo.getInterfaces("experimental")
        ifacesInfo = commands.getstatusoutput("ifconfig -a | grep HWaddr")[1].splitlines()
        for interface in interfaces:
            for infoLine in ifacesInfo:
                if (infoLine.find(interface.getMAC()) != -1):
                    mappings[interface.getInterfaceID()] = infoLine[:infoLine.find(" ")]
        return mappings
    
    def __registerMethods(self):
        self.registerMethodHandler("get_computer_id", self.getComputerID)        
        self.registerMethodHandler("autodetect", self.autodetect)        
        self.registerMethodHandler("execute_command", self.executeCommand)
        self.registerMethodHandler("gcc_compile", self.gccCompile)
        self.registerMethodHandler("cat", self.cat)        
        self.registerMethodHandler("make", self.make)
        self.registerMethodHandler("mkdir", self.mkdir)        
        self.registerMethodHandler("untar", self.untar)
        self.registerMethodHandler("add_route", self.addRoute)
        self.registerMethodHandler("delete_route", self.delRoute)
        self.registerMethodHandler("config_iface", self.configIface)
        self.registerMethodHandler("click-align", self.clickAlign)
        self.registerMethodHandler("click-install", self.clickInstall)
        self.registerMethodHandler("click-uninstall", self.clickUninstall)
        self.registerMethodHandler("load_module", self.loadModule)
        self.registerMethodHandler("unload_module", self.unloadModule)
        self.registerMethodHandler("linux_forwarding_on", self.linuxForwardingOn)
        self.registerMethodHandler("linux_forwarding_off", self.linuxForwardingOff)                                        

    def __sendReply(self,prot,code,seq,payload):
        if (code == 0):
            code = 200
        else:
            code = 422 # returnCodes[422] = "error executing command"
        prot.sendReply(code, seq, payload)

    def autodetect(self,prot,seq,ln,payload):
        pass

    def getComputerID(self,prot,seq,ln,payload):
        self.__sendReply(prot,"0",seq,self.__computerID)
        
    def executeCommand(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput(payload)
        self.__sendReply(prot,code,seq,payload)        
    
    def gccCompile(self,prot,seq,ln,payload):
        (workDir, filename) = pickle.loads(payload)
        name = filename[:filename.find(".")]
        (code, payload) = commands.getstatusoutput("cd " + worDir + " ; g++ -o " + name + " " + filename)
        self.__sendReply(prot,code,seq,payload)        

    def cat(self,prot,seq,ln,payload):
        #print "got cat command"
        payload = pickle.loads(payload)[0]
        (code, payload) = commands.getstatusoutput("cat " + str(payload))
        self.__sendReply(prot,code,seq,payload)

    def make(self,prot,seq,ln,payload):
        (workDir, makeTarget) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("cd " + workDir + " ; make -f " + makeTarget)
        self.__sendReply(prot,code,seq,payload)        

    def mkdir(self,prot,seq,ln,payload):
        code = os.mkdir(payload)
        self.__sendReply(prot,code,seq,"")
        
    def untar(self,prot,seq,ln,payload):
        (tarPath, targetDir) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("tar -xf " + path + " -C " + targetDir)
        self.__sendReply(prot,code,seq,payload)                

    def addRoute(self,prot,seq,ln,payload):
        (network, netmask, gateway, interface) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("route add -net " + network + \
                                                   " netmask " + netmask + \
                                                   " gw " + gateway \
                                                   + " dev " + interface)
        self.__sendReply(prot,code,seq,payload)

    def delRoute(self,prot,seq,ln,payload):
        (network, netmask) = pickle.loads(payload)
        (code, payload) = commands.getstatusoutput("route del -net " + network + " netmask " + netmask)
        self.__sendReply(prot,code,seq,payload)

    def configIface(self,prot,seq,ln,payload):
        (interfaceID, address, mask, status) = pickle.loads(payload)
        try:
            cmd = "ifconfig " + self.__ifaceIDtoNameMappings[interfaceID] + " "
        except KeyError:
            log.error("Key error "+str( self.__ifaceIDtoNameMappings))
            (code, payload) = (400, "Key error for interface")
            self.__sendReply(prot,code,seq,payload)
            return
        if (status == "on"):
            cmd += address + " netmask " + mask + " up"
        else:
            cmd += "down"
        (code, payload) = commands.getstatusoutput(cmd)
        self.__sendReply(prot,code,seq,payload)        

    def clickAlign(self,prot,seq,ln,payload):
        (clickAlignPath, configFile) = pickle.loads(payload)
        basePath = configFile[:configFile.rfind("/")]
        filename = configFile[configFile.rfind("/") + 1: configFile.find(".")]
        newPathToFile = basePath + "/" + filename + "-aligned.click'"
        (code, payload) = commands.getstatusoutput(clickAlignPath + " " + configFile + " > " + newPathToFile)
        self.__sendReply(prot,code,seq,payload)                

    def clickInstall(self,prot,seq,ln,payload):
        (clickInstallPath, configFile, numberThreads) = pickle.loads(payload)
        cmd = click-installPath + " "
        if (int(numberThreads) != 0):
            cmd += "--threads=" + numberThreads + " "
        cmd += configFile
        (code, payload) = commands.getstatusoutput(cmd)
        self.__sendReply(prot,code,seq,payload)        

    def clickUninstall(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput(payload)
        self.__sendReply(prot,code,seq,payload)        

    def loadModule(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput("insmod " + payload)
        self.__sendReply(prot,code,seq,payload)                

    def unloadModule(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput("rmmod " + payload)
        self.__sendReply(prot,code,seq,payload)                        

    def linuxForwardingOn(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput("echo '1' \> /proc/sys/net/ipv4/ip_forward")
        self.__sendReply(prot,code,seq,payload)                                

    def linuxForwardingOff(self,prot,seq,ln,payload):
        (code, payload) = commands.getstatusoutput("echo '0' \> /proc/sys/net/ipv4/ip_forward")
        self.__sendReply(prot,code,seq,payload)                                        
        
    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 ComputerDaemon (self)")
        self.stop()
Exemplo n.º 33
0
#!/usr/bin/env python
import os, sys, commands
from henmanager import HenManager

manager = HenManager()
nodes = manager.getNodes("computer")
user=""

usage = "usage: reservations.py [computerid] [computerid]\n"
usage += "usage: reservations.py all\n"
usage += "usage: reservations.py model [dell2950|dell1950|dell1850|sunx4100|sunv20z|delloptiplex]\n"
usage += "usage: reservations.py user [username]"

if (len(sys.argv) < 2):
    print usage
    os._exit(0)

if (sys.argv[1] == "model"):
    
    if (len(sys.argv) != 3):
        print usage
        os._exit(0)
    elif (sys.argv[2] == "dell2950"):
        beginID="computer81"
        endID="computer100"
    elif (sys.argv[2] == "dell1950"):
        beginID="computer56"
        endID="computer80"
    elif (sys.argv[2] == "dell1850"):
        beginID="computer21"
        endID="computer25"