diff --git a/nixos/modules/services/networking/connman.nix b/nixos/modules/services/networking/connman.nix index e8eadc4e187d..6ccc2dffb267 100644 --- a/nixos/modules/services/networking/connman.nix +++ b/nixos/modules/services/networking/connman.nix @@ -77,6 +77,13 @@ in { ''; }; + package = mkOption { + type = types.path; + description = "The connman package / build flavor"; + default = connman; + example = literalExample "pkgs.connmanFull"; + }; + }; }; @@ -89,11 +96,13 @@ in { assertion = !config.networking.useDHCP; message = "You can not use services.connman with networking.useDHCP"; }{ + # TODO: connman seemingly can be used along network manager and + # connmanFull supports this - so this should be worked out somehow assertion = !config.networking.networkmanager.enable; message = "You can not use services.connman with networking.networkmanager"; }]; - environment.systemPackages = [ connman ]; + environment.systemPackages = [ cfg.package ]; systemd.services.connman = { description = "Connection service"; @@ -105,7 +114,7 @@ in { BusName = "net.connman"; Restart = "on-failure"; ExecStart = toString ([ - "${pkgs.connman}/sbin/connmand" + "${cfg.package}/sbin/connmand" "--config=${configFile}" "--nodaemon" ] ++ optional enableIwd "--wifi=iwd_agent" @@ -122,7 +131,7 @@ in { serviceConfig = { Type = "dbus"; BusName = "net.connman.vpn"; - ExecStart = "${pkgs.connman}/sbin/connman-vpnd -n"; + ExecStart = "${cfg.package}/sbin/connman-vpnd -n"; StandardOutput = "null"; }; }; @@ -132,7 +141,7 @@ in { serviceConfig = { Name = "net.connman.vpn"; before = [ "connman" ]; - ExecStart = "${pkgs.connman}/sbin/connman-vpnd -n"; + ExecStart = "${cfg.package}/sbin/connman-vpnd -n"; User = "root"; SystemdService = "connman-vpn.service"; }; diff --git a/pkgs/tools/networking/connman/connman.nix b/pkgs/tools/networking/connman/connman.nix new file mode 100644 index 000000000000..512194872205 --- /dev/null +++ b/pkgs/tools/networking/connman/connman.nix @@ -0,0 +1,171 @@ +{ stdenv +, fetchurl +, pkgconfig +, file +, glib +# always required runtime dependencies +, dbus +, libmnl +, gnutls +, readline +# configureable options +, firewallType ? "iptables" # or "nftables" +, iptables ? null +, libnftnl ? null # for nftables +, dnsType ? "internal" # or "systemd-resolved" +# optional features which are turned *on* by default +, enableOpenconnect ? true +, openconnect ? null +, enableOpenvpn ? true +, openvpn ? null +, enableVpnc ? true +, vpnc ? true +, enablePolkit ? true +, polkit ? null +, enablePptp ? true +, pptp ? null +, ppp ? null +, enableLoopback ? true +, enableEthernet ? true +, enableWireguard ? true +, enableGadget ? true +, enableWifi ? true +, enableBluetooth ? true +, enableOfono ? true +, enableDundee ? true +, enablePacrunner ? true +, enableNeard ? true +, enableWispr ? true +, enableTools ? true +, enableStats ? true +, enableClient ? true +, enableDatafiles ? true +# optional features which are turned *off* by default +, enableNetworkManager ? false +, enableHh2serialGps ? false +, enableL2tp ? false +, enableIospm ? false +, enableTist ? false +}: + +assert stdenv.lib.asserts.assertOneOf "firewallType" firewallType [ "iptables" "nftables" ]; +assert stdenv.lib.asserts.assertOneOf "dnsType" dnsType [ "internal" "systemd-resolved" ]; + +let inherit (stdenv.lib) optionals; in + +stdenv.mkDerivation rec { + pname = "connman"; + version = "1.38"; + src = fetchurl { + url = "mirror://kernel/linux/network/connman/${pname}-${version}.tar.xz"; + sha256 = "0awkqigvhwwxiapw0x6yd4whl465ka8a4al0v2pcqy9ggjlsqc6b"; + }; + + buildInputs = [ + glib + dbus + libmnl + gnutls + readline + ]; + + nativeBuildInputs = [ + pkgconfig + file + ] + ++ optionals (enablePolkit) [ polkit ] + ++ optionals (enablePptp) [ pptp ppp ] + ++ optionals (firewallType == "iptables") [ iptables ] + ++ optionals (firewallType == "nftables") [ libnftnl ] + ; + + # fix invalid path to 'file' + postPatch = '' + sed -i "s/\/usr\/bin\/file/file/g" ./configure + ''; + + configureFlags = [ + # directories flags + "--sysconfdir=${placeholder "out"}/etc" + "--localstatedir=/var" + "--with-dbusconfdir=${placeholder "out"}/share" + "--with-dbusdatadir=${placeholder "out"}/share" + "--with-tmpfilesdir=${placeholder "out"}/lib/tmpfiles.d" + "--with-systemdunitdir=${placeholder "out"}/lib/systemd/system" + "--with-dns-backend=${dnsType}" + "--with-firewall=${firewallType}" + # production build flags + "--disable-maintainer-mode" + "--enable-session-policy-local=builtin" + # for building and running tests + # "--enable-tests" # installs the tests, we don't want that + "--enable-tools" + ] + ++ optionals (!enableLoopback) [ "--disable-loopback" ] + ++ optionals (!enableEthernet) [ "--disable-ethernet" ] + ++ optionals (!enableWireguard) [ "--disable-wireguard" ] + ++ optionals (!enableGadget) [ "--disable-gadget" ] + ++ optionals (!enableWifi) [ "--disable-wifi" ] + # enable IWD support for wifi as it doesn't require any new dependencies + # and it's easier for the NixOS module to use only one connman package when + # IWD is requested + ++ optionals (enableWifi) [ "--enable-iwd" ] + ++ optionals (!enableBluetooth) [ "--disable-bluetooth" ] + ++ optionals (!enableOfono) [ "--disable-ofono" ] + ++ optionals (!enableDundee) [ "--disable-dundee" ] + ++ optionals (!enablePacrunner) [ "--disable-pacrunner" ] + ++ optionals (!enableNeard) [ "--disable-neard" ] + ++ optionals (!enableWispr) [ "--disable-wispr" ] + ++ optionals (!enableTools) [ "--disable-tools" ] + ++ optionals (!enableStats) [ "--disable-stats" ] + ++ optionals (!enableClient) [ "--disable-client" ] + ++ optionals (!enableDatafiles) [ "--disable-datafiles" ] + ++ optionals (enableOpenconnect) [ + "--enable-openconnect=builtin" + "--with-openconnect=${openconnect}/sbin/openconnect" + ] + ++ optionals (enableOpenvpn) [ + "--enable-openvpn=builtin" + "--with-openvpn=${openvpn}/sbin/openvpn" + ] + ++ optionals (enableVpnc) [ + "--enable-vpnc=builtin" + "--with-vpnc=${vpnc}/sbin/vpnc" + ] + ++ optionals (enablePolkit) [ + "--enable-polkit" + ] + ++ optionals (enablePptp) [ + "--enable-pptp" + "--with-pptp=${pptp}/sbin/pptp" + ] + ++ optionals (!enableWireguard) [ + "--disable-wireguard" + ] + ++ optionals (enableNetworkManager) [ + "--enable-nmcompat" + ] + ++ optionals (enableHh2serialGps) [ + "--enable-hh2serial-gps" + ] + ++ optionals (enableL2tp) [ + "--enable-l2tp" + ] + ++ optionals (enableIospm) [ + "--enable-iospm" + ] + ++ optionals (enableTist) [ + "--enable-tist" + ] + ; + + doCheck = true; + + meta = with stdenv.lib; { + description = "A daemon for managing internet connections"; + homepage = "https://01.org/connman"; + maintainers = [ maintainers.matejc ]; + platforms = platforms.linux; + license = licenses.gpl2; + }; +} diff --git a/pkgs/tools/networking/connman/default.nix b/pkgs/tools/networking/connman/default.nix index e58b8362f951..ccceaa30b043 100644 --- a/pkgs/tools/networking/connman/default.nix +++ b/pkgs/tools/networking/connman/default.nix @@ -1,61 +1,40 @@ -{ stdenv, fetchurl, pkgconfig, openconnect, file, gawk, - openvpn, vpnc, glib, dbus, iptables, gnutls, polkit, - wpa_supplicant, readline6, pptp, ppp }: +{ callPackage }: -stdenv.mkDerivation rec { - pname = "connman"; - version = "1.37"; - src = fetchurl { - url = "mirror://kernel/linux/network/connman/${pname}-${version}.tar.xz"; - sha256 = "05kfjiqhqfmbbwc4snnyvi5hc4zxanac62f6gcwaf5mvn0z9pqkc"; +{ + # All the defaults + connman = callPackage ./connman.nix { }; + + connmanFull = callPackage ./connman.nix { + # TODO: Why is this in `connmanFull` and not the default build? See TODO in + # nixos/modules/services/networking/connman.nix (near the assertions) + enableNetworkManager = true; + enableHh2serialGps = true; + enableL2tp = true; + enableIospm = true; + enableTist = true; }; - buildInputs = [ openconnect polkit - openvpn vpnc glib dbus iptables gnutls - wpa_supplicant readline6 pptp ppp ]; - - nativeBuildInputs = [ pkgconfig file gawk ]; - - preConfigure = '' - export WPASUPPLICANT=${wpa_supplicant}/sbin/wpa_supplicant - export PPPD=${ppp}/sbin/pppd - export AWK=${gawk}/bin/gawk - sed -i "s/\/usr\/bin\/file/file/g" ./configure - ''; - - configureFlags = [ - "--sysconfdir=\${out}/etc" - "--localstatedir=/var" - "--with-dbusconfdir=${placeholder "out"}/share" - "--with-dbusdatadir=${placeholder "out"}/share" - "--disable-maintainer-mode" - "--enable-openconnect=builtin" - "--with-openconnect=${openconnect}/sbin/openconnect" - "--enable-openvpn=builtin" - "--with-openvpn=${openvpn}/sbin/openvpn" - "--enable-vpnc=builtin" - "--with-vpnc=${vpnc}/sbin/vpnc" - "--enable-session-policy-local=builtin" - "--enable-client" - "--enable-bluetooth" - "--enable-wifi" - "--enable-polkit" - "--enable-tools" - "--enable-datafiles" - "--enable-pptp" - "--with-pptp=${pptp}/sbin/pptp" - "--enable-iwd" - ]; - - postInstall = '' - cp ./client/connmanctl $out/sbin/connmanctl - ''; - - meta = with stdenv.lib; { - description = "A daemon for managing internet connections"; - homepage = https://01.org/connman; - maintainers = [ maintainers.matejc ]; - platforms = platforms.linux; - license = licenses.gpl2; + connmanMinimal = callPackage ./connman.nix { + enableOpenconnect = false; + enableOpenvpn = false; + enableVpnc = false; + vpnc = false; + enablePolkit = false; + enablePptp = false; + enableLoopback = false; + # enableEthernet = false; # If disabled no ethernet connection can be performed + enableWireguard = false; + enableGadget = false; + # enableWifi = false; # If disabled no WiFi connection can be performed + enableBluetooth = false; + enableOfono = false; + enableDundee = false; + enablePacrunner = false; + enableNeard = false; + enableWispr = false; + enableTools = false; + enableStats = false; + enableClient = false; + # enableDatafiles = false; # If disabled, configuration and data files are not installed }; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index e6e44e98f944..71178b53a768 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2499,7 +2499,11 @@ in conspy = callPackage ../os-specific/linux/conspy {}; - connman = callPackage ../tools/networking/connman { }; + inherit (callPackage ../tools/networking/connman {}) + connman + connmanFull + connmanMinimal + ; connman-gtk = callPackage ../tools/networking/connman/connman-gtk { };