]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
feat(connman): introduce connman support module
authorZoltán Böszörményi <zboszor@gmail.com>
Thu, 24 Mar 2022 09:48:00 +0000 (10:48 +0100)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Mon, 28 Mar 2022 08:01:46 +0000 (08:01 +0000)
Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com>
modules.d/35connman/cm-config.sh [new file with mode: 0755]
modules.d/35connman/cm-initrd.service [new file with mode: 0644]
modules.d/35connman/cm-lib.sh [new file with mode: 0644]
modules.d/35connman/cm-run.sh [new file with mode: 0755]
modules.d/35connman/cm-wait-online-initrd.service [new file with mode: 0644]
modules.d/35connman/module-setup.sh [new file with mode: 0755]
modules.d/40network/module-setup.sh

diff --git a/modules.d/35connman/cm-config.sh b/modules.d/35connman/cm-config.sh
new file mode 100755 (executable)
index 0000000..6ae754a
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+type cm_generate_connections > /dev/null 2>&1 || . /lib/cm-lib.sh
+
+if [ -n "$netroot" ] || [ -e /tmp/net.ifaces ]; then
+    echo rd.neednet >> /etc/cmdline.d/connman.conf
+fi
+
+if getargbool 0 rd.debug -d -y rdinitdebug -d -y rdnetdebug; then
+    if [ -n "$DRACUT_SYSTEMD" ]; then
+        # Enable tty output if a usable console is found
+        # shellcheck disable=SC2217
+        if [ -w /dev/console ] && (echo < /dev/console) > /dev/null 2> /dev/null; then
+            mkdir -p /run/systemd/system/cm-initrd.service.d
+            cat << EOF > /run/systemd/system/cm-initrd.service.d/tty-output.conf
+[Service]
+StandardOutput=tty
+EOF
+            systemctl --no-block daemon-reload
+        fi
+    fi
+fi
+
+cm_generate_connections
diff --git a/modules.d/35connman/cm-initrd.service b/modules.d/35connman/cm-initrd.service
new file mode 100644 (file)
index 0000000..cecb408
--- /dev/null
@@ -0,0 +1,24 @@
+[Unit]
+DefaultDependencies=no
+Wants=systemd-udev-trigger.service
+After=systemd-udev-trigger.service
+After=dracut-cmdline.service
+Wants=network.target
+Before=network.target
+RequiresMountsFor=/var/lib/connman
+After=dbus.service
+ConditionPathExists=/run/connman/initrd/neednet
+
+[Service]
+Type=dbus
+BusName=net.connman
+Restart=on-failure
+ExecStart=/usr/sbin/connmand -n
+StandardOutput=null
+CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_ADMIN
+ProtectHome=true
+ProtectSystem=full
+
+[Install]
+WantedBy=initrd.target
+Also=cm-wait-online-initrd.service
diff --git a/modules.d/35connman/cm-lib.sh b/modules.d/35connman/cm-lib.sh
new file mode 100644 (file)
index 0000000..69c4fa2
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+type getcmdline > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+cm_generate_connections() {
+    if getargbool 0 rd.neednet; then
+        mkdir -p "$hookdir"/initqueue/finished
+        echo '[ -f /tmp/cm.done ]' > "$hookdir"/initqueue/finished/cm.sh
+        mkdir -p /run/connman/initrd
+        : > /run/connman/initrd/neednet # activate ConnMan services
+    fi
+}
diff --git a/modules.d/35connman/cm-run.sh b/modules.d/35connman/cm-run.sh
new file mode 100755 (executable)
index 0000000..a9dcf05
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+type source_hook > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+if [ -e /tmp/cm.done ]; then
+    return
+fi
+
+while read -r _serv; do
+    ifname=$(connmanctl services "$_serv" | grep Interface= | sed 's/^.*Interface=\([^,]*\).*$/\1/')
+    source_hook initqueue/online "$ifname"
+    /sbin/netroot "$ifname"
+done < <(connmanctl services | grep -oE '[^ ]+$')
+
+: > /tmp/cm.done
diff --git a/modules.d/35connman/cm-wait-online-initrd.service b/modules.d/35connman/cm-wait-online-initrd.service
new file mode 100644 (file)
index 0000000..08e6941
--- /dev/null
@@ -0,0 +1,16 @@
+[Unit]
+DefaultDependencies=no
+Requires=cm-initrd.service
+After=cm-initrd.service
+Before=network-online.target
+Before=dracut-initqueue.service
+ConditionPathExists=/run/connman/initrd/neednet
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/connmand-wait-online
+RemainAfterExit=yes
+
+[Install]
+WantedBy=initrd.target
+WantedBy=network-online.target
diff --git a/modules.d/35connman/module-setup.sh b/modules.d/35connman/module-setup.sh
new file mode 100755 (executable)
index 0000000..cf8ca4c
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+# called by dracut
+check() {
+    require_binaries sed grep connmand connmanctl connmand-wait-online || return 1
+
+    # do not add this module by default
+    return 255
+}
+
+# called by dracut
+depends() {
+    echo dbus systemd bash
+    return 0
+}
+
+# called by dracut
+installkernel() {
+    return 0
+}
+
+# called by dracut
+install() {
+    # We don't need `ip` but having it is *really* useful for people debugging
+    # in an emergency shell.
+    inst_multiple ip sed grep
+
+    inst connmand
+    inst connmanctl
+    inst connmand-wait-online
+    inst "$dbussystem"/connman.conf
+    [[ $hostonly ]] && [[ -f $dracutsysrootdir/etc/connman/main.conf ]] && inst /etc/connman/main.conf
+    inst_dir /usr/lib/connman/plugins
+    inst_dir /var/lib/connman
+
+    inst_hook cmdline 99 "$moddir/cm-config.sh"
+
+    inst_simple "$moddir"/cm-initrd.service "$systemdsystemunitdir"/cm-initrd.service
+    inst_simple "$moddir"/cm-wait-online-initrd.service "$systemdsystemunitdir"/cm-wait-online-initrd.service
+
+    $SYSTEMCTL -q --root "$initdir" enable cm-initrd.service
+
+    inst_hook initqueue/settled 99 "$moddir/cm-run.sh"
+
+    inst_simple "$moddir/cm-lib.sh" "/lib/cm-lib.sh"
+}
index d5edbf81399fb47a851d269d2a92f539fc7e9127..1ab13eff790543a00f97cb4c0401d197b0ea6ce3 100755 (executable)
@@ -9,7 +9,7 @@ check() {
 depends() {
     is_qemu_virtualized && echo -n "qemu-net "
 
-    for module in network-wicked network-manager network-legacy systemd-networkd; do
+    for module in network-wicked connman network-manager network-legacy systemd-networkd; do
         if dracut_module_included "$module"; then
             network_handler="$module"
             break
@@ -19,6 +19,8 @@ depends() {
     if [ -z "$network_handler" ]; then
         if [[ -e $dracutsysrootdir$systemdsystemunitdir/wicked.service ]]; then
             network_handler="network-wicked"
+        elif [[ -e $dracutsysrootdir$systemdsystemunitdir/connman.service ]]; then
+            network_handler="connman"
         elif [[ -x $dracutsysrootdir/usr/libexec/nm-initrd-generator ]] || [[ -x $dracutsysrootdir/usr/lib/nm-initrd-generator ]]; then
             network_handler="network-manager"
         elif [[ -x $dracutsysrootdir$systemdutildir/systemd-networkd ]]; then