aubergine: networking: revert to a working modemmanager (1.18.12)
authorJulien Moutinho <julm+julm-nix@sourcephile.fr>
Thu, 12 Oct 2023 22:29:52 +0000 (00:29 +0200)
committerJulien Moutinho <julm+julm-nix@sourcephile.fr>
Tue, 17 Oct 2023 22:58:59 +0000 (00:58 +0200)
hosts/aubergine/networking/lte.nix
hosts/aubergine/wireguard.nix
nixpkgs/overlays.nix
nixpkgs/overlays/modemmanager.nix [new file with mode: 0644]
nixpkgs/pkgs/libqmi.nix [new file with mode: 0644]
nixpkgs/pkgs/modemmanager-1-18.nix [new file with mode: 0644]
nixpkgs/pkgs/modemmanager-1-20-4.nix [new file with mode: 0644]
nixpkgs/pkgs/no-dummy-dirs-in-sysconfdir.patch [new file with mode: 0644]

index 37a6d30ba01cb66171269bd77164da2b23978738..550b895fbf933376c8f89fb933fdf45ea5dda491 100644 (file)
@@ -37,7 +37,12 @@ in
   '';
   services.mmsd.enable = true;
   services.mmsd.extraArgs = [ "--debug" ];
-  systemd.services.ModemManager.serviceConfig.ExecStart = lib.mkForce [ "" "${pkgs.modemmanager}/bin/ModemManager --debug" ];
+  systemd.services.ModemManager.serviceConfig.ExecStart =
+    lib.mkForce [
+      ""
+      "${pkgs.modemmanager-1-18}/bin/ModemManager --debug"
+      #"${pkgs.modemmanager-1-20-4}/bin/ModemManager --debug"
+    ];
   systemd.services.NetworkManager.wants = [ "ModemManager.service" ];
   services.dbus.packages = [ pkgs.dconf ];
   programs.dconf.enable = true;
@@ -72,8 +77,10 @@ in
     '';
   };
   systemd.services.watch-lte = {
-    wantedBy = [ "multi-user.target" ];
-    startAt = "*:0/5"; # every 5 min
+    after = [ "NetworkManager-wait-online.service" ];
+    requires = [ "NetworkManager-wait-online.service" ];
+    wantedBy = [ "network-online.target" ];
+    #startAt = "*:0/5"; # every 5 min
     path = with pkgs; [ inetutils networkmanager ];
     unitConfig = { StartLimitIntervalSec = 0; };
     serviceConfig = {
@@ -81,9 +88,11 @@ in
       IPAddressAllow = [ "9.9.9.9" ];
       RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" ];
       ExecStart = pkgs.writeShellScript "watch-lte" ''
-        set -eux
-        ping -c 1 9.9.9.9 ||
-        nmcli connection up Prixtel
+        set -ux
+        while sleep 300; do
+          ping -c 1 9.9.9.9 ||
+          nmcli connection up Prixtel
+        done
       '';
       Restart = "on-failure";
       RestartSec = "30s";
index 4ee79cfe846a14ad52fe95ffced8b600913588e5..b08faf7d49b22298d717abb7ce3535a4d8c75f4a 100644 (file)
@@ -16,8 +16,10 @@ in
   # FIXME: this is enough to connect to the LTE router,
   # but not enough to connect the wg-intra hosts behind the LTE router.
   systemd.services.fix-wireguard-behind-lte = {
-    wantedBy = [ "multi-user.target" ];
-    startAt = "*:0/5"; # every 5 min
+    after = [ "NetworkManager-wait-online.service" ];
+    requires = [ "NetworkManager-wait-online.service" ];
+    wantedBy = [ "network-online.target" ];
+    #startAt = "*:0/5"; # every 5 min
     path = with pkgs; [ iproute2 curl /*gnused socat*/ ];
     unitConfig = { StartLimitIntervalSec = 0; };
     serviceConfig = {
@@ -26,12 +28,14 @@ in
       IPAddressAllow = [ peers.mermet.ipv4 ];
       RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_NETLINK" ];
       ExecStart = pkgs.writeShellScript "fix-wireguard-behind-lte" ''
-        set -eux
-        # FIXME: lift mermet's restriction of only one connection at a time
-        #externalIP=$(socat - TCP:${peers.mermet.ipv4}:${toString peers.mermet.listenPort} |
-        externalIP=$(curl -s4L https://icanhazip.com)
-        test -z "''${externalIP-}" ||
-        ip addr replace "$externalIP"/32 dev ${network.lteIface}
+        set -ux
+        while sleep 300; do
+          # FIXME: lift mermet's restriction of only one connection at a time
+          #externalIP=$(socat - TCP:${peers.mermet.ipv4}:${toString peers.mermet.listenPort} |
+          externalIP=$(curl -s4L https://icanhazip.com)
+          test -z "''${externalIP-}" ||
+          ip addr replace "$externalIP"/32 dev ${network.lteIface}
+        done
       '';
       Restart = "on-failure";
       RestartSec = "30s";
index 17dd5d41fa6b4ecb3656cfc17c843245971c86f1..49c44504647369f413ad13cf96e3781aa58b2107 100644 (file)
@@ -5,4 +5,5 @@ map import
     overlays/podl.nix
     overlays/vim-ghcid-quickfix.nix
     overlays/zerobin.nix
+    overlays/modemmanager.nix
   ]
diff --git a/nixpkgs/overlays/modemmanager.nix b/nixpkgs/overlays/modemmanager.nix
new file mode 100644 (file)
index 0000000..dce6dc1
--- /dev/null
@@ -0,0 +1,5 @@
+final: prev: {
+  #libqmi = final.callPackage ../pkgs/libqmi.nix {};
+  modemmanager-1-18 = final.callPackage ../pkgs/modemmanager-1-18.nix {};
+  modemmanager-1-20-4 = final.callPackage ../pkgs/modemmanager-1-20-4.nix {};
+}
diff --git a/nixpkgs/pkgs/libqmi.nix b/nixpkgs/pkgs/libqmi.nix
new file mode 100644 (file)
index 0000000..b261967
--- /dev/null
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, gobject-introspection
+, gtk-doc
+, docbook-xsl-nons
+, docbook_xml_dtd_43
+, glib
+, python3
+, libgudev
+, libmbim
+, libqrtr-glib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "libqmi";
+  version = "1.30.8";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "https://www.freedesktop.org/software/libqmi/${pname}-${version}.tar.xz";
+    sha256 = "sha256-hiSCzp460L1l0mQzTuMRzblLnfKGO1txNjCbQbisGZA=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gobject-introspection
+    python3
+    gtk-doc
+    docbook-xsl-nons
+    docbook_xml_dtd_43
+  ];
+
+  buildInputs = [
+    libgudev
+    libmbim
+  ];
+
+  propagatedBuildInputs = [
+    glib
+    libqrtr-glib
+  ];
+
+  configureFlags = [
+    "--with-udev-base-dir=${placeholder "out"}/lib/udev"
+    "--enable-gtk-doc=${if (stdenv.buildPlatform == stdenv.hostPlatform) then "yes" else "no"}"
+    "--enable-introspection=${if (stdenv.buildPlatform == stdenv.hostPlatform) then "yes" else "no"}"
+  ];
+
+  enableParallelBuilding = true;
+
+  doCheck = true;
+
+  meta = with lib; {
+    homepage = "https://www.freedesktop.org/wiki/Software/libqmi/";
+    description = "Modem protocol helper library";
+    maintainers = teams.freedesktop.members;
+    platforms = platforms.linux;
+    license = with licenses; [
+      # Library
+      lgpl2Plus
+      # Tools
+      gpl2Plus
+    ];
+    changelog = "https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/blob/${version}/NEWS";
+  };
+}
diff --git a/nixpkgs/pkgs/modemmanager-1-18.nix b/nixpkgs/pkgs/modemmanager-1-18.nix
new file mode 100644 (file)
index 0000000..01c70f3
--- /dev/null
@@ -0,0 +1,59 @@
+{ lib, stdenv, fetchurl
+, glib, udev, libgudev, polkit, ppp, gettext, pkg-config, python3
+, libmbim, libqmi, systemd, vala, gobject-introspection, dbus
+}:
+
+stdenv.mkDerivation rec {
+  pname = "modemmanager";
+  version = "1.18.12";
+
+  src = fetchurl {
+    url = "https://www.freedesktop.org/software/ModemManager/ModemManager-${version}.tar.xz";
+    sha256 = "sha256-tGTkkl2VWmyobdCGFudjsmrkbX/Tfb4oFnjjQGWx5DA=";
+  };
+
+  nativeBuildInputs = [ vala gobject-introspection gettext pkg-config ];
+
+  buildInputs = [ glib udev libgudev polkit ppp libmbim libqmi systemd ];
+
+  nativeInstallCheckInputs = [
+    python3 python3.pkgs.dbus-python python3.pkgs.pygobject3
+  ];
+
+  configureFlags = [
+    "--with-polkit"
+    "--with-udev-base-dir=${placeholder "out"}/lib/udev"
+    "--with-dbus-sys-dir=${placeholder "out"}/share/dbus-1/system.d"
+    "--with-systemdsystemunitdir=${placeholder "out"}/etc/systemd/system"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "--with-systemd-suspend-resume"
+    "--with-systemd-journal"
+  ];
+
+  postPatch = ''
+    patchShebangs tools/test-modemmanager-service.py
+  '';
+
+  # In Nixpkgs g-ir-scanner is patched to produce absolute paths, and
+  # that interferes with ModemManager's tests, causing them to try to
+  # load libraries from the install path, which doesn't usually exist
+  # when `make check' is run.  So to work around that, we run it as an
+  # install check instead, when those paths will have been created.
+  doInstallCheck = true;
+  preInstallCheck = ''
+    export G_TEST_DBUS_DAEMON="${dbus}/bin/dbus-daemon"
+    patchShebangs tools/tests/test-wrapper.sh
+  '';
+  installCheckTarget = "check";
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "WWAN modem manager, part of NetworkManager";
+    homepage = "https://www.freedesktop.org/wiki/Software/ModemManager/";
+    license = licenses.gpl2Plus;
+    maintainers = teams.freedesktop.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/modemmanager-1-20-4.nix b/nixpkgs/pkgs/modemmanager-1-20-4.nix
new file mode 100644 (file)
index 0000000..752cd74
--- /dev/null
@@ -0,0 +1,103 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, glib
+, udev
+, libgudev
+, polkit
+, ppp
+, gettext
+, pkg-config
+, libxslt
+, python3
+, libmbim
+, libqmi
+, systemd
+, bash-completion
+, meson
+, ninja
+, vala
+, gobject-introspection
+, dbus
+}:
+
+stdenv.mkDerivation rec {
+  pname = "modemmanager";
+  version = "1.20.4";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.freedesktop.org";
+    owner = "mobile-broadband";
+    repo = "ModemManager";
+    rev = version;
+    hash = "sha256-OWP23EQ7a8rghhV7AC9yinCxRI0xwcntB5dl9XtgK6M=";
+  };
+
+  patches = [
+    # Since /etc is the domain of NixOS, not Nix, we cannot install files there.
+    # But these are just placeholders so we do not need to install them at all.
+    ./no-dummy-dirs-in-sysconfdir.patch
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    vala
+    gobject-introspection
+    gettext
+    pkg-config
+    libxslt
+  ];
+
+  buildInputs = [
+    glib
+    udev
+    libgudev
+    polkit
+    ppp
+    libmbim
+    libqmi
+    systemd
+    bash-completion
+    dbus
+  ];
+
+  nativeInstallCheckInputs = [
+    python3
+    python3.pkgs.dbus-python
+    python3.pkgs.pygobject3
+  ];
+
+  mesonFlags = [
+    "-Dudevdir=${placeholder "out"}/lib/udev"
+    "-Ddbus_policy_dir=${placeholder "out"}/share/dbus-1/system.d"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "-Dvapi=true"
+  ];
+
+  postPatch = ''
+    patchShebangs \
+      tools/test-modemmanager-service.py
+  '';
+
+  # In Nixpkgs g-ir-scanner is patched to produce absolute paths, and
+  # that interferes with ModemManager's tests, causing them to try to
+  # load libraries from the install path, which doesn't usually exist
+  # when `make check' is run.  So to work around that, we run it as an
+  # install check instead, when those paths will have been created.
+  doInstallCheck = true;
+  preInstallCheck = ''
+    export G_TEST_DBUS_DAEMON="${dbus}/bin/dbus-daemon"
+    patchShebangs tools/tests/test-wrapper.sh
+  '';
+  installCheckTarget = "check";
+
+  meta = with lib; {
+    description = "WWAN modem manager, part of NetworkManager";
+    homepage = "https://www.freedesktop.org/wiki/Software/ModemManager/";
+    license = licenses.gpl2Plus;
+    maintainers = teams.freedesktop.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/no-dummy-dirs-in-sysconfdir.patch b/nixpkgs/pkgs/no-dummy-dirs-in-sysconfdir.patch
new file mode 100644 (file)
index 0000000..d293efa
--- /dev/null
@@ -0,0 +1,20 @@
+diff --git a/data/dispatcher-connection/meson.build b/data/dispatcher-connection/meson.build
+index 2e7ef8b4..e0f4aa66 100644
+--- a/data/dispatcher-connection/meson.build
++++ b/data/dispatcher-connection/meson.build
+@@ -21,5 +21,4 @@ install_data(
+ )
+ mkdir_cmd = 'mkdir -p ${DESTDIR}@0@'
+-meson.add_install_script('sh', '-c', mkdir_cmd.format(mm_prefix / mm_connectiondiruser))
+ meson.add_install_script('sh', '-c', mkdir_cmd.format(mm_prefix / mm_connectiondirpackage))
+diff --git a/data/dispatcher-fcc-unlock/meson.build b/data/dispatcher-fcc-unlock/meson.build
+index 5dc3b6a0..25a948a1 100644
+--- a/data/dispatcher-fcc-unlock/meson.build
++++ b/data/dispatcher-fcc-unlock/meson.build
+@@ -39,5 +39,4 @@ foreach output, input: vidpids
+ endforeach
+ mkdir_cmd = 'mkdir -p ${DESTDIR}@0@'
+-meson.add_install_script('sh', '-c', mkdir_cmd.format(mm_prefix / mm_fccunlockdiruser))
+ meson.add_install_script('sh', '-c', mkdir_cmd.format(mm_prefix / mm_fccunlockdirpackage))