diff options
Diffstat (limited to 'src/conf_mode/vrf.py')
-rwxr-xr-x | src/conf_mode/vrf.py | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/src/conf_mode/vrf.py b/src/conf_mode/vrf.py index a74b79317..8cf4b72ae 100755 --- a/src/conf_mode/vrf.py +++ b/src/conf_mode/vrf.py @@ -15,35 +15,24 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import os -import jinja2 from sys import exit from copy import deepcopy +from jinja2 import FileSystemLoader, Environment from json import loads from subprocess import check_output, CalledProcessError from vyos.config import Config from vyos.configdict import list_diff +from vyos.defaults import directories as vyos_data_dir from vyos.ifconfig import Interface +from vyos.util import read_file from vyos import ConfigError config_file = r'/etc/iproute2/rt_tables.d/vyos-vrf.conf' -# Please be careful if you edit the template. -config_tmpl = """ -### Autogenerated by vrf.py ### -# -# Routing table ID to name mapping reference - -# id vrf name comment -{% for vrf in vrf_add -%} -{{ "%-10s" | format(vrf.table) }} {{ "%-16s" | format(vrf.name) }} # {{ vrf.description }} -{% endfor -%} - -""" - default_config_data = { - 'bind_to_all': 0, + 'bind_to_all': '0', 'deleted': False, 'vrf_add': [], 'vrf_existing': [], @@ -103,7 +92,7 @@ def get_config(): # Should services be allowed to bind to all VRFs? if conf.exists(['bind-to-all']): - vrf_config['bind_to_all'] = 1 + vrf_config['bind_to_all'] = '1' # Determine vrf interfaces (currently effective) - to determine which # vrf interface is no longer present and needs to be removed @@ -193,7 +182,12 @@ def verify(vrf_config): return None def generate(vrf_config): - tmpl = jinja2.Template(config_tmpl) + # Prepare Jinja2 template loader from files + tmpl_path = os.path.join(vyos_data_dir['data'], 'templates', 'vrf') + fs_loader = FileSystemLoader(tmpl_path) + env = Environment(loader=fs_loader) + + tmpl = env.get_template('vrf.conf.tmpl') config_text = tmpl.render(vrf_config) with open(config_file, 'w') as f: f.write(config_text) @@ -210,12 +204,15 @@ def apply(vrf_config): # set the default VRF global behaviour bind_all = vrf_config['bind_to_all'] - _cmd(f'sysctl -wq net.ipv4.tcp_l3mdev_accept={bind_all}') - _cmd(f'sysctl -wq net.ipv4.udp_l3mdev_accept={bind_all}') + if read_file('/proc/sys/net/ipv4/tcp_l3mdev_accept') != bind_all: + _cmd(f'sysctl -wq net.ipv4.tcp_l3mdev_accept={bind_all}') + _cmd(f'sysctl -wq net.ipv4.udp_l3mdev_accept={bind_all}') for vrf in vrf_config['vrf_remove']: name = vrf['name'] if os.path.isdir(f'/sys/class/net/{name}'): + _cmd(f'sudo ip -4 route del vrf {name} unreachable default metric 4278198272') + _cmd(f'sudo ip -6 route del vrf {name} unreachable default metric 4278198272') _cmd(f'ip link delete dev {name}') for vrf in vrf_config['vrf_add']: |