From 15641360ca6402c934a2aa2ae1fe9ec012e0491e Mon Sep 17 00:00:00 2001 From: Qyriad Date: Wed, 11 Feb 2026 13:19:59 +0100 Subject: [PATCH] make dynamicism/default.nix a stub for dynamicism.nix --- modules/dynamicism/default.nix | 144 +---------------------------- modules/dynamicism/dynamicism.nix | 145 ++++++++++++++++++++++++++++++ modules/dynamicism/gotosocial.nix | 2 - 3 files changed, 147 insertions(+), 144 deletions(-) create mode 100644 modules/dynamicism/dynamicism.nix diff --git a/modules/dynamicism/default.nix b/modules/dynamicism/default.nix index 5e2b4e7..1fca96c 100644 --- a/modules/dynamicism/default.nix +++ b/modules/dynamicism/default.nix @@ -1,145 +1,5 @@ -{ pkgs, lib, config, options, ... }: -let - inherit (lib.options) - mkOption - showOption - ; - inherit (lib.asserts) - checkAssertWarn - ; - t = lib.types; +{ ... }: - inherit (import ./lib.nix { inherit lib; }) - typeCheck - convenientAttrPath - concatFoldl - recUpdateFoldl - recUpdateFoldlAttrs - ; - - evalNixos = import (pkgs.path + "/nixos"); - - opts = options.dynamicism; - - subOpts = lib.mapAttrs (_: metaAttr: metaAttr.configuration.options) options.dynamicism.for.valueMeta.attrs; - - finalSettingsFor = { ... }@submod: recUpdateFoldl (optPath: - lib.setAttrByPath optPath (lib.getAttrFromPath optPath config) - ) submod.source-options; - - ourAssertions = lib.concatAttrValues { - unitsExist = subOpts - |> lib.attrValues - |> concatFoldl (submod: submod.systemd-services-updated.value - |> lib.map (unit: { - assertion = config.systemd.units.${unit}.enable or false; - message = '' - ${showOption submod.systemd-services-updated.loc}' specified non-existent unit '${unit}' - ''; - }) - |> lib.optionals submod.enable.value - ); - - optsExist = concatFoldl (submod: lib.optionals submod.enable.value (lib.map (optPath: { - assertion = lib.hasAttrByPath optPath options; - message = "'${showOption submod.source-options.loc}' specified non-existent option '${showOption optPath}'"; - }) submod.source-options.value)) (lib.attrValues subOpts); - }; -in { - # - # Interface. - # - options.dynamicism = { - for = mkOption { - type = t.attrsOf (t.submoduleWith { - modules = [ ./submodule.nix ]; - shorthandOnlyDefinesConfig = false; - specialArgs = { inherit pkgs; }; - }); - default = { }; - }; - - finalSettings = mkOption { - type = t.attrsOf t.raw; - internal = true; - readOnly = true; - description = '' - Attrset of each `source-options` tree to their actual values. - ''; - }; - - doChange = mkOption { - type = t.functionTo t.pathInStore; - readOnly = true; - description = '' - The function to call to Do The Thing. - ''; - }; - }; - - # Assertions. - config.assertions = ourAssertions; - - # - # Generic implementation. - # - config.system.activationScripts."dynamicism-reset" = { - deps = [ "etc" "stdio" "specialfs" ]; - text = '' - echo "DYNIX: removing existing systemd dropins" - # FIXME: do for each enabled submodule - if [[ -d /run/systemd/system ]]; then - rm -v /run/systemd/system/*/dynix-*.conf || true - fi - ''; - }; - config.dynamicism = { - doChange = { - option, - value, - configuration ? builtins.getEnv "NIXOS_CONFIG", - }: let - loc = opts.doChange.loc ++ [ "(function argument)" "value" ]; - option' = typeCheck loc convenientAttrPath option; - nixosAfter = evalNixos { - configuration = { config, ... }: { - imports = [ - configuration - (lib.setAttrByPath option' (lib.mkOverride (-999) value)) - ]; - - environment.systemPackages = [ - config.dynamicism.for.gotosocial.activate - ]; - }; - }; - - allActivations = config.dynamicism.for - |> lib.filterAttrs (name: submod: submod.enable) - |> lib.mapAttrsToList (name: submod: submod.activate); - allActivationScripts = pkgs.writeShellApplication { - name = "dynamicism-activate"; - runtimeInputs = allActivations; - text = nixosAfter.config.dynamicism.for - |> lib.filterAttrs (name: submod: submod.enable) - |> lib.mapAttrsToList (name: submod: '' - echo "Activating dynamicism for ${name}" - ${lib.getExe submod.activate} - '') - |> lib.concatStringsSep "\n"; - }; - in allActivationScripts; - - finalSettings = config.dynamicism.for - |> recUpdateFoldlAttrs (name: { ... }@submod: finalSettingsFor submod) - |> checkAssertWarn ourAssertions [ ]; - }; - - # Implementations. - imports = [ - ./gotosocial.nix - ./harmonia.nix - #./tzupdate.nix - ]; + imports = [ ./dynamicism.nix ]; } diff --git a/modules/dynamicism/dynamicism.nix b/modules/dynamicism/dynamicism.nix new file mode 100644 index 0000000..5e2b4e7 --- /dev/null +++ b/modules/dynamicism/dynamicism.nix @@ -0,0 +1,145 @@ +{ pkgs, lib, config, options, ... }: +let + inherit (lib.options) + mkOption + showOption + ; + inherit (lib.asserts) + checkAssertWarn + ; + t = lib.types; + + inherit (import ./lib.nix { inherit lib; }) + typeCheck + convenientAttrPath + concatFoldl + recUpdateFoldl + recUpdateFoldlAttrs + ; + + evalNixos = import (pkgs.path + "/nixos"); + + opts = options.dynamicism; + + subOpts = lib.mapAttrs (_: metaAttr: metaAttr.configuration.options) options.dynamicism.for.valueMeta.attrs; + + finalSettingsFor = { ... }@submod: recUpdateFoldl (optPath: + lib.setAttrByPath optPath (lib.getAttrFromPath optPath config) + ) submod.source-options; + + ourAssertions = lib.concatAttrValues { + unitsExist = subOpts + |> lib.attrValues + |> concatFoldl (submod: submod.systemd-services-updated.value + |> lib.map (unit: { + assertion = config.systemd.units.${unit}.enable or false; + message = '' + ${showOption submod.systemd-services-updated.loc}' specified non-existent unit '${unit}' + ''; + }) + |> lib.optionals submod.enable.value + ); + + optsExist = concatFoldl (submod: lib.optionals submod.enable.value (lib.map (optPath: { + assertion = lib.hasAttrByPath optPath options; + message = "'${showOption submod.source-options.loc}' specified non-existent option '${showOption optPath}'"; + }) submod.source-options.value)) (lib.attrValues subOpts); + }; +in +{ + # + # Interface. + # + options.dynamicism = { + for = mkOption { + type = t.attrsOf (t.submoduleWith { + modules = [ ./submodule.nix ]; + shorthandOnlyDefinesConfig = false; + specialArgs = { inherit pkgs; }; + }); + default = { }; + }; + + finalSettings = mkOption { + type = t.attrsOf t.raw; + internal = true; + readOnly = true; + description = '' + Attrset of each `source-options` tree to their actual values. + ''; + }; + + doChange = mkOption { + type = t.functionTo t.pathInStore; + readOnly = true; + description = '' + The function to call to Do The Thing. + ''; + }; + }; + + # Assertions. + config.assertions = ourAssertions; + + # + # Generic implementation. + # + config.system.activationScripts."dynamicism-reset" = { + deps = [ "etc" "stdio" "specialfs" ]; + text = '' + echo "DYNIX: removing existing systemd dropins" + # FIXME: do for each enabled submodule + if [[ -d /run/systemd/system ]]; then + rm -v /run/systemd/system/*/dynix-*.conf || true + fi + ''; + }; + config.dynamicism = { + doChange = { + option, + value, + configuration ? builtins.getEnv "NIXOS_CONFIG", + }: let + loc = opts.doChange.loc ++ [ "(function argument)" "value" ]; + option' = typeCheck loc convenientAttrPath option; + nixosAfter = evalNixos { + configuration = { config, ... }: { + imports = [ + configuration + (lib.setAttrByPath option' (lib.mkOverride (-999) value)) + ]; + + environment.systemPackages = [ + config.dynamicism.for.gotosocial.activate + ]; + }; + }; + + allActivations = config.dynamicism.for + |> lib.filterAttrs (name: submod: submod.enable) + |> lib.mapAttrsToList (name: submod: submod.activate); + allActivationScripts = pkgs.writeShellApplication { + name = "dynamicism-activate"; + runtimeInputs = allActivations; + text = nixosAfter.config.dynamicism.for + |> lib.filterAttrs (name: submod: submod.enable) + |> lib.mapAttrsToList (name: submod: '' + echo "Activating dynamicism for ${name}" + ${lib.getExe submod.activate} + '') + |> lib.concatStringsSep "\n"; + }; + in allActivationScripts; + + finalSettings = config.dynamicism.for + |> recUpdateFoldlAttrs (name: { ... }@submod: finalSettingsFor submod) + |> checkAssertWarn ourAssertions [ ]; + }; + + # Implementations. + imports = [ + ./gotosocial.nix + ./harmonia.nix + #./tzupdate.nix + ]; +} diff --git a/modules/dynamicism/gotosocial.nix b/modules/dynamicism/gotosocial.nix index cbcff2b..f8b30a9 100644 --- a/modules/dynamicism/gotosocial.nix +++ b/modules/dynamicism/gotosocial.nix @@ -1,7 +1,5 @@ { pkgs, lib, config, ... }: let - cfg = config.dynamicism.for.gotosocial; - settingsFormat = pkgs.formats.yaml { }; configFile = settingsFormat.generate "gotosocial-override.yml" config.services.gotosocial.settings; in