Exemplo n.º 1
0
    def run(self):
        logging.info('Started LinkNeg...')
        iface = self.get_mopt('iface')
        state = bool_it(self.get_mopt('state'))
        admin_speed = self.get_opt('speed', default=0)
        timeout = self.get_opt('timeout', default=10)

        ip = IPDB()
        self.oper_state = ip.interfaces[iface]['operstate']
        wd = ip.watchdog(ifname=iface)
        cuid = ip.register_callback(self._cb)

        wd.wait(timeout=timeout)
        ip.unregister_callback(cuid)
        ip.release()

        admin_state = 'UP' if state else 'DOWN'
        oper_state = self.oper_state

        if admin_state == oper_state and admin_speed:
            oper_speed = self.get_speed(iface)
        else:
            oper_speed = 0

        res_data = {'admin_state': admin_state, 'oper_state': oper_state}
        if admin_speed:
            res_data['admin_speed'] = "%s Mb/s" % admin_speed
            res_data['oper_speed'] = "%s Mb/s" % oper_speed

        if admin_state == oper_state and admin_speed == oper_speed:
            self.set_pass(res_data)
        else:
            self.set_fail(res_data)
Exemplo n.º 2
0
    def run(self):
        logging.info('Started LinkNeg...')
        iface = self.get_mopt('iface')
        state = bool_it(self.get_mopt('state'))
        timeout = self.get_opt('timeout', default=10)

        ip = IPDB()
        self.oper_state = ip.interfaces[iface]['operstate']
        wd = ip.watchdog(ifname=iface)
        cuid = ip.register_callback(self._cb)

        wd.wait(timeout=timeout)
        ip.unregister_callback(cuid)
        ip.release()

        admin_state = 'UP' if state else 'DOWN'
        oper_state = self.oper_state
        res_data = {'admin_state': admin_state, 'oper_state': oper_state}

        if admin_state == oper_state:
            self.set_pass(res_data)
        else:
            self.set_fail(res_data)
Exemplo n.º 3
0
#      pp.pprint(netlink_message)


def new_dev_callback(ipdb, netlink_message, action):
    if action == 'RTM_NEWLINK':
        #pp.pprint(netlink_message)
        nldict = dict(netlink_message)
        print "handling call back"
        ifindex = nldict['index']
        ifnametup = nldict['attrs'][0]
        ifname = ifnametup[1]
        nsPath = check_output([
            "sudo", "docker", "inspect", "--format",
            " '{{.NetworkSettings.SandboxKey}}'", ifname[:-1]
        ])
        nsPath = nsPath.rstrip('\r\n')[1:]
        nsPath = json.dumps(str(nsPath)).replace("'", "")
        nsPath = nsPath.replace('"', "")
        out = check_output(["sudo", "ls", "-Li", nsPath])
        inum = out.split(" ")[0]
        print inum
        ifInum[ct.c_uint(ifindex)] = ct.c_uint64(int(inum))
        print "ifindex", ifindex, ifInum[ct.c_uint(ifindex)]


#addr_callback = ipdb.register_callback(new_address_callback)
dev_callback = ipdb.register_callback(new_dev_callback)
input()
#ipdb.unregister_callback(addr_callback)
ipdb.unregister_callback(dev_callback)
Exemplo n.º 4
0
# create IPDB instance
ip = IPDB()
# create watchdogs
wd0 = ip.watchdog(ifname='br0')
wd1 = ip.watchdog(ifname='bala_port0')
wd2 = ip.watchdog(ifname='bala_port1')
# create bridge
ip.create(kind='bridge', ifname='br0').commit()
# wait the bridge to be created
wd0.wait()
# register callback
ip.register_callback(cb)
# create ports
ip.create(kind='dummy', ifname='bala_port0').commit()
ip.create(kind='dummy', ifname='bala_port1').commit()
# sleep for interfaces
wd1.wait()
wd2.wait()

ip.unregister_callback(cb)

# cleanup
for i in ('bala_port0', 'bala_port1', 'br0'):
    try:
        ip.interfaces[i].remove().commit()
    except:
        pass

ip.release()
Exemplo n.º 5
0
# create IPDB instance
ip = IPDB()
# create watchdogs
wd0 = ip.watchdog(ifname='br0')
wd1 = ip.watchdog(ifname='bala_port0')
wd2 = ip.watchdog(ifname='bala_port1')
# create bridge
ip.create(kind='bridge', ifname='br0').commit()
# wait the bridge to be created
wd0.wait()
# register callback
ip.register_callback(cb)
# create ports
ip.create(kind='dummy', ifname='bala_port0').commit()
ip.create(kind='dummy', ifname='bala_port1').commit()
# sleep for interfaces
wd1.wait()
wd2.wait()

ip.unregister_callback(cb)

# cleanup
for i in ('bala_port0', 'bala_port1', 'br0'):
    try:
        ip.interfaces[i].remove().commit()
    except:
        pass

ip.release()
Exemplo n.º 6
0
class DevTracker(object):
    def __init__(self, devlist, logger=None):
        self.devlist = devlist
        self.queue = queue.Queue()
        self.ipdb = IPDB()
        self.logger = logger or default_logger

    def _get_current(self):

        for dev in self.devlist:

            if not dev in self.ipdb.interfaces:
                continue

            devinfo = self.ipdb.by_name[dev]

            for addr, preflen in devinfo["ipaddr"]:
                if whichipversion(addr) == 4:
                    addr = "{}/{}".format(addr, preflen)
                    prefix = ipaddress.ip_interface(addr).network
                    msg = {
                        "action": "RTM_NEWADDR",
                        "device": dev,
                        "address": prefix,
                    }
                    self.queue.put(msg)

    def start(self):

        self.logger.debug("start to track devices: %s", " ".join(self.devlist))

        self._get_current()

        def ipdb_callback(ipdb, msg, action):

            if not action in ("RTM_NEWADDR", "RTM_DELADDR"):
                return

            if msg["family"] != 2:
                # XXX: IPv4 only :(
                return

            tracked_dev = None
            tracked_dev_addr = None
            for attr in msg["attrs"]:
                if attr[0] == "IFA_LABEL" and attr[1] in self.devlist:
                    tracked_dev = attr[1]
                elif attr[0] == "IFA_ADDRESS":
                    tracked_dev_addr = attr[1]

            if not tracked_dev or not tracked_dev_addr:
                return

            addr = "{}/{}".format(tracked_dev_addr, msg["prefixlen"])
            prefix = ipaddress.ip_interface(addr).network

            msg = {
                "action": action,
                "device": tracked_dev,
                "address": prefix,
            }

            try:
                self.logger.debug("device addr change: %s", str(msg))
                self.queue.put(msg)
            except queue.Full:
                self.logger.error("devtracker queue full for msg %s", str(msg))

        self.cbid = self.ipdb.register_callback(ipdb_callback)

    def stop(self):
        self.ipdb.unregister_callback(self.cbid)

    def queued(self):
        return (not self.queue.empty())

    def pop(self):
        try:
            return self.queue.get(block=False)
        except queue.Empty:
            return None