🚧 Update user configuration loading and use formatter

This commit is contained in:
Jo 2025-04-26 23:08:11 +02:00
parent cd32ad1c61
commit 54edba0070
12 changed files with 83 additions and 146 deletions

View file

@ -0,0 +1,6 @@
{pkgs, ...}: {
home.packages = with pkgs; [
cowsay
cmatrix
];
}

View file

@ -1,8 +1,13 @@
{ lib, self, ... }: {
{
lib,
self,
...
}: {
# Create a NixOS module option on a single line.
mkOpt = type: default: description:
lib.mkOption {inherit type default description;};
# Create a simple bool options
mkBool = default: description:
lib.mkOption {
inherit default description;
@ -10,18 +15,15 @@
};
# Create a module compliant with the NixOS module system.
mkModule =
{
mkModule = {
name ? "puzzlevision",
class,
modules,
}: {
_class = class;
# Template: "[path-to-flake]/flake.nix#[class-name]Modules.[module-name]"
# Example: "[path-to-flake]/flake.nix#nixosModules.system.audio"
_file = "${self.outPath}/flake.nix#${class}Modules.${name}";
imports = modules;
};

View file

@ -6,13 +6,7 @@
# Automagically imports libs from "/lib/lib-name" and exposes them to the `flake.lib` output.
./lib.nix
# Recursively imports overlays from "/overlays/overlay-name" and exposes them to the `flake.overlays` output.
#./overlays.nix
# Automagically imports systems from "/systems/arch-classname/system-name".
./systems.nix
# Automagically imports homes from "/homes/user-name".
#./homes.nix
];
}

View file

@ -1,10 +1,10 @@
{ self, ... }:
{
{self, ...}: {
flake = {
#nixosModules.puzzlevision = self.lib.mkModule {
# class = "nixos";
# modules = self.lib.dirToModuleList ../nixos;
#};
# TODO: figure out why this isn't working correctly
nixosModules.puzzlevision = self.lib.mkModule {
class = "nixos";
modules = self.lib.dirToModuleList ../nixos;
};
homeModules.puzzlevision = self.lib.mkModule {
class = "home";

View file

@ -1,10 +1,12 @@
{
lib,
inputs,
self,
inputs,
...
}: {
imports = [ inputs.easy-hosts.flakeModule ];
imports = [
inputs.easy-hosts.flakeModule
];
easyHosts = {
autoConstruct = true;

2
modules/home/default.nix Normal file
View file

@ -0,0 +1,2 @@
{...}: {
}

View file

@ -1,33 +0,0 @@
{
lib,
pkgs,
self,
config,
osConfig,
...
}: let
inherit (lib) mkIf mkOption;
inherit (self) namespace;
cfg = config.${namespace}.desktop.gnome;
in {
options.${namespace}.desktop.gnome = with lib.types; {
enabled-extensions = mkOption {
type = listOf package;
default = with pkgs.gnomeExtensions; [dash-to-dock user-themes blur-my-shell appindicator unite color-picker clipboard-history];
example = [dash-to-dock blur-my-shell];
description = "Specify gnome extensions to install.";
};
};
config = mkIf osConfig.${namespace}.desktop.gnome.enable {
home.packages = cfg.enabled-extensions;
dconf.settings = {
"org/gnome/shell" = {
enabled-extensions = lib.forEach cfg.enabled-extensions (x: x.extensionUuid);
disabled-extensions = []; # Make sure none of our extensions are disabled on system rebuild
};
};
};
}

View file

@ -9,7 +9,9 @@
cfg = config.${namespace}.desktop.gnome;
in {
options.${namespace}.desktop.gnome = {enable = mkEnableOption "Enable the gnome desktop environment ${namespace}";};
options.${namespace}.desktop.gnome = {
enable = mkEnableOption "the gnome desktop environment";
};
config = mkIf cfg.enable {
services.xserver.enable = true;

View file

@ -3,21 +3,22 @@
self,
config,
...
}:
let
}: let
inherit (lib) mkEnableOption mkIf;
inherit (self) namespace;
cfg = config.${namespace}.common.grub;
cfg = config.${namespace}.system.grub;
in {
options.${namespace}.common.grub = { enable = mkEnableOption "grub"; };
options.${namespace}.system.grub = {
enable = mkEnableOption "the grub bootloader.";
};
config = mkIf cfg.enable {
boot.loader.systemd-boot.enable = false;
boot.loader.grub = {
enable = true;
devices = [ "nodev" ];
devices = ["nodev"];
efiInstallAsRemovable = true;
efiSupport = true;

View file

@ -1,81 +1,75 @@
{
lib,
config,
self,
pkgs,
config,
...
}: let
inherit (lib) mkEnableOption mkIf mkOption types;
inherit (lib) types mkEnableOption mkOption mkIf;
inherit (self) namespace;
inherit (self.lib) mkOpt dirToModuleList;
cfg = config.${namespace}.users;
inherit (self.lib) dirToModuleList;
# The identifier of the current system type, e.g. "x86_64-linux" or "aarch64-darwin"
system = pkgs.system;
cfg = config.${namespace}.users;
# Type for a user configuration
userType = types.submodule {
userSubmodule = types.submodule {
options = {
enable = mkEnableOption "this user";
initialPassword = mkOpt (types.nullOr types.str) null "Initial password for the user";
password = mkOpt (types.nullOr types.str) null "Plaintext password for the user";
hashedPassword = mkOpt (types.nullOr types.str) null "Hashed password for the user";
isNormalUser = mkOpt types.bool true "Whether this user is a normal user";
extraGroups = mkOpt (types.listOf types.str) [] "Extra groups for the user";
enable = mkEnableOption "this user.";
isNormalUser = self.lib.mkBool true "Whether this user is considered a normal user.";
isSystemUser = self.lib.mkBool false "Whether this user is considered a system user.";
initialPassword = self.lib.mkOpt (types.nullOr types.str) null "Plaintext insecure initial user password, only recommended for testing.";
password = self.lib.mkOpt (types.nullOr types.str) null "Plaintext insecure user password, only recommended for testing.";
extraGroups = self.lib.mkOpt (types.listOf types.str) [] "List of additional groups this user belongs to.";
};
};
# Function to get home configuration path for a username
getHomeConfigPath = username: "${self.outPath}/homes/${system}/${username}";
homeConfigExists = username: let
path = getHomeConfigPath username;
in
builtins.pathExists "${path}/default.nix";
# Function to check if a home configuration exists for a username
homeConfigExists = username:
let path = getHomeConfigPath username;
in builtins.pathExists "${path}/default.nix";
# Import all home-manager modules
homeModules = dirToModuleList "${self.outPath}/modules/home";
in {
options.${namespace}.users = mkOption {
type = types.attrsOf userType;
type = types.attrsOf userSubmodule;
default = {};
description = "User configurations with auto-imported home-manager setup";
description = "List of users to create. Also handles home configurations, placed in self.outPath/homes/[x86_64-linux, aarch64-linux, etc...], through home-manager.";
};
config = {
# Ensure users are fully managed by NixOS
# Manage users declaratively and map userConfig to users.users by name;
users.mutableUsers = false;
# Create the actual system users
users.users = lib.mapAttrs (username: userConfig:
mkIf userConfig.enable {
name = username;
inherit (userConfig) extraGroups initialPassword hashedPassword isNormalUser password;
}
) cfg;
inherit (userConfig) isNormalUser isSystemUser initialPassword password extraGroups;
})
cfg;
# Configure home-manager with auto-imported user configuration
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = {
inherit self;
inherit self system;
namespace = self.namespace;
};
users = lib.mapAttrs (username: userConfig:
users =
lib.mapAttrs (
username: userConfig:
mkIf (userConfig.enable && homeConfigExists username) (
{ ... }: {
imports = [
(getHomeConfigPath username) # Import the user's specific home configuration
]; #++ homeModules; # Include all generalized home modules
{osConfig, ...}: {
# Import user home configuration and general home modules
imports = [(getHomeConfigPath username)] ++ homeModules;
home.stateVersion = lib.mkDefault config.system.stateVersion;
home.stateVersion = lib.mkDefault osConfig.system.stateVersion;
}
)
) cfg;
)
cfg;
};
};
}

View file

@ -1,26 +0,0 @@
{
lib,
config,
self,
...
}: let
inherit (lib) mkIf;
inherit (self) namespace;
cfg = config.${namespace}.utils.vm;
in {
options.${namespace}.utils.vm = {
enable = self.lib.mkBool true "Whether to enable custom vm presets";
preset = self.lib.mkOpt lib.types.str "performance" "Specify the prefered vm settings preset: performance, balance or powersave";
};
config = mkIf cfg.enable {
virtualisation.vmVariant = {
virtualisation = {
cores = 6;
memorySize = 4096;
graphics = true;
};
};
};
}

View file

@ -1,24 +1,17 @@
{
pkgs,
...
}: {
{pkgs, ...}: {
imports = [
./hardware.nix
];
puzzlevision = {
# TODO: improve home-manager configuration loading as development continues and make sure everything works correctly.
users = {
jo = {
users.cyn = {
enable = true;
initialPassword = "balls";
extraGroups = [ "wheel" ];
};
password = "cynical"; # For testing only, replace with sops secret before production use
extraGroups = ["wheel"];
};
desktop.gnome.enable = true;
utils.vm.enable = true;
common.grub.enable = true;
system.grub.enable = true;
};
environment.systemPackages = with pkgs; [