diff --git a/Justfile b/Justfile deleted file mode 100644 index c9f792d7..00000000 --- a/Justfile +++ /dev/null @@ -1,34 +0,0 @@ -# Note: -# add `--option substitute false` and or `--no-net` to the command so it builds properly offline -os host action: - #!/usr/bin/env bash - set -euo pipefail - - nixpkgs=$(nix-instantiate --eval -E "let sources = import ./npins; in sources.nixpkgs.outPath" | jq -r .) - nixos-rebuild {{ action }} \ - -I nixpkgs=${nixpkgs} \ - -I nixos-config=./nix/configurations/{{ host }}.nix \ - --no-reexec \ - --file ./default.nix \ - --attr "nixosConfigurations.{{ host }}" - -install host: - #!/usr/bin/env bash - set -euo pipefail - - nixpkgs=$(nix-instantiate --eval -E "let sources = import ./npins; in sources.nixpkgs.outPath" | jq -r .) - nixos-install \ - -I nixpkgs=${nixpkgs} \ - -I nixos-config=./nix/configurations/{{ host }}.nix \ - --file ./default.nix \ - --attr "nixosConfigurations.{{ host }}" - -# Retain four weeks of generations so I don't fuck up -clean-os: - nix-env --delete-generations 28d -p /nix/var/nix/profiles/system - -clean-hm: - nix-env --delete-generations 28d -p ~/.local/state/nix/profiles/home-manager - -update: - npins update diff --git a/nix/configurations/installer.nix b/nix/configurations/installer.nix index 027168d7..3b9d56db 100644 --- a/nix/configurations/installer.nix +++ b/nix/configurations/installer.nix @@ -56,6 +56,7 @@ in environment.systemPackages = [ pkgs.disko + pkgs.manage pkgs.git pkgs.pastebinit # for sharing cli output & debugging pkgs.hdparm # to ATA secure wipe disks diff --git a/nix/packages/by-name/manage/package.nix b/nix/packages/by-name/manage/package.nix new file mode 100644 index 00000000..ea15fc56 --- /dev/null +++ b/nix/packages/by-name/manage/package.nix @@ -0,0 +1,10 @@ +{ + haskellPackages, + haskell, +}: +let + inherit (haskell.lib.compose) justStaticExecutables; + + drv = haskellPackages.callCabal2nix "manage" ./src { }; +in +justStaticExecutables drv diff --git a/nix/packages/by-name/manage/src/.gitignore b/nix/packages/by-name/manage/src/.gitignore new file mode 100644 index 00000000..c33954f5 --- /dev/null +++ b/nix/packages/by-name/manage/src/.gitignore @@ -0,0 +1 @@ +dist-newstyle/ diff --git a/nix/packages/by-name/manage/src/Main.hs b/nix/packages/by-name/manage/src/Main.hs new file mode 100755 index 00000000..dc112e47 --- /dev/null +++ b/nix/packages/by-name/manage/src/Main.hs @@ -0,0 +1,104 @@ +#!/usr/bin/env runhaskell +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE ViewPatterns #-} + +import Control.Monad +import System.Environment +import System.Exit +import System.IO +import System.Process + +-- Note: to type check this code +-- `ghc manage.hs -Werror=all -fno-code' + +main :: IO () +main = do + let showHelpOr args elseDo = + if "--help" `elem` args then putStr help + else elseDo + + getArgs >>= \case + ( "os" : host : action + : (partitionArgs -> (manageArgs, extraArgs)) + ) -> + manageArgs `showHelpOr` do + nixpkgs <- readNixpkgsPath + void $ readProcessFriendly "nixos-rebuild" (action : nixosRebuildArgs nixpkgs host <> extraArgs) + + ( "install" : host + : (partitionArgs -> (manageArgs, extraArgs)) + ) -> + manageArgs `showHelpOr` do + nixpkgs <- readNixpkgsPath + void $ readProcessFriendly "nixos-install" (nixosInstallArgs nixpkgs host <> extraArgs) + + _ -> putStr help >> exitFailure + +newtype StorePath = StorePath { unStorePath :: String } + +defaultNixosCmdArgs :: StorePath -> String -> [String] +defaultNixosCmdArgs (unStorePath -> nixpkgsPath) hostname = + [ "-I", "nixpkgs=" <> nixpkgsPath + , "-I", "nixos-config=./nix/configurations/" <> hostname <> ".nix" + , "--file", "./default.nix" + , "--attr", "nixosConfigurations." <> hostname + ] + +nixosInstallArgs :: StorePath -> String -> [String] +nixosInstallArgs = defaultNixosCmdArgs + +nixosRebuildArgs :: StorePath -> String -> [String] +nixosRebuildArgs = + defaultNixosCmdArgs + -- This is not a nixos-install flag + <> (\_ _ -> ["--no-reexec"]) + +help :: String +help = + unlines + [ "Manage.hs" + , "" + , "Manage.hs is a thin wrapper to make nixos-{install,rebuild} easier to use." + , "Black lives matter. Trans rights are human rights. No nazi bullsh*t." + , "" + , "Available commands:" + , indent "os :" <> indent "run perhost action with nixos-rebuild" + , indent "install :" <> indent "run perhost action with nixos-install" + , indent "--help:" <> indent "show this help menu" + ] + where indent = ("\t" <>) + +partitionArgs :: [String] -> ([String], [String]) +partitionArgs = finalize . span (/= "--") + where finalize (xs, ys) = (xs, drop 1 ys) + +quote :: String -> String +quote x = "\"" <> x <> "\"" + +-- https://stackoverflow.com/a/70162369 +blueForeground :: String -> String +blueForeground x = "\ESC[34m" <> x <> "\ESC[0m" + +readProcessFriendly :: String -> [String] -> IO String +readProcessFriendly cmdName args = do + hPutStrLn stderr + $ "Executing: " <> (quote . blueForeground) (showCommandForUser cmdName args) + (_, _, _, pid) <- createProcess + ( proc cmdName args + ) { std_in = UseHandle stdin + , std_out = UseHandle stdout + , std_err = UseHandle stderr + } + _ <- waitForProcess pid + pure "" + +readNixpkgsPath :: IO StorePath +readNixpkgsPath = + StorePath . clean <$> readProcessFriendly + "nix-instantiate" + [ "--eval" + , "-E" + , "let sources = import ./npins; in sources.nixpkgs.outPath" + ] + where + clean = filter (\c -> c /= '\n' && c /= '"') diff --git a/nix/packages/by-name/manage/src/manage.cabal b/nix/packages/by-name/manage/src/manage.cabal new file mode 100644 index 00000000..a59349a3 --- /dev/null +++ b/nix/packages/by-name/manage/src/manage.cabal @@ -0,0 +1,21 @@ +cabal-version: 3.0 +name: manage +version: 0.1.0.0 +description: NixOS Helper +author: Léana 江 +maintainer: leana.jiang+git@icloud.com +build-type: Simple + +common common + ghc-options: + -Wall -Wcompat -Widentities -Wincomplete-record-updates + -Wincomplete-patterns -Wincomplete-uni-patterns + -Wredundant-constraints -Werror=missing-fields + build-depends: base + default-language: Haskell2010 + +executable manage + import: common + main-is: ./Main.hs + build-depends: + process diff --git a/npins/sources.json b/npins/sources.json index c6de909e..15e6974a 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -182,11 +182,11 @@ "owner": "nixos", "repo": "nixpkgs" }, - "branch": "nixos-25.11-small", + "branch": "nixos-25.11", "submodules": false, - "revision": "6c1fc6e4c93c084d0ae654ee85dc16cfe53b12b0", - "url": "https://github.com/nixos/nixpkgs/archive/6c1fc6e4c93c084d0ae654ee85dc16cfe53b12b0.tar.gz", - "hash": "sha256-3tAkeUYt7WBVgNfaXDW6HnrrGSuZooZ8nIAnbmKsY2A=" + "revision": "fa83fd837f3098e3e678e6cf017b2b36102c7211", + "url": "https://github.com/nixos/nixpkgs/archive/fa83fd837f3098e3e678e6cf017b2b36102c7211.tar.gz", + "hash": "sha256-e7VO/kGLgRMbWtpBqdWl0uFg8Y2XWFMdz0uUJvlML8o=" }, "npins": { "type": "GitRelease", diff --git a/shell.nix b/shell.nix index 31c91133..5b89b246 100644 --- a/shell.nix +++ b/shell.nix @@ -6,6 +6,7 @@ in overlays = map import [ ./nix/overlays/disko.nix ./nix/overlays/npins.nix + ./nix/packages/overlay.nix ]; }, withGHC ? false, @@ -17,11 +18,10 @@ pkgs.mkShell { packages = with pkgs; [ - just - jq - npins + npins # from npins repo + disko # from disko flake + manage nixos-anywhere # comes from nixpkgs - disko # comes from disko flake ] ++ lib.optionals withGHC [ (haskellPackages.ghcWithPackages (self: [