python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / networking / strongswan.nix
blob8b1398bfd47d4fb00afaa05afd34ba26085b2fcb
1 { config, lib, pkgs, ... }:
3 let
5   inherit (builtins) toFile;
6   inherit (lib) concatMapStringsSep concatStringsSep mapAttrsToList
7                 mkIf mkEnableOption mkOption types literalExpression;
9   cfg = config.services.strongswan;
11   ipsecSecrets = secrets: toFile "ipsec.secrets" (
12     concatMapStringsSep "\n" (f: "include ${f}") secrets
13   );
15   ipsecConf = {setup, connections, ca}:
16     let
17       # https://wiki.strongswan.org/projects/strongswan/wiki/IpsecConf
18       makeSections = type: sections: concatStringsSep "\n\n" (
19         mapAttrsToList (sec: attrs:
20           "${type} ${sec}\n" +
21             (concatStringsSep "\n" ( mapAttrsToList (k: v: "  ${k}=${v}") attrs ))
22         ) sections
23       );
24       setupConf       = makeSections "config" { inherit setup; };
25       connectionsConf = makeSections "conn" connections;
26       caConf          = makeSections "ca" ca;
28     in
29     builtins.toFile "ipsec.conf" ''
30       ${setupConf}
31       ${connectionsConf}
32       ${caConf}
33     '';
35   strongswanConf = {setup, connections, ca, secretsFile, managePlugins, enabledPlugins}: toFile "strongswan.conf" ''
36     charon {
37       ${if managePlugins then "load_modular = no" else ""}
38       ${if managePlugins then ("load = " + (concatStringsSep " " enabledPlugins)) else ""}
39       plugins {
40         stroke {
41           secrets_file = ${secretsFile}
42         }
43       }
44     }
46     starter {
47       config_file = ${ipsecConf { inherit setup connections ca; }}
48     }
49   '';
53   options.services.strongswan = {
54     enable = mkEnableOption (lib.mdDoc "strongSwan");
56     secrets = mkOption {
57       type = types.listOf types.str;
58       default = [];
59       example = [ "/run/keys/ipsec-foo.secret" ];
60       description = lib.mdDoc ''
61         A list of paths to IPSec secret files. These
62         files will be included into the main ipsec.secrets file with
63         the `include` directive. It is safer if these
64         paths are absolute.
65       '';
66     };
68     setup = mkOption {
69       type = types.attrsOf types.str;
70       default = {};
71       example = { cachecrls = "yes"; strictcrlpolicy = "yes"; };
72       description = lib.mdDoc ''
73         A set of options for the ‘config setup’ section of the
74         {file}`ipsec.conf` file. Defines general
75         configuration parameters.
76       '';
77     };
79     connections = mkOption {
80       type = types.attrsOf (types.attrsOf types.str);
81       default = {};
82       example = literalExpression ''
83         {
84           "%default" = {
85             keyexchange = "ikev2";
86             keyingtries = "1";
87           };
88           roadwarrior = {
89             auto       = "add";
90             leftcert   = "/run/keys/moonCert.pem";
91             leftid     = "@moon.strongswan.org";
92             leftsubnet = "10.1.0.0/16";
93             right      = "%any";
94           };
95         }
96       '';
97       description = lib.mdDoc ''
98         A set of connections and their options for the ‘conn xxx’
99         sections of the {file}`ipsec.conf` file.
100       '';
101     };
103     ca = mkOption {
104       type = types.attrsOf (types.attrsOf types.str);
105       default = {};
106       example = {
107         strongswan = {
108           auto   = "add";
109           cacert = "/run/keys/strongswanCert.pem";
110           crluri = "http://crl2.strongswan.org/strongswan.crl";
111         };
112       };
113       description = lib.mdDoc ''
114         A set of CAs (certification authorities) and their options for
115         the ‘ca xxx’ sections of the {file}`ipsec.conf`
116         file.
117       '';
118     };
120     managePlugins = mkOption {
121       type = types.bool;
122       default = false;
123       description = lib.mdDoc ''
124         If set to true, this option will disable automatic plugin loading and
125         then tell strongSwan to enable the plugins specified in the
126         {option}`enabledPlugins` option.
127       '';
128     };
130     enabledPlugins = mkOption {
131       type = types.listOf types.str;
132       default = [];
133       description = lib.mdDoc ''
134         A list of additional plugins to enable if
135         {option}`managePlugins` is true.
136       '';
137     };
138   };
141   config = with cfg;
142   let
143     secretsFile = ipsecSecrets cfg.secrets;
144   in
145   mkIf enable
146     {
148     # here we should use the default strongswan ipsec.secrets and
149     # append to it (default one is empty so not a pb for now)
150     environment.etc."ipsec.secrets".source = secretsFile;
152     systemd.services.strongswan = {
153       description = "strongSwan IPSec Service";
154       wantedBy = [ "multi-user.target" ];
155       path = with pkgs; [ kmod iproute2 iptables util-linux ]; # XXX Linux
156       after = [ "network-online.target" ];
157       environment = {
158         STRONGSWAN_CONF = strongswanConf { inherit setup connections ca secretsFile managePlugins enabledPlugins; };
159       };
160       serviceConfig = {
161         ExecStart  = "${pkgs.strongswan}/sbin/ipsec start --nofork";
162       };
163       preStart = ''
164         # with 'nopeerdns' setting, ppp writes into this folder
165         mkdir -m 700 -p /etc/ppp
166       '';
167     };
168   };