summaryrefslogtreecommitdiff
path: root/src/conf_mode/interfaces-wirelessmodem.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/conf_mode/interfaces-wirelessmodem.py')
-rwxr-xr-xsrc/conf_mode/interfaces-wirelessmodem.py145
1 files changed, 44 insertions, 101 deletions
diff --git a/src/conf_mode/interfaces-wirelessmodem.py b/src/conf_mode/interfaces-wirelessmodem.py
index 35e3c583c..c2970d252 100755
--- a/src/conf_mode/interfaces-wirelessmodem.py
+++ b/src/conf_mode/interfaces-wirelessmodem.py
@@ -16,37 +16,21 @@
import os
-from copy import deepcopy
from fnmatch import fnmatch
-from netifaces import interfaces
from sys import exit
from vyos.config import Config
-from vyos.ifconfig import BridgeIf, Section
+from vyos.configdict import dict_merge
+from vyos.configverify import verify_bridge_vrf
from vyos.template import render
from vyos.util import call
-from vyos.validate import is_member
+from vyos.xml import defaults
from vyos import ConfigError
-
from vyos import airbag
airbag.enable()
-default_config_data = {
- 'apn': '',
- 'chat_script': '',
- 'deleted': False,
- 'description': '',
- 'device': '',
- 'disable': False,
- 'disable_link_detect': 1,
- 'on_demand': False,
- 'metric': '10',
- 'mtu': '1500',
- 'name_server': True,
- 'is_bridge_member': False,
- 'intf': '',
- 'vrf': ''
-}
+# XXX: workaround for https://phabricator.vyos.net/T2660
+default_values = {'backup' : {'distance' : '10'}}
def check_kmod():
modules = ['option', 'usb_wwan', 'usbserial']
@@ -66,115 +50,81 @@ def find_device_file(device):
return None
def get_config():
- wwan = deepcopy(default_config_data)
+ """ Retrive CLI config as dictionary. Dictionary can never be empty,
+ as at least the interface name will be added or a deleted flag """
conf = Config()
# determine tagNode instance
if 'VYOS_TAGNODE_VALUE' not in os.environ:
raise ConfigError('Interface (VYOS_TAGNODE_VALUE) not specified')
- wwan['intf'] = os.environ['VYOS_TAGNODE_VALUE']
- wwan['chat_script'] = f"/etc/ppp/peers/chat.{wwan['intf']}"
+ # retrieve interface default values
+ base = ['interfaces', 'wirelessmodem']
+ # XXX: workaround for https://phabricator.vyos.net/T2660
+ #default_values = defaults(base)
+
+ ifname = os.environ['VYOS_TAGNODE_VALUE']
+ base = base + [ifname]
+ wwan = conf.get_config_dict(base, key_mangling=('-', '_'))
# Check if interface has been removed
- if not conf.exists('interfaces wirelessmodem ' + wwan['intf']):
- wwan['deleted'] = True
- return wwan
-
- # set new configuration level
- conf.set_level('interfaces wirelessmodem ' + wwan['intf'])
-
- # get metrick for backup default route
- if conf.exists(['apn']):
- wwan['apn'] = conf.return_value(['apn'])
-
- # get metrick for backup default route
- if conf.exists(['backup', 'distance']):
- wwan['metric'] = conf.return_value(['backup', 'distance'])
-
- # Retrieve interface description
- if conf.exists(['description']):
- wwan['description'] = conf.return_value(['description'])
-
- # System device name
- if conf.exists(['device']):
- tmp = conf.return_value(['device'])
- wwan['device'] = find_device_file(tmp)
- # If device file was not found in /dev we will just re-use
- # the plain device name, thus we can trigger the exception
- # in verify() as it's a non existent file
- if wwan['device'] == None:
- wwan['device'] = tmp
-
- # disable interface
- if conf.exists('disable'):
- wwan['disable'] = True
-
- # ignore link state changes
- if conf.exists('disable-link-detect'):
- wwan['disable_link_detect'] = 2
-
- # Do not use DNS servers provided by the peer
- if conf.exists(['mtu']):
- wwan['mtu'] = conf.return_value(['mtu'])
-
- # Do not use DNS servers provided by the peer
- if conf.exists(['no-peer-dns']):
- wwan['name_server'] = False
-
- # Access concentrator name (only connect to this concentrator)
- if conf.exists(['ondemand']):
- wwan['on_demand'] = True
-
- # retrieve VRF instance
- if conf.exists('vrf'):
- wwan['vrf'] = conf.return_value(['vrf'])
+ if wwan == {}:
+ wwan.update({'deleted' : ''})
+
+ # We have gathered the dict representation of the CLI, but there are
+ # default options which we need to update into the dictionary
+ # retrived.
+ wwan = dict_merge(default_values, wwan)
+
+ # Add interface instance name into dictionary
+ wwan.update({'ifname': ifname})
return wwan
def verify(wwan):
- if wwan['deleted']:
+ if 'deleted' in wwan.keys():
return None
- if not wwan['apn']:
- raise ConfigError('No APN configured for "{intf}"'.format(**wwan))
+ if not 'apn' in wwan.keys():
+ raise ConfigError('No APN configured for "{ifname}"'.format(**wwan))
- if not wwan['device']:
+ if not 'device' in wwan.keys():
raise ConfigError('Physical "device" must be configured')
# we can not use isfile() here as Linux device files are no regular files
# thus the check will return False
- if not os.path.exists('{device}'.format(**wwan)):
+ if not os.path.exists(find_device_file(wwan['device'])):
raise ConfigError('Device "{device}" does not exist'.format(**wwan))
- if wwan['vrf'] and wwan['vrf'] not in interfaces():
- raise ConfigError('VRF "{vrf}" does not exist'.format(**wwan))
+ verify_bridge_vrf(wwan)
return None
def generate(wwan):
# set up configuration file path variables where our templates will be
# rendered into
- intf = wwan['intf']
- config_wwan = f'/etc/ppp/peers/{intf}'
- config_wwan_chat = wwan['chat_script']
- script_wwan_pre_up = f'/etc/ppp/ip-pre-up.d/1010-vyos-wwan-{intf}'
- script_wwan_ip_up = f'/etc/ppp/ip-up.d/1010-vyos-wwan-{intf}'
- script_wwan_ip_down = f'/etc/ppp/ip-down.d/1010-vyos-wwan-{intf}'
+ ifname = wwan['ifname']
+ config_wwan = f'/etc/ppp/peers/{ifname}'
+ config_wwan_chat = f'/etc/ppp/peers/chat.{ifname}'
+ script_wwan_pre_up = f'/etc/ppp/ip-pre-up.d/1010-vyos-wwan-{ifname}'
+ script_wwan_ip_up = f'/etc/ppp/ip-up.d/1010-vyos-wwan-{ifname}'
+ script_wwan_ip_down = f'/etc/ppp/ip-down.d/1010-vyos-wwan-{ifname}'
config_files = [config_wwan, config_wwan_chat, script_wwan_pre_up,
script_wwan_ip_up, script_wwan_ip_down]
# Always hang-up WWAN connection prior generating new configuration file
- call(f'systemctl stop ppp@{intf}.service')
+ call(f'systemctl stop ppp@{ifname}.service')
- if wwan['deleted']:
+ if 'deleted' in wwan:
# Delete PPP configuration files
for file in config_files:
if os.path.exists(file):
os.unlink(file)
else:
+ wwan['device'] = find_device_file(wwan['device'])
+
# Create PPP configuration files
render(config_wwan, 'wwan/peer.tmpl', wwan)
# Create PPP chat script
@@ -195,20 +145,13 @@ def generate(wwan):
return None
def apply(wwan):
- if wwan['deleted']:
+ if 'deleted' in wwan.keys():
# bail out early
return None
- if not wwan['disable']:
+ if not 'disable' in wwan.keys():
# "dial" WWAN connection
- intf = wwan['intf']
- call(f'systemctl start ppp@{intf}.service')
-
- # re-add ourselves to any bridge we might have fallen out of
- # FIXME: wwan isn't under vyos.ifconfig so we can't call
- # Interfaces.add_to_bridge() so STP settings won't get applied
- if wwan['is_bridge_member'] in Section.interfaces('bridge'):
- BridgeIf(wwan['is_bridge_member'], create=False).add_port(wwan['intf'])
+ call('systemctl start ppp@{ifname}.service'.format(**wwan))
return None