IP addresses management — pyroute2 0.5.18 documentation

# IP addresses management

## Using the global view

The addresses view provides access to all the addresses registered in the DB, as well as methods to create and remove them:

    eth0 = ndb.interfaces['eth0']

    # create an address
    (ndb
     .addresses
     .create(address='10.0.0.1', prefixlen=24, index=eth0['index'])
     .commit())

    # remove it
    (ndb
     .addresses['10.0.0.1/24']
     .remove()
     .commit())

    # list addresses
    (ndb
     .addresses
     .summary())  # see also other view dump methods

## Using ipaddr views

Interfaces also provide address views as subsets of the global address view:

    (ndb
     .interfaces['eth0']
     .ipaddr
     .summary())

It is possible use the same API as with the global address view:

    (ndb
     .interfaces['eth0']
     .ipaddr
     .create(address='10.0.0.1', prefixlen=24)  # index is implied
     .commit())

## Using interface methods

Interfaces provide also simple methods to manage addresses:

    (ndb
     .interfaces['eth0']
     .del_ip('172.16.0.1/24')                   # remove an existing address
     .del_ip(family=AF_INET)                    # remove all IPv4 addresses
     .add_ip('10.0.0.1/24')                     # add a new IP address
     .add_ip(address='10.0.0.2', prefixlen=24)  # if you prefer keyword args
     .set('state', 'up')
     .commit())

Functions add_ip() and del_ip() return the interface object, so they can be chained as in the example above, and the final commit() will commit all the changes in the chain.

The keywords to del_ip() are the same object field names that may be used in the selectors or report filters:

    (ndb
     .interfaces['eth0']
     .del_ip(prefixlen=25)    # remove all addresses with mask /25
     .commit())

A match function that may be passed to the del_ip() is the same as for addresses.dump().filter(), and it gets a named tuple as the argument. The fields are named in the same way as address objects fields. So if you want to filter addresses by a pattern or the prefixlen field with a match function, you may use:

    (ndb
     .interfaces['eth0']
     .del_ip(lambda x: x.address.startswith('192.168'))
     .commit())

    (ndb
     .interfaces['eth1']
     .del_ip(lambda x: x.prefixlen == 25)
     .commit())

An empty del_ip() removes all the IP addresses on the interface:

    (ndb
     .interfaces['eth0']
     .del_ip()                # flush all the IP:s
     .commit())

## Accessing one address details

Access an address as a separate RTNL object:

    print(ndb.addresses['10.0.0.1/24'])

Please notice that address objects are read-only, you may not change them, only remove old ones, and create new.