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.py88
1 files changed, 67 insertions, 21 deletions
diff --git a/src/conf_mode/interfaces-wirelessmodem.py b/src/conf_mode/interfaces-wirelessmodem.py
index 9efad3b8d..7aee5c9bd 100755
--- a/src/conf_mode/interfaces-wirelessmodem.py
+++ b/src/conf_mode/interfaces-wirelessmodem.py
@@ -20,10 +20,10 @@ from sys import exit
from copy import deepcopy
from jinja2 import Template
from subprocess import Popen, PIPE
-from pwd import getpwnam
-from grp import getgrnam
+from netifaces import interfaces
from vyos.config import Config
+from vyos.util import chown_file, chmod_x_file
from vyos import ConfigError
# Please be careful if you edit the template.
@@ -70,6 +70,32 @@ CONNECT ''
"""
+config_wwan_ip_up_tmpl = """#!/bin/sh
+# As WWAN is an "on demand" interface we need to re-configure it when it
+# becomes 'up'
+
+ipparam=$6
+
+# device name and metric are received using ipparam
+device=`echo "$ipparam"|awk '{ print $1 }'`
+
+if [ "$device" != "{{ intf }}" ]; then
+ exit
+fi
+
+# add some info to syslog
+DIALER_PID=$(cat /var/run/{{ intf }}.pid)
+logger -t pppd[$DIALER_PID] "executing $0"
+
+echo "{{ description }}" > /sys/class/net/{{ intf }}/ifalias
+
+{% if vrf -%}
+logger -t pppd[$DIALER_PID] "configuring interface {{ intf }} for VRF {{ vrf }}"
+ip link set dev {{ intf }} master {{ vrf }}
+{% endif %}
+
+"""
+
default_config_data = {
'address': [],
'apn': '',
@@ -84,7 +110,8 @@ default_config_data = {
'metric': '10',
'mtu': '1500',
'name_server': True,
- 'intf': ''
+ 'intf': '',
+ 'vrf': ''
}
def subprocess_cmd(command):
@@ -154,6 +181,10 @@ def get_config():
if conf.exists(['ondemand']):
wwan['on_demand'] = True
+ # retrieve VRF instance
+ if conf.exists('vrf'):
+ wwan['vrf'] = conf.return_value(['vrf'])
+
return wwan
def verify(wwan):
@@ -168,41 +199,58 @@ def verify(wwan):
if not os.path.exists(f"/dev/{wwan['device']}"):
raise ConfigError(f"Device {wwan['device']} does not exist")
+ vrf_name = wwan['vrf']
+ if vrf_name and vrf_name not in interfaces():
+ raise ConfigError(f'VRF {vrf_name} does not exist')
+
return None
def generate(wwan):
- config_file_wwan = f"/etc/ppp/peers/{wwan['intf']}"
+ intf = wwan['intf']
+ config_file_wwan = f'/etc/ppp/peers/{intf}'
+ config_file_wwan_chat = wwan['chat_script']
+ ip_up_script_file = f'/etc/ppp/ip-up.d/9991-vyos-vrf-{intf}'
+
+ config_files = [config_file_wwan, config_file_wwan_chat, ip_up_script_file]
+
+ # Ensure directories for config files exist - otherwise create them on demand
+ for file in config_files:
+ dirname = os.path.dirname(file)
+ if not os.path.isdir(dirname):
+ os.mkdir(dirname)
# Always hang-up WWAN connection prior generating new configuration file
- cmd = f"systemctl stop ppp@{wwan['intf']}.service"
+ cmd = f'systemctl stop ppp@{intf}.service'
subprocess_cmd(cmd)
if wwan['deleted']:
# Delete PPP configuration files
- if os.path.exists(config_file_wwan):
- os.unlink(config_file_wwan)
- if os.path.exists(wwan['chat_script']):
- os.unlink(wwan['chat_script'])
+ for file in config_files:
+ if os.path.exists(file):
+ os.unlink(file)
else:
- # PPP peers directory
- dirname = os.path.dirname(config_file_wwan)
- if not os.path.isdir(dirname):
- os.mkdir(dirname)
-
# Create PPP configuration files
tmpl = Template(config_wwan_tmpl)
config_text = tmpl.render(wwan)
with open(config_file_wwan, 'w') as f:
f.write(config_text)
-
# Create PPP chat script
tmpl = Template(chat_wwan_tmpl)
config_text = tmpl.render(wwan)
with open(wwan['chat_script'], 'w') as f:
f.write(config_text)
+ # Create ip-pre-up script
+ tmpl = Template(config_wwan_ip_up_tmpl)
+ config_text = tmpl.render(wwan)
+ with open(ip_up_script_file, 'w') as f:
+ f.write(config_text)
+
+ # make generated script file executable
+ chmod_x_file(ip_up_script_file)
+
return None
def apply(wwan):
@@ -211,15 +259,13 @@ def apply(wwan):
return None
if not wwan['disable']:
- # dial WWAN connection
- cmd = f"systemctl start ppp@{wwan['intf']}.service"
+ # "dial" WWAN connection
+ intf = wwan['intf']
+ cmd = f'systemctl start ppp@{intf}.service'
subprocess_cmd(cmd)
# make logfile owned by root / vyattacfg
- if os.path.isfile(wwan['logfile']):
- uid = getpwnam('root').pw_uid
- gid = getgrnam('vyattacfg').gr_gid
- os.chown(wwan['logfile'], uid, gid)
+ chown_file(wwan['logfile'], 'root', 'vyattacfg')
return None