From 0c266bafdf819767e2b220f0eb8ea8802eadee09 Mon Sep 17 00:00:00 2001 From: David Arnold Date: Tue, 20 Jul 2021 18:24:39 -0500 Subject: [PATCH] ref: adapt to fup upstream refactoring --- checks/default.nix | 5 +- deprecated.nix | 113 ++++++++++++++++++++++++++++++++ examples/downstream | 2 +- flake.lock | 46 ++++++------- flake.nix | 108 +++++++++++++----------------- modules/boostrap-iso.nix | 78 ++++++++++++++++++++++ modules/default.nix | 1 + src/generators.nix | 11 ---- src/importers.nix | 55 +--------------- src/mkFlake/default.nix | 9 +-- src/mkFlake/fup-adapter.nix | 42 +++++++----- src/mkFlake/options.nix | 4 +- src/mkFlake/outputs-builder.nix | 6 +- src/modules.nix | 78 ---------------------- 14 files changed, 298 insertions(+), 260 deletions(-) create mode 100644 deprecated.nix create mode 100644 modules/boostrap-iso.nix diff --git a/checks/default.nix b/checks/default.nix index dc932b4..584d1d6 100644 --- a/checks/default.nix +++ b/checks/default.nix @@ -4,9 +4,8 @@ let nixpkgs = inputs.nixpkgs; - diggalib = inputs.lib; # digga internals - nixlib = inputs.nixlib; - lib = nixlib // diggalib; + digga = inputs.digga; + lib = nixpkgs.lib // digga.lib; pkgs = import nixpkgs { inherit system; config = { }; overlays = [ ]; }; in diff --git a/deprecated.nix b/deprecated.nix new file mode 100644 index 0000000..a3a1c2c --- /dev/null +++ b/deprecated.nix @@ -0,0 +1,113 @@ +{ lib, flake-utils-plus, internal-modules, importers, nixosModules }: +let + importers' = importers; +in +lib.warn '' + You are accessing a deprecated item of the digga lib. + Please update timely, it will be remove soon. +'' +rec { + + mkSuites = lib.warn '' + Deprecated Function: mkSuites. + '' + ( + { suites, profiles }: + let + profileSet = lib.genAttrs' profiles (path: { + name = baseNameOf path; + value = mkProfileAttrs (toString path); + }); + in + lib.mapAttrs (_: v: lib.profileMap v) (suites profileSet) + ) + ; + + mkProfileAttrs = lib.warn '' + Deprecated Function: mkProfileAttrs. + '' + ( + dir: + let + imports = + let + files = builtins.readDir dir; + + p = n: v: + v == "directory" + && n != "profiles"; + in + lib.filterAttrs p files; + + f = n: _: + lib.optionalAttrs + (lib.pathExists (dir + "/${n}/default.nix")) + { default = dir + "/${n}"; } + // mkProfileAttrs (dir + "/${n}"); + in + lib.mapAttrs f imports + ) + ; + + profileMap = + lib.warn '' + Deprecated Function: profileMap. + '' + ( + list: map (profile: profile.default) (lib.flatten list) + ) + ; + + + exporters = + lib.warn '' + Deprecated Attribute Set: lib.exporters. + + Please use export* functions instead: + lib.exporters.modulesFromList -> lib.exportModules + lib.exporters.fromOverlays -> lib.exportPackages + lib.exporters.internalOverlays -> lib.exportOverlays + '' + { + modulesFromList = flake-utils-plus.exportModules; + fromOverlays = flake-utils-plus.exportPackages; + internalOverlays = flake-utils-plus.exportOverlays; + } + ; + + modules = + lib.warn '' + Deprecated Attribute Set: lib.modules. + + Internal modules 'customBuilds', 'hmNixosDefaults' & 'globalDefaults' + will be completely removed from the api soon. + + Please use digga.nixosModules for exported modules or proto-modules: + lib.modules.isoConfig -> nixosModules.boostrapIso + '' + ( + internal-modules // { isoConfig = nixosModules.boostrapIso; } + ) + ; + + importers = + lib.warn '' + Deprecated Attribute Set: lib.importers. + + Please use import* functions instead: + lib.importers.overlays -> lib.importOverlays + lib.importers.modules -> lib.importModules + lib.importers.hosts -> lib.importHosts + lib.importers.rakeLeaves -> lib.rakeLeaves + lib.importers.flattenTree -> lib.flattenTree + '' + { + overlays = importers'.importOverlays; + modules = importers'.importModules; + hosts = importers'.importHosts; + rakeLeaves = importers'.rakeLeaves; + flattenTree = importers'.flattenTree; + } + ; + +} diff --git a/examples/downstream b/examples/downstream index 19e73bc..c673440 160000 --- a/examples/downstream +++ b/examples/downstream @@ -1 +1 @@ -Subproject commit 19e73bc63448740b4c89e993555b82eb13062924 +Subproject commit c673440504250bbca93d69c6f404c7024568b430 diff --git a/flake.lock b/flake.lock index 7dac686..69da7a8 100644 --- a/flake.lock +++ b/flake.lock @@ -86,6 +86,27 @@ "type": "github" } }, + "flake-utils-plus": { + "inputs": { + "flake-utils": [ + "flake-utils" + ] + }, + "locked": { + "lastModified": 1626825599, + "narHash": "sha256-hgjuzvLE+jlt9z6k5MDbc0Fod4k5frZGnN7zArrlpd4=", + "owner": "gytis-ivaskevicius", + "repo": "flake-utils-plus", + "rev": "ea46e02fb86785d3c883d658b194d69799386673", + "type": "github" + }, + "original": { + "owner": "gytis-ivaskevicius", + "ref": "staging", + "repo": "flake-utils-plus", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -173,34 +194,13 @@ "deploy": "deploy", "devshell": "devshell", "flake-utils": "flake-utils", + "flake-utils-plus": "flake-utils-plus", "home-manager": "home-manager", "nixlib": [ "nixpkgs" ], "nixos-generators": "nixos-generators", - "nixpkgs": "nixpkgs", - "utils": "utils" - } - }, - "utils": { - "inputs": { - "flake-utils": [ - "flake-utils" - ] - }, - "locked": { - "lastModified": 1626288344, - "narHash": "sha256-TioHDqWJkw37jjx4DVrH6LCzwrUfAqXbWl4rKR91fpA=", - "owner": "gytis-ivaskevicius", - "repo": "flake-utils-plus", - "rev": "5c6ee69f6957afc2fe22c094717d6d78516418b5", - "type": "github" - }, - "original": { - "owner": "gytis-ivaskevicius", - "ref": "staging", - "repo": "flake-utils-plus", - "type": "github" + "nixpkgs": "nixpkgs" } } }, diff --git a/flake.nix b/flake.nix index 15f76ef..a585efd 100644 --- a/flake.nix +++ b/flake.nix @@ -18,7 +18,7 @@ home-manager.inputs.nixpkgs.follows = "nixlib"; devshell.url = "github:numtide/devshell"; - utils.url = "github:gytis-ivaskevicius/flake-utils-plus/staging"; + flake-utils-plus.url = "github:gytis-ivaskevicius/flake-utils-plus/staging"; nixos-generators.url = "github:nix-community/nixos-generators"; nixos-generators.inputs.nixpkgs.follows = "blank"; @@ -29,7 +29,7 @@ # remove after https://github.com/NixOS/nix/pull/4641 # and uncomment the poper lines using "utils/flake-utils" above flake-utils.url = "github:numtide/flake-utils"; - utils.inputs.flake-utils.follows = "flake-utils"; + flake-utils-plus.inputs.flake-utils.follows = "flake-utils"; deploy.inputs.utils.follows = "flake-utils"; nixos-generators.inputs.utils.follows = "flake-utils"; # end ANTI CORRUPTION LAYER @@ -41,45 +41,34 @@ , nixpkgs , deploy , devshell - , utils + , flake-utils-plus , nixos-generators , home-manager , ... }@inputs: let - lib = nixlib.lib.makeExtensible (self: - let combinedLib = nixlib.lib // self; in - with self; - utils.lib // { - tests = import ./src/tests.nix { lib = combinedLib; }; + tests = import ./src/tests.nix { inherit (nixpkgs) lib; }; - modules = import ./src/modules.nix { - lib = combinedLib; - inherit nixos-generators; - }; + internal-modules = import ./src/modules.nix { + inherit (nixpkgs) lib; + inherit nixos-generators; + }; - importers = import ./src/importers.nix { - lib = combinedLib; - }; + importers = import ./src/importers.nix { + inherit (nixpkgs) lib; + }; - generators = import ./src/generators.nix { - lib = combinedLib; - inherit deploy; - }; + generators = import ./src/generators.nix { + inherit (nixpkgs) lib; + inherit deploy; + }; - mkFlake = import ./src/mkFlake { - inherit deploy devshell home-manager; - lib = combinedLib; - }; - - inherit (attrs) mapFilterAttrs genAttrs' concatAttrs; - inherit (lists) unifyOverlays; - inherit (strings) rgxToString; - inherit (importers) profileMap flattenTree rakeLeaves mkProfileAttrs maybeImportDevshellModule; - inherit (generators) mkSuites mkDeployNodes mkHomeConfigurations; - } - ); + mkFlake = import ./src/mkFlake { + inherit (nixpkgs) lib; + inherit (flake-utils-plus.inputs) flake-utils; + inherit deploy devshell home-manager flake-utils-plus internal-modules tests; + }; # Unofficial Flakes Roadmap - Polyfills # .. see: https://demo.hedgedoc.org/s/_W6Ve03GK# @@ -90,7 +79,7 @@ ufrContract = import ./ufr-polyfills/ufrContract.nix; # Dependency Groups - Style - checksInputs = { inherit nixpkgs lib; nixlib = nixlib.lib; }; + checksInputs = { inherit nixpkgs; digga = self; }; jobsInputs = { inherit nixpkgs; digga = self; }; devShellInputs = { inherit nixpkgs devshell; }; @@ -98,43 +87,36 @@ # .. it's adopted by a growing number of projects. # Please consider adopting it if you want to help to improve flakes. + # DEPRECATED - will be removed timely + deprecated = import ./deprecated.nix { + inherit (nixpkgs) lib; + inherit (self) nixosModules; + inherit flake-utils-plus internal-modules importers; + }; + in { # what you came for ... - lib = - let + lib = { + inherit (flake-utils-plus.inputs.flake-utils) defaultSystems eachSystem eachDefaultSystem filterPackages; + inherit (flake-utils-plus) exportModules exportOverlays exportPackages; + inherit mkFlake; + inherit (tests) mkTest; + inherit (importers) flattenTree rakeLeaves importOverlays importModules importHosts; + inherit (generators) mkDeployNodes mkHomeConfigurations; - fupLib = with utils.lib; { + # DEPRECATED - will be removed soon + inherit (deprecated) + mkSuites + profileMap + mkProfileAttrs + exporters + modules + importers + ; - inherit - systemFlake - exporters - ; - - }; - - diggaLib = with lib; { - - inherit - modules - importers - ; - - inherit (lib) - mkFlake - mkDeployNodes - mkHomeConfigurations - ; - - inherit (lib.tests) - mkTest - ; - - }; - - in - fupLib // diggaLib; + }; # a little extra service ... overlays = import ./overlays; diff --git a/modules/boostrap-iso.nix b/modules/boostrap-iso.nix new file mode 100644 index 0000000..af5c551 --- /dev/null +++ b/modules/boostrap-iso.nix @@ -0,0 +1,78 @@ +{ self, fullHostConfig }: +{ config, lib, modulesPath, suites, ... }@args: { + + imports = [ "${modulesPath}/installer/cd-dvd/installation-cd-minimal-new-kernel.nix" ]; + # avoid unwanted systemd service startups + disabledModules = + if (suites != null) + then + let + allProfiles = lib.foldl + (lhs: rhs: lhs ++ rhs) [ ] + (builtins.attrValues suites); + in + # we choose to satisfy the path contract of disabledModules + assert + lib.assertMsg + (builtins.all (p: lib.types.path.check p) allProfiles) + "all profiles used in suites must be paths"; + allProfiles + else + lib.warn '' + Any profiles that you have defined outside 'importables.suites' + will not be disabled on this ISO. That means services defined + there will unnessecarily launch on this installation medium. + '' [ ]; + + nix.registry = lib.mapAttrs (n: v: { flake = v; }) self.inputs; + + isoImage.isoBaseName = "nixos-" + config.networking.hostName; + isoImage.contents = [{ + source = self; + target = "/devos/"; + }]; + isoImage.storeContents = [ + self.devShell.${config.nixpkgs.system} + # include also closures that are "switched off" by the + # above profile filter on the local config attribute + fullHostConfig.system.build.toplevel + ]; + # still pull in tools of deactivated profiles + environment.systemPackages = fullHostConfig.environment.systemPackages; + + # confilcts with networking.wireless which might be slightly + # more useful on a stick + networking.networkmanager.enable = lib.mkForce false; + # confilcts with networking.wireless + networking.wireless.iwd.enable = lib.mkForce false; + + # Set up a link-local boostrap network + # See also: https://github.com/NixOS/nixpkgs/issues/75515#issuecomment-571661659 + networking.usePredictableInterfaceNames = lib.mkForce true; # so prefix matching works + networking.useNetworkd = lib.mkForce true; + networking.useDHCP = lib.mkForce false; + networking.dhcpcd.enable = lib.mkForce false; + systemd.network = { + # https://www.freedesktop.org/software/systemd/man/systemd.network.html + networks."boostrap-link-local" = { + matchConfig = { + Name = "en* wl* ww*"; + }; + networkConfig = { + Description = "Link-local host bootstrap network"; + MulticastDNS = true; + LinkLocalAddressing = "ipv6"; + DHCP = "yes"; + }; + address = [ + # fall back well-known link-local for situations where MulticastDNS is not available + "fe80::47" # 47: n=14 i=9 x=24; n+i+x + ]; + extraConfig = '' + # Unique, yet stable. Based off the MAC address. + IPv6LinkLocalAddressGenerationMode = "eui64" + ''; + }; + }; +} + diff --git a/modules/default.nix b/modules/default.nix index 1c77927..b869b1f 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -1,3 +1,4 @@ { nixConfig = import ./nix-config.nix; + bootstapIso = import ./boostrap-iso.nix; } diff --git a/src/generators.nix b/src/generators.nix index 5968507..a8dc04c 100644 --- a/src/generators.nix +++ b/src/generators.nix @@ -52,15 +52,4 @@ } extraConfig) hosts; - - # DEPRECATED, suites no longer needs an explicit function after the importables generalization - # deprecation message for suites is already in evalArgs - mkSuites = { suites, profiles }: - let - profileSet = lib.genAttrs' profiles (path: { - name = baseNameOf path; - value = lib.mkProfileAttrs (toString path); - }); - in - lib.mapAttrs (_: v: lib.profileMap v) (suites profileSet); } diff --git a/src/importers.nix b/src/importers.nix index e67fee1..c583a4d 100644 --- a/src/importers.nix +++ b/src/importers.nix @@ -113,60 +113,11 @@ let in lib.filterAttrs (n: v: v != { }) (lib.mapAttrs' collect files); - # DEPRECATED, prefer rakeLeaves - mkProfileAttrs = - /** - Synopsis: mkProfileAttrs _path_ - Recursively collect the subdirs of _path_ containing a default.nix into attrs. - This sets a contract, eliminating ambiguity for _default.nix_ living under the - profile directory. - Example: - let profiles = mkProfileAttrs ./profiles; in - assert profiles ? core.default; 0 - **/ - dir: - let - imports = - let - files = builtins.readDir dir; - - p = n: v: - v == "directory" - && n != "profiles"; - in - lib.filterAttrs p files; - - f = n: _: - lib.optionalAttrs - (lib.pathExists (dir + "/${n}/default.nix")) - { default = dir + "/${n}"; } - // mkProfileAttrs (dir + "/${n}"); - in - lib.mapAttrs f imports; - in { inherit rakeLeaves flattenTree; - mkProfileAttrs = builtins.trace '' - The function, mkProfileAttrs, has been deprecated, you can now create profile sets - with the standard importer, rakeLeaves. The formmat of rakeLeaves is a little different, - because it doesn't recurse into directories with `default.nix` files in them. So some - of your sub-profiles might no longer be collected. Make sure to update your profiles - with that in mind; - See https://github.com/divnix/digga/pull/29 for more details - '' - mkProfileAttrs; - - # DEPRECATED, both versions of `profileMap` are no longer necessary - # paths are type-checked for suites in evalArgs - # and `.default` isn't special with `rakeLeaves` - /** profileMap = list: map - (p: getProfilePath (throw "passed profile ${builtins.toJSON p} isn't a path") p) - (lib.flatten list); **/ - profileMap = list: map (profile: profile.default) (lib.flatten list); - - overlays = dir: + importOverlays = dir: { # Meant to output a module that sets the overlays option # overlays order matters. mkAfter ensures those in-house @@ -175,13 +126,13 @@ in overlays = lib.mkAfter (builtins.attrValues (flattenTree (rakeLeaves dir))); }; - modules = dir: + importModules = dir: { # Meant to output a module that sets the modules option modules = builtins.attrValues (flattenTree (rakeLeaves dir)); }; - hosts = dir: + importHosts = dir: { # Meant to output a module that sets the hosts option (including constructed host names) hosts = lib.mapAttrs diff --git a/src/mkFlake/default.nix b/src/mkFlake/default.nix index 0b954ee..889b4ea 100644 --- a/src/mkFlake/default.nix +++ b/src/mkFlake/default.nix @@ -1,4 +1,4 @@ -{ lib, deploy, devshell, home-manager } @ injectedDeps: +{ lib, deploy, devshell, home-manager, flake-utils-plus, flake-utils, internal-modules, tests } @ injectedDeps: { self, inputs, ... } @ args: let @@ -9,12 +9,7 @@ let fupAdapter' = import ./fup-adapter.nix injectedDeps'; defaultOutputsBuilder' = import ./outputs-builder.nix injectedDeps'; - evaled = lib.evalModules { - modules = [ - args - options' - ]; - }; + evaled = lib.evalModules { modules = [ args options' ]; }; defaultOutputsBuilder = defaultOutputsBuilder' evaled.config; diff --git a/src/mkFlake/fup-adapter.nix b/src/mkFlake/fup-adapter.nix index f45a4d0..973534a 100644 --- a/src/mkFlake/fup-adapter.nix +++ b/src/mkFlake/fup-adapter.nix @@ -1,5 +1,5 @@ # constructor dependencies -{ lib, ... }: +{ lib, flake-utils-plus, internal-modules, ... }: { # evaluated digga configuration @@ -23,11 +23,11 @@ let ]; defaultHostModules = [ - (lib.modules.hmNixosDefaults { + (internal-modules.hmNixosDefaults { specialArgs = config.home.importables; modules = config.home.modules ++ config.home.externalModules; }) - (lib.modules.globalDefaults { + (internal-modules.globalDefaults { self = config.self; hmUsers = config.home.users; }) @@ -40,7 +40,7 @@ let '' { }); }) - lib.modules.customBuilds + internal-modules.customBuilds ]; unifyOverlays = channels: map (o: if builtins.isFunction (o null null) then o channels else o); @@ -57,10 +57,12 @@ let "externalModules" ]; -in -lib.systemFlake (lib.mergeAny - { - inherit (config) self inputs channelsConfig supportedSystems; + diggaFupArgs = { + inherit (config) + self + inputs + channelsConfig + supportedSystems; inherit sharedOverlays; hosts = builtins.mapAttrs (_: stripHost) config.nixos.hosts; @@ -74,18 +76,18 @@ lib.systemFlake (lib.mergeAny ) config.channels; - hostDefaults = lib.mergeAny (stripHost config.nixos.hostDefaults) { + hostDefaults = flake-utils-plus.lib.mergeAny (stripHost config.nixos.hostDefaults) { specialArgs = config.nixos.importables; modules = config.nixos.hostDefaults.externalModules ++ defaultHostModules; }; - nixosModules = lib.exporters.modulesFromList config.nixos.hostDefaults.modules; + nixosModules = flake-utils-plus.lib.exportModules config.nixos.hostDefaults.modules; - homeModules = lib.exporters.modulesFromList config.home.modules; + homeModules = flake-utils-plus.lib.exportModules config.home.modules; - devshellModules = lib.exporters.modulesFromList config.devshell.modules; + devshellModules = flake-utils-plus.lib.exportModules config.devshell.modules; - overlays = lib.exporters.internalOverlays { + overlays = flake-utils-plus.lib.exporters.internalOverlays { # since we can't detect overlays owned by self # we have to filter out ones exported by the inputs # optimally we would want a solution for NixOS/nix#4740 @@ -94,8 +96,14 @@ lib.systemFlake (lib.mergeAny }; outputsBuilder = channels: - lib.mergeAny (defaultOutputsBuilder channels) (config.outputsBuilder channels); + flake-utils-plus.lib.mergeAny (defaultOutputsBuilder channels) (config.outputsBuilder channels); - } - extraArgs # for overlays list order -) + }; + +in +flake-utils-plus.lib.mkFlake + ( + flake-utils-plus.lib.mergeAny + diggaFupArgs + extraArgs # for overlays list order + ) diff --git a/src/mkFlake/options.nix b/src/mkFlake/options.nix index 096501e..60072e9 100644 --- a/src/mkFlake/options.nix +++ b/src/mkFlake/options.nix @@ -1,5 +1,5 @@ # constructor dependencies -{ lib, devshell, self, inputs, ... }: +{ lib, devshell, flake-utils, self, inputs, ... }: with lib; @@ -370,7 +370,7 @@ in }; supportedSystems = mkOption { type = listOf str; - default = lib.defaultSystems; + default = flake-utils.lib.defaultSystems; description = '' The systems supported by this flake ''; diff --git a/src/mkFlake/outputs-builder.nix b/src/mkFlake/outputs-builder.nix index f7aa042..1ace4bc 100644 --- a/src/mkFlake/outputs-builder.nix +++ b/src/mkFlake/outputs-builder.nix @@ -1,5 +1,5 @@ # constructor dependencies -{ lib, deploy, devshell, home-manager, ... }: +{ lib, deploy, devshell, home-manager, flake-utils-plus, tests, ... }: config: channels: let @@ -47,7 +47,7 @@ in inherit homeConfigurationsPortable; - packages = lib.exporters.fromOverlays config.self.overlays channels; + packages = flake-utils-plus.lib.exportPackages config.self.overlays channels; devShell = (import devshell { inherit system pkgs; }).mkShell { name = lib.mkDefault config.nixos.hostDefaults.channelName; @@ -115,7 +115,7 @@ in createProfilesTestOp = n: host: { name = "allProfilesTestFor-${n}"; - value = lib.tests.profilesTest { + value = tests.profilesTest { inherit host pkgs; }; }; diff --git a/src/modules.nix b/src/modules.nix index ef1b518..25236e6 100644 --- a/src/modules.nix +++ b/src/modules.nix @@ -60,83 +60,5 @@ system.configurationRevision = lib.mkIf (self ? rev) self.rev; }; - - isoConfig = { self, fullHostConfig }: - { config, modulesPath, suites, ... }@args: { - - imports = [ "${modulesPath}/installer/cd-dvd/installation-cd-minimal-new-kernel.nix" ]; - # avoid unwanted systemd service startups - disabledModules = - if (suites != null) - then - let - allProfiles = lib.foldl - (lhs: rhs: lhs ++ rhs) [ ] - (builtins.attrValues suites); - in - # we choose to satisfy the path contract of disabledModules - assert - lib.assertMsg - (builtins.all (p: lib.types.path.check p) allProfiles) - "all profiles used in suites must be paths"; - allProfiles - else - lib.warn '' - Any profiles that you have defined outside 'importables.suites' - will not be disabled on this ISO. That means services defined - there will unnessecarily launch on this installation medium. - '' [ ]; - - nix.registry = lib.mapAttrs (n: v: { flake = v; }) self.inputs; - - isoImage.isoBaseName = "nixos-" + config.networking.hostName; - isoImage.contents = [{ - source = self; - target = "/devos/"; - }]; - isoImage.storeContents = [ - self.devShell.${config.nixpkgs.system} - # include also closures that are "switched off" by the - # above profile filter on the local config attribute - fullHostConfig.system.build.toplevel - ]; - # still pull in tools of deactivated profiles - environment.systemPackages = fullHostConfig.environment.systemPackages; - - # confilcts with networking.wireless which might be slightly - # more useful on a stick - networking.networkmanager.enable = lib.mkForce false; - # confilcts with networking.wireless - networking.wireless.iwd.enable = lib.mkForce false; - - # Set up a link-local boostrap network - # See also: https://github.com/NixOS/nixpkgs/issues/75515#issuecomment-571661659 - networking.usePredictableInterfaceNames = lib.mkForce true; # so prefix matching works - networking.useNetworkd = lib.mkForce true; - networking.useDHCP = lib.mkForce false; - networking.dhcpcd.enable = lib.mkForce false; - systemd.network = { - # https://www.freedesktop.org/software/systemd/man/systemd.network.html - networks."boostrap-link-local" = { - matchConfig = { - Name = "en* wl* ww*"; - }; - networkConfig = { - Description = "Link-local host bootstrap network"; - MulticastDNS = true; - LinkLocalAddressing = "ipv6"; - DHCP = "yes"; - }; - address = [ - # fall back well-known link-local for situations where MulticastDNS is not available - "fe80::47" # 47: n=14 i=9 x=24; n+i+x - ]; - extraConfig = '' - # Unique, yet stable. Based off the MAC address. - IPv6LinkLocalAddressGenerationMode = "eui64" - ''; - }; - }; - }; }