{ self, inputs, ... }: { flake.modules.nixos.rebuild = { config, pkgs, lib, ... }: let flakeDir = config.rebuild.flakeDir; echoCmd = lib.getExe' pkgs.coreutils "echo"; hostnameCmd = "$(${lib.getExe pkgs.hostname} -s)"; nfs = with pkgs; writeShellApplication { name = "nfs"; runtimeInputs = [ coreutils hostname nh ]; text = '' HOSTNAME=$(hostname -s) echo "Switching to the $HOSTNAME nixos profile" nh os switch "$@" "${flakeDir}#$HOSTNAME" ''; }; nfsu = with pkgs; writeShellApplication { name = "nfsu"; runtimeInputs = [ nfs pkgs.git ]; text = ''nfs --refresh "$@"''; }; in { options.rebuild = { flakeDir = lib.mkOption { description = "Path to the flake directory."; type = lib.types.str; default = "/etc/nixos"; }; }; config = { environment.systemPackages = with pkgs; [ nfs nfsu ]; }; }; flake.modules.homeManager.rebuild = { config, pkgs, lib, ... }: let flakeDir = config.homeManagerFlakeDir; flake-parts-check = with pkgs; writeShellApplication { name = "flake-parts-check"; runtimeInputs = [ nix ]; text = '' cd ${flakeDir} nix run "${flakeDir}#write-flake" nix flake check ''; }; test-build = with pkgs; writeShellApplication { name = "test-build"; runtimeInputs = [ coreutils nix hostname ]; text = '' if [ -z "$1" ]; then HOSTNAME=$(hostname -s) else HOSTNAME="$1" fi echo "Testing the evaulation of the nixos config for $HOSTNAME" nix eval "${flakeDir}#nixosConfigurations.$HOSTNAME.config.system.build.toplevel.drvPath" ''; }; in { options = { homeManagerFlakeDir = lib.mkOption { description = "Path to the home-manager flake directory."; type = lib.types.str; default = "${config.xdg.configHome}/home-manager"; }; }; config = { home.activation.printFlakeDir = lib.hm.dag.entryAfter ["writeBoundary"] '' run echo "Home Manager flake directory: ${flakeDir}" ''; home.packages = with pkgs; [ home-manager (symlinkJoin { name = "build-tools"; paths = [ flake-parts-check test-build (inputs.self.wrappers.home-switch.apply { inherit pkgs flakeDir; }).wrapper (inputs.self.wrappers.home-switch.apply { binName = lib.mkForce "nhmu"; inherit pkgs flakeDir; extraOptions = [ "--update" ]; }).wrapper (inputs.wrappers.lib.wrapPackage { binName = "cleanup"; inherit pkgs; package = nh; args = [ "clean" "user" "--keep-since" "3days" ]; }) ]; }) ]; }; }; flake.wrappers.home-switch = inputs.wrappers.lib.wrapModule ({config, lib, wlib, ... }: { options = { flakeDir = lib.mkOption { type = lib.types.str; }; user = lib.mkOption { type = lib.types.str; default = "$(whoami)"; }; hostname = lib.mkOption { type = lib.types.str; default = "$(hostname -s)"; }; configuration = lib.mkOption { type = lib.types.str; default = "${config.user}@${config.hostname}"; }; extraOptions = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; }; }; config = { binName = "nhms"; extraPackages = with config.pkgs; [ coreutils hostname nh ]; preHook = '' CONFIG=${config.configuration} echo "Switching to $CONFIG from ${config.flakeDir}" ''; package = config.pkgs.nh; args = [ "home" "switch" "--configuration" "${config.configuration}" "$@" "${config.flakeDir}" ] ++ config.extraOptions; }; }); }