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.