From 0b027b131c97ec901c3b3dc9211ee434d21291dc Mon Sep 17 00:00:00 2001 From: Florian Eckert Date: Fri, 3 Dec 2021 15:57:33 +0100 Subject: [PATCH] ModemManager: refactoring procd init script The way the init script is written now, we get a bad output when calling the ubus service backend. ubus call service list "{'verbose':true,'name':'modemmanager'}" >{ > "modemmanager": { > "instances": { > "instance1": { > "running": true, > "pid": 20511, > "command": [ > "sh", > "-c", > ". >/usr/share/ModemManager/modemmanager.common; \t >mkdir -m 0755 -p /var/run/modemmanager; \t >mm_cleanup_interfaces; \t >( mm_report_events_from_cache ) >/dev/null 2>&1 & \t >/usr/sbin/ModemManager" > ], > "term_timeout": 5, > "respawn": { > "threshold": 3600, > "timeout": 5, > "retry": 5 > }, > "pidfile":"/var/run/modemmanager/modemmanager.pid" > } > } > } >}" I also get the output in the log that the PID file cannot be created. > daemon.err procd: Failed to remove pidfile: :No such file or directory The changes in this commit fixes this issues, by moving startup into a wrapper script. Signed-off-by: Florian Eckert --- net/modemmanager/Makefile | 1 + net/modemmanager/files/modemmanager.init | 10 +++--- .../files/usr/sbin/ModemManager-wrapper | 33 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 net/modemmanager/files/usr/sbin/ModemManager-wrapper diff --git a/net/modemmanager/Makefile b/net/modemmanager/Makefile index ce87b0a36..db59989b2 100644 --- a/net/modemmanager/Makefile +++ b/net/modemmanager/Makefile @@ -98,6 +98,7 @@ define Package/modemmanager/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ModemManager $(1)/usr/sbin + $(INSTALL_BIN) ./files/usr/sbin/ModemManager-wrapper $(1)/usr/sbin $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin diff --git a/net/modemmanager/files/modemmanager.init b/net/modemmanager/files/modemmanager.init index b3f9f9290..a3f6c1b12 100755 --- a/net/modemmanager/files/modemmanager.init +++ b/net/modemmanager/files/modemmanager.init @@ -22,14 +22,12 @@ start_service() { # it starts. # # All these commands need to be executed on every MM start, even after - # procd-triggered respawns, which is why they're all included as instance command + # procd-triggered respawns, which is why this is wrapped in a startup + # wrapper script called '/usr/sbin/ModemManager-wrapper'. # + . /usr/share/ModemManager/modemmanager.common procd_open_instance - procd_set_param command sh -c ". /usr/share/ModemManager/modemmanager.common; \ - mkdir -m 0755 -p ${MODEMMANAGER_RUNDIR}; \ - mm_cleanup_interfaces; \ - ( mm_report_events_from_cache ) >/dev/null 2>&1 & \ - /usr/sbin/ModemManager" + procd_set_param command /usr/sbin/ModemManager-wrapper procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" procd_set_param pidfile "${MODEMMANAGER_PID_FILE}" procd_close_instance diff --git a/net/modemmanager/files/usr/sbin/ModemManager-wrapper b/net/modemmanager/files/usr/sbin/ModemManager-wrapper new file mode 100644 index 000000000..f5fb6d1f2 --- /dev/null +++ b/net/modemmanager/files/usr/sbin/ModemManager-wrapper @@ -0,0 +1,33 @@ +#!/bin/sh + +trap_with_arg() { + func="$1" ; shift + for sig ; do + # shellcheck disable=SC2064 + trap "$func $sig" "$sig" + done +} + +func_trap() { + logger "ModemManager-wrapper[$$]" "Sending signal ${1}..." + kill "-${1}" "$CHILD" 2>/dev/null +} + +main() { + . /usr/share/ModemManager/modemmanager.common + + trap_with_arg func_trap INT TERM KILL + + mkdir -p "${MODEMMANAGER_RUNDIR}" + chmod 0755 "${MODEMMANAGER_RUNDIR}" + mm_cleanup_interfaces + + /usr/sbin/ModemManager "$@" 1>/dev/null 2>/dev/null & + CHILD="$!" + sleep 2 + mm_report_events_from_cache + + wait "$CHILD" +} + +main "$@"