diff options
author | Christian Poessinger <christian@poessinger.com> | 2019-10-08 21:23:57 +0200 |
---|---|---|
committer | Christian Poessinger <christian@poessinger.com> | 2019-10-09 17:19:03 +0200 |
commit | afc82770cce851da31267829f1726f85093d9d76 (patch) | |
tree | 737581797aa07cebad9d3f1cec8eb50b29505ca4 /python/vyos | |
parent | 21fe962befb2ebd1625eb7a6c28cb3e9005fe37e (diff) | |
download | vyos-1x-afc82770cce851da31267829f1726f85093d9d76.tar.gz vyos-1x-afc82770cce851da31267829f1726f85093d9d76.zip |
Python/ifconfig: T1557: add generic support for DHCP client options
Diffstat (limited to 'python/vyos')
-rw-r--r-- | python/vyos/ifconfig.py | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/python/vyos/ifconfig.py b/python/vyos/ifconfig.py index 4ac605b54..0f80f4cea 100644 --- a/python/vyos/ifconfig.py +++ b/python/vyos/ifconfig.py @@ -23,13 +23,23 @@ from netifaces import ifaddresses, AF_INET, AF_INET6 from subprocess import Popen, PIPE, STDOUT from time import sleep +dhclient_base = r'/var/lib/dhcp/dhclient_' dhcp_cfg = """ # generated by ifconfig.py option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; +timeout 60; +retry 300; + interface "{{ intf }}" { send host-name "{{ hostname }}"; - request subnet-mask, broadcast-address, routers, domain-name-servers, rfc3442-classless-static-routes, domain-name, interface-mtu; + {% if client_id -%} + send dhcp-client-identifier "{{ client_id }}"; + {% endif -%} + request subnet-mask, broadcast-address, routers, domain-name-servers, + rfc3442-classless-static-routes, domain-name, interface-mtu; + require subnet-mask; } + """ dhcpv6_cfg = """ @@ -37,10 +47,8 @@ dhcpv6_cfg = """ interface "{{ intf }}" { request routers, domain-name-servers, domain-name; } -""" - -dhclient_base = r'/var/lib/dhcp/dhclient_' +""" class Interface: def __init__(self, ifname, type=None): @@ -78,6 +86,13 @@ class Interface: self._dhcpv6_pid_file = dhclient_base + self._ifname + '.v6pid' self._dhcpv6_lease_file = dhclient_base + self._ifname + '.v6leases' + # DHCP options + self._dhcp_options = { + 'intf' : self._ifname, + 'hostname' : '', + 'client_id' : '', + } + def _debug_msg(self, msg): if os.path.isfile('/tmp/vyos.ifconfig.debug'): print('DEBUG/{:<6} {}'.format(self._ifname, msg)) @@ -449,6 +464,21 @@ class Interface: cmd = 'ip addr del "{}" dev "{}"'.format(addr, self._ifname) return self._cmd(cmd) + + def get_dhcp_options(self): + """ + Return dictionary with supported DHCP options. + Dictionary should be altered and send back via set_dhcp_options() + so those options are applied when DHCP is run. + """ + return self._dhcp_options + + def set_dhcp_options(self, options): + """ + Store new DHCP options used by next run of DHCP client. + """ + self._dhcp_options = options + # replace dhcpv4/v6 with systemd.networkd? def _set_dhcp(self): """ @@ -461,15 +491,13 @@ class Interface: >>> j = Interface('eth0') >>> j.set_dhcp() """ - dhcp = { - 'hostname': 'vyos', - 'intf': self._ifname - } - # read configured system hostname. - # maybe change to vyos hostd client ??? - with open('/etc/hostname', 'r') as f: - dhcp['hostname'] = f.read().rstrip('\n') + dhcp = self.get_dhcp_options() + if not dhcp['hostname']: + # read configured system hostname. + # maybe change to vyos hostd client ??? + with open('/etc/hostname', 'r') as f: + dhcp['hostname'] = f.read().rstrip('\n') # render DHCP configuration tmpl = jinja2.Template(dhcp_cfg) |