summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/templates/frr/staticd.frr.j24
-rw-r--r--interface-definitions/dhcp-server.xml.in48
-rw-r--r--interface-definitions/interfaces-openvpn.xml.in10
-rw-r--r--interface-definitions/interfaces-wireless.xml.in4
-rw-r--r--interface-definitions/policy.xml.in8
-rw-r--r--interface-definitions/service_webproxy.xml.in2
-rw-r--r--python/vyos/configdict.py19
-rw-r--r--[-rwxr-xr-x]python/vyos/ifconfig/interface.py0
-rwxr-xr-xscripts/build-command-templates2
-rwxr-xr-xsmoketest/scripts/cli/test_policy.py32
-rw-r--r--src/systemd/dhclient@.service3
11 files changed, 87 insertions, 45 deletions
diff --git a/data/templates/frr/staticd.frr.j2 b/data/templates/frr/staticd.frr.j2
index 589f03c2c..55c05ceb7 100644
--- a/data/templates/frr/staticd.frr.j2
+++ b/data/templates/frr/staticd.frr.j2
@@ -17,7 +17,7 @@ vrf {{ vrf }}
{% endif %}
{# IPv4 default routes from DHCP interfaces #}
{% if dhcp is vyos_defined %}
-{% for interface, interface_config in dhcp.items() %}
+{% for interface, interface_config in dhcp.items() if interface_config.dhcp_options.no_default_route is not vyos_defined %}
{% set next_hop = interface | get_dhcp_router %}
{% if next_hop is vyos_defined %}
{{ ip_prefix }} route 0.0.0.0/0 {{ next_hop }} {{ interface }} tag 210 {{ interface_config.dhcp_options.default_route_distance if interface_config.dhcp_options.default_route_distance is vyos_defined }}
@@ -26,7 +26,7 @@ vrf {{ vrf }}
{% endif %}
{# IPv4 default routes from PPPoE interfaces #}
{% if pppoe is vyos_defined %}
-{% for interface, interface_config in pppoe.items() %}
+{% for interface, interface_config in pppoe.items() if interface_config.no_default_route is not vyos_defined %}
{{ ip_prefix }} route 0.0.0.0/0 {{ interface }} tag 210 {{ interface_config.default_route_distance if interface_config.default_route_distance is vyos_defined }}
{% endfor %}
{% endif %}
diff --git a/interface-definitions/dhcp-server.xml.in b/interface-definitions/dhcp-server.xml.in
index 6dabc5e1c..6e1592200 100644
--- a/interface-definitions/dhcp-server.xml.in
+++ b/interface-definitions/dhcp-server.xml.in
@@ -67,10 +67,7 @@
</node>
<leafNode name="global-parameters">
<properties>
- <help>Additional global parameters for DHCP server. You must
- use the syntax of dhcpd.conf in this text-field. Using this
- without proper knowledge may result in a crashed DHCP server.
- Check system log to look for errors.</help>
+ <help>Additional global parameters for DHCP server. You must use the syntax of dhcpd.conf in this text-field. Using this without proper knowledge may result in a crashed DHCP server. Check system log to look for errors.</help>
<multi/>
</properties>
</leafNode>
@@ -111,10 +108,7 @@
#include <include/name-server-ipv4.xml.i>
<leafNode name="shared-network-parameters">
<properties>
- <help>Additional shared-network parameters for DHCP server.
- You must use the syntax of dhcpd.conf in this text-field.
- Using this without proper knowledge may result in a crashed
- DHCP server. Check system log to look for errors.</help>
+ <help>Additional shared-network parameters for DHCP server. You must use the syntax of dhcpd.conf in this text-field. Using this without proper knowledge may result in a crashed DHCP server. Check system log to look for errors.</help>
<multi/>
</properties>
</leafNode>
@@ -134,17 +128,38 @@
<leafNode name="bootfile-name">
<properties>
<help>Bootstrap file name</help>
+ <constraint>
+ <regex>[-_a-zA-Z0-9./]+</regex>
+ </constraint>
</properties>
</leafNode>
<leafNode name="bootfile-server">
<properties>
- <help>Server (IP address or domain name) from which the initial
- boot file is to be loaded</help>
+ <help>Server from which the initial boot file is to be loaded</help>
+ <valueHelp>
+ <format>ipv4</format>
+ <description>Bootfile server IPv4 address</description>
+ </valueHelp>
+ <valueHelp>
+ <format>hostname</format>
+ <description>Bootfile server FQDN</description>
+ </valueHelp>
+ <constraint>
+ <validator name="ipv4-address"/>
+ <validator name="fqdn"/>
+ </constraint>
</properties>
</leafNode>
<leafNode name="bootfile-size">
<properties>
- <help>Bootstrap file size in 512 byte blocks</help>
+ <help>Bootstrap file size</help>
+ <valueHelp>
+ <format>u32:1-16</format>
+ <description>Bootstrap file size in 512 byte blocks</description>
+ </valueHelp>
+ <constraint>
+ <validator name="numeric" argument="--range 1-16"/>
+ </constraint>
</properties>
</leafNode>
<leafNode name="client-prefix-length">
@@ -326,11 +341,7 @@
</leafNode>
<leafNode name="static-mapping-parameters">
<properties>
- <help>Additional static-mapping parameters for DHCP server.
- Will be placed inside the "host" block of the mapping.
- You must use the syntax of dhcpd.conf in this text-field.
- Using this without proper knowledge may result in a crashed
- DHCP server. Check system log to look for errors.</help>
+ <help>Additional static-mapping parameters for DHCP server. Will be placed inside the "host" block of the mapping. You must use the syntax of dhcpd.conf in this text-field. Using this without proper knowledge may result in a crashed DHCP server. Check system log to look for errors.</help>
<multi/>
</properties>
</leafNode>
@@ -364,10 +375,7 @@
</tagNode >
<leafNode name="subnet-parameters">
<properties>
- <help>Additional subnet parameters for DHCP server. You must
- use the syntax of dhcpd.conf in this text-field. Using this
- without proper knowledge may result in a crashed DHCP server.
- Check system log to look for errors.</help>
+ <help>Additional subnet parameters for DHCP server. You must use the syntax of dhcpd.conf in this text-field. Using this without proper knowledge may result in a crashed DHCP server. Check system log to look for errors.</help>
<multi/>
</properties>
</leafNode>
diff --git a/interface-definitions/interfaces-openvpn.xml.in b/interface-definitions/interfaces-openvpn.xml.in
index bfad6d70f..f1cbf8468 100644
--- a/interface-definitions/interfaces-openvpn.xml.in
+++ b/interface-definitions/interfaces-openvpn.xml.in
@@ -305,10 +305,7 @@
</leafNode>
<leafNode name="openvpn-option">
<properties>
- <help>Additional OpenVPN options. You must
- use the syntax of openvpn.conf in this text-field. Using this
- without proper knowledge may result in a crashed OpenVPN server.
- Check system log to look for errors.</help>
+ <help>Additional OpenVPN options. You must use the syntax of openvpn.conf in this text-field. Using this without proper knowledge may result in a crashed OpenVPN server. Check system log to look for errors.</help>
<multi/>
</properties>
</leafNode>
@@ -502,10 +499,7 @@
</leafNode>
<leafNode name="subnet-mask">
<properties>
- <help>Subnet mask pushed to dynamic clients.
- If not set the server subnet mask will be used.
- Only used with topology subnet or device type tap.
- Not used with bridged interfaces.</help>
+ <help>Subnet mask pushed to dynamic clients. If not set the server subnet mask will be used. Only used with topology subnet or device type tap. Not used with bridged interfaces.</help>
<constraint>
<validator name="ipv4-address"/>
</constraint>
diff --git a/interface-definitions/interfaces-wireless.xml.in b/interface-definitions/interfaces-wireless.xml.in
index eb6107303..daee770a9 100644
--- a/interface-definitions/interfaces-wireless.xml.in
+++ b/interface-definitions/interfaces-wireless.xml.in
@@ -716,9 +716,7 @@
</leafNode>
<leafNode name="passphrase">
<properties>
- <help>WPA personal shared pass phrase. If you are
- using special characters in the WPA passphrase then single
- quotes are required.</help>
+ <help>WPA personal shared pass phrase. If you are using special characters in the WPA passphrase then single quotes are required.</help>
<valueHelp>
<format>txt</format>
<description>Passphrase of at least 8 but not more than 63 printable characters</description>
diff --git a/interface-definitions/policy.xml.in b/interface-definitions/policy.xml.in
index 83ae714b4..0d0ada591 100644
--- a/interface-definitions/policy.xml.in
+++ b/interface-definitions/policy.xml.in
@@ -852,7 +852,7 @@
<validator name="ipv6-address"/>
</constraint>
</properties>
- </leafNode>
+ </leafNode>
<leafNode name="access-list">
<properties>
<help>IPv6 access-list to match</help>
@@ -961,8 +961,13 @@
<format>ipv4</format>
<description>Peer IP address</description>
</valueHelp>
+ <valueHelp>
+ <format>ipv6</format>
+ <description>Peer IPv6 address</description>
+ </valueHelp>
<constraint>
<validator name="ipv4-address"/>
+ <validator name="ipv6-address"/>
</constraint>
</properties>
</leafNode>
@@ -1411,6 +1416,7 @@
<description>Metric value</description>
</valueHelp>
<constraint>
+ <validator name="numeric" argument="--relative --"/>
<validator name="numeric" argument="--range 0-4294967295"/>
</constraint>
</properties>
diff --git a/interface-definitions/service_webproxy.xml.in b/interface-definitions/service_webproxy.xml.in
index 42f5bba9f..e4609b699 100644
--- a/interface-definitions/service_webproxy.xml.in
+++ b/interface-definitions/service_webproxy.xml.in
@@ -484,7 +484,7 @@
<description>Name of source group</description>
</valueHelp>
<constraint>
- <regex>[^0-9]</regex>
+ <regex>[^0-9][a-zA-Z_][a-zA-Z0-9][\w\-\.]*</regex>
</constraint>
<constraintErrorMessage>URL-filter source-group cannot start with a number!</constraintErrorMessage>
</properties>
diff --git a/python/vyos/configdict.py b/python/vyos/configdict.py
index 04ddc10e9..78225f8d4 100644
--- a/python/vyos/configdict.py
+++ b/python/vyos/configdict.py
@@ -358,13 +358,14 @@ def get_pppoe_interfaces(conf, vrf=None):
""" Common helper functions to retrieve all interfaces from current CLI
sessions that have DHCP configured. """
pppoe_interfaces = {}
+ conf.set_level([])
for ifname in conf.list_nodes(['interfaces', 'pppoe']):
# always reset config level, as get_interface_dict() will alter it
conf.set_level([])
# we already have a dict representation of the config from get_config_dict(),
# but with the extended information from get_interface_dict() we also
# get the DHCP client default-route-distance default option if not specified.
- ifconfig = get_interface_dict(conf, ['interfaces', 'pppoe'], ifname)
+ _, ifconfig = get_interface_dict(conf, ['interfaces', 'pppoe'], ifname)
options = {}
if 'default_route_distance' in ifconfig:
@@ -455,8 +456,8 @@ def get_interface_dict(config, base, ifname=''):
if bond: dict.update({'is_bond_member' : bond})
# Check if any DHCP options changed which require a client restat
- dhcp = node_changed(config, ['dhcp-options'], recursive=True)
- if dhcp: dict.update({'dhcp_options_changed' : ''})
+ dhcp = is_node_changed(config, base + [ifname, 'dhcp-options'])
+ if dhcp: dict.update({'dhcp_options_changed' : {}})
# Some interfaces come with a source_interface which must also not be part
# of any other bond or bridge interface as it is exclusivly assigned as the
@@ -515,8 +516,8 @@ def get_interface_dict(config, base, ifname=''):
if bridge: dict['vif'][vif].update({'is_bridge_member' : bridge})
# Check if any DHCP options changed which require a client restat
- dhcp = node_changed(config, ['vif', vif, 'dhcp-options'], recursive=True)
- if dhcp: dict['vif'][vif].update({'dhcp_options_changed' : ''})
+ dhcp = is_node_changed(config, base + [ifname, 'vif', vif, 'dhcp-options'])
+ if dhcp: dict['vif'][vif].update({'dhcp_options_changed' : {}})
for vif_s, vif_s_config in dict.get('vif_s', {}).items():
# Add subinterface name to dictionary
@@ -554,8 +555,8 @@ def get_interface_dict(config, base, ifname=''):
if bridge: dict['vif_s'][vif_s].update({'is_bridge_member' : bridge})
# Check if any DHCP options changed which require a client restat
- dhcp = node_changed(config, ['vif-s', vif_s, 'dhcp-options'], recursive=True)
- if dhcp: dict['vif_s'][vif_s].update({'dhcp_options_changed' : ''})
+ dhcp = is_node_changed(config, base + [ifname, 'vif-s', vif_s, 'dhcp-options'])
+ if dhcp: dict['vif_s'][vif_s].update({'dhcp_options_changed' : {}})
for vif_c, vif_c_config in vif_s_config.get('vif_c', {}).items():
# Add subinterface name to dictionary
@@ -594,8 +595,8 @@ def get_interface_dict(config, base, ifname=''):
{'is_bridge_member' : bridge})
# Check if any DHCP options changed which require a client restat
- dhcp = node_changed(config, ['vif-s', vif_s, 'vif-c', vif_c, 'dhcp-options'], recursive=True)
- if dhcp: dict['vif_s'][vif_s]['vif_c'][vif_c].update({'dhcp_options_changed' : ''})
+ dhcp = is_node_changed(config, base + [ifname, 'vif-s', vif_s, 'vif-c', vif_c, 'dhcp-options'])
+ if dhcp: dict['vif_s'][vif_s]['vif_c'][vif_c].update({'dhcp_options_changed' : {}})
# Check vif, vif-s/vif-c VLAN interfaces for removal
dict = get_removed_vlans(config, base + [ifname], dict)
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index 22441d1d2..22441d1d2 100755..100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
diff --git a/scripts/build-command-templates b/scripts/build-command-templates
index 729fc864c..c8ae83d9d 100755
--- a/scripts/build-command-templates
+++ b/scripts/build-command-templates
@@ -27,6 +27,7 @@ import copy
import functools
from lxml import etree as ET
+from textwrap import fill
# Defaults
@@ -130,6 +131,7 @@ def get_properties(p, default=None):
# DNS forwarding for instance has multiple defaults - specified as whitespace separated list
tmp = ', '.join(default.text.split())
help += f' (default: {tmp})'
+ help = fill(help, width=64, subsequent_indent='\t\t\t')
props["help"] = help
except:
pass
diff --git a/smoketest/scripts/cli/test_policy.py b/smoketest/scripts/cli/test_policy.py
index f175d7df7..3d37d22ae 100755
--- a/smoketest/scripts/cli/test_policy.py
+++ b/smoketest/scripts/cli/test_policy.py
@@ -715,6 +715,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
local_pref = '300'
metric = '50'
peer = '2.3.4.5'
+ peerv6 = '2001:db8::1'
tag = '6542'
goto = '25'
@@ -723,7 +724,6 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
ipv6_prefix_len= '122'
ipv4_nexthop_type= 'blackhole'
ipv6_nexthop_type= 'blackhole'
-
test_data = {
'foo-map-bar' : {
@@ -804,6 +804,14 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
'peer' : peer,
},
},
+
+ '31' : {
+ 'action' : 'permit',
+ 'match' : {
+ 'peer' : peerv6,
+ },
+ },
+
'40' : {
'action' : 'permit',
'match' : {
@@ -888,6 +896,28 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
},
},
},
+ 'relative-metric' : {
+ 'rule' : {
+ '10' : {
+ 'action' : 'permit',
+ 'match' : {
+ 'ip-nexthop-addr' : ipv4_nexthop_address,
+ },
+ 'set' : {
+ 'metric' : '+10',
+ },
+ },
+ '20' : {
+ 'action' : 'permit',
+ 'match' : {
+ 'ip-nexthop-addr' : ipv4_nexthop_address,
+ },
+ 'set' : {
+ 'metric' : '-20',
+ },
+ },
+ },
+ },
}
self.cli_set(['policy', 'access-list', access_list, 'rule', '10', 'action', 'permit'])
diff --git a/src/systemd/dhclient@.service b/src/systemd/dhclient@.service
index 2ced1038a..5cc7869cb 100644
--- a/src/systemd/dhclient@.service
+++ b/src/systemd/dhclient@.service
@@ -13,6 +13,9 @@ PIDFile=/var/lib/dhcp/dhclient_%i.pid
ExecStart=/sbin/dhclient -4 $DHCLIENT_OPTS
ExecStop=/sbin/dhclient -4 $DHCLIENT_OPTS -r
Restart=always
+TimeoutStopSec=20
+SendSIGKILL=SIGKILL
+FinalKillSignal=SIGABRT
[Install]
WantedBy=multi-user.target