about summary refs log tree commit diff stats
path: root/modules/by-name/ne/networking/module.nix
blob: 8448e9b30216d983f49da3834c4afd908d9c94fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{
  config,
  lib,
  ...
}: let
  cfg = config.soispha.networking;
in {
  options.soispha.networking = {
    enable = lib.mkEnableOption "networking";

    mode = lib.mkOption {
      type = lib.types.enum ["NetworkManager" "systemd-networkd"];
      example = "systemd-networkd";
      description = "The daemon used to setup networking.";
    };

    userName = lib.mkOption {
      type = lib.types.str;
      default = "soispha";
      description = ''
        The name of the user to allow access to the configured network
      '';
    };

    hostName = lib.mkOption {
      type = lib.types.str;
      example = "apzu";
      description = "The name of the host";
    };
  };

  config =
    lib.mkIf cfg.enable
    (lib.modules.mkMerge [
      {
        networking.hostName = cfg.hostName;
      }
      (lib.mkIf (cfg.mode == "systemd-networkd") {
        systemd.network = {
          networks = {
            "tap0" = {
              name = "tap0";
              bridge = [
                "virbr0"
              ];
            };
            "enp4s0" = {
              name = "enp4s0";
              networkConfig = {
                DHCP = "yes";
                DNSOverTLS = "yes";
                DNSSEC = "yes";
              };
              bridge = [
                "virbr0"
              ];
            };
          };

          netdevs = {
            "tap0" = {
              netdevConfig = {
                Name = "tap0";
                Kind = "tap";
              };
              tapConfig = {
                User = config.users.users."${cfg.userName}".uid;
                Group = "libvirtd";
              };
            };
            "virbr0" = {
              netdevConfig = {
                Name = "br0";
                Kind = "bridge";
              };
            };
          };
        };
      })

      (lib.mkIf (cfg.mode == "NetworkManager") {
        networking.networkmanager = {
          enable = true;
          dns = "default";
          wifi = {
            powersave = true;
          };
        };

        soispha.impermanence.directories = [
          "/etc/NetworkManager"
        ];

        users.users."${cfg.userName}".extraGroups = [
          "networkmanager" # allows to configure NetworkManager as this user
        ];
      })
    ]);
}