diff options
-rw-r--r-- | data/templates/dhcp-relay/config.tmpl | 4 | ||||
-rw-r--r-- | data/templates/dhcp-relay/dhcrelay.conf.tmpl | 5 | ||||
-rwxr-xr-x | smoketest/scripts/cli/test_service_dhcp-relay.py | 101 | ||||
-rwxr-xr-x | src/conf_mode/dhcp_relay.py | 4 | ||||
-rw-r--r-- | src/systemd/isc-dhcp-relay.service | 4 |
5 files changed, 110 insertions, 8 deletions
diff --git a/data/templates/dhcp-relay/config.tmpl b/data/templates/dhcp-relay/config.tmpl deleted file mode 100644 index b223807cf..000000000 --- a/data/templates/dhcp-relay/config.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -### Autogenerated by dhcp_relay.py ### - -# Defaults for isc-dhcp-relay6.service -OPTIONS="{{ options | join(' ') }} -i {{ interface | join(' -i ') }} {{ server | join(' ') }}" diff --git a/data/templates/dhcp-relay/dhcrelay.conf.tmpl b/data/templates/dhcp-relay/dhcrelay.conf.tmpl new file mode 100644 index 000000000..721a238a6 --- /dev/null +++ b/data/templates/dhcp-relay/dhcrelay.conf.tmpl @@ -0,0 +1,5 @@ +### Autogenerated by dhcp_relay.py ### + +# Defaults for isc-dhcp-relay.service +OPTIONS="-4 {{ options | join(' ') }} -i {{ interface | join(' -i ') }} {{ server | join(' ') }}" + diff --git a/smoketest/scripts/cli/test_service_dhcp-relay.py b/smoketest/scripts/cli/test_service_dhcp-relay.py new file mode 100755 index 000000000..d56f6aa16 --- /dev/null +++ b/smoketest/scripts/cli/test_service_dhcp-relay.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2020 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import re +import os +import unittest + +from vyos.configsession import ConfigSession +from vyos.configsession import ConfigSessionError +from vyos.ifconfig import Section +from vyos.util import cmd +from vyos.util import process_named_running +from vyos.util import read_file + +PROCESS_NAME = 'dhcrelay' +RELAY_CONF = '/run/dhcp-relay/dhcrelay.conf' +base_path = ['service', 'dhcp-relay'] + +def get_config_value(key): + tmp = read_file(SSHD_CONF) + tmp = re.findall(f'\n?{key}\s+(.*)', tmp) + return tmp + +class TestServiceDHCPRelay(unittest.TestCase): + def setUp(self): + self.session = ConfigSession(os.getpid()) + # ensure we can also run this test on a live system - so lets clean + # out the current configuration :) + self.session.delete(base_path) + + def tearDown(self): + self.session.delete(base_path) + self.session.commit() + del self.session + + def test_relay_default(self): + max_size = '800' + hop_count = '20' + agents_packets = 'append' + servers = ['192.0.2.1', '192.0.2.2'] + + self.session.set(base_path + ['interface', 'lo']) + # check validate() - DHCP relay does not support the loopback interface + with self.assertRaises(ConfigSessionError): + self.session.commit() + self.session.delete(base_path + ['interface', 'lo']) + + # activate DHCP relay on all ethernet interfaces + for tmp in Section.interfaces("ethernet"): + self.session.set(base_path + ['interface', tmp]) + + # check validate() - No DHCP relay server(s) configured + with self.assertRaises(ConfigSessionError): + self.session.commit() + for server in servers: + self.session.set(base_path + ['server', server]) + + self.session.set(base_path + ['relay-options', 'max-size', max_size]) + self.session.set(base_path + ['relay-options', 'hop-count', hop_count]) + self.session.set(base_path + ['relay-options', 'relay-agents-packets', agents_packets]) + + # commit changes + self.session.commit() + + # Check configured port + config = read_file(RELAY_CONF) + + # Test configured relay interfaces + for tmp in Section.interfaces("ethernet"): + self.assertIn(f'-i {tmp}', config) + + # Test relay servers + for server in servers: + self.assertIn(f' {server}', config) + + # Test max-size + self.assertIn(f'-A {max_size}', config) + # Hop count + self.assertIn(f'-c {hop_count}', config) + # relay-agents-packets + self.assertIn(f'-a -m {agents_packets}', config) + + # Check for running process + self.assertTrue(process_named_running(PROCESS_NAME)) + +if __name__ == '__main__': + unittest.main() + diff --git a/src/conf_mode/dhcp_relay.py b/src/conf_mode/dhcp_relay.py index 352865b9d..34b3fabb7 100755 --- a/src/conf_mode/dhcp_relay.py +++ b/src/conf_mode/dhcp_relay.py @@ -26,7 +26,7 @@ from vyos import ConfigError from vyos import airbag airbag.enable() -config_file = r'/run/dhcp-relay/dhcp.conf' +config_file = r'/run/dhcp-relay/dhcrelay.conf' default_config_data = { 'interface': [], @@ -104,7 +104,7 @@ def generate(relay): if not relay: return None - render(config_file, 'dhcp-relay/config.tmpl', relay) + render(config_file, 'dhcp-relay/dhcrelay.conf.tmpl', relay) return None def apply(relay): diff --git a/src/systemd/isc-dhcp-relay.service b/src/systemd/isc-dhcp-relay.service index 56bcec840..de2e51a87 100644 --- a/src/systemd/isc-dhcp-relay.service +++ b/src/systemd/isc-dhcp-relay.service @@ -3,7 +3,7 @@ Description=ISC DHCP IPv4 relay Documentation=man:dhcrelay(8) Wants=network-online.target RequiresMountsFor=/run -ConditionPathExists=/run/dhcp-relay/dhcp.conf +ConditionPathExists=/run/dhcp-relay/dhcrelay.conf After=vyos-router.service [Service] @@ -11,7 +11,7 @@ Type=forking WorkingDirectory=/run/dhcp-relay RuntimeDirectory=dhcp-relay RuntimeDirectoryPreserve=yes -EnvironmentFile=/run/dhcp-relay/dhcp.conf +EnvironmentFile=/run/dhcp-relay/dhcrelay.conf PIDFile=/run/dhcp-relay/dhcrelay.pid ExecStart=/usr/sbin/dhcrelay -4 -pf /run/dhcp-relay/dhcrelay.pid $OPTIONS Restart=always |