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
with ndb.addresses['10.0.0.1/24'] as addr:
    addr.remove()

# list addresses
for record in ndb.addresses.summary():
    print(record)

Using ipaddr views

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

with ndb.interfaces['eth0'] as eth0:
    for record in eth0.ipaddr.summary():
        print(record)
('localhost', 0, 'eth0', '192.168.122.28', 24)

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

with ndb.interfaces['eth0'] as eth0:
    eth0.ipaddr.create(
        address='10.0.0.1', prefixlen=24  # index is implied
    ).commit()
for record in ndb.addresses.summary():
    print(record)
('localhost', 0, 'lo', '127.0.0.1', 8)
('localhost', 0, 'eth0', '10.0.0.1', 24)
('localhost', 0, 'eth0', '192.168.122.28', 24)

Using interface methods

Interfaces provide also simple methods to manage addresses:

with ndb.interfaces['eth0'] as eth0:
    eth0.del_ip('192.168.122.28/24')  # remove an existing address
    eth0.del_ip(family=AF_INET)  # ... or remove all IPv4 addresses
    eth0.add_ip('10.0.0.1/24')  # add a new IP address
    eth0.add_ip(address='10.0.0.2', prefixlen=24)  # ... or using keywords
    eth0.set('state', 'up')
with ndb.addresses.summary() as report:
    report.select_records(ifname='eth0')
    for address in report:
        print(address)
('localhost', 0, 'eth0', '10.0.0.1', 24)
('localhost', 0, 'eth0', '10.0.0.2', 24)

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:

with ndb.interfaces['eth0'] as eth0:
    eth0.del_ip(prefixlen=24)  # remove all addresses with mask /24

A match function that may be passed to the del_ip() is the same as for addresses.dump().select_records(), 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:

with ndb.interfaces['eth0'] as eth0:
    eth0.add_ip('10.0.0.1/25')

with ndb.interfaces['eth0'] as eth0:
    eth0.del_ip(lambda x: x.address.startswith('192.168'))
    eth0.del_ip(lambda x: x.prefixlen == 25)

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

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

Accessing one address details

Access an address as a separate RTNL object:

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

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