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

📄 brctl.py

📁 xen虚拟机源代码安装包
💻 PY
字号:
"""Bridge control utilities."""import osimport os.pathimport reimport sysCMD_IFCONFIG = 'ifconfig'CMD_ROUTE    = 'route'CMD_BRCTL    = 'brctl'CMD_IPTABLES = "iptables"opts = Noneclass Opts:    def __init__(self, defaults):        for (k, v) in defaults.items():            setattr(self, k, v)        passdef cmd(p, s):    """Print and execute command 'p' with args 's'.    """    global opts    c = p + ' ' + s    if opts.verbose: print c    if not opts.dryrun:        os.system(c)bridgeRE = re.compile(r'([^\t]*)\t*[^\t]*\t*[^\t]*\t*([^\t]*)')def get_state():    fin = os.popen(CMD_BRCTL + ' show', 'r')    try:        bridges = {}        brlist = None        brname = None        first = True        for line in fin:            if first:                first = False            elif line[0] == '\t':                brlist.append(line.strip())            else:                if brname:                    bridges[brname] = brlist                m = bridgeRE.match(line)                brname = m.group(1)                brlist = [m.group(2).strip()]        if brname:            bridges[brname] = brlist        return bridges    finally:        fin.close()def vif_bridge_add(params):    """Add the network interface for vif on dom to a bridge.    """    cmd(CMD_BRCTL, 'addif %(bridge)s %(vif)s' % params)def vif_bridge_rem(params):    """Remove the network interface for vif on dom from a bridge.    """    cmd(CMD_BRCTL, 'delif %(bridge)s %(vif)s' % params)def vif_restrict_addr(vif, addr, delete=0):    d = { 'vif': vif, 'addr': addr}    if delete:        d['flag'] = '-D'    else:        d['flag'] = '-A'    cmd(CMD_IPTABLES, '-P FORWARD DROP')    cmd(CMD_IPTABLES, '%(flag)s FORWARD -m physdev --physdev-in %(vif)s -s %(addr)s -j ACCEPT' % d)    cmd(CMD_IPTABLES, '%(flag)s FORWARD -m physdev --physdev-out %(vif)s -d %(addr)s -j ACCEPT' % d)def bridge_create(bridge, **kwd):    """Create a bridge.    Defaults hello time to 0, forward delay to 0 and stp off.    """    cmd(CMD_BRCTL, 'addbr %s' % bridge)    if kwd.get('hello', None) is None:        kwd['hello'] = 0    if kwd.get('fd', None) is None:        kwd['fd'] = 0    if kwd.get('stp', None) is None:        kwd['stp'] = 'off'    bridge_set(bridge, **kwd)    cmd(CMD_IFCONFIG, "%s up" % bridge)def bridge_set(bridge, hello=None, fd=None, stp=None):    """Set bridge parameters.    """    if hello is not None:        cmd(CMD_BRCTL, 'sethello %s %d' % (bridge, hello))    if fd is not None:        cmd(CMD_BRCTL, 'setfd %s %d' % (bridge, fd))    if stp is not None:        cmd(CMD_BRCTL, 'stp %s %s' % (bridge, stp))def bridge_del(bridge):    """Delete a bridge.    """    cmd(CMD_IFCONFIG, '%s down' % bridge)    cmd(CMD_BRCTL, 'delbr %s' % bridge)def routes():    """Return a list of the routes.    """    fin = os.popen(CMD_ROUTE + ' -n', 'r')    routes = []    for x in fin:        if x.startswith('Kernel'): continue        if x.startswith('Destination'): continue        x = x.strip()        y = x.split()        z = { 'destination': y[0],              'gateway'    : y[1],              'mask'       : y[2],              'flags'      : y[3],              'metric'     : y[4],              'ref'        : y[5],              'use'        : y[6],              'interface'  : y[7] }        routes.append(z)    return routesdef ifconfig(interface):    """Return the ip config for an interface,    """    fin = os.popen(CMD_IFCONFIG + ' %s' % interface, 'r')    inetre = re.compile('\s*inet\s*addr:(?P<address>\S*)\s*Bcast:(?P<broadcast>\S*)\s*Mask:(?P<mask>\S*)')    info = None    for x in fin:        m = inetre.match(x)        if not m: continue        info = m.groupdict()        info['interface'] = interface        break    return infodef reconfigure(interface, bridge):    """Reconfigure an interface to be attached to a bridge, and give the bridge    the IP address etc. from interface. Move the default route to the interface    to the bridge.    """    global opts    intf_info = ifconfig(interface)    if not intf_info:        print >>sys.stderr, 'Interface not found:', interface        return    #bridge_info = ifconfig(bridge)    #if not bridge_info:    #    print >>sys.stderr, 'Bridge not found:', bridge    #    return    route_info = routes()    intf_info['bridge'] = bridge    intf_info['gateway'] = None    for r in route_info:        if (r['destination'] == '0.0.0.0' and            'G' in r['flags'] and            r['interface'] == interface):            intf_info['gateway'] = r['gateway']    if not intf_info['gateway']:        print >>sys.stderr, 'Gateway not found: ', interface        return    cmd(CMD_IFCONFIG,        '%(bridge)s %(address)s netmask %(mask)s broadcast %(broadcast)s up'        % intf_info)    cmd(CMD_ROUTE,        'add default gateway %(gateway)s dev %(bridge)s'        % intf_info)    cmd(CMD_BRCTL, 'addif %(bridge)s %(interface)s' % intf_info)    cmd(CMD_IFCONFIG, '%(interface)s 0.0.0.0' % intf_info)defaults = {    'verbose'  : 1,    'dryrun'   : 0,    }opts = Opts(defaults)def set_opts(val):    global opts    opts = val    return opts

⌨️ 快捷键说明

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