diff options
| -rw-r--r-- | data/templates/igmp-proxy/igmpproxy.conf.tmpl | 37 | ||||
| -rwxr-xr-x | src/conf_mode/igmp_proxy.py | 94 | 
2 files changed, 67 insertions, 64 deletions
| diff --git a/data/templates/igmp-proxy/igmpproxy.conf.tmpl b/data/templates/igmp-proxy/igmpproxy.conf.tmpl new file mode 100644 index 000000000..c7fc5cef5 --- /dev/null +++ b/data/templates/igmp-proxy/igmpproxy.conf.tmpl @@ -0,0 +1,37 @@ +######################################################## +# +# autogenerated by igmp_proxy.py +# +#   The configuration file must define one upstream +#   interface, and one or more downstream interfaces. +# +#   If multicast traffic originates outside the +#   upstream subnet, the "altnet" option can be +#   used in order to define legal multicast sources. +#   (Se example...) +# +#   The "quickleave" should be used to avoid saturation +#   of the upstream link. The option should only +#   be used if it's absolutely nessecary to +#   accurately imitate just one Client. +# +######################################################## + +{% if not disable_quickleave -%} +quickleave +{% endif -%} + +{% for interface in interfaces %} +# Configuration for {{ interface.name }} ({{ interface.role }} interface) +{% if interface.role == 'disabled' -%} +phyint {{ interface.name }} disabled +{%- else -%} +phyint {{ interface.name }} {{ interface.role }} ratelimit 0 threshold {{ interface.threshold }} +{%- endif -%} +{%- for subnet in interface.alt_subnet %} +        altnet {{ subnet }} +{%- endfor %} +{%- for subnet in interface.whitelist %} +        whitelist {{ subnet }} +{%- endfor %} +{% endfor %} diff --git a/src/conf_mode/igmp_proxy.py b/src/conf_mode/igmp_proxy.py index cd0704124..aa46f2c4e 100755 --- a/src/conf_mode/igmp_proxy.py +++ b/src/conf_mode/igmp_proxy.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2018 VyOS maintainers and contributors +# Copyright (C) 2018-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 @@ -13,60 +13,20 @@  #  # 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 sys  import os -import jinja2 + +from sys import exit +from copy import deepcopy +from jinja2 import FileSystemLoader, Environment  from netifaces import interfaces  from vyos.config import Config +from vyos.defaults import directories as vyos_data_dir  from vyos import ConfigError  config_file = r'/etc/igmpproxy.conf' -# Please be careful if you edit the template. -config_tmpl = """ -######################################################## -# -# autogenerated by igmp_proxy.py -# -#   The configuration file must define one upstream -#   interface, and one or more downstream interfaces. -# -#   If multicast traffic originates outside the -#   upstream subnet, the "altnet" option can be -#   used in order to define legal multicast sources. -#   (Se example...) -# -#   The "quickleave" should be used to avoid saturation -#   of the upstream link. The option should only -#   be used if it's absolutely nessecary to -#   accurately imitate just one Client. -# -######################################################## - -{% if not disable_quickleave -%} -quickleave -{% endif -%} - -{% for interface in interfaces %} -# Configuration for {{ interface.name }} ({{ interface.role }} interface) -{% if interface.role == 'disabled' -%} -phyint {{ interface.name }} disabled -{%- else -%} -phyint {{ interface.name }} {{ interface.role }} ratelimit 0 threshold {{ interface.threshold }} -{%- endif -%} -{%- for subnet in interface.alt_subnet %} -        altnet {{ subnet }} -{%- endfor %} -{%- for subnet in interface.whitelist %} -        whitelist {{ subnet }} -{%- endfor %} -{% endfor %} -""" -  default_config_data = {      'disable': False,      'disable_quickleave': False, @@ -74,23 +34,24 @@ default_config_data = {  }  def get_config(): -    igmp_proxy = default_config_data +    igmp_proxy = deepcopy(default_config_data)      conf = Config() -    if not conf.exists('protocols igmp-proxy'): +    base = ['protocols', 'igmp-proxy'] +    if not conf.exists(base):          return None      else: -        conf.set_level('protocols igmp-proxy') +        conf.set_level(base)      # Network interfaces to listen on -    if conf.exists('disable'): +    if conf.exists(['disable']):          igmp_proxy['disable'] = True      # Option to disable "quickleave" -    if conf.exists('disable-quickleave'): +    if conf.exists(['disable-quickleave']):          igmp_proxy['disable_quickleave'] = True -    for intf in conf.list_nodes('interface'): -        conf.set_level('protocols igmp-proxy interface {0}'.format(intf)) +    for intf in conf.list_nodes(['interface']): +        conf.set_level(base + ['interface', intf])          interface = {              'name': intf,              'alt_subnet': [], @@ -99,17 +60,17 @@ def get_config():              'whitelist': []          } -        if conf.exists('alt-subnet'): -            interface['alt_subnet'] = conf.return_values('alt-subnet') +        if conf.exists(['alt-subnet']): +            interface['alt_subnet'] = conf.return_values(['alt-subnet']) -        if conf.exists('role'): -            interface['role'] = conf.return_value('role') +        if conf.exists(['role']): +            interface['role'] = conf.return_value(['role']) -        if conf.exists('threshold'): -            interface['threshold'] = conf.return_value('threshold') +        if conf.exists(['threshold']): +            interface['threshold'] = conf.return_value(['threshold']) -        if conf.exists('whitelist'): -            interface['whitelist'] = conf.return_values('whitelist') +        if conf.exists(['whitelist']): +            interface['whitelist'] = conf.return_values(['whitelist'])          # Append interface configuration to global configuration list          igmp_proxy['interfaces'].append(interface) @@ -153,7 +114,12 @@ def generate(igmp_proxy):          print('Warning: IGMP Proxy will be deactivated because it is disabled')          return None -    tmpl = jinja2.Template(config_tmpl) +    # Prepare Jinja2 template loader from files +    tmpl_path = os.path.join(vyos_data_dir['data'], 'templates', 'igmp-proxy') +    fs_loader = FileSystemLoader(tmpl_path) +    env = Environment(loader=fs_loader) + +    tmpl = env.get_template('igmpproxy.conf.tmpl')      config_text = tmpl.render(igmp_proxy)      with open(config_file, 'w') as f:          f.write(config_text) @@ -167,7 +133,7 @@ def apply(igmp_proxy):           if os.path.exists(config_file):               os.unlink(config_file)      else: -        os.system('sudo systemctl restart igmpproxy.service') +        os.system('systemctl restart igmpproxy.service')      return None @@ -179,4 +145,4 @@ if __name__ == '__main__':          apply(c)      except ConfigError as e:          print(e) -        sys.exit(1) +        exit(1) | 
