Example #1
0
def scan_netdevs():
    scan = []
    ipr = IPRoute()

    try:
        for part in ipr.get_links():
            new_link = {}
            new_link["netlink_msg"] = part
            new_link["index"] = part["index"]
            new_link["name"] = part.get_attr("IFLA_IFNAME")

            hwaddr = part.get_attr("IFLA_ADDRESS")
            if hwaddr:
                new_link["hwaddr"] = normalize_hwaddr(hwaddr)
            else:
                new_link["hwaddr"] = None

            addrs = ipr.get_addr(index=new_link["index"])
            new_link["ip_addrs"] = addrs

            scan.append(new_link)
    except:
        raise
    finally:
        ipr.close()
    return scan
Example #2
0
def set_dns_systemd_resolved(lease):
    # NOTE: if systemd-resolved is not already running, we might not want to
    # run it in case there's specific system configuration for other resolvers
    ipr = IPRoute()
    index = ipr.link_lookup(ifname=lease.interface)[0]
    # Construct the argument to pass to DBUS.
    # the equivalent argument for:
    # busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 \
    # org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 2 1 2 4 1 2 3 4
    # is SetLinkDNS(2, [(2, [8, 8, 8, 8])]_
    iay = [(2, [int(b) for b in ns.split('.')])
           for ns in lease.name_server.split()]
    #        if '.' in ns
    #        else (10, [ord(x) for x in
    #            socket.inet_pton(socket.AF_INET6, ns)])
    bus = SystemBus()
    resolved = bus.get_object('org.freedesktop.resolve1',
                              '/org/freedesktop/resolve1')
    manager = Interface(resolved,
                        dbus_interface='org.freedesktop.resolve1.Manager')
    try:
        manager.SetLinkDNS(index, iay)
        return True
    except DBusException as e:
        logger.error(e)
        return False
Example #3
0
    def create_interface(self):
        '''
        Create veth-pair
        Creates veth-pair in the host-os first and then one end of the pair is
        moved inside container.

        Name of interface inside container can be same for multiple containers.
        So, the veth-pair cannot be created with name of interface inside
        cotnainer. The veth-pair is created with a temporary name and will be
        renamed later
        '''

        # Check if interface already created
        iproute = IPRoute()
        iface = iproute.link_lookup(ifname=self.host_ifname)
        if len(iface) != 0:
            return

        # Create veth pairs. One end of pair is named host_ifname and the
        # other end of pair is set a temporary name. It will be overridden
        # once interface is moved inside container
        try:
            cn_name = self.host_ifname + '-ns'
            iproute.link_create(ifname=self.host_ifname, peer=cn_name,
                                kind='veth')
        except NetlinkError as e:
            if e.code != errno.EEXIST:
                raise CniError(CNI_ERROR_ADD_VETH,
                               'Error creating veth device ' +
                               self.host_ifname + ' code ' + str(e.code) +
                               ' message ' + e.message)
        # Move one end of pair inside container
        self.move_link(cn_name)
        return
Example #4
0
    def delete_interface(self):
        '''
        Delete the interface.
        Deletes both VLAN Tag interface and MACVlan interface
        '''
        # Find the VLAN interface interface from the MACVlan interface
        link = self.get_link()
        if link is None:
            return

        vlan_idx = None
        for i in link[0]['attrs']:
            if (i[0] == 'IFLA_LINK'):
                vlan_idx = i[1]
                break

        if vlan_idx is None:
            raise Error(CNI_ERROR_DEL_VLAN_INTF,
                        'Error finding vlan interface. Interface inside ' +
                        ' container ' + self.cni.container_ifname)

        # Delete the VLAN Tag interface.
        # It will delete the interface inside container also
        try:
            iproute = IPRoute()
            iproute.link('del', index=vlan_idx)
        except NetlinkError as e:
            raise Error(CNI_ERROR_DEL_VLAN_INTF,
                        'Error deleting VLAN interface. Parent interface ' +
                        self.host_ifname + ' vlan-tag ' + self.vlan_tag +
                        ' vlan-ifindex ' + str(vlan_idx) +
                        ' code ' + str(e.code) + ' message ' + e.message)
        return
Example #5
0
def create_veth_pair(name):
    ip = IPRoute()
    peers = ('{}0'.format(name), '{}1'.format(name))
    LOG.info('creating veth pair {}'.format(peers))
    ip.link('add', kind='veth', ifname=peers[0], peer=peers[1])
    link_up(peers[0])
    link_up(peers[1])
Example #6
0
def delete_veth_pair(name):
    ip = IPRoute()
    peers = ('{}0'.format(name), '{}1'.format(name))
    LOG.info('deleting veth pair {}'.format(peers))
    link_down(peers[0])
    link_down(peers[1])
    ip.link('del', index=ip.link_lookup(ifname=peers[0])[0])
Example #7
0
def scan_netdevs():
    scan = []
    ipr = IPRoute()

    try:
        for part in ipr.get_links():
            new_link = {}
            new_link["netlink_msg"] = part
            new_link["index"] = part["index"]
            new_link["name"] = part.get_attr("IFLA_IFNAME")
            #
            # FIXME:
            #
            # nlmsg.get_attr() returns None if there is no
            # such attribute in the NLA chain; if hwaddr is None,
            # normalize_hwaddr(hwaddr) will raise AttributeError(),
            # since None has no upper(). The issue is that the
            # AttributeError() will be a bit unrelated to the
            # root cause, and since that it will be confusing.
            #
            hwaddr = part.get_attr("IFLA_ADDRESS")
            new_link["hwaddr"] = normalize_hwaddr(hwaddr)
            scan.append(new_link)
    except:
        raise
    finally:
        ipr.close()
    return scan
def start_ue () :
   #print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
   timeout=60 #timeout in seconds
   send_command('AT', 'OK' , timeout)
   send_command('AT+CFUN=1' , 'OK' , timeout)
   #send_command('AT+CGATT=0' , 'OK' , timeout)
   send_command('AT+CGATT=1','OK', 300)
   #os.system('wvdial -C ' + bandrich_ppd_config + ' &' )
   
   thread_ppp = pppThread(1, "ppp_thread", 1)
   thread_ppp.start()

   iface='ppp0'
   
   while 1:
     time.sleep ( 2)
     #Now we check if ppp0 interface is up and running
     try:
        if exit_flag == 1:
          break
        ip = IPRoute()
        idx = ip.link_lookup(ifname=iface)[0]
        os.system ('route add 192.172.0.1 ppp0')
        os.system ('ping -c 5 192.172.0.1')
        break
     except Exception, e:
        error = ' Interface ' + iface + 'does not exist...'
        error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: '  + str(e.__class__) + " : " + str( e)
        error = error + traceback.format_exc()
        print error
Example #9
0
class TestProxyData(TestData):

    def setup(self):
        create_link('dummyX', 'dummy')
        t_url = 'unix://\0%s' % (uuid.uuid4())
        p_url = 'unix://\0%s' % (uuid.uuid4())

        self.uplink = IPRoute()
        self.uplink.serve(t_url)

        self.proxy = IPRoute(host=t_url)
        self.proxy.serve(p_url)

        self.ip = IPRoute(host=p_url)
        service = self.ip.discover(self.ip.default_target,
                                   addr=self.proxy.default_peer)

        self.ip.default_peer = self.proxy.default_peer
        self.ip.default_dport = service

        self.dev = self.ip.link_lookup(ifname='dummyX')

    def teardown(self):
        TestData.teardown(self)
        self.proxy.release()
        self.uplink.release()
Example #10
0
class rv_manager(object):

    def __init__(self):
        self.ipr = IPRoute()
        self.dataplane = BPF(src_file="core/rv_manager/rv_manager.c")
        # Loading Tables from dp
        self.next = self.dataplane.get_table("next_hop")
        self.ifc2vi = self.dataplane.get_table("rvm_ifc2vi")
        self.vi2ifc = self.dataplane.get_table("rvm_vi2ifc")
        # Loading Functions from db
        self.func_phy2virt = self.dataplane.load_func(
            "rvm_function_p2v", BPF.SCHED_CLS)
        self.func_virt2phy = self.dataplane.load_func(
            "rvm_function_v2p", BPF.SCHED_CLS)

    def set_next_hop(self, next_vnf):
        self.next[self.next.Key(0)] = self.next.Leaf(next_vnf)

    def get_fd(self):
        return self.func_virt2phy.fd

    def set_bpf_ingress(self, ifc_index, func):
        self.ipr.tc("add", "ingress", ifc_index, "ffff:")
        self.ipr.tc("add-filter", "bpf", ifc_index, ":1", fd=func.fd,
                    name=func.name, parent="ffff:", action="drop", classid=1)

    def add_new_workload(self, phy_iface_index, virt_iface_index):
        self.ifc2vi[self.ifc2vi.Key(phy_iface_index)] = self.ifc2vi.Leaf(
            virt_iface_index)
        self.vi2ifc[self.vi2ifc.Key(virt_iface_index)] = self.vi2ifc.Leaf(
            phy_iface_index)

        self.set_bpf_ingress(phy_iface_index, self.func_phy2virt)
Example #11
0
def set_net(lease):
    ipr = IPRoute()
    try:
        index = ipr.link_lookup(ifname=lease.interface)[0]
    except IndexError as e:
        logger.error('Interface %s not found, can not set IP.',
                     lease.interface)
    try:
        ipr.addr('add', index, address=lease.address,
                 mask=int(lease.subnet_mask_cidr))
    except NetlinkError as e:
        if ipr.get_addr(index=index)[0].\
                get_attrs('IFA_ADDRESS')[0] == lease.address:
            logger.debug('Interface %s is already set to IP %s' %
                         (lease.interface, lease.address))
        else:
            logger.error(e)
    else:
        logger.debug('Interface %s set to IP %s' %
                     (lease.interface, lease.address))
    try:
        ipr.route('add', dst='0.0.0.0', gateway=lease.router, oif=index)
    except NetlinkError as e:
        if ipr.get_routes(table=254)[0].\
                get_attrs('RTA_GATEWAY')[0] == lease.router:
            logger.debug('Default gateway is already set to %s' %
                         (lease.router))
        else:
            logger.error(e)
    else:
        logger.debug('Default gateway set to %s', lease.router)
    ipr.close()
    set_dns(lease)
Example #12
0
 def test_iproute(self):
     ip = IPRoute()
     try:
         assert len(ip.get_links()) > 1
     except:
         raise
     finally:
         ip.close()
Example #13
0
def mroute():
    ip = IPRoute() # family = NETLINK_ROUTE "Receives routing and link
    # updates and may be used to modify the routing tables"
    ip.monitor()

    while True:
        for raw in ip.get():
            print '{event:10} {attrs}'.format(**raw)
Example #14
0
def _run_remote_uplink(url, connect, release,
                       key=None, cert=None, ca=None):
    ip = IPRoute()
    ip.serve(url, key=key, cert=cert, ca=ca)
    ip.iothread.secret = 'bala'
    connect.set()
    release.wait()
    ip.release()
Example #15
0
    def setup(self):
        create_link('dummyX', 'dummy')
        url = 'unix://\0%s' % (uuid.uuid4())

        self.uplink = IPRoute()
        self.uplink.serve(url)

        self.ip = IPRoute(host=url)
        self.dev = self.ip.link_lookup(ifname='dummyX')
Example #16
0
 def testServer(self):
     url = 'unix://\0%s' % (uuid.uuid4())
     ip = IPRoute()
     ip.serve(url)
     target = Process(target=_run_remote_client,
                      args=(url, 'get_links'))
     target.start()
     target.join()
     ip.release()
Example #17
0
def getInterfaceState(ifname):
    try:
        ip = IPRoute()
        state = ip.get_links(ip.link_lookup(ifname=ifname))[0].get_attr('IFLA_OPERSTATE')
        ip.close()
    except Exception as e:
        raise Exception("getInterfaceState: Collecting interface status for %s failed: %s" % (ifname,str(e)))
    else:
        if state == "UP":
            return True
    return False
Example #18
0
 def _test_remote(self, url):
     connect = Event()
     release = Event()
     target = Process(target=_run_remote_uplink,
                      args=(url, connect, release))
     target.daemon = True
     target.start()
     connect.wait()
     ip = IPRoute(host=url)
     ip.release()
     release.set()
Example #19
0
class TestMisc(object):

    def setup(self):
        self.ip = IPRoute()

    def teardown(self):
        self.ip.release()

    def test_addrpool_expand(self):
        # see coverage
        for i in range(100):
            self.ip.get_addr()
Example #20
0
 def get_link(self):
     '''
     Get link information for the interface inside the container
     '''
     link = None
     with CniNamespace(self.container_netns, logger):
         iproute = IPRoute()
         iface = iproute.link_lookup(ifname=self.container_ifname)
         if len(iface) != 0:
             idx = iface[0]
             link = iproute.link("get", index=idx)
     return link
Example #21
0
    def create_interface(self):
        '''
        Create MACVlan interface
        Creates VLAN interface first based on VLAN tag for sub-interface
        then create macvlan interface above the vlan interface
        '''

        iproute = IPRoute()
        # Ensure the host interface is present
        host_if = iproute.link_lookup(ifname=self.host_ifname)
        if len(host_if) == 0:
            raise CniError(CNI_ERROR_ADD_VLAN_INTF,
                           'Error creating vlan interface' + ' host interface' +
                           self.host_ifname + ' not found')
            return

        # Create vlan interface if not present
        vlan_if = iproute.link_lookup(ifname=self.vlan_ifname)
        if len(vlan_if) == 0:
            try:
                iproute.link("add", ifname=self.vlan_ifname, kind='vlan',
                             vlan_id=self.vlan_tag, link=host_if[0])
            except NetlinkError as e:
                if e.code != errno.EEXIST:
                    raise CniError(CNI_ERROR_ADD_VETH,
                                   'Error creating vlan interface. ' +
                                   'Host interface ' + self.host_ifname +
                                   'vlan id ' + str(self.vlan_tag) +
                                   'vlan ifname ' + self.vlan_ifname +
                                   ' code ' + str(e.code) +
                                   ' message ' + e.message)
            vlan_if = iproute.link_lookup(ifname=self.vlan_ifname)

        # Create MACVlan interface if not present
        cn_ifname = self.vlan_ifname + '-ns'
        cn_if = iproute.link_lookup(ifname=cn_ifname)
        if len(cn_if) == 0:
            try:
                iproute.link("add", ifname=cn_ifname, kind='macvlan',
                             link=vlan_if[0], macvlan_mode="vepa")
            except NetlinkError as e:
                if e.code != errno.EEXIST:
                    raise CniError(CNI_ERROR_ADD_VETH,
                                   'Error creating macvlan interface ' +
                                   ' vlan iterface ' + self.vlan_ifname +
                                   ' macvlan interface ' + cn_ifname +
                                   ' code ' + str(e.code) +
                                   ' message ' + e.message)
            cn_if = iproute.link_lookup(ifname=self.vlan_ifname)

        # Move one end of pair inside container
        self.move_link(cn_ifname)
        return
Example #22
0
 def setup(self):
     create_link('dummyX', 'dummy')
     url = 'unix+%s://\0%s' % (self.ssl_proto, uuid.uuid4())
     self.uplink = IPRoute()
     self.uplink.serve(url,
                       key='server.key',
                       cert='server.crt',
                       ca='ca.crt')
     self.ip = IPRoute(host=url,
                       key='client.key',
                       cert='client.crt',
                       ca='ca.crt')
     self.dev = self.ip.link_lookup(ifname='dummyX')
Example #23
0
    def test_ssl_fail(self):
        url = 'localhost:9824'
        uplink = IPRoute()
        uplink.serve('ssl://%s' % (url),
                     key='server.key',
                     cert='server.crt',
                     ca='ca.crt')

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('localhost', 9824))
        s.send(b'test')
        s.close()
        uplink.release()
Example #24
0
def _manage_plug_via_netlink(interface_name, action='unplug'):
    """ Manipulates the plug qdisc via netlink

    FIXME: Once we have a modern userpace, replace this with appropriate
    calls to nl-qdisc-add
    """
    ip = IPRoute()
    index = ip.link_lookup(ifname=interface_name)[0]
    # See the linux source at include/uapi/linux/pkt_sched.h
    # #define TCQ_PLUG_BUFFER                0
    # #define TCQ_PLUG_RELEASE_ONE           1
    # #define TCQ_PLUG_RELEASE_INDEFINITE    2
    # #define TCQ_PLUG_LIMIT                 3
    action = {'unplug': 2, 'plug': 0}[action]
    packet_limit = 10000
    handle = transform_handle(PLUG_QDISC)
    parent = transform_handle(PLUG_CLASS)
    flags = NLM_F_REQUEST | NLM_F_ACK
    command = pyroute2.netlink.rtnl.RTM_NEWQDISC
    # This is a bit of magic sauce, inspired by xen's remus project
    opts = struct.pack('iI', action, packet_limit)

    msg = tcmsg()
    msg['index'] = index
    msg['handle'] = handle
    msg['parent'] = parent
    msg['attrs'] = [['TCA_KIND', 'plug']]
    msg['attrs'].append(['TCA_OPTIONS', opts])
    try:
        nlm_response = ip.nlm_request(msg, msg_type=command, msg_flags=flags)
    except pyroute2.netlink.NetlinkError as nle:
        if nle.code == 22:
            # This is an old kernel and we're talking to a qfifo, chill
            log.warn('Detected a non plug qdisc, likely due to an old kernel. '
                     'If you wish to have zero downtime haproxy restarts, '
                     'upgrade your kernel. '
                     'Doing nothing to the SYN traffic lane...')
            return
        else:
            raise

    # As per the netlink manpage (man 7 netlink), we expect an
    # acknowledgment as a NLMSG_ERROR packet with the error field being 0,
    # which it looks like pyroute2 treats as None. Really we want it to be
    # non negative.
    if not(len(nlm_response) > 0 and
           nlm_response[0]['event'] == 'NLMSG_ERROR' and
           nlm_response[0]['header']['error'] is None):
        raise RuntimeError(
            'Had an error while communicating with netlink: {0}'.format(
                nlm_response))
Example #25
0
 def configure_interface(self, ip4, plen, gw):
     '''
     Configure the interface inside container with,
     - IP Address
     - Default gateway
     - Link-up
     '''
     # Configure interface inside the container
     self.configure_link(ip4, plen, gw)
     # Set link-up for vlan interface on host-os
     iproute = IPRoute()
     idx = iproute.link_lookup(ifname=self.vlan_ifname)[0]
     iproute.link('set', index=idx, state='up')
     return
Example #26
0
    def delete_veth(self):
        ip = IPRoute()
        iface = ip.link_lookup(ifname=self.host_ifname)
        if len(iface) == 0:
            return
        idx = iface[0]
        try:
            ip.link('del', index=idx)
        except NetlinkError as e:
            raise CniError(CNI_ERROR_DEL_VETH,
                           'Error deleting veth device ' + self.host_ifname +
                           ' code ' + str(e.code) + ' message ' + e.message)

        return
Example #27
0
class BasicTest(object):

    def setup(self):
        require_user('root')
        self.ip = IPRoute()
        self.ip.link('add',
                     index=0,
                     ifname='dummyX',
                     linkinfo={'attrs': [['IFLA_INFO_KIND', 'dummy']]})
        self.interface = self.ip.link_lookup(ifname='dummyX')[0]

    def teardown(self):
        self.ip.link('delete', index=self.interface)
        self.ip.release()

    def get_qdiscs(self):
        return [x for x in self.ip.get_qdiscs() if
                x['index'] == self.interface]

    def get_qdisc(self):
        # get qdiscs list and filter out our interface
        qds = self.get_qdiscs()
        if qds:
            return qds[0]
        else:
            return None
Example #28
0
    def create_veth(self):
        '''
        Create veth pair
        The ifname inside container can be same for multiple containers.
        Hence, the veth pair cannot be created inside the host namespace.
        Create veth pair inside container and move one-end to host namespace
        '''
        ip = IPRoute()
        iface = ip.link_lookup(ifname=self.host_ifname)
        if len(iface) != 0:
            return

        # Switch to container namespace
        with Namespace(self.container_pid, 'net'):
            ip_ns = IPRoute()
            try:
                # Create veth pairs
                ip_ns.link_create(ifname=self.host_ifname,
                                  peer=self.container_ifname, kind='veth')
            except NetlinkError as e:
                if e.code != errno.EEXIST:
                    raise CniError(CNI_ERROR_ADD_VETH,
                                   'Error creating veth device ' +
                                   self.host_ifname + ' code ' + str(e.code) +
                                   ' message ' + e.message)
            # Move one end of veth pair to host network namespace
            idx = ip_ns.link_lookup(ifname=self.host_ifname)[0]
            ip_ns.link('set', index=idx, net_ns_pid=self.main_pid)
        return
Example #29
0
class TestRemoteData(TestData):

    def setup(self):
        create_link('dummyX', 'dummy')
        url = 'unix://\0%s' % (uuid.uuid4())

        self.uplink = IPRoute()
        self.uplink.serve(url)

        self.ip = IPRoute(host=url)
        self.dev = self.ip.link_lookup(ifname='dummyX')

    def teardown(self):
        TestData.teardown(self)
        self.uplink.release()
Example #30
0
    def _test_remote(self, url):

        uplink = IPRoute()
        uplink.serve(url)

        ip = IPRoute(host=url)
        ip.release()
        uplink.release()
Example #31
0
File: net.py Project: pquq12/uhd
def get_iface_addrs(mac_addr):
    """
    return ipv4 addresses for a given macaddress
    input format: "aa:bb:cc:dd:ee:ff"
    """
    with  IPRoute() as ip2:
        # returns index
        [link] = ip2.link_lookup(address=mac_addr)
        # Only get v4 addresses
        addresses = [addr.get_attrs('IFA_ADDRESS')
                     for addr in ip2.get_addr(family=socket.AF_INET)
                     if addr.get('index', None) == link]
        # flatten possibly nested list
        addresses = list(itertools.chain.from_iterable(addresses))

        return addresses
Example #32
0
def get_interface_index(iface_name):
    """
    Return the interface index.
    """

    interface_index = None

    try:
        with IPRoute() as ip:
            data = ip.link_lookup(ifname=iface_name)
            if data:
                interface_index = data[0]
    except NetlinkError as netlink_err:
        g_exception_logger.exception(netlink_err)

    return interface_index
Example #33
0
 def open(self):
     with IPRoute() as ipr:
         ipr.link('add', ifname=self.bridge_name, kind='bridge')
         self.bridge_link_id = ipr.link_lookup(ifname=self.bridge_name)[0]
         print(self.bridge_link_id)
         ipr.addr('add',
                  index=self.bridge_link_id,
                  address=str(self.ipv4_addr),
                  prefixlen=self.ipv4_network.prefixlen)
         ipr.addr('add',
                  index=self.bridge_link_id,
                  address=str(self.ipv6_addr),
                  prefixlen=self.ipv6_network.prefixlen)
         EthBridge.manage_nat_rule(self.ipv4_network, action='add')
         EthBridge.manage_nat_rule(self.ipv6_network, action='add')
         ipr.link('set', index=self.bridge_link_id, state='up')
Example #34
0
def global_route_wg(ifname, fwmark, table_id):
    wg_fwmark(ifname, fwmark)

    oif = get_index4ifname(ifname)

    with IPRoute() as ip:
        ip.route("add", dst="0.0.0.0/0", oif=oif, table=table_id)
        ip.rule("add",
                table=table_id,
                fwmark=fwmark,
                action="RT_SCOPE_NOWHERE")
        # 到这里不行了。 pyroute2 还是有很多问题。
        ip.rule("add", action="FRA_SUPPRESS_PREFIXLENGTH")
        input("回车 continue... ")

        ip.route("delete", dst="0.0.0.0/0", oif=oif, table=table_id)
Example #35
0
    def attach_interface_to_bridge(interface_index, bridge_name):
        from pyroute2 import IPRoute
        ip = IPRoute()

        logging.debug("Attaching interface ID = %d to bridge `%s`..." %
                      (interface_index, bridge_name))
        bridge_index = ip.link_lookup(ifname=bridge_name)[0]

        ip.link("set", index=interface_index, master=bridge_index, state="up")

        logging.debug("Interface ID = %d attached to bridge %s." %
                      (interface_index, bridge_name))

        ip.close()
Example #36
0
    def setup_veth_container_end(self, ifname):
        """Setup the VETH in a container.

        Parameters
        ----------
        ifname : str
            The interface name within the container.
        """
        ipr = IPRoute()

        logger.debug('Bind veth %s to %s at %s', self.veth_name, ifname, self.address)
        index = ipr.link_lookup(ifname=ifname)[0]
        ipr.addr('add', index=index, address=str(self.address.ip), mask=self.address.network.prefixlen)
        ipr.link('set', index=index, state='up')
Example #37
0
    def _add_bridge(self, name, address, prefixLen):
        """
        Creates a bridge with the given name, address, and netmask perfix length.
        """
        _remove_interface_if_exists(name)

        with IPRoute() as ipr:
            ipr.link("add", ifname=name, kind="bridge")

        with IPDB() as ipdb:
            with ipdb.interfaces[name] as bridge:
                bridge.add_ip("%s/%d" % (
                    address,
                    prefixLen,
                ))
                bridge.up()
Example #38
0
    def connect_tap_to_bridge(self, bridge_name=None, tap_mode="ConfigureLocal"):
        """Connect a ns-3 tap device to the bridge.

        Parameters
        ----------
        bridge_name : str
            The bridge to connect the tap (and ns-3) device to.
        tap_mode : str
            The ns-3 mode for the tap bridge. Either ConfigureLocal or UseLocal.
        """
        if bridge_name is None:
            bridge_name = self.bridge_name

        ipr = IPRoute()

        logger.debug('Connect %s to bridge %s via %s', self.node.name, bridge_name, self.tap_name)
        ipr.link('add', ifname=self.tap_name, kind='tuntap', mode='tap')
        defer(f'disconnect ns3 node {self.node.name}', self.disconnect_tap_from_bridge)

        ipr.link('set', ifname=self.tap_name, state='up')

        ipr.link('set', ifname=self.tap_name, master=ipr.link_lookup(ifname=bridge_name)[0])

        logger.debug("Adding TapBridge for %s.", self.node.name)
        tap_helper = tap_bridge.TapBridgeHelper()
        # ConfigureLocal is used to prevent the TAP / bridged device to use a "learned" MAC address.
        # So, we can set the CSMA and WiFiNetDevice address to something we control.
        # Otherwise, WiFi ACK misses happen.
        if tap_mode == "ConfigureLocal":
            tap_helper.SetAttribute('Mode', core.StringValue('ConfigureLocal'))
            tap_helper.SetAttribute('DeviceName', core.StringValue(self.tap_name))
            tap_helper.SetAttribute('MacAddress', ns_net.Mac48AddressValue(ns_net.Mac48Address.Allocate()))
            tap_helper.Install(self.node.ns3_node, self.ns3_device)
        elif tap_mode == "UseLocal":
            tap_helper.SetAttribute("Mode", core.StringValue("UseLocal"))
            tap_helper.SetAttribute("DeviceName", core.StringValue(self.tap_name))
            tap_helper.Install(self.node.ns3_node, self.ns3_device)
        else:
            logger.error("Unsupported TAP-Mode %s.", tap_mode)
Example #39
0
def get_link_up(if_name):
    """
    Return a dictionary {if_name: IFLA_OPERSTATE}
    """
    from pyroute2 import IPRoute
    result = {}
    with IPRoute() as ipr:
        links = ipr.link_lookup(ifname=if_name)
        if not links:
            return {'error_msg': "No interface found"}
        link_info = next(iter(ipr.get_links(links)), None)
        if link_info is None:
            return {'error_msg': "Error on get_links for sfp0"}
        result['sfp0'] = link_info.get_attr('IFLA_OPERSTATE')
        if result['sfp0'] != 'UP':
            result['error_msg'] = "Link not up for interface"
    return result
Example #40
0
File: net.py Project: zwm152/uhd
def get_iface_addrs(mac_addr):
    """
    Return a list of IPv4 addresses for a given MAC address.
    If there are no IP addresses assigned to the MAC address, it will return
    an empty list.

    Arguments:
    mac_addr -- A MAC address as a string, input format: "aa:bb:cc:dd:ee:ff"
    """
    with IPRoute() as ip2:
        [link_index] = ip2.link_lookup(address=mac_addr)
        # Only get v4 addresses
        addresses = [addr.get_attrs('IFA_ADDRESS')
                     for addr in ip2.get_addr(family=socket.AF_INET)
                     if addr.get('index', None) == link_index]
        # flatten possibly nested list
        return list(itertools.chain.from_iterable(addresses))
Example #41
0
def interface_operstate(interface: str) -> Optional[str]:
    """
    Get the operstate of an interface.

    :param interface: str: Network interface.

    """
    interface_number = __get_interface_number(interface)
    if interface_number:
        with IPRoute() as ipr:
            if interface_number in ipr.link_lookup(operstate="UP"):
                return "UP"
            elif interface_number in ipr.link_lookup(operstate="DOWN"):
                return "DOWN"
            elif interface_number in ipr.link_lookup(operstate="UNKNOWN"):
                return "UNKNOWN"
    return None
Example #42
0
def _remove_interface_if_exists(name):
    """
    If the given interface exists, brings it down and removes it. Otherwise
    just returns silently. A bridge is also an interface, so this can be
    used for removing bridges too.
    """
    with IPRoute() as ipr:
        # bring it down
        try:
            ipr.link('set', ifname=name, state='down')
        except netlink.exceptions.NetlinkError:
            pass
        # remove it
        try:
            ipr.link('del', ifname=name)
        except netlink.exceptions.NetlinkError:
            pass
Example #43
0
def _ns_worker(netns_path, worker_index, success):
    with IPRoute() as ip, NetNS(netns_path) as ns:
        try:
            veth_outside = 'veth%s-o' % worker_index
            veth_inside = 'veth%s-i' % worker_index
            ip.link('add', ifname=veth_outside, kind='veth', peer=veth_inside)
            veth_outside_idx = ip.link_lookup(ifname=veth_outside)[0]
            ip.link('set', index=veth_outside_idx, state='up')
            veth_inside_idx = ip.link_lookup(ifname=veth_inside)[0]
            ip.link('set', index=veth_inside_idx, net_ns_fd=netns_path)
            veth_inside_idx = ns.link_lookup(ifname=veth_inside)[0]
            ns.link('set', index=veth_inside_idx, state='up')
        except Exception:
            success[0] = False
        finally:
            if veth_outside_idx is not None:
                ip.link('del', index=veth_outside_idx)
Example #44
0
 def __init__(self, ifname, bpf=None):
     self.ifname = ifname
     # lookup the interface details
     with IPRoute() as ip:
         for link in ip.get_links():
             if link.get_attr('IFLA_IFNAME') == ifname:
                 break
         else:
             raise IOError(2, 'Link not found')
     self.l2addr = link.get_attr('IFLA_ADDRESS')
     self.ifindex = link['index']
     # bring up the socket
     socket.__init__(self, AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
     socket.bind(self, (self.ifname, ETH_P_ALL))
     if bpf:
         fstring, self.fprog = compile_bpf(bpf)
         socket.setsockopt(self, SOL_SOCKET, SO_ATTACH_FILTER, fstring)
Example #45
0
def configure_veth_interface(name, data):
    """
    Configures a veth interface, connects to the correct bridge
    :param str name: The name of the veth interface
    :param dict data: The veth interface data (bridge name)
    """
    logger.info("Creating VNet veth interface {}".format(name))
    ip = IPRoute()
    dev = ip.link_lookup(ifname=name)[0]
    bridge = ip.link_lookup(ifname=data["bridge"])[0]
    # Connect the veth interface to the bridge
    ip.link("set", index=dev, master=bridge)
Example #46
0
    def move_link(self, ifname):
        '''
        Move interface inside a container and rename to self.container_ifname
        '''
        # Get index of interface being configured
        iproute = IPRoute()
        intf = iproute.link_lookup(ifname=ifname)
        if len(intf) == 0:
            return
        idx = intf[0]

        # Move interface inside container.
        # If the interface rename failed, the interface with temporary name
        # can be present inside interface
        iproute.link('set', index=idx, net_ns_pid=self.container_pid)

        # Rename the interface
        with CniNamespace(self.container_netns, logger):
            ip_ns = IPRoute()
            if ifname != self.container_ifname:
                ip_ns.link("set", index=idx, address=self.mac,
                           ifname=self.container_ifname)
        return
Example #47
0
def ServerPyroute2(args):
  ip = IPRoute()
  idx = ip.link_lookup(ifname=args.device)[0]

  if args.operation == 'add':
    for i in range(1,int(args.number)+1):
      ip.route('add',
      dst=args.prefix+str(i)+'/128',
      oif=idx,
      encap={'type': 'seg6','mode': 'encap','segs': args.segments})
  elif args.operation=='delete':
    for i in range(1,int(args.number)+1):
      ip.route('delete',
      dst=args.prefix+str(i)+'/128',
      oif=idx)
  elif args.operation=='change':
    for i in range(1,int(args.number)+1):
      ip.route('change',
      dst=args.prefix+str(i)+'/128',
      oif=idx,
      encap={'via': args.segments})
  else:
    print(bcolors.FAIL +'please select \'change\', \'delete\', or \'add\' for input parameter -m'+ bcolors.ENDC)
Example #48
0
    def test_multiple_sources(self):

        # NB: no 'localhost' record -- important
        #
        sources = {'localhost0': IPRoute(),
                   'localhost1': RemoteIPRoute(),  # local mitogen source
                   'localhost2': RemoteIPRoute()}  # one more

        # check all the views
        #
        with NDB(sources=sources) as ndb:
            assert len(ndb.interfaces.csv())
            assert len(ndb.neighbours.csv())
            assert len(ndb.addresses.csv())
            assert len(ndb.routes.csv())

        for source in sources:
            assert sources[source].closed
Example #49
0
def main():
    b = BPF(src_file="memcached_tc.c", debug=0)
    fn = b.load_func("handle_ingress", BPF.SCHED_CLS)
    print "ready"

    ipr = IPRoute()
    ipdb = IPDB(nl=ipr)
    ifc = ipr.get_links(ifname='ens3d1')[0]
    idx = ifc['index']
    #ifc = ipdb.interfaces.ens3d1

    try:
        try:
            ipr.tc("add", "clsact", idx)
        except:
            pass
        # add ingress clsact
        ipr.tc("add-filter",
               "bpf",
               idx,
               fd=fn.fd,
               name=fn.name,
               parent="ffff:fff2",
               class_id=1,
               direct_action=True)

        b['NOTIFY_EVT'].open_perf_buffer(print_notification)
        b['PKT_EVT'].open_perf_buffer(print_pkt_size)
        while True:
            b.perf_buffer_poll()
    except:
        ipr.tc("del", "clsact", idx)
        #for key, val in b['MCD_MAP'].items():
        #    print "Stored:"
        #    print key.key, ":", val.val
        print "stored", len(b['MCD_MAP']), "items"
        raise
Example #50
0
    def _load_interfaces(cls):
        if cls._loaded:
            return

        # scan all interfaces in os
        with IPRoute() as ipr:
            for link in ipr.get_links():
                ifname = link.get_attr('IFLA_IFNAME')
                config = env.gwconfig.interfaces.get(ifname, None)
                cls._interfaces[ifname] = cls(ifname, link, config)

        # scan all user configured interface and register as well
        for ifname, config in env.gwconfig.interfaces.items():
            if ifname not in cls._interfaces:
                logger.warning(f'Link not found for user configured interface: {ifname}')
                cls._interfaces[ifname] = cls(ifname, None, config)

        cls._loaded = True
Example #51
0
    def test_ssl_fail(self):
        url = 'localhost:9824'
        uplink = IPRoute()
        uplink.serve('ssl://%s' % (url),
                     key='server.key',
                     cert='server.crt',
                     ca='ca.crt')

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('localhost', 9824))
        s.send(b'test')
        s.close()
        uplink.release()
def get_preferences():
    r = redis.Redis(host=redis_host, port=redis_port, db=redis_db)
    ret = dict()

    preferred_inet = r.get('GET pref-inet')
    if not preferred_inet:
        preferred_inet = default_inet
    print("Preferred Interface:", preferred_inet)
    ret['inet'] = preferred_inet
    
    preferred_ipv4 = r.get('GET pref-ipv4')
    if not preferred_ipv4:
        preferred_ipv4 = default_ipv4
    print("Preferred IPv4:", preferred_ipv4)
    ret['ipv4'] = preferred_ipv4

    with IPRoute() as ipr:
        for x in ipr.get_routes(table=254):
            dev = ipr.link_lookup(ifname=preferred_inet)
            if (dev and x.get_attr('RTA_OIF') == dev[0]):
                route = dict()
                route['dev']  = x.get_attr('RTA_OIF')
                route['gw']   = x.get_attr('RTA_GATEWAY')
                route['prio'] = x.get_attr('RTA_PRIORITY')
                print("Preferred Route:", route, "\n")
                ret['route'] = route
                break

        check = False
        for x in ipr.get_addr(family=AF_INET, label=preferred_inet):
            if x.get_attr('IFA_ADDRESS') == preferred_ipv4:
                check = True
                break

        if (check):
            if debug:
                print("Set preferences:", preferred_ipv4, "assigned to", 
                        preferred_inet, "and route", route, "\n")
        else:
            if debug:
                print("Bad preferences:", preferred_ipv4, 
                        "is not assigned to", preferred_inet)

    return ret
Example #53
0
def set_local_ip_address(wlan, ip_address):
    """The high-level method to set static local ip address.

    Args:
        wlan (str):       	        wi-fi interface that will be used to connect to external network
        ip_address (str):           Static ip address of this machine the network
    """
    from pyroute2 import IPRoute, NetlinkError
    ip = IPRoute()
    index = ip.link_lookup(ifname=wlan)[0]
    try:
        ip.addr('add', index, address=ip_address, mask=24)

    except NetlinkError as e:
        print(e)

    ip.close()
Example #54
0
File: net.py Project: zwm152/uhd
def get_valid_interfaces(iface_list):
    """
    Given a list of interfaces (['eth1', 'eth2'] for example), return the
    subset that contains actually valid entries.
    Interfaces are checked for if they actually exist, and if so, if they're up.
    """
    valid_ifaces = []
    with IPRoute() as ipr:
        for iface in iface_list:
            valid_iface_idx = ipr.link_lookup(ifname=iface)
            if len(valid_iface_idx) == 0:
                continue
            valid_iface_idx = valid_iface_idx[0]
            link_info = ipr.get_links(valid_iface_idx)[0]
            if link_info.get_attr('IFLA_OPERSTATE') == 'UP' \
                    and len(get_iface_addrs(link_info.get_attr('IFLA_ADDRESS'))):
                assert link_info.get_attr('IFLA_IFNAME') == iface
                valid_ifaces.append(iface)
    return valid_ifaces
Example #55
0
def get_ip_which_can_connect_to_internet2():
    # NOTE: this lib only support Linux, don't work on MacOS
    # refer here: https://github.com/svinota/pyroute2/issues/437#issuecomment-343117084
    import platform
    if platform.system() == "Darwin":
        print("This lib is only support Linux")
        return

    from pyroute2 import IPRoute
    ip_addresses = []
    with IPRoute() as ipr:
        routes = ipr.route('get', dst='8.8.8.8')
        for value in list(routes):
            for v in value['attrs']:
                if v[0] == 'RTA_PREFSRC':
                    ip = v[1]
                    print("IP addresses which can connect to internet: {}".
                          format(ip))
                    return ip
Example #56
0
def getInterfaceState(ifname):
    try:
        ip = IPRoute()
        state = ip.get_links(
            ip.link_lookup(ifname=ifname))[0].get_attr('IFLA_OPERSTATE')
        ip.close()
    except Exception as e:
        raise Exception(
            "getInterfaceState: Collecting interface status for %s failed: %s"
            % (ifname, str(e)))
    else:
        if state == "UP":
            return True
    return False
def get_interface_kind(interface_name):

    # Get interface state
    ip = IPRoute()

    linkinfo = ip.get_links(
        ip.link_lookup(ifname=interface_name))[0].get_attr('IFLA_LINKINFO')
    if linkinfo is not None:
        kind = linkinfo.get_attr('IFLA_INFO_KIND')
    else:
        kind = 'n/a'
    ip.close()

    return kind
Example #58
0
def deploy(topo):
    """Deploy a given topology with network namespace

    Args:
        topo (nx.Graph): the network topo to be deployed
    """
    # sanity check should be done outside
    # add nodes, each as a network namespace
    for n in topo.nodes():
        netns.create(n)
    # add links and attribute each interface to proper network namespace
    ip = IPRoute()
    for (i, j, intf_pair) in topo.edges.data('interfaces'):
        print(i, j, intf_pair)
        ip.link('add', ifname=intf_pair[0], kind='veth', peer=intf_pair[1])
        for ns, intf in zip([i, j], intf_pair):
            intf_idx = ip.link_lookup(ifname=intf)[0]
            ip.link('set', index=intf_idx, net_ns_fd=ns)
Example #59
0
def get_address(ifname):
    """Get first interface IP address with netmask in format
    '192.168.1.1/24'
    """
    if ifname == None:
        return

    ipr = IPRoute()
    try:
        for i in ipr.get_addr(label=ifname):
            if 'prefixlen' in i and 'attrs' in i:
                for ii in i['attrs']:
                    if ii[0] == 'IFA_LOCAL':
                        ipr.close()
                        return ii[1] + '/' + str(i['prefixlen'])
    except Exception as e:
        pass
    ipr.close()
Example #60
0
def condUnshareNet(unshare_net=True):
    if USE_NSPAWN and unshare_net:
        try:
            unshare(CLONE_NEWNET)
            # Set up loopback interface and add default route via loopback in the namespace.
            # Missing default route may confuse some software, see
            # https://github.com/rpm-software-management/mock/issues/113
            ipr = IPRoute()
            dev = ipr.link_lookup(ifname='lo')[0]

            ipr.link('set', index=dev, state='up')
            ipr.route("add", dst="default", gateway="127.0.0.1")
        except exception.UnshareFailed:
            # IPC and UTS ns are supported since the same kernel version. If this
            # fails, there had to be a warning already
            pass
        except Exception as e:  # pylint: disable=broad-except
            getLog().warning("network namespace setup failed: %s", e)