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)
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)
# 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)
# 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()
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