114 lines
3.3 KiB
Nix
114 lines
3.3 KiB
Nix
{
|
|
lib,
|
|
config,
|
|
...
|
|
}: let
|
|
host = config.host;
|
|
|
|
hostUsers = host.hostUsers;
|
|
principleUsers = host.principleUsers;
|
|
in {
|
|
options.host = {
|
|
users = lib.mkOption {
|
|
default = {};
|
|
type = lib.types.attrsOf (lib.types.submodule ({
|
|
config,
|
|
name,
|
|
...
|
|
}: {
|
|
options = {
|
|
name = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = name;
|
|
description = ''
|
|
What should this users name on the system be
|
|
'';
|
|
defaultText = lib.literalExpression "config.host.users.\${name}.name";
|
|
};
|
|
isPrincipleUser = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = ''
|
|
User should be configured as root and have ssh access
|
|
'';
|
|
defaultText = lib.literalExpression "config.host.users.\${name}.isPrincipleUser";
|
|
};
|
|
isDesktopUser = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = ''
|
|
User should install their desktop applications
|
|
'';
|
|
defaultText = lib.literalExpression "config.host.users.\${name}.isDesktopUser";
|
|
};
|
|
isTerminalUser = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = ''
|
|
User should install their terminal applications
|
|
'';
|
|
defaultText = lib.literalExpression "config.host.users.\${name}.isTerminalUser";
|
|
};
|
|
isNormalUser = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = config.isDesktopUser || config.isTerminalUser;
|
|
description = ''
|
|
User should install their applications and can log in
|
|
'';
|
|
defaultText = lib.literalExpression "config.host.users.\${name}.isNormalUser";
|
|
};
|
|
};
|
|
}));
|
|
};
|
|
hostUsers = lib.mkOption {
|
|
default = lib.attrsets.mapAttrsToList (_: user: user) host.users;
|
|
};
|
|
principleUsers = lib.mkOption {
|
|
default = lib.lists.filter (user: user.isPrincipleUser) hostUsers;
|
|
};
|
|
normalUsers = lib.mkOption {
|
|
default = lib.lists.filter (user: user.isNormalUser) hostUsers;
|
|
};
|
|
desktopUsers = lib.mkOption {
|
|
default = lib.lists.filter (user: user.isDesktopUser) hostUsers;
|
|
};
|
|
terminalUsers = lib.mkOption {
|
|
default = lib.lists.filter (user: user.isTerminalUser) hostUsers;
|
|
};
|
|
};
|
|
|
|
config = {
|
|
host.users = {
|
|
leyla = {
|
|
isPrincipleUser = lib.mkDefault false;
|
|
isDesktopUser = lib.mkDefault false;
|
|
isTerminalUser = lib.mkDefault false;
|
|
};
|
|
eve = {
|
|
isPrincipleUser = lib.mkDefault false;
|
|
isDesktopUser = lib.mkDefault false;
|
|
isTerminalUser = lib.mkDefault false;
|
|
};
|
|
};
|
|
|
|
assertions =
|
|
(
|
|
builtins.map (user: {
|
|
assertion = !(user.isPrincipleUser && !user.isNormalUser);
|
|
message = ''
|
|
Non normal user ${user.name} can not be a principle user.
|
|
'';
|
|
})
|
|
hostUsers
|
|
)
|
|
++ [
|
|
{
|
|
assertion = (builtins.length principleUsers) > 0;
|
|
message = ''
|
|
At least one user must be a principle user.
|
|
'';
|
|
}
|
|
];
|
|
};
|
|
}
|