diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/system_frr.py | 100 | 
1 files changed, 9 insertions, 91 deletions
diff --git a/src/conf_mode/system_frr.py b/src/conf_mode/system_frr.py index cc47aa5be..0d0b37e00 100755 --- a/src/conf_mode/system_frr.py +++ b/src/conf_mode/system_frr.py @@ -15,14 +15,13 @@  # along with this program.  If not, see <http://www.gnu.org/licenses/>.  from pathlib import Path -from re import compile as re_compile -from re import M as re_M  from sys import exit  from vyos import ConfigError  from vyos import airbag  from vyos.config import Config  from vyos.logger import syslog +from vyos.template import render_to_string  from vyos.util import read_file, write_file, run  airbag.enable() @@ -38,31 +37,13 @@ def get_config(config=None):          conf = config      else:          conf = Config() -    base = ['system', 'frr'] -    if not conf.exists(base): -        return {} -    frr_config = conf.get_config_dict(base) +    base = ['system', 'frr'] +    frr_config = conf.get_config_dict(base, get_first_key=True)      return frr_config -def daemons_config_parse(daemons_config): -    # create regex for parsing daemons options -    regex_daemon_config = re_compile( -        r'^(?P<daemon_name>\w+)_options="(?P<daemon_options>.*)"$', re_M) -    # create empty dict for config -    daemons_config_dict = {} -    # fill dictionary with actual config -    for daemon in regex_daemon_config.finditer(daemons_config): -        daemon_name = daemon.group('daemon_name') -        daemon_options = daemon.group('daemon_options') -        daemons_config_dict[daemon_name] = daemon_options - -    # return daemons config -    return (daemons_config_dict) - -  def verify(frr_config):      # Nothing to verify here      pass @@ -70,76 +51,13 @@ def verify(frr_config):  def generate(frr_config):      # read daemons config file -    daemons_config = read_file(config_file) -    daemons_config_current = daemons_config -    daemons_config_dict = daemons_config_parse(daemons_config) - -    # configure SNMP integration -    frr_snmp = frr_config.get('frr', {}).get('snmp', {}) -    # prepare regex for matching modules -    regex_snmp = re_compile(r'^.* -M snmp.*$') -    regex_bmp = re_compile(r'^.* -M bmp.*$') -    regex_irdp = re_compile(r'^.* -M irdp.*$') -    # check each daemon's config -    for (daemon_name, daemon_options) in daemons_config_dict.items(): -        # check if SNMP integration is enabled in the config file -        snmp_enabled = regex_snmp.match(daemon_options) -        # check if BMP is enabled in the config file -        bmp_enabled = regex_bmp.match(daemon_options) -        # check if IRDP is enabled in the config file -        irdp_enabled = regex_irdp.match(daemon_options) - -        # enable SNMP integration -        if daemon_name in frr_snmp and not snmp_enabled: -            daemon_options_new = f'{daemon_options} -M snmp' -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') -            daemon_options = daemon_options_new -        # disable SNMP integration -        if daemon_name not in frr_snmp and snmp_enabled: -            daemon_options_new = daemon_options.replace(' -M snmp', '') -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') -            daemon_options = daemon_options_new - -        # enable BMP -        if daemon_name == 'bgpd' and 'bmp' in frr_config.get( -                'frr', {}) and not bmp_enabled: -            daemon_options_new = f'{daemon_options} -M bmp' -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') -            daemon_options = daemon_options_new -        # disable BMP -        if daemon_name == 'bgpd' and 'bmp' not in frr_config.get( -                'frr', {}) and bmp_enabled: -            daemon_options_new = daemon_options.replace(' -M bmp', '') -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') -            daemon_options = daemon_options_new - -        # enable IRDP -        if daemon_name == 'zebra' and 'irdp' in frr_config.get( -                'frr', {}) and not irdp_enabled: -            daemon_options_new = f'{daemon_options} -M irdp' -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') -            daemon_options = daemon_options_new -        # disable IRDP -        if daemon_name == 'zebra' and 'irdp' not in frr_config.get( -                'frr', {}) and irdp_enabled: -            daemon_options_new = daemon_options.replace(' -M irdp', '') -            daemons_config = daemons_config.replace( -                f'{daemon_name}_options=\"{daemon_options}\"', -                f'{daemon_name}_options=\"{daemon_options_new}\"') - +    daemons_config_current = read_file(config_file, strip_end=False) +    # generate new config file +    daemons_config_new = render_to_string('frr/daemons.frr.tmpl', frr_config)      # update configuration file if this is necessary -    if daemons_config != daemons_config_current: -        write_file(config_file, daemons_config) +    if daemons_config_new != daemons_config_current: +        syslog.warning('FRR daemons configuration file need to be changed') +        write_file(config_file, daemons_config_new)          frr_config['config_file_changed'] = True  | 
