{ config, lib, namespace, options, pkgs, ... }: with lib; with lib.${namespace}; let cfg = config.${namespace}.user; defaultIconFileName = "profile.png"; defaultIcon = pkgs.stdenvNoCC.mkDerivation { name = "default-icon"; src = ./. + "/${defaultIconFileName}"; dontUnpack = true; installPhase = '' cp $src $out ''; passthru = { fileName = defaultIconFileName; }; }; propagatedIcon = pkgs.runCommandNoCC "propagated-icon" { passthru = { inherit (fileName) ; }; } '' local target="$out/share/${namespace}-icons/user/${cfg.name}" mkdir -p "$target" cp ${cfg.icon} "$target/${cfg.icon.fileName}" ''; in { options.${namespace}.user = with types; { name = mkOpt str "cholli" "The name to use for the user account."; fullName = mkOpt str "Christoph Hollizeck" "The full name of the user."; email = mkOpt str "christoph.hollizeck@hey.com" "The email of the user."; initialPassword = mkOpt str "asdf" "The initial password to use when the user is first created."; icon = mkOpt (nullOr package) defaultIcon "The profile picture to use for the user."; extraGroups = mkOpt (listOf str) [ ] "Groups for the user to be assigned."; extraOptions = mkOpt attrs { } (mdDoc "Extra options passed to `users.users.`."); trustedPublicKeys = mkOption { default = [ ]; type = nullOr (listOf str); description = "Trusted public keys for this user for the machine"; }; }; config = { environment.systemPackages = [ ]; # remove default nix alias environment.shellAliases = { l = null; ls = null; ll = null; }; programs.fish = enabled; users.defaultUserShell = pkgs.fish; ${namespace}.home = { file = { "Desktop/.keep".text = ""; "Documents/.keep".text = ""; "Downloads/.keep".text = ""; "Music/.keep".text = ""; "Pictures/.keep".text = ""; "Videos/.keep".text = ""; "projects/.keep".text = ""; ".face".source = cfg.icon; "Pictures/${cfg.icon.fileName or (builtins.baseNameOf cfg.icon)}".source = cfg.icon; }; }; users.users.${cfg.name} = { isNormalUser = true; inherit (cfg) name initialPassword; home = "/home/${cfg.name}"; group = "users"; # Arbitrary user ID to use for the user. Since I only # have a single user on my machines this won't ever collide. # However, if you add multiple users you'll need to change this # so each user has their own unique uid (or leave it out for the # system to select). uid = 1000; openssh.authorizedKeys.keys = cfg.trustedPublicKeys; extraGroups = [ "steamcmd" ] ++ cfg.extraGroups; } // cfg.extraOptions; }; }