zfs_unstable: 2.3.0-rc3 -> 2.3.0-rc4 (#365045)
[NixPkgs.git] / nixos / modules / services / networking / pptpd.nix
bloba065709efe64d0201219e7e73d96bfcc64c793da
2   config,
3   pkgs,
4   lib,
5   ...
6 }:
8 with lib;
11   options = {
12     services.pptpd = {
13       enable = mkEnableOption "pptpd, the Point-to-Point Tunneling Protocol daemon";
15       serverIp = mkOption {
16         type = types.str;
17         description = "The server-side IP address.";
18         default = "10.124.124.1";
19       };
21       clientIpRange = mkOption {
22         type = types.str;
23         description = "The range from which client IPs are drawn.";
24         default = "10.124.124.2-11";
25       };
27       maxClients = mkOption {
28         type = types.int;
29         description = "The maximum number of simultaneous connections.";
30         default = 10;
31       };
33       extraPptpdOptions = mkOption {
34         type = types.lines;
35         description = "Adds extra lines to the pptpd configuration file.";
36         default = "";
37       };
39       extraPppdOptions = mkOption {
40         type = types.lines;
41         description = "Adds extra lines to the pppd options file.";
42         default = "";
43         example = ''
44           ms-dns 8.8.8.8
45           ms-dns 8.8.4.4
46         '';
47       };
48     };
49   };
51   config = mkIf config.services.pptpd.enable {
52     systemd.services.pptpd =
53       let
54         cfg = config.services.pptpd;
56         pptpd-conf = pkgs.writeText "pptpd.conf" ''
57           # Inspired from pptpd-1.4.0/samples/pptpd.conf
58           ppp ${ppp-pptpd-wrapped}/bin/pppd
59           option ${pppd-options}
60           pidfile /run/pptpd.pid
61           localip ${cfg.serverIp}
62           remoteip ${cfg.clientIpRange}
63           connections ${toString cfg.maxClients} # (Will get harmless warning if inconsistent with IP range)
65           # Extra
66           ${cfg.extraPptpdOptions}
67         '';
69         pppd-options = pkgs.writeText "ppp-options-pptpd.conf" ''
70           # From: cat pptpd-1.4.0/samples/options.pptpd | grep -v ^# | grep -v ^$
71           name pptpd
72           refuse-pap
73           refuse-chap
74           refuse-mschap
75           require-mschap-v2
76           require-mppe-128
77           proxyarp
78           lock
79           nobsdcomp
80           novj
81           novjccomp
82           nologfd
84           # Extra:
85           ${cfg.extraPppdOptions}
86         '';
88         ppp-pptpd-wrapped = pkgs.stdenv.mkDerivation {
89           name = "ppp-pptpd-wrapped";
90           phases = [ "installPhase" ];
91           nativeBuildInputs = with pkgs; [ makeWrapper ];
92           installPhase = ''
93             mkdir -p $out/bin
94             makeWrapper ${pkgs.ppp}/bin/pppd $out/bin/pppd \
95               --set LD_PRELOAD    "${pkgs.libredirect}/lib/libredirect.so" \
96               --set NIX_REDIRECTS "/etc/ppp=/etc/ppp-pptpd"
97           '';
98         };
99       in
100       {
101         description = "pptpd server";
103         requires = [ "network-online.target" ];
104         wantedBy = [ "multi-user.target" ];
106         preStart = ''
107           mkdir -p -m 700 /etc/ppp-pptpd
109           secrets="/etc/ppp-pptpd/chap-secrets"
111           [ -f "$secrets" ] || install -m 600 -o root -g root /dev/stdin "$secrets" << EOF
112           # From: pptpd-1.4.0/samples/chap-secrets
113           # Secrets for authentication using CHAP
114           # client      server  secret          IP addresses
115           #username     pptpd   password        *
116           EOF
117         '';
119         serviceConfig = {
120           ExecStart = "${pkgs.pptpd}/bin/pptpd --conf ${pptpd-conf}";
121           KillMode = "process";
122           Restart = "on-success";
123           Type = "forking";
124           PIDFile = "/run/pptpd.pid";
125         };
126       };
127   };