⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xendevice.py

📁 xen虚拟机源代码安装包
💻 PY
字号:
#!/usr/bin/python""" Copyright (C) International Business Machines Corp., 2005, 2006 Authors: Dan Smith <danms@us.ibm.com>          Daniel Stekloff <dsteklof@us.ibm.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; under version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA"""import sysimport commandsimport osimport reimport timefrom Xm import *from Test import *from config import *from XenDomain import *from NetConfig import *from XmTestLib import *from __init__ import *class XenNetDevCmd:    def __init__(self, netDevice, addCmd, removeCmd):        """Object representing a network device command"""        self.addcmd = addCmd        self.removecmd = removeCmd        self.addhasrun = False        self.rmvhasrun = False        self.netdevice = netDevice    def getAddCmd(self):        return self.addcmd    def getRemoveCmd(self):        return self.removecmd    def hasAddRun(self):        return self.addhasrun    def hasRemoveRun(self):        self.rmvhasrun    def runAddCmd(self, runOnDom0=False):        # Defaults running command on dom0, if console then will run there        if runOnDom0 == False:            dom = self.netdevice.getDomain()            console = dom.getConsole()            console.runCmd(self.addcmd)        else:            status, output = traceCommand(self.addcmd)            if status:                raise NetworkError("Device add cmd failed: %s Status: %d"                                   % (self.addcmd, status))        self.addhasrun = True    def runRemoveCmd(self, runOnDom0=False):        # Defaults running command on dom0, if console then will run there        if runOnDom0 == False:            dom = self.netdevice.getDomain()            console = dom.getConsole()            console.runCmd(self.removecmd)        else:            status, output = traceCommand(self.removecmd)            if status:                raise NetworkError("Device remove cmd failed: %s Status: %d"                                   % (self.removecmd, status))        self.removehasrun = Trueclass XenDevice:    def __init__(self, domain, id, devConfig=None):        """An object to represent Xen Devices like network and block        @param domain: Domain the device will be added to        @param id: Device identifier        @param devConfig: Initial configuration dictionary for XenDevice        """        if config:            self.config = devConfig        else:            self.config = {}        self.id = id        self.domain = domain        self.configNode = None        # Commands run when domain is started or devices added and removed.        self.dom0_cmds = []        self.domU_cmds = []    def __str__(self):        """Convert device config to XenConfig node compatible string"""        confstr = ''        for k, v in self.config.items():            if len(confstr) > 0:                confstr += ', '            if isinstance(v, int):                confstr += "%s=%i" % (k, v)            elif isinstance(v, list) and v:                confstr += "%s=%s" % (k, v)            elif isinstance(v, str) and v:                confstr += "%s=%s" % (k, v)        return confstr    def execAddCmds(self):        # Cmds for when a device is added to the system        if len(self.dom0_cmds) > 0:            for i in range(0, len(self.dom0_cmds)):                if self.dom0_cmds[i].getAddCmd():                    self.dom0_cmds[i].runAddCmd(runOnDom0=True)        if len(self.domU_cmds) > 0:            for i in range(0, len(self.domU_cmds)):                if self.domU_cmds[i].getAddCmd():                    self.domU_cmds[i].runAddCmd()    def execRemoveCmds(self):        # Cmds for when a device is removed from the system        if len(self.dom0_cmds) > 0:            for i in range(0, len(self.dom0_cmds)):                if (self.dom0_cmds[i].getRemoveCmd()                     and self.dom0_cmds[i].hasAddRun() == True):                    self.dom0_cmds[i].runRemoveCmd(runOnDom0=True)        if len(self.domU_cmds) > 0:            for i in range(0, len(self.domU_cmds)):                if (self.domU_cmds[i].getRemoveCmd()                    and self.domU_cmds[i].hasAddRun() == True):                    self.domU_cmds[i].runRemoveCmd()    def removeDevice(self):        self.execRemoveCmds()    def getId(self):        return self.id    def getConfigOpt(self):        return self.configNode    def getDomain(self):        return self.domainclass XenNetDevice(XenDevice):    def __init__(self, domain, id, devConfig=None):        """An object to represent Xen Network Device        @param domain: Domain the device is being added to        @param id: Network device identifier, interface name like eth0        @param devConfig: Initial dictionary configuration for XenNetDevice        """        if devConfig:            self.config = devConfig        else:            self.config = {}        self.id = id        self.domain = domain        self.configNode = "vif"        self.dom0_cmds = []        self.domU_cmds = []        self.network = None        self.netmask = None        self.ip = None        self.dom0_alias_ip = None        if domain.getDomainType() == "HVM":            self.config["type"] = "ioemu"            if not self.config.has_key('bridge'):                self.config["bridge"] = "xenbr0"        if self.config.has_key("ip"):            self.setNetDevIP(ip=self.config["ip"])        else:            if NETWORK_IP_RANGE != "dhcp":                self.setNetDevIP()    def __del__(self):        # Make sure we clean up NetConfig's list of ips, so the ip can be        # reused        self.releaseNetDevIP()    def addIfconfigCmd(self, domU=True):        # Method to add start and remove ifconfig functions        if domU == True:            locmd = XenNetDevCmd(self, addCmd="ifconfig lo 127.0.0.1", removeCmd=None)        ifcmd = []        # Start or Add cmd        acmd = 'ifconfig %s inet %s netmask %s up' % (self.id, self.ip, self.netmask)        rcmd = 'ifconfig %s down' % self.id        ifcmd = XenNetDevCmd(self, addCmd=acmd, removeCmd=rcmd)        if domU == True:            self.domU_cmds.append(locmd)             self.domU_cmds.append(ifcmd)         else:            self.dom0_cmds.append(ifcmd)     def removeDevice(self):        self.releaseNetDevIP()    def addDom0AliasCmd(self, dev=DOM0_INTF):        # Method to add start and remove dom0 alias cmds        acmd = 'ip addr add %s dev %s' % (self.dom0_alias_ip, dev)        rcmd = 'ip addr del %s dev %s' % (self.dom0_alias_ip, dev)         aliascmd = XenNetDevCmd(self, addCmd=acmd, removeCmd=rcmd)        self.dom0_cmds.append(aliascmd)    def releaseNetDevIP(self):        # Must remove start cmds for ip configuration and then release from        # NetConfig        self.execRemoveCmds()        self.dom0_cmds = []        self.domU_cmds = []        if self.config.has_key("ip"):            del self.config["ip"]        if self.dom0_alias_ip:                xmtest_netconf.releaseIP("domain0", self.domain.getName(), self.dom0_alias_ip)        xmtest_netconf.releaseIP(self.domain.getName(), self.id, self.ip)    def getNetDevIP(self):        return self.ip    def getDom0AliasIP(self):        return self.dom0_alias_ip    def getNetwork(self):        return self.network    def setNetDevIP(self, ip=None):        # Function to set a new IP for NetDevice.        if NETWORK_IP_RANGE == "dhcp":            raise NetworkError("System configured for dhcp, cannot set new ip.")        if (self.ip and not ip) or ((self.ip and ip) and (self.ip != ip)):             self.releaseNetDevIP()        if not self.netmask:            self.netmask = xmtest_netconf.getNetMask()        if not self.network:            self.network = xmtest_netconf.getNetwork()        if ip:            xmtest_netconf.setIP(self.domain.getName(), self.id, ip)            self.ip = ip        else:            self.ip = xmtest_netconf.getIP(self.domain.getName(), self.id)        self.addIfconfigCmd()        self.config["ip"] = str(self.ip)        # Setup an alias for Dom0        self.dom0_alias_ip = xmtest_netconf.getIP("domain0", self.domain.getName())        self.addDom0AliasCmd()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -