vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / gvpe.nix
blob275146ada2d0f57b4803faea06973cab95e53159
1 # GNU Virtual Private Ethernet
3 {config, pkgs, lib, ...}:
5 let
6   inherit (lib) mkOption mkIf types;
8   cfg = config.services.gvpe;
10   finalConfig = if cfg.configFile != null then
11     cfg.configFile
12   else if cfg.configText != null then
13     pkgs.writeTextFile {
14       name = "gvpe.conf";
15       text = cfg.configText;
16     }
17   else
18     throw "You must either specify contents of the config file or the config file itself for GVPE";
20   ifupScript = if cfg.ipAddress == null || cfg.subnet == null then
21      throw "Specify IP address and subnet (with mask) for GVPE"
22    else if cfg.nodename == null then
23      throw "You must set node name for GVPE"
24    else
25    (pkgs.writeTextFile {
26     name = "gvpe-if-up";
27     text = ''
28       #! /bin/sh
30       export PATH=$PATH:${pkgs.iproute2}/sbin
32       ip link set dev $IFNAME up
33       ip address add ${cfg.ipAddress} dev $IFNAME
34       ip route add ${cfg.subnet} dev $IFNAME
36       ${cfg.customIFSetup}
37     '';
38     executable = true;
39   });
43   options = {
44     services.gvpe = {
45       enable = lib.mkEnableOption "gvpe";
47       nodename = mkOption {
48         default = null;
49         type = types.nullOr types.str;
50         description = ''
51           GVPE node name
52         '';
53       };
54       configText = mkOption {
55         default = null;
56         type = types.nullOr types.lines;
57         example = ''
58           tcp-port = 655
59           udp-port = 655
60           mtu = 1480
61           ifname = vpn0
63           node = alpha
64           hostname = alpha.example.org
65           connect = always
66           enable-udp = true
67           enable-tcp = true
68           on alpha if-up = if-up-0
69           on alpha pid-file = /var/gvpe/gvpe.pid
70         '';
71         description = ''
72           GVPE config contents
73         '';
74       };
75       configFile = mkOption {
76         default = null;
77         type = types.nullOr types.path;
78         example = "/root/my-gvpe-conf";
79         description = ''
80           GVPE config file, if already present
81         '';
82       };
83       ipAddress = mkOption {
84         default = null;
85         type = types.nullOr types.str;
86         description = ''
87           IP address to assign to GVPE interface
88         '';
89       };
90       subnet = mkOption {
91         default = null;
92         type = types.nullOr types.str;
93         example = "10.0.0.0/8";
94         description = ''
95           IP subnet assigned to GVPE network
96         '';
97       };
98       customIFSetup = mkOption {
99         default = "";
100         type = types.lines;
101         description = ''
102           Additional commands to apply in ifup script
103         '';
104       };
105     };
106   };
107   config = mkIf cfg.enable {
108     systemd.services.gvpe = {
109       description = "GNU Virtual Private Ethernet node";
110       after = [ "network.target" ];
111       wantedBy = [ "multi-user.target" ];
113       preStart = ''
114         mkdir -p /var/gvpe
115         mkdir -p /var/gvpe/pubkey
116         chown root /var/gvpe
117         chmod 700 /var/gvpe
118         cp ${finalConfig} /var/gvpe/gvpe.conf
119         cp ${ifupScript} /var/gvpe/if-up
120       '';
122       script = "${pkgs.gvpe}/sbin/gvpe -c /var/gvpe -D ${cfg.nodename} "
123         + " ${cfg.nodename}.pid-file=/var/gvpe/gvpe.pid"
124         + " ${cfg.nodename}.if-up=if-up"
125         + " &> /var/log/gvpe";
127       serviceConfig.Restart = "always";
128     };
129   };