Compare commits
2 commits
main
...
nonapode/f
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a3edc7ff0 | |||
| db07347757 |
19 changed files with 363 additions and 172 deletions
|
|
@ -1,3 +1,6 @@
|
|||
{ ... }@flake: { ... }@inputs: { ... }@imports: {
|
||||
{ ... }@flake:
|
||||
{ ... }@inputs:
|
||||
{ ... }@imports:
|
||||
{
|
||||
imports = builtins.attrValues (flake.hmModules or { });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
flake: { ... }@inputs: { ... }@imports: let
|
||||
flake:
|
||||
{ ... }@inputs:
|
||||
{ ... }@imports:
|
||||
let
|
||||
module' = name: imports: builtins.trace "user module: ${name}" { inherit imports; };
|
||||
modules = builtins.mapAttrs module' imports."user/module";
|
||||
in { default = module' "default" (builtins.attrValues modules); } // modules
|
||||
in
|
||||
{ default = module' "default" (builtins.attrValues modules); } // modules
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
{ ... }@flake: { ... }@inputs: { profile, ... }@imports: let
|
||||
{ ... }@flake:
|
||||
{ ... }@inputs:
|
||||
{ profile, ... }@imports:
|
||||
let
|
||||
profile' = name: snippets: builtins.trace "home-manager: profile: ${name}" { imports = snippets; };
|
||||
in builtins.mapAttrs profile' profile
|
||||
|
||||
in
|
||||
builtins.mapAttrs profile' profile
|
||||
|
|
|
|||
|
|
@ -1,11 +1,26 @@
|
|||
{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let
|
||||
host' = name: snippets: let
|
||||
{
|
||||
nixosUsers ? { },
|
||||
nixosGroups ? { },
|
||||
nixosModules,
|
||||
hmModules ? {
|
||||
default = { };
|
||||
},
|
||||
...
|
||||
}@flake:
|
||||
{ ... }@inputs:
|
||||
{ host, ... }@imports:
|
||||
let
|
||||
host' =
|
||||
name: snippets:
|
||||
let
|
||||
|
||||
overlay = self: super: {
|
||||
makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; });
|
||||
};
|
||||
|
||||
common = { modulesPath, lib, ... }: {
|
||||
common =
|
||||
{ modulesPath, lib, ... }:
|
||||
{
|
||||
config.nixpkgs.overlays = [ overlay ];
|
||||
config.networking.hostName = lib.mkForce name;
|
||||
config.home-manager = {
|
||||
|
|
@ -21,12 +36,15 @@
|
|||
|
||||
system = inputs.nixpkgs.lib.nixosSystem {
|
||||
specialArgs = { inherit inputs flake; };
|
||||
modules = [ common ]
|
||||
modules = [
|
||||
common
|
||||
]
|
||||
++ snippets
|
||||
++ builtins.attrValues nixosUsers
|
||||
++ builtins.attrValues nixosGroups
|
||||
;
|
||||
++ builtins.attrValues nixosGroups;
|
||||
};
|
||||
in system.config.system.build.isoImage;
|
||||
in
|
||||
system.config.system.build.isoImage;
|
||||
|
||||
in builtins.mapAttrs host' host
|
||||
in
|
||||
builtins.mapAttrs host' host
|
||||
|
|
|
|||
|
|
@ -1,19 +1,45 @@
|
|||
{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let
|
||||
host' = name: snippets: let
|
||||
system = { namespace?"fbs42", nixpkgs?"nixpkgs" }: inputs.${nixpkgs}.lib.nixosSystem {
|
||||
{
|
||||
nixosUsers ? { },
|
||||
nixosGroups ? { },
|
||||
nixosModules,
|
||||
hmModules ? {
|
||||
default = { };
|
||||
},
|
||||
...
|
||||
}@flake:
|
||||
{ ... }@inputs:
|
||||
{ host, ... }@imports:
|
||||
let
|
||||
host' =
|
||||
name: snippets:
|
||||
let
|
||||
system =
|
||||
{
|
||||
namespace ? "fbs42",
|
||||
nixpkgs ? "nixpkgs",
|
||||
}:
|
||||
inputs.${nixpkgs}.lib.nixosSystem {
|
||||
specialArgs = { inherit inputs flake namespace; };
|
||||
modules = builtins.concatLists (map (base: builtins.attrValues (flake.lib.scan { base = "${base}/host/${name}"; })) flake.lib.schema.base)
|
||||
modules =
|
||||
builtins.concatLists (
|
||||
map (
|
||||
base: builtins.attrValues (flake.lib.scan { base = "${base}/host/${name}"; })
|
||||
) flake.lib.schema.base
|
||||
)
|
||||
++ [ { config.networking.hostName = name; } ]
|
||||
++ [ nixosModules.default ]
|
||||
++ [ inputs.home-manager.nixosModules.default ]
|
||||
++ [ { config.home-manager.sharedModules = [ hmModules.default ]; } ]
|
||||
++ [ { config.home-manager.extraSpecialArgs = { inherit flake namespace; }; } ]
|
||||
++ builtins.attrValues nixosUsers
|
||||
++ builtins.attrValues nixosGroups
|
||||
;
|
||||
++ builtins.attrValues nixosGroups;
|
||||
};
|
||||
|
||||
cfg = assert builtins.length snippets == 1; builtins.head snippets;
|
||||
in system cfg;
|
||||
cfg =
|
||||
assert builtins.length snippets == 1;
|
||||
builtins.head snippets;
|
||||
in
|
||||
system cfg;
|
||||
|
||||
in builtins.mapAttrs host' host
|
||||
in
|
||||
builtins.mapAttrs host' host
|
||||
|
|
|
|||
|
|
@ -1,10 +1,25 @@
|
|||
flake: { ... }@inputs: { group, ... }@imports: let
|
||||
group' = name: snippets: { pkgs, lib, options, config, ... }@args: let
|
||||
flake:
|
||||
{ ... }@inputs:
|
||||
{ group, ... }@imports:
|
||||
let
|
||||
group' =
|
||||
name: snippets:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
options,
|
||||
config,
|
||||
...
|
||||
}@args:
|
||||
let
|
||||
invoke = x: if builtins.isFunction x then x args else x;
|
||||
in {
|
||||
in
|
||||
{
|
||||
options.fbs42.group.${name} = lib.mkEnableOption name;
|
||||
config.users.groups.${name} = lib.mkIf
|
||||
(config.fbs42.group.${name} || builtins.any (usr: usr.group == name) (builtins.attrValues config.users.users))
|
||||
(lib.mkMerge (map invoke snippets));
|
||||
config.users.groups.${name} = lib.mkIf (
|
||||
config.fbs42.group.${name}
|
||||
|| builtins.any (usr: usr.group == name) (builtins.attrValues config.users.users)
|
||||
) (lib.mkMerge (map invoke snippets));
|
||||
};
|
||||
in builtins.mapAttrs group' group
|
||||
in
|
||||
builtins.mapAttrs group' group
|
||||
|
|
|
|||
|
|
@ -1,3 +1,14 @@
|
|||
flake: { ... }@inputs: { module, ... }@imports: let
|
||||
modules = builtins.mapAttrs (name: imports: builtins.trace "module: ${name}" { inherit imports; }) module;
|
||||
in { default = { imports = builtins.attrValues modules; }; } // modules
|
||||
flake:
|
||||
{ ... }@inputs:
|
||||
{ module, ... }@imports:
|
||||
let
|
||||
modules = builtins.mapAttrs (
|
||||
name: imports: builtins.trace "module: ${name}" { inherit imports; }
|
||||
) module;
|
||||
in
|
||||
{
|
||||
default = {
|
||||
imports = builtins.attrValues modules;
|
||||
};
|
||||
}
|
||||
// modules
|
||||
|
|
|
|||
|
|
@ -1,2 +1,4 @@
|
|||
{ ... }@flake: { ... }@inputs: { profile, ... }@imports:
|
||||
{ ... }@flake:
|
||||
{ ... }@inputs:
|
||||
{ profile, ... }@imports:
|
||||
builtins.mapAttrs (name: imports: builtins.trace "profile: ${name}" { inherit imports; }) profile
|
||||
|
|
|
|||
|
|
@ -1,5 +1,15 @@
|
|||
self: { ... }@inputs: { user, ... }@imports: let
|
||||
user' = name: snippets: { pkgs, lib, config, ... }@args:
|
||||
self:
|
||||
{ ... }@inputs:
|
||||
{ user, ... }@imports:
|
||||
let
|
||||
user' =
|
||||
name: snippets:
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}@args:
|
||||
builtins.trace "user: ${name}" {
|
||||
options.fbs42.user.${name} = lib.mkEnableOption name;
|
||||
## no longer with nixos-24.11
|
||||
|
|
@ -7,11 +17,15 @@ self: { ... }@inputs: { user, ... }@imports: let
|
|||
# group = lib.mkDefault name;
|
||||
#};
|
||||
|
||||
imports = map ({ user, home-manager}: {
|
||||
imports = map (
|
||||
{ user, home-manager }:
|
||||
{
|
||||
config = lib.mkIf config.fbs42.user.${name} {
|
||||
users.users.${name} = (user args);
|
||||
home-manager.users.${name} = home-manager;
|
||||
};
|
||||
}) snippets;
|
||||
}
|
||||
) snippets;
|
||||
};
|
||||
in builtins.mapAttrs user' user
|
||||
in
|
||||
builtins.mapAttrs user' user
|
||||
|
|
|
|||
|
|
@ -1,11 +1,26 @@
|
|||
{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let
|
||||
host' = name: snippets: let
|
||||
{
|
||||
nixosUsers ? { },
|
||||
nixosGroups ? { },
|
||||
nixosModules,
|
||||
hmModules ? {
|
||||
default = { };
|
||||
},
|
||||
...
|
||||
}@flake:
|
||||
{ ... }@inputs:
|
||||
{ host, ... }@imports:
|
||||
let
|
||||
host' =
|
||||
name: snippets:
|
||||
let
|
||||
|
||||
overlay = self: super: {
|
||||
makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; });
|
||||
};
|
||||
|
||||
common = { modulesPath, lib, ... }: {
|
||||
common =
|
||||
{ modulesPath, lib, ... }:
|
||||
{
|
||||
config.nixpkgs.overlays = [ overlay ];
|
||||
config.networking.hostName = lib.mkForce name;
|
||||
config.home-manager = {
|
||||
|
|
@ -23,12 +38,15 @@
|
|||
|
||||
system = inputs.nixpkgs.lib.nixosSystem {
|
||||
specialArgs = { inherit inputs flake; };
|
||||
modules = [ common ]
|
||||
modules = [
|
||||
common
|
||||
]
|
||||
++ snippets
|
||||
++ builtins.attrValues nixosUsers
|
||||
++ builtins.attrValues nixosGroups
|
||||
;
|
||||
++ builtins.attrValues nixosGroups;
|
||||
};
|
||||
in system.config.system.build.sdImage;
|
||||
in
|
||||
system.config.system.build.sdImage;
|
||||
|
||||
in builtins.mapAttrs host' host
|
||||
in
|
||||
builtins.mapAttrs host' host
|
||||
|
|
|
|||
16
flake.lock
generated
16
flake.lock
generated
|
|
@ -22,32 +22,32 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1747688870,
|
||||
"narHash": "sha256-ypL9WAZfmJr5V70jEVzqGjjQzF0uCkz+AFQF7n9NmNc=",
|
||||
"lastModified": 1757808926,
|
||||
"narHash": "sha256-K6PEI5PYY94TVMH0mX3MbZNYFme7oNRKml/85BpRRAo=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "d5f1f641b289553927b3801580598d200a501863",
|
||||
"rev": "f21d9167782c086a33ad53e2311854a8f13c281e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-24.11",
|
||||
"ref": "release-25.05",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1751274312,
|
||||
"narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=",
|
||||
"lastModified": 1757810152,
|
||||
"narHash": "sha256-Vp9K5ol6h0J90jG7Rm4RWZsCB3x7v5VPx588TQ1dkfs=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674",
|
||||
"rev": "9a094440e02a699be5c57453a092a8baf569bdad",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-24.11",
|
||||
"ref": "nixos-25.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
|
||||
hardware.url = "github:nixos/nixos-hardware";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-24.11";
|
||||
url = "github:nix-community/home-manager/release-25.05";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,21 +1,34 @@
|
|||
let
|
||||
function = name: value: let
|
||||
function =
|
||||
name: value:
|
||||
let
|
||||
result = if builtins.isAttrs value then { ... }: value else value;
|
||||
result' = builtins.trace "result ${name}=${builtins.typeOf result}" result;
|
||||
in
|
||||
assert builtins.isFunction result';
|
||||
result;
|
||||
|
||||
config = { user?{}, home-manager?{} }@set:
|
||||
config =
|
||||
{
|
||||
user ? { },
|
||||
home-manager ? { },
|
||||
}@set:
|
||||
builtins.mapAttrs function { inherit user home-manager; };
|
||||
|
||||
in name: value: let
|
||||
result = if builtins.isFunction value
|
||||
then
|
||||
in
|
||||
name: value:
|
||||
let
|
||||
result =
|
||||
if builtins.isFunction value then
|
||||
config { user = value; }
|
||||
else if builtins.any (attr: builtins.hasAttr attr value) [ "user" "home-manager" ]
|
||||
else if
|
||||
builtins.any (attr: builtins.hasAttr attr value) [
|
||||
"user"
|
||||
"home-manager"
|
||||
]
|
||||
then
|
||||
config value
|
||||
else
|
||||
config { user = value; };
|
||||
in result
|
||||
in
|
||||
result
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
name: profile: profile
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,23 @@
|
|||
let
|
||||
scan = import ./scan.nix;
|
||||
|
||||
flake' = self: { imports, exports , base }@schema: { ... }@inputs: { ... }@imports: let
|
||||
flake' =
|
||||
self:
|
||||
{
|
||||
imports,
|
||||
exports,
|
||||
base,
|
||||
}@schema:
|
||||
{ ... }@inputs:
|
||||
{ ... }@imports:
|
||||
let
|
||||
lib = {
|
||||
inherit scan schema inputs imports;
|
||||
inherit
|
||||
scan
|
||||
schema
|
||||
inputs
|
||||
imports
|
||||
;
|
||||
extend = flake schema inputs imports;
|
||||
new = flake { } { } { };
|
||||
# TODO: override
|
||||
|
|
@ -11,24 +25,57 @@ let
|
|||
convert = attr: value: value self inputs imports;
|
||||
|
||||
result = (builtins.mapAttrs convert schema.exports);
|
||||
in result // { lib = lib // (result.lib or {}); };
|
||||
in
|
||||
{
|
||||
formatter = builtins.mapAttrs (_: pkgs: pkgs.nixfmt-tree) inputs.nixpkgs.legacyPackages;
|
||||
}
|
||||
// result
|
||||
// {
|
||||
lib = lib // (result.lib or { });
|
||||
};
|
||||
|
||||
flake = { imports?{}, exports?{}, base?[] }@schema'old: { ... }@inputs'old: { ... }@imports'old: { ... }@inputs'new: base: let
|
||||
flake =
|
||||
{
|
||||
imports ? { },
|
||||
exports ? { },
|
||||
base ? [ ],
|
||||
}@schema'old:
|
||||
{ ... }@inputs'old:
|
||||
{ ... }@imports'old:
|
||||
{ ... }@inputs'new:
|
||||
base:
|
||||
let
|
||||
schema = {
|
||||
imports = (schema'old.imports or {}) // scan { base = base + "/import"; recursive = true; };
|
||||
imports =
|
||||
(schema'old.imports or { })
|
||||
// scan {
|
||||
base = base + "/import";
|
||||
recursive = true;
|
||||
};
|
||||
exports = (schema'old.exports or { }) // scan { base = base + "/export"; };
|
||||
base = [ base ] ++ (schema'old.base or [ ]);
|
||||
};
|
||||
|
||||
merge = attr: let
|
||||
merge =
|
||||
attr:
|
||||
let
|
||||
old = imports'old.${attr} or { };
|
||||
new = imports'new.${attr} or { };
|
||||
in builtins.mapAttrs (attr: _: (old.${attr} or []) ++ (new.${attr} or [])) (old//new);
|
||||
in
|
||||
builtins.mapAttrs (attr: _: (old.${attr} or [ ]) ++ (new.${attr} or [ ])) (old // new);
|
||||
|
||||
imports'new = builtins.mapAttrs (name: value: scan { base = base + "/${name}"; convert = name: content: [ (value name content) ]; }) schema.imports;
|
||||
result = flake' result schema
|
||||
(inputs'old // (builtins.removeAttrs inputs'new ["self"]))
|
||||
(builtins.mapAttrs (attr: _: merge attr) schema.imports);
|
||||
in result;
|
||||
imports'new = builtins.mapAttrs (
|
||||
name: value:
|
||||
scan {
|
||||
base = base + "/${name}";
|
||||
convert = name: content: [ (value name content) ];
|
||||
}
|
||||
) schema.imports;
|
||||
result = flake' result schema (inputs'old // (builtins.removeAttrs inputs'new [ "self" ])) (
|
||||
builtins.mapAttrs (attr: _: merge attr) schema.imports
|
||||
);
|
||||
in
|
||||
result;
|
||||
|
||||
in flake {} {} {}
|
||||
in
|
||||
flake { } { } { }
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
self:
|
||||
35
lib/scan.nix
35
lib/scan.nix
|
|
@ -1,23 +1,42 @@
|
|||
{ base, convert ? name: value: value, recursive ? false }:
|
||||
{
|
||||
base,
|
||||
convert ? name: value: value,
|
||||
recursive ? false,
|
||||
}:
|
||||
let
|
||||
scan =
|
||||
sub:
|
||||
let
|
||||
scan = sub: let
|
||||
all = builtins.readDir (base + "/${builtins.concatStringsSep "/" sub}");
|
||||
names = filter: builtins.filter filter (builtins.attrNames all);
|
||||
nix = name: all.${name} == "regular" && builtins.stringLength name > 4 && builtins.substring (builtins.stringLength name - 4) 4 name == ".nix";
|
||||
nix =
|
||||
name:
|
||||
all.${name} == "regular"
|
||||
&& builtins.stringLength name > 4
|
||||
&& builtins.substring (builtins.stringLength name - 4) 4 name == ".nix";
|
||||
dir = name: all.${name} == "directory";
|
||||
files = map (name: sub ++ [ (builtins.substring 0 (builtins.stringLength name - 4) name) ]) (names nix);
|
||||
files = map (name: sub ++ [ (builtins.substring 0 (builtins.stringLength name - 4) name) ]) (
|
||||
names nix
|
||||
);
|
||||
dirs = builtins.concatLists (map (name: scan (sub ++ [ name ])) (names dir));
|
||||
in if recursive then files ++ dirs else files;
|
||||
in
|
||||
if recursive then files ++ dirs else files;
|
||||
|
||||
root = scan [ ];
|
||||
|
||||
item = relative: let
|
||||
item =
|
||||
relative:
|
||||
let
|
||||
name = builtins.concatStringsSep "/" relative;
|
||||
absolute = base + "/${name}.nix";
|
||||
content = import absolute;
|
||||
value = convert name content;
|
||||
in { inherit name value; };
|
||||
in
|
||||
{
|
||||
inherit name value;
|
||||
};
|
||||
|
||||
items = map item root;
|
||||
|
||||
in if builtins.pathExists base then builtins.listToAttrs (map item root) else {}
|
||||
in
|
||||
if builtins.pathExists base then builtins.listToAttrs (map item root) else { }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue