diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/dhcp_server.py | 5 | ||||
| -rwxr-xr-x | src/conf_mode/high-availability.py | 16 | ||||
| -rwxr-xr-x | src/conf_mode/protocols_igmp.py | 2 | ||||
| -rwxr-xr-x | src/op_mode/firewall.py | 47 | ||||
| -rw-r--r-- | src/systemd/isc-dhcp-server.service | 24 | 
5 files changed, 61 insertions, 33 deletions
| diff --git a/src/conf_mode/dhcp_server.py b/src/conf_mode/dhcp_server.py index c4c72aae9..ac7d95632 100755 --- a/src/conf_mode/dhcp_server.py +++ b/src/conf_mode/dhcp_server.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2018-2022 VyOS maintainers and contributors +# Copyright (C) 2018-2023 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 @@ -34,6 +34,7 @@ from vyos import airbag  airbag.enable()  config_file = '/run/dhcp-server/dhcpd.conf' +systemd_override = r'/run/systemd/system/isc-dhcp-server.service.d/10-override.conf'  def dhcp_slice_range(exclude_list, range_dict):      """ @@ -295,6 +296,7 @@ def generate(dhcp):      # render the "real" configuration      render(config_file, 'dhcp-server/dhcpd.conf.j2', dhcp,             formater=lambda _: _.replace(""", '"')) +    render(systemd_override, 'dhcp-server/10-override.conf.j2', dhcp)      # Clean up configuration test file      if os.path.exists(tmp_file): @@ -303,6 +305,7 @@ def generate(dhcp):      return None  def apply(dhcp): +    call('systemctl daemon-reload')      # bail out early - looks like removal from running config      if not dhcp or 'disable' in dhcp:          call('systemctl stop isc-dhcp-server.service') diff --git a/src/conf_mode/high-availability.py b/src/conf_mode/high-availability.py index 626a3757e..0121df11c 100755 --- a/src/conf_mode/high-availability.py +++ b/src/conf_mode/high-availability.py @@ -15,6 +15,8 @@  # along with this program.  If not, see <http://www.gnu.org/licenses/>. +import time +  from sys import exit  from ipaddress import ip_interface  from ipaddress import IPv4Interface @@ -26,11 +28,13 @@ from vyos.ifconfig.vrrp import VRRP  from vyos.template import render  from vyos.template import is_ipv4  from vyos.template import is_ipv6 +from vyos.utils.network import is_ipv6_tentative  from vyos.utils.process import call  from vyos import ConfigError  from vyos import airbag  airbag.enable() +  def get_config(config=None):      if config:          conf = config @@ -171,6 +175,18 @@ def apply(ha):          call(f'systemctl stop {service_name}')          return None +    # Check if IPv6 address is tentative T5533 +    for group, group_config in ha['vrrp']['group'].items(): +        if 'hello_source_address' in group_config: +            if is_ipv6(group_config['hello_source_address']): +                ipv6_address = group_config['hello_source_address'] +                interface = group_config['interface'] +                checks = 20 +                interval = 0.1 +                for _ in range(checks): +                    if is_ipv6_tentative(interface, ipv6_address): +                        time.sleep(interval) +      call(f'systemctl reload-or-restart {service_name}')      return None diff --git a/src/conf_mode/protocols_igmp.py b/src/conf_mode/protocols_igmp.py index f6097e282..435189025 100755 --- a/src/conf_mode/protocols_igmp.py +++ b/src/conf_mode/protocols_igmp.py @@ -102,7 +102,7 @@ def verify(igmp):          # Check, is this multicast group          for intfc in igmp['ifaces']:              for gr_addr in igmp['ifaces'][intfc]['gr_join']: -                if IPv4Address(gr_addr) < IPv4Address('224.0.0.0'): +                if not IPv4Address(gr_addr).is_multicast:                      raise ConfigError(gr_addr + " not a multicast group")  def generate(igmp): diff --git a/src/op_mode/firewall.py b/src/op_mode/firewall.py index 581710b31..23b4b8459 100755 --- a/src/op_mode/firewall.py +++ b/src/op_mode/firewall.py @@ -127,7 +127,15 @@ def output_firewall_name_statistics(hook, prior, prior_conf, ipv6=False, single_                      if not source_addr:                          source_addr = dict_search_args(rule_conf, 'source', 'group', 'domain_group')                          if not source_addr: -                            source_addr = '::/0' if ipv6 else '0.0.0.0/0' +                            source_addr = dict_search_args(rule_conf, 'source', 'fqdn') +                            if not source_addr: +                                source_addr = dict_search_args(rule_conf, 'source', 'geoip', 'country_code') +                                if source_addr: +                                    source_addr = str(source_addr)[1:-1].replace('\'','') +                                    if 'inverse_match' in dict_search_args(rule_conf, 'source', 'geoip'): +                                        source_addr = 'NOT ' + str(source_addr) +                                if not source_addr: +                                    source_addr = 'any'              # Get destination              dest_addr = dict_search_args(rule_conf, 'destination', 'address') @@ -138,7 +146,15 @@ def output_firewall_name_statistics(hook, prior, prior_conf, ipv6=False, single_                      if not dest_addr:                          dest_addr = dict_search_args(rule_conf, 'destination', 'group', 'domain_group')                          if not dest_addr: -                            dest_addr = '::/0' if ipv6 else '0.0.0.0/0' +                            dest_addr = dict_search_args(rule_conf, 'destination', 'fqdn') +                            if not dest_addr: +                                dest_addr = dict_search_args(rule_conf, 'destination', 'geoip', 'country_code') +                                if dest_addr: +                                    dest_addr = str(dest_addr)[1:-1].replace('\'','') +                                    if 'inverse_match' in dict_search_args(rule_conf, 'destination', 'geoip'): +                                        dest_addr = 'NOT ' + str(dest_addr) +                                if not dest_addr: +                                    dest_addr = 'any'              # Get inbound interface              iiface = dict_search_args(rule_conf, 'inbound_interface', 'interface_name') @@ -169,7 +185,22 @@ def output_firewall_name_statistics(hook, prior, prior_conf, ipv6=False, single_              row.append(oiface)              rows.append(row) -    if 'default_action' in prior_conf and not single_rule_id: + +    if hook in ['input', 'forward', 'output']: +        row = ['default'] +        row.append('N/A') +        row.append('N/A') +        if 'default_action' in prior_conf: +            row.append(prior_conf['default_action']) +        else: +            row.append('accept') +        row.append('any') +        row.append('any') +        row.append('any') +        row.append('any') +        rows.append(row) + +    elif 'default_action' in prior_conf and not single_rule_id:          row = ['default']          if 'default-action' in details:              rule_details = details['default-action'] @@ -179,8 +210,10 @@ def output_firewall_name_statistics(hook, prior, prior_conf, ipv6=False, single_              row.append('0')              row.append('0')          row.append(prior_conf['default_action']) -        row.append('0.0.0.0/0') # Source -        row.append('0.0.0.0/0') # Dest +        row.append('any') # Source +        row.append('any') # Dest +        row.append('any')   # inbound-interface +        row.append('any')   # outbound-interface          rows.append(row)      if rows: @@ -303,7 +336,7 @@ def show_firewall_group(name=None):                  continue              references = find_references(group_type, group_name) -            row = [group_name, group_type, '\n'.join(references) or 'N/A'] +            row = [group_name, group_type, '\n'.join(references) or 'N/D']              if 'address' in group_conf:                  row.append("\n".join(sorted(group_conf['address'])))              elif 'network' in group_conf: @@ -315,7 +348,7 @@ def show_firewall_group(name=None):              elif 'interface' in group_conf:                  row.append("\n".join(sorted(group_conf['interface'])))              else: -                row.append('N/A') +                row.append('N/D')              rows.append(row)      if rows: diff --git a/src/systemd/isc-dhcp-server.service b/src/systemd/isc-dhcp-server.service deleted file mode 100644 index a7d86e69c..000000000 --- a/src/systemd/isc-dhcp-server.service +++ /dev/null @@ -1,24 +0,0 @@ -[Unit] -Description=ISC DHCP IPv4 server -Documentation=man:dhcpd(8) -RequiresMountsFor=/run -ConditionPathExists=/run/dhcp-server/dhcpd.conf -After=vyos-router.service - -[Service] -Type=forking -WorkingDirectory=/run/dhcp-server -RuntimeDirectory=dhcp-server -RuntimeDirectoryPreserve=yes -Environment=PID_FILE=/run/dhcp-server/dhcpd.pid CONFIG_FILE=/run/dhcp-server/dhcpd.conf LEASE_FILE=/config/dhcpd.leases -PIDFile=/run/dhcp-server/dhcpd.pid -ExecStartPre=/bin/sh -ec '\ -touch ${LEASE_FILE}; \ -chown dhcpd:vyattacfg ${LEASE_FILE}* ; \ -chmod 664 ${LEASE_FILE}* ; \ -/usr/sbin/dhcpd -4 -t -T -q -user dhcpd -group vyattacfg -pf ${PID_FILE} -cf ${CONFIG_FILE} -lf ${LEASE_FILE} ' -ExecStart=/usr/sbin/dhcpd -4 -q -user dhcpd -group vyattacfg -pf ${PID_FILE} -cf ${CONFIG_FILE} -lf ${LEASE_FILE} -Restart=always - -[Install] -WantedBy=multi-user.target | 
