diff options
Diffstat (limited to 'src/conf_mode/system_ipv6.py')
| -rwxr-xr-x | src/conf_mode/system_ipv6.py | 71 | 
1 files changed, 26 insertions, 45 deletions
diff --git a/src/conf_mode/system_ipv6.py b/src/conf_mode/system_ipv6.py index a2442d009..593b8f7f3 100755 --- a/src/conf_mode/system_ipv6.py +++ b/src/conf_mode/system_ipv6.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2019-2023 VyOS maintainers and contributors +# Copyright (C) 2019-2024 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 @@ -18,17 +18,18 @@ import os  from sys import exit  from vyos.config import Config -from vyos.configdict import dict_merge +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents +from vyos.configdict import get_frrender_dict +from vyos.configverify import has_frr_protocol_in_dict  from vyos.configverify import verify_route_map -from vyos.template import render_to_string +from vyos.frrender import FRRender  from vyos.utils.dict import dict_search  from vyos.utils.file import write_file  from vyos.utils.process import is_systemd_service_active +from vyos.utils.process import is_systemd_service_running  from vyos.utils.system import sysctl_write -from vyos.configdep import set_dependents -from vyos.configdep import call_dependents  from vyos import ConfigError -from vyos import frr  from vyos import airbag  airbag.enable() @@ -37,42 +38,35 @@ def get_config(config=None):          conf = config      else:          conf = Config() -    base = ['system', 'ipv6'] - -    opt = conf.get_config_dict(base, key_mangling=('-', '_'), -                               get_first_key=True, -                               with_recursive_defaults=True) - -    # When working with FRR we need to know the corresponding address-family -    opt['afi'] = 'ipv6' - -    # We also need the route-map information from the config -    # -    # XXX: one MUST always call this without the key_mangling() option! See -    # vyos.configverify.verify_common_route_maps() for more information. -    tmp = {'policy' : {'route-map' : conf.get_config_dict(['policy', 'route-map'], -                                                          get_first_key=True)}} -    # Merge policy dict into "regular" config dict -    opt = dict_merge(tmp, opt)      # If IPv6 neighbor table size is set here and also manually in sysctl, the more      # fine grained value from sysctl must win      set_dependents('sysctl', conf) +    return get_frrender_dict(conf) + +def verify(config_dict): +    if not has_frr_protocol_in_dict(config_dict, 'ipv6'): +        return None -    return opt +    opt = config_dict['ipv6'] +    opt['policy'] = config_dict['policy'] -def verify(opt):      if 'protocol' in opt:          for protocol, protocol_options in opt['protocol'].items():              if 'route_map' in protocol_options:                  verify_route_map(protocol_options['route_map'], opt)      return -def generate(opt): -    opt['frr_zebra_config'] = render_to_string('frr/zebra.route-map.frr.j2', opt) -    return +def generate(config_dict): +    if config_dict and not is_systemd_service_running('vyos-configd.service'): +        FRRender().generate(config_dict) +    return None + +def apply(config_dict): +    if not has_frr_protocol_in_dict(config_dict, 'ipv6'): +        return None +    opt = config_dict['ipv6'] -def apply(opt):      # configure multipath      tmp = dict_search('multipath.layer4_hashing', opt)      value = '1' if (tmp != None) else '0' @@ -88,11 +82,6 @@ def apply(opt):      # Minimum number of stored records is indicated which is not cleared      sysctl_write('net.ipv6.neigh.default.gc_thresh1', size // 8) -    # enable/disable IPv6 forwarding -    tmp = dict_search('disable_forwarding', opt) -    value = '0' if (tmp != None) else '1' -    write_file('/proc/sys/net/ipv6/conf/all/forwarding', value) -      # configure IPv6 strict-dad      tmp = dict_search('strict_dad', opt)      value = '2' if (tmp != None) else '1' @@ -105,19 +94,11 @@ def apply(opt):      # running when this script is called first. Skip this part and wait for initial      # commit of the configuration to trigger this statement      if is_systemd_service_active('frr.service'): -        zebra_daemon = 'zebra' -        # Save original configuration prior to starting any commit actions -        frr_cfg = frr.FRRConfig() - -        # The route-map used for the FIB (zebra) is part of the zebra daemon -        frr_cfg.load_configuration(zebra_daemon) -        frr_cfg.modify_section(r'no ipv6 nht resolve-via-default') -        frr_cfg.modify_section(r'ipv6 protocol \w+ route-map [-a-zA-Z0-9.]+', stop_pattern='(\s|!)') -        if 'frr_zebra_config' in opt: -            frr_cfg.add_before(frr.default_add_before, opt['frr_zebra_config']) -        frr_cfg.commit_configuration(zebra_daemon) +        if config_dict and not is_systemd_service_running('vyos-configd.service'): +            FRRender().apply()      call_dependents() +    return None  if __name__ == '__main__':      try:  | 
