with import ; { config, pkgs, ... }: { 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" {} '' exec < ${pkgs.iana_etc}/etc/services exec > $out awk -F '[ /]+' ' BEGIN { port=0 } ${concatMapStringsSep "\n" (entry: '' $2 == ${entry.port} { port=$2 next } port == ${entry.port} { ${concatMapStringsSep "\n" (proto: let s = "${entry.${proto}.name} ${entry.port}/${proto}"; in "print ${toJSON s}") (filter (proto: entry.${proto} != null) ["tcp" "udp"])} port=0 } '') (attrValues config.krebs.iana-etc.services)} { print $0 } ' ''); }; }