From 073a8ae3b34ed85619dd22bba0d4fb6b6e8e14d1 Mon Sep 17 00:00:00 2001 From: oddlama Date: Fri, 22 Dec 2023 01:47:12 +0100 Subject: [PATCH] feat: add interface naming module --- flake.nix | 2 +- modules/default.nix | 6 ++++- modules/interface-naming.nix | 50 ++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 modules/interface-naming.nix 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]; + }; +}