ModemManager: refactoring procd init script
authorFlorian Eckert <redacted>
Fri, 3 Dec 2021 14:57:33 +0000 (15:57 +0100)
committerFlorian Eckert <redacted>
Mon, 6 Dec 2021 13:49:43 +0000 (14:49 +0100)
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 <redacted>
net/modemmanager/Makefile
net/modemmanager/files/modemmanager.init
net/modemmanager/files/usr/sbin/ModemManager-wrapper [new file with mode: 0644]

index ce87b0a36ab2ac0256702f36098dc50a2ffdeca1..db59989b203453402ffd9a50c0f701187c0bb875 100644 (file)
@@ -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
index b3f9f92901b6c8a7aeb0be61ba936d07319f16b5..a3f6c1b12a524d7d1f2127364a1f4fe41d03fc69 100755 (executable)
@@ -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 (file)
index 0000000..f5fb6d1
--- /dev/null
@@ -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 "$@"
git clone https://git.99rst.org/PROJECT