Page MenuHomeVyOS Platform

service-router-advert.py
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

service-router-advert.py

#!/usr/bin/env python3
#
# Copyright (C) 2018-2019 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
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# 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 os
from jinja2 import FileSystemLoader, Environment
from stat import S_IRUSR, S_IWUSR, S_IRGRP
from sys import exit
from vyos.config import Config
from vyos.defaults import directories as vyos_data_dir
from vyos import ConfigError
from vyos.util import run
config_file = r'/etc/radvd.conf'
default_config_data = {
'interfaces': []
}
def get_config():
rtradv = default_config_data
conf = Config()
base_level = ['service', 'router-advert']
if not conf.exists(base_level):
return rtradv
for interface in conf.list_nodes(base_level + ['interface']):
intf = {
'name': interface,
'hop_limit' : '64',
'default_lifetime': '',
'default_preference': 'medium',
'dnssl': [],
'link_mtu': '',
'managed_flag': 'off',
'interval_max': '600',
'interval_min': '',
'name_server': [],
'other_config_flag': 'off',
'prefixes' : [],
'reachable_time': '0',
'retrans_timer': '0',
'send_advert': 'on'
}
# set config level first to reduce boilerplate code
conf.set_level(base_level + ['interface', interface])
if conf.exists(['hop-limit']):
intf['hop_limit'] = conf.return_value(['hop-limit'])
if conf.exists(['default-lifetim']):
intf['default_lifetime'] = conf.return_value(['default-lifetim'])
if conf.exists(['default-preference']):
intf['default_preference'] = conf.return_value(['default-preference'])
if conf.exists(['dnssl']):
intf['dnssl'] = conf.return_values(['dnssl'])
if conf.exists(['link-mtu']):
intf['link_mtu'] = conf.return_value(['link-mtu'])
if conf.exists(['managed-flag']):
intf['managed_flag'] = 'on'
if conf.exists(['interval', 'max']):
intf['interval_max'] = conf.return_value(['interval', 'max'])
if conf.exists(['interval', 'min']):
intf['interval_min'] = conf.return_value(['interval', 'min'])
if conf.exists(['name-server']):
intf['name_server'] = conf.return_values(['name-server'])
if conf.exists(['other-config-flag']):
intf['other_config_flag'] = 'on'
if conf.exists(['reachable-time']):
intf['reachable_time'] = conf.return_value(['reachable-time'])
if conf.exists(['retrans-timer']):
intf['retrans_timer'] = conf.return_value(['retrans-timer'])
if conf.exists(['no-send-advert']):
intf['send_advert'] = 'off'
for prefix in conf.list_nodes(['prefix']):
tmp = {
'prefix' : prefix,
'autonomous_flag' : 'on',
'on_link' : 'on',
'preferred_lifetime': '14400',
'valid_lifetime' : '2592000'
}
# set config level first to reduce boilerplate code
conf.set_level(base_level + ['interface', interface, 'prefix', prefix])
if conf.exists(['no-autonomous-flag']):
tmp['autonomous_flag'] = 'off'
if conf.exists(['no-on-link-flag']):
tmp['on_link'] = 'off'
if conf.exists(['preferred-lifetime']):
tmp['preferred_lifetime'] = conf.return_value(['preferred-lifetime'])
if conf.exists(['valid-lifetime']):
tmp['valid_lifetime'] = conf.return_value(['valid-lifetime'])
intf['prefixes'].append(tmp)
rtradv['interfaces'].append(intf)
return rtradv
def verify(rtradv):
return None
def generate(rtradv):
if not rtradv['interfaces']:
return None
# Prepare Jinja2 template loader from files
tmpl_path = os.path.join(vyos_data_dir['data'], 'templates', 'router-advert')
fs_loader = FileSystemLoader(tmpl_path)
env = Environment(loader=fs_loader, trim_blocks=True)
tmpl = env.get_template('radvd.conf.tmpl')
config_text = tmpl.render(rtradv)
with open(config_file, 'w') as f:
f.write(config_text)
# adjust file permissions of new configuration file
if os.path.exists(config_file):
os.chmod(config_file, S_IRUSR | S_IWUSR | S_IRGRP)
return None
def apply(rtradv):
if not rtradv['interfaces']:
# bail out early - looks like removal from running config
run('systemctl stop radvd.service')
if os.path.exists(config_file):
os.unlink(config_file)
return None
run('systemctl restart radvd.service')
return None
if __name__ == '__main__':
try:
c = get_config()
verify(c)
generate(c)
apply(c)
except ConfigError as e:
print(e)
exit(1)

File Metadata

Mime Type
text/x-script.python
Expires
Sat, Oct 17, 12:57 AM (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4355487
Default Alt Text
service-router-advert.py (5 KB)

Event Timeline