'';
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;
'';
};
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 = {
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";
# 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 = {
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";
overlays/podl.nix
overlays/vim-ghcid-quickfix.nix
overlays/zerobin.nix
+ overlays/modemmanager.nix
]
--- /dev/null
+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 {};
+}
--- /dev/null
+{ 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";
+ };
+}
--- /dev/null
+{ 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;
+ };
+}
--- /dev/null
+{ 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;
+ };
+}
--- /dev/null
+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))