diff options
-rw-r--r-- | data/templates/dhcp-client/daemon-options.tmpl | 2 | ||||
-rw-r--r-- | python/vyos/ifconfig/dhcp.py | 76 | ||||
-rw-r--r-- | src/systemd/dhclient@.service | 2 |
3 files changed, 35 insertions, 45 deletions
diff --git a/data/templates/dhcp-client/daemon-options.tmpl b/data/templates/dhcp-client/daemon-options.tmpl index 8f995ab62..b5a10c3b8 100644 --- a/data/templates/dhcp-client/daemon-options.tmpl +++ b/data/templates/dhcp-client/daemon-options.tmpl @@ -1 +1 @@ -DHCLIENT_OPTS="-nw -cf {{ config_path }}/{{ ifname }}.conf -pf {{ config_path }}/{{ ifname }}.pid -lf {{ config_path }}/{{ ifname }}.leases {{ '-S' if dhcpv6_prm_only }} {{ '-T' if dhcpv6_temporary }} {{ ifname }}"
+DHCLIENT_OPTS="-nw -cf {{ conf_file }} -pf {{ pid_file }} -lf {{ lease_file }} {{ '-S' if dhcpv6_prm_only }} {{ '-T' if dhcpv6_temporary }} {{ ifname }}"
diff --git a/python/vyos/ifconfig/dhcp.py b/python/vyos/ifconfig/dhcp.py index b9862652a..d3e75c292 100644 --- a/python/vyos/ifconfig/dhcp.py +++ b/python/vyos/ifconfig/dhcp.py @@ -19,28 +19,20 @@ from vyos.dicts import FixedDict from vyos.ifconfig.control import Control from vyos.template import render -class _DHCP (Control): - def __init__(self, ifname, **kargs): - super().__init__(**kargs) - self.file = { - 'ifname': ifname, - 'conf': self.client_base + f'/{ifname}.conf', - 'options': self.client_base + f'/{ifname}.options', - 'pid': self.client_base + f'/{ifname}.pid', - 'lease': self.client_base + f'/{ifname}.leases', - } - -class _DHCPv4 (_DHCP): - client_base = r'/run/dhclient' +class _DHCPv4 (Control): def __init__(self, ifname): - super().__init__(ifname) + super().__init__() + config_base = r'/run/dhclient' self.options = FixedDict(**{ 'ifname': ifname, - 'config_path': self.client_base, 'hostname': '', 'client_id': '', - 'vendor_class_id': '' + 'vendor_class_id': '', + 'conf_file': config_base + f'/{ifname}.conf', + 'options_file': config_base + f'/{ifname}.options', + 'pid_file': config_base + f'/{ifname}.pid', + 'lease_file': config_base + f'/{ifname}.leases', }) # replace dhcpv4/v6 with systemd.networkd? @@ -55,17 +47,16 @@ class _DHCPv4 (_DHCP): >>> j = Interface('eth0') >>> j.dhcp.v4.set() """ - if not self.options['hostname']: # read configured system hostname. # maybe change to vyos hostd client ??? with open('/etc/hostname', 'r') as f: self.options['hostname'] = f.read().rstrip('\n') - render(self.file['options'], 'dhcp-client/daemon-options.tmpl', self.options) - render(self.file['conf'], 'dhcp-client/ipv4.tmpl', self.options) + render(self.options['options_file'], 'dhcp-client/daemon-options.tmpl', self.options) + render(self.options['conf_file'], 'dhcp-client/ipv4.tmpl', self.options) - return self._cmd('systemctl restart dhclient@{ifname}.service'.format(**self.file)) + return self._cmd('systemctl restart dhclient@{ifname}.service'.format(**self.options)) def delete(self): """ @@ -78,31 +69,30 @@ class _DHCPv4 (_DHCP): >>> j = Interface('eth0') >>> j.dhcp.v4.delete() """ - if not os.path.isfile(self.file['pid']): + if not os.path.isfile(self.options['pid_file']): self._debug_msg('No DHCP client PID found') return None - return self._cmd('systemctl stop dhclient@{ifname}.service'.format(**self.file)) + self._cmd('systemctl stop dhclient@{ifname}.service'.format(**self.options)) # cleanup old config files - for name in ('conf', 'options', 'pid', 'lease'): - if os.path.isfile(self.file[name]): - os.remove(self.file[name]) - -class _DHCPv6 (_DHCP): - client_base = r'/run/dhclient6' + for name in ('conf_file', 'options_file', 'pid_file', 'lease_file'): + if os.path.isfile(self.options[name]): + os.remove(self.options[name]) +class _DHCPv6 (Control): def __init__(self, ifname): - super().__init__(ifname) + super().__init__() + config_base = r'/run/dhclient6' self.options = FixedDict(**{ 'ifname': ifname, - 'config_path': self.client_base, + 'conf_file': config_base + f'/{ifname}.conf', + 'options_file': config_base + f'/{ifname}.options', + 'pid_file': config_base + f'/{ifname}.pid', + 'lease_file': config_base + f'/{ifname}.leases', 'dhcpv6_prm_only': False, 'dhcpv6_temporary': False, }) - self.file.update({ - 'accept_ra': f'/proc/sys/net/ipv6/conf/{ifname}/accept_ra', - }) def set(self): """ @@ -122,13 +112,13 @@ class _DHCPv6 (_DHCP): raise Exception( 'DHCPv6 temporary and parameters-only options are mutually exclusive!') - render(self.file['options'], 'dhcp-client/daemon-options.tmpl', self.options) - render(self.file['conf'], 'dhcp-client/ipv6.tmpl', self.options) + render(self.options['options_file'], 'dhcp-client/daemon-options.tmpl', self.options) + render(self.options['conf_file'], 'dhcp-client/ipv6.tmpl', self.options) # no longer accept router announcements on this interface - self._write_sysfs(self.file['accept_ra'], 0) + self._write_sysfs('/proc/sys/net/ipv6/conf/{ifname}/accept_ra'.format(**self.options), 0) - return self._cmd('systemctl restart dhclient6@{ifname}.service'.format(**self.file)) + return self._cmd('systemctl restart dhclient6@{ifname}.service'.format(**self.options)) def delete(self): """ @@ -141,19 +131,19 @@ class _DHCPv6 (_DHCP): >>> j = Interface('eth0') >>> j.dhcp.v6.delete() """ - if not os.path.isfile(self.file['pid']): + if not os.path.isfile(self.options['pid_file']): self._debug_msg('No DHCPv6 client PID found') return None - return self._cmd('systemctl stop dhclient6@{ifname}.service'.format(**self.file)) + self._cmd('systemctl stop dhclient6@{ifname}.service'.format(**self.options)) # accept router announcements on this interface - self._write_sysfs(self.file['accept_ra'], 1) + self._write_sysfs('/proc/sys/net/ipv6/conf/{ifname}/accept_ra'.format(**self.options), 1) # cleanup old config files - for name in ('conf', 'options', 'pid', 'lease'): - if os.path.isfile(self.file[name]): - os.remove(self.file[name]) + for name in ('conf_file', 'options_file', 'pid_file', 'lease_file'): + if os.path.isfile(self.options[name]): + os.remove(self.options[name]) class DHCP(object): diff --git a/src/systemd/dhclient@.service b/src/systemd/dhclient@.service index c6f1e4be1..1040ce2b2 100644 --- a/src/systemd/dhclient@.service +++ b/src/systemd/dhclient@.service @@ -8,7 +8,7 @@ After=vyos-router.service [Service] WorkingDirectory=/run/dhclient -Type=forking +Type=exec EnvironmentFile=-/run/dhclient/%i.options PIDFile=/run/dhclient/%i.pid ExecStart=/sbin/dhclient -4 $DHCLIENT_OPTS |