From 2daa8aa6892d990d12c50bf16095dac0e1f179c7 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 10 Dec 2021 22:10:10 +0100 Subject: wwan: T3795: only run ModemManager when interface is in use (cherry picked from commit a8ebb4817955b3f33f773a4d05c753dfc77958cd) --- src/conf_mode/interfaces-wwan.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/conf_mode/interfaces-wwan.py') diff --git a/src/conf_mode/interfaces-wwan.py b/src/conf_mode/interfaces-wwan.py index f013e5411..7fdd0d447 100755 --- a/src/conf_mode/interfaces-wwan.py +++ b/src/conf_mode/interfaces-wwan.py @@ -17,6 +17,7 @@ import os from sys import exit +from time import sleep from vyos.config import Config from vyos.configdict import get_interface_dict @@ -28,10 +29,14 @@ from vyos.util import cmd from vyos.util import call from vyos.util import dict_search from vyos.util import DEVNULL +from vyos.util import is_systemd_service_active +from vyos.template import render from vyos import ConfigError from vyos import airbag airbag.enable() +service_name = 'ModemManager.service' + def get_config(config=None): """ Retrive CLI config as dictionary. Dictionary can never be empty, as at least the @@ -44,6 +49,20 @@ def get_config(config=None): base = ['interfaces', 'wwan'] wwan = get_interface_dict(conf, base) + # We need to know the amount of other WWAN interfaces as ModemManager needs + # to be started or stopped. + conf.set_level(base) + wwan['other_interfaces'] = conf.get_config_dict([], key_mangling=('-', '_'), + get_first_key=True, + no_tag_node_value_mangle=True) + + # This if-clause is just to be sure - it will always evaluate to true + ifname = wwan['ifname'] + if ifname in wwan['other_interfaces']: + del wwan['other_interfaces'][ifname] + if len(wwan['other_interfaces']) == 0: + del wwan['other_interfaces'] + return wwan def verify(wwan): @@ -64,6 +83,18 @@ def generate(wwan): return None def apply(wwan): + if not is_systemd_service_active(service_name): + cmd(f'systemctl start {service_name}') + + counter = 100 + # Wait until a modem is detected and then we can continue + while counter > 0: + counter -= 1 + tmp = cmd('mmcli -L') + if tmp != 'No modems were found': + break + sleep(0.250) + # we only need the modem number. wwan0 -> 0, wwan1 -> 1 modem = wwan['ifname'].lstrip('wwan') base_cmd = f'mmcli --modem {modem}' @@ -73,6 +104,11 @@ def apply(wwan): w = WWANIf(wwan['ifname']) if 'deleted' in wwan or 'disable' in wwan: w.remove() + + # There are no other WWAN interfaces - stop the daemon + if 'other_interfaces' not in wwan: + cmd(f'systemctl stop {service_name}') + return None ip_type = 'ipv4' @@ -93,6 +129,9 @@ def apply(wwan): call(command, stdout=DEVNULL) w.update(wwan) + if 'other_interfaces' not in wwan and 'deleted' in wwan: + cmd(f'systemctl start {service_name}') + return None if __name__ == '__main__': -- cgit v1.2.3 From 03938f718be722a92d26279a5edd822f9261228a Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 10 Dec 2021 22:10:37 +0100 Subject: wwan: T3795: only enable cron helper when interface is in use (cherry picked from commit e73b40a04ee90a91b778ce72a60cbb751f42a306) --- src/conf_mode/interfaces-wwan.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/conf_mode/interfaces-wwan.py') diff --git a/src/conf_mode/interfaces-wwan.py b/src/conf_mode/interfaces-wwan.py index 7fdd0d447..e052e152d 100755 --- a/src/conf_mode/interfaces-wwan.py +++ b/src/conf_mode/interfaces-wwan.py @@ -30,12 +30,14 @@ from vyos.util import call from vyos.util import dict_search from vyos.util import DEVNULL from vyos.util import is_systemd_service_active +from vyos.util import write_file from vyos.template import render from vyos import ConfigError from vyos import airbag airbag.enable() service_name = 'ModemManager.service' +cron_script = '/etc/cron.d/wwan' def get_config(config=None): """ @@ -80,6 +82,11 @@ def verify(wwan): return None def generate(wwan): + if 'deleted' in wwan: + return None + + if not os.path.exists(cron_script): + write_file(cron_script, '*/5 * * * * root /usr/libexec/vyos/vyos-check-wwan.py') return None def apply(wwan): @@ -108,6 +115,10 @@ def apply(wwan): # There are no other WWAN interfaces - stop the daemon if 'other_interfaces' not in wwan: cmd(f'systemctl stop {service_name}') + # Clean CRON helper script which is used for to re-connect when + # RF signal is lost + if os.path.exists(cron_script): + os.unlink(cron_script) return None -- cgit v1.2.3 From c2ac56c5fb6a929afe054deab70d9e83a6a7a3f2 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Fri, 10 Dec 2021 22:17:43 +0100 Subject: wwan: T3795: remove superfluous import (render) (cherry picked from commit 5e7243db4ced47dbad48913f86909ba284fcc24d) --- src/conf_mode/interfaces-wwan.py | 1 - 1 file changed, 1 deletion(-) (limited to 'src/conf_mode/interfaces-wwan.py') diff --git a/src/conf_mode/interfaces-wwan.py b/src/conf_mode/interfaces-wwan.py index e052e152d..a4b033374 100755 --- a/src/conf_mode/interfaces-wwan.py +++ b/src/conf_mode/interfaces-wwan.py @@ -31,7 +31,6 @@ from vyos.util import dict_search from vyos.util import DEVNULL from vyos.util import is_systemd_service_active from vyos.util import write_file -from vyos.template import render from vyos import ConfigError from vyos import airbag airbag.enable() -- cgit v1.2.3