summaryrefslogtreecommitdiffstats
path: root/krebs/3modules/iana-etc.nix
blob: 3195f71d9f9bec6e80a87027ccf41524b20ecb67 (plain)
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
{ config, pkgs, lib, ... }:
with lib; {

  options.krebs.iana-etc.services = mkOption {
    default = {};
    type = types.attrsOf (types.submodule ({ config, ... }: {
      options = {
        port = mkOption {
          default = config._module.args.name;
          type = types.addCheck types.str (test "[1-9][0-9]*");
        };
      } // genAttrs ["tcp" "udp"] (protocol: mkOption {
        default = null;
        type = types.nullOr (types.submodule {
          options = {
            name = mkOption {
              type = types.str;
            };
          };
        });
      });
    }));
  };

  config.environment.etc = mkIf (config.krebs.iana-etc.services != {})  {
    services.source = mkForce (pkgs.runCommand "krebs-iana-etc" {} /* sh */ ''
      {
        ${concatMapStringsSep "\n" (entry: /* sh */ ''
          ${concatMapStringsSep "\n"
            (proto: let
              line = "${entry.${proto}.name} ${entry.port}/${proto}";
            in /* sh */ ''
              echo ${shell.escape line}
            '')
            (filter (proto: entry.${proto} != null) ["tcp" "udp"])}
          '') (attrValues config.krebs.iana-etc.services)}
        cat ${pkgs.iana-etc}/etc/services
      } |
      sort -b -k 2,2 -u > $out
    '');
  };

}