summaryrefslogtreecommitdiff
path: root/src/conf_mode/protocols_igmp.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/conf_mode/protocols_igmp.py')
-rwxr-xr-xsrc/conf_mode/protocols_igmp.py61
1 files changed, 25 insertions, 36 deletions
diff --git a/src/conf_mode/protocols_igmp.py b/src/conf_mode/protocols_igmp.py
index 8d25fe9d5..0148b5dac 100755
--- a/src/conf_mode/protocols_igmp.py
+++ b/src/conf_mode/protocols_igmp.py
@@ -13,46 +13,19 @@
#
# 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 jinja2
-import copy
import os
-import vyos.validate
+
+from ipaddress import IPv4Address
+from jinja2 import FileSystemLoader, Environment
+from sys import exit
from vyos import ConfigError
from vyos.config import Config
+from vyos.defaults import directories as vyos_data_dir
config_file = r'/tmp/igmp.frr'
-# Please be careful if you edit the template.
-config_tmpl = """
-!
-{% for iface in old_ifaces -%}
-interface {{ iface }}
-no ip igmp
-!
-{% endfor -%}
-{% for iface in ifaces -%}
-interface {{ iface }}
-{% if ifaces[iface].version -%}
-ip igmp version {{ ifaces[iface].version }}
-{% else -%}
-{# IGMP default version 3 #}
-ip igmp
-{% endif -%}
-{% if ifaces[iface].query_interval -%}
-ip igmp query-interval {{ ifaces[iface].query_interval }}
-{% endif -%}
-{% if ifaces[iface].query_max_resp_time -%}
-ip igmp query-max-response-time {{ ifaces[iface].query_max_resp_time }}
-{% endif -%}
-!
-{% endfor -%}
-!
-"""
-
def get_config():
conf = Config()
igmp_conf = {
@@ -74,18 +47,24 @@ def get_config():
iface : {
'version' : conf.return_effective_value('interface {0} version'.format(iface)),
'query_interval' : conf.return_effective_value('interface {0} query-interval'.format(iface)),
- 'query_max_resp_time' : conf.return_effective_value('interface {0} query-max-response-time'.format(iface))
+ 'query_max_resp_time' : conf.return_effective_value('interface {0} query-max-response-time'.format(iface)),
+ 'gr_join' : {}
}
})
+ for gr_join in conf.list_effective_nodes('interface {0} join'.format(iface)):
+ igmp_conf['old_ifaces'][iface]['gr_join'][gr_join] = conf.return_effective_values('interface {0} join {1} source'.format(iface, gr_join))
for iface in conf.list_nodes('interface'):
igmp_conf['ifaces'].update({
iface : {
'version' : conf.return_value('interface {0} version'.format(iface)),
'query_interval' : conf.return_value('interface {0} query-interval'.format(iface)),
- 'query_max_resp_time' : conf.return_value('interface {0} query-max-response-time'.format(iface))
+ 'query_max_resp_time' : conf.return_value('interface {0} query-max-response-time'.format(iface)),
+ 'gr_join' : {}
}
})
+ for gr_join in conf.list_nodes('interface {0} join'.format(iface)):
+ igmp_conf['ifaces'][iface]['gr_join'][gr_join] = conf.return_values('interface {0} join {1} source'.format(iface, gr_join))
return igmp_conf
@@ -97,12 +76,22 @@ def verify(igmp):
# Check interfaces
if not igmp['ifaces']:
raise ConfigError(f"IGMP require defined interfaces!")
+ # 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'):
+ raise ConfigError(gr_addr + " not a multicast group")
def generate(igmp):
if igmp is None:
return None
- tmpl = jinja2.Template(config_tmpl)
+ # Prepare Jinja2 template loader from files
+ tmpl_path = os.path.join(vyos_data_dir['data'], 'templates', 'igmp')
+ fs_loader = FileSystemLoader(tmpl_path)
+ env = Environment(loader=fs_loader)
+
+ tmpl = env.get_template('igmp.frr.tmpl')
config_text = tmpl.render(igmp)
with open(config_file, 'w') as f:
f.write(config_text)
@@ -127,4 +116,4 @@ if __name__ == '__main__':
apply(c)
except ConfigError as e:
print(e)
- sys.exit(1)
+ exit(1)