oxipng: re-enable tests (#375349)
[NixPkgs.git] / nixos / modules / services / networking / connman.nix
bloba59a494f633734c7a8274b64631a5f1af3e7ad8c
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   cfg = config.services.connman;
10   configFile = pkgs.writeText "connman.conf" ''
11     [General]
12     NetworkInterfaceBlacklist=${lib.concatStringsSep "," cfg.networkInterfaceBlacklist}
14     ${cfg.extraConfig}
15   '';
16   enableIwd = cfg.wifi.backend == "iwd";
19   meta.maintainers = with lib.maintainers; [ ];
21   imports = [
22     (lib.mkRenamedOptionModule [ "networking" "connman" ] [ "services" "connman" ])
23   ];
25   ###### interface
27   options = {
28     services.connman = {
29       enable = lib.mkOption {
30         type = lib.types.bool;
31         default = false;
32         description = ''
33           Whether to use ConnMan for managing your network connections.
34         '';
35       };
37       package = lib.mkOption {
38         type = lib.types.package;
39         description = "The connman package / build flavor";
40         default = pkgs.connman;
41         defaultText = lib.literalExpression "pkgs.connman";
42         example = lib.literalExpression "pkgs.connmanFull";
43       };
45       enableVPN = lib.mkOption {
46         type = lib.types.bool;
47         default = true;
48         description = ''
49           Whether to enable ConnMan VPN service.
50         '';
51       };
53       extraConfig = lib.mkOption {
54         type = lib.types.lines;
55         default = "";
56         description = ''
57           Configuration lines appended to the generated connman configuration file.
58         '';
59       };
61       networkInterfaceBlacklist = lib.mkOption {
62         type = with lib.types; listOf str;
63         default = [
64           "vmnet"
65           "vboxnet"
66           "virbr"
67           "ifb"
68           "ve"
69         ];
70         description = ''
71           Default blacklisted interfaces, this includes NixOS containers interfaces (ve).
72         '';
73       };
75       wifi = {
76         backend = lib.mkOption {
77           type = lib.types.enum [
78             "wpa_supplicant"
79             "iwd"
80           ];
81           default = "wpa_supplicant";
82           description = ''
83             Specify the Wi-Fi backend used.
84             Currently supported are {option}`wpa_supplicant` or {option}`iwd`.
85           '';
86         };
87       };
89       extraFlags = lib.mkOption {
90         type = with lib.types; listOf str;
91         default = [ ];
92         example = [ "--nodnsproxy" ];
93         description = ''
94           Extra flags to pass to connmand
95         '';
96       };
97     };
98   };
100   ###### implementation
102   config = lib.mkIf cfg.enable {
103     assertions = [
104       {
105         assertion = !config.networking.useDHCP;
106         message = "You can not use services.connman with networking.useDHCP";
107       }
108       {
109         # TODO: connman seemingly can be used along network manager and
110         # connmanFull supports this - so this should be worked out somehow
111         assertion = !config.networking.networkmanager.enable;
112         message = "You can not use services.connman with networking.networkmanager";
113       }
114     ];
116     environment.systemPackages = [ cfg.package ];
118     systemd.services.connman = {
119       description = "Connection service";
120       wantedBy = [ "multi-user.target" ];
121       after = lib.optional enableIwd "iwd.service";
122       requires = lib.optional enableIwd "iwd.service";
123       serviceConfig = {
124         Type = "dbus";
125         BusName = "net.connman";
126         Restart = "on-failure";
127         ExecStart = toString (
128           [
129             "${cfg.package}/sbin/connmand"
130             "--config=${configFile}"
131             "--nodaemon"
132           ]
133           ++ lib.optional enableIwd "--wifi=iwd_agent"
134           ++ cfg.extraFlags
135         );
136         StandardOutput = "null";
137       };
138     };
140     systemd.services.connman-vpn = lib.mkIf cfg.enableVPN {
141       description = "ConnMan VPN service";
142       wantedBy = [ "multi-user.target" ];
143       before = [ "connman.service" ];
144       serviceConfig = {
145         Type = "dbus";
146         BusName = "net.connman.vpn";
147         ExecStart = "${cfg.package}/sbin/connman-vpnd -n";
148         StandardOutput = "null";
149       };
150     };
152     systemd.services.net-connman-vpn = lib.mkIf cfg.enableVPN {
153       description = "D-BUS Service";
154       serviceConfig = {
155         Name = "net.connman.vpn";
156         before = [ "connman.service" ];
157         ExecStart = "${cfg.package}/sbin/connman-vpnd -n";
158         User = "root";
159         SystemdService = "connman-vpn.service";
160       };
161     };
163     networking = {
164       useDHCP = false;
165       wireless = {
166         enable = lib.mkIf (!enableIwd) true;
167         dbusControlled = true;
168         iwd = lib.mkIf enableIwd {
169           enable = true;
170         };
171       };
172       networkmanager.enable = false;
173     };
174   };