204 lines
6.6 KiB
Nix
204 lines
6.6 KiB
Nix
# ============================================================================
|
|
# Fleet Option Definition
|
|
# ============================================================================
|
|
# This module defines the athenix.fleet and athenix.hwTypes options.
|
|
# Self-contained fleet management without dependencies on user configuration.
|
|
{ inputs, lib, ... }:
|
|
let
|
|
fleetDefinition = lib.mkOption {
|
|
description = "Hardware types definitions for the fleet.";
|
|
type = lib.types.attrsOf (
|
|
lib.types.submodule (
|
|
{ name, ... }:
|
|
{
|
|
options = {
|
|
type = lib.mkOption {
|
|
type = lib.types.oneOf [
|
|
lib.types.str
|
|
lib.types.listOf
|
|
lib.types.str
|
|
];
|
|
default = name;
|
|
description = "Type(s) of system configuration for this device.";
|
|
};
|
|
system = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "x86_64-linux";
|
|
description = "NixOS system architecture for this hardware type.";
|
|
};
|
|
devices = lib.mkOption {
|
|
type = lib.types.oneOf [
|
|
lib.types.int
|
|
(lib.types.attrsOf (
|
|
lib.types.submodule (
|
|
{ ... }:
|
|
{
|
|
freeformType = lib.types.attrs;
|
|
}
|
|
)
|
|
))
|
|
];
|
|
};
|
|
count = lib.mkOption {
|
|
type = lib.types.int;
|
|
default = 0;
|
|
description = "Number of devices of this type to create.";
|
|
};
|
|
defaultCount = lib.mkOption {
|
|
type = lib.types.int;
|
|
default = 0;
|
|
description = "Default number of devices to create with default configurations and numbered hostnames.";
|
|
};
|
|
overrides = lib.mkOption {
|
|
type = lib.types.attrs;
|
|
default = { };
|
|
description = "Overrides to apply to all devices of this type.";
|
|
};
|
|
};
|
|
}
|
|
)
|
|
);
|
|
};
|
|
|
|
# Forward declaration for user options (full definition in user-config.nix)
|
|
# This allows users.nix to be evaluated at flake level
|
|
userSubmodule = lib.types.submodule {
|
|
options = {
|
|
enable = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = "Whether this user account is enabled on this system.";
|
|
};
|
|
isNormalUser = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = true;
|
|
description = "Whether this is a normal user account (vs system user).";
|
|
};
|
|
description = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
default = null;
|
|
description = "Full name or description of the user (GECOS field).";
|
|
example = "John Doe";
|
|
};
|
|
extraGroups = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
default = [ ];
|
|
description = "Additional groups for the user (wheel, docker, etc.).";
|
|
example = [
|
|
"wheel"
|
|
"networkmanager"
|
|
"docker"
|
|
];
|
|
};
|
|
hashedPassword = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "!";
|
|
description = ''
|
|
Hashed password for the user account.
|
|
Generate with: mkpasswd -m sha-512
|
|
Default "!" means account is locked (SSH key only).
|
|
'';
|
|
};
|
|
extraPackages = lib.mkOption {
|
|
type = lib.types.listOf lib.types.package;
|
|
default = [ ];
|
|
description = "Additional system packages available to this user.";
|
|
example = lib.literalExpression "[ pkgs.vim pkgs.git ]";
|
|
};
|
|
excludePackages = lib.mkOption {
|
|
type = lib.types.listOf lib.types.package;
|
|
default = [ ];
|
|
description = "System packages to exclude for this user.";
|
|
};
|
|
homePackages = lib.mkOption {
|
|
type = lib.types.listOf lib.types.package;
|
|
default = [ ];
|
|
description = "Packages to install in the user's home-manager profile.";
|
|
example = lib.literalExpression "[ pkgs.firefox pkgs.vscode ]";
|
|
};
|
|
extraImports = lib.mkOption {
|
|
type = lib.types.listOf lib.types.path;
|
|
default = [ ];
|
|
description = "Additional home-manager modules to import for this user.";
|
|
};
|
|
external = lib.mkOption {
|
|
type = lib.types.nullOr (
|
|
lib.types.oneOf [
|
|
lib.types.path
|
|
lib.types.package
|
|
lib.types.attrs
|
|
]
|
|
);
|
|
default = null;
|
|
description = ''
|
|
External user configuration module from Git or local path.
|
|
|
|
Should contain user.nix (user options + home-manager config)
|
|
and optionally nixos.nix (system-level config).
|
|
'';
|
|
example = lib.literalExpression ''
|
|
builtins.fetchGit {
|
|
url = "https://github.com/username/dotfiles";
|
|
rev = "abc123...";
|
|
}'';
|
|
};
|
|
opensshKeys = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
default = [ ];
|
|
description = "SSH public keys for the user (authorized_keys).";
|
|
example = [ "ssh-ed25519 AAAAC3Nza... user@host" ];
|
|
};
|
|
shell = lib.mkOption {
|
|
type = lib.types.nullOr (
|
|
lib.types.enum [
|
|
"bash"
|
|
"zsh"
|
|
"fish"
|
|
"tcsh"
|
|
]
|
|
);
|
|
default = "bash";
|
|
description = "Default shell for the user.";
|
|
};
|
|
editor = lib.mkOption {
|
|
type = lib.types.nullOr (
|
|
lib.types.enum [
|
|
"vim"
|
|
"neovim"
|
|
"emacs"
|
|
"nano"
|
|
"code"
|
|
]
|
|
);
|
|
default = "neovim";
|
|
description = "Default text editor for the user (sets EDITOR).";
|
|
};
|
|
useZshTheme = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = true;
|
|
description = "Whether to apply the system Zsh theme (Oh My Posh).";
|
|
};
|
|
useNvimPlugins = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = true;
|
|
description = "Whether to apply the system Neovim configuration.";
|
|
};
|
|
};
|
|
};
|
|
in
|
|
{
|
|
options.athenix = {
|
|
fleet = fleetDefinition;
|
|
hwTypes = lib.mkOption {
|
|
description = "Hardware types definitions for the fleet.";
|
|
type = lib.types.attrs;
|
|
};
|
|
users = lib.mkOption {
|
|
type = lib.types.attrsOf userSubmodule;
|
|
description = "User accounts configuration. Set enable=true for users that should exist on this system.";
|
|
};
|
|
};
|
|
|
|
config.athenix.hwTypes = lib.mkDefault (import ../hw { inherit inputs; });
|
|
}
|