diff --git a/flake.nix b/flake.nix index d3022ad..ed1eec0 100644 --- a/flake.nix +++ b/flake.nix @@ -25,7 +25,7 @@ ... }: { - nixosModules.extra-modules = import ./modules nixpkgs; + nixosModules.extra-modules = import ./modules; nixosModules.default = self.nixosModules.extra-modules; } // flake-utils.lib.eachDefaultSystem (system: rec { diff --git a/modules/default.nix b/modules/default.nix index 0967ef4..0b4b850 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -1 +1,5 @@ -{} +{ + imports = [ + ./interface-naming.nix + ]; +} diff --git a/modules/interface-naming.nix b/modules/interface-naming.nix new file mode 100644 index 0000000..64ca85b --- /dev/null +++ b/modules/interface-naming.nix @@ -0,0 +1,50 @@ +# Provides an option to easily rename interfaces by their mac addresses. +{ + config, + lib, + pkgs, + ... +}: let + inherit + (lib) + attrValues + concatStringsSep + duplicates + flip + mapAttrsToList + mkOption + types + ; + + cfg = config.networking.renameInterfacesByMac; + + interfaceNamesUdevRules = pkgs.writeTextFile { + name = "interface-names-udev-rules"; + text = concatStringsSep "\n" ( + flip mapAttrsToList cfg + (name: mac: ''SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="${mac}", NAME:="${name}"'') + ); + destination = "/etc/udev/rules.d/01-interface-names.rules"; + }; +in { + options.networking.renameInterfacesByMac = mkOption { + default = {}; + example = {lan = "11:22:33:44:55:66";}; + description = "Allows naming of network interfaces based on their physical address"; + type = types.attrsOf types.str; + }; + + config = lib.mkIf (cfg != {}) { + assertions = let + duplicateMacs = duplicates (attrValues cfg); + in [ + { + assertion = duplicateMacs == []; + message = "Duplicate mac addresses found in network interface name assignment: ${concatStringsSep ", " duplicateMacs}"; + } + ]; + + services.udev.packages = [interfaceNamesUdevRules]; + boot.initrd.services.udev.packages = [interfaceNamesUdevRules]; + }; +}