summaryrefslogtreecommitdiff
path: root/src/conf_mode/igmp_proxy.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/conf_mode/igmp_proxy.py')
-rwxr-xr-xsrc/conf_mode/igmp_proxy.py98
1 files changed, 33 insertions, 65 deletions
diff --git a/src/conf_mode/igmp_proxy.py b/src/conf_mode/igmp_proxy.py
index cd0704124..77e2bb150 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,59 +13,21 @@
#
# 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
+from vyos.util import call
-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 %}
-"""
+config_file = r'/etc/igmpproxy.conf'
default_config_data = {
'disable': False,
@@ -74,23 +36,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 +62,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 +116,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)
@@ -163,11 +131,11 @@ def generate(igmp_proxy):
def apply(igmp_proxy):
if igmp_proxy is None or igmp_proxy['disable']:
# IGMP Proxy support is removed in the commit
- os.system('sudo systemctl stop igmpproxy.service')
+ call('sudo systemctl stop igmpproxy.service')
if os.path.exists(config_file):
os.unlink(config_file)
else:
- os.system('sudo systemctl restart igmpproxy.service')
+ call('systemctl restart igmpproxy.service')
return None
@@ -179,4 +147,4 @@ if __name__ == '__main__':
apply(c)
except ConfigError as e:
print(e)
- sys.exit(1)
+ exit(1)