From 62109df95eadadd4f7ee48597aca7b4cc40cace7 Mon Sep 17 00:00:00 2001 From: Joshua Yuen Date: Thu, 31 Jul 2025 01:28:46 -0400 Subject: [PATCH] Add template install-system shell script to live ISO --- flake.lock | 17 +++ flake.nix | 10 +- scripts/_template/flake.lock | 27 +++++ scripts/_template/flake.nix | 30 +++++ scripts/_template/template.sh | 140 +++++++++++++++++++++++ scripts/install-system/flake.lock | 27 +++++ scripts/install-system/flake.nix | 29 +++++ scripts/install-system/install-system.sh | 136 ++++++++++++++++++++++ 8 files changed, 414 insertions(+), 2 deletions(-) create mode 100644 scripts/_template/flake.lock create mode 100644 scripts/_template/flake.nix create mode 100644 scripts/_template/template.sh create mode 100644 scripts/install-system/flake.lock create mode 100644 scripts/install-system/flake.nix create mode 100644 scripts/install-system/install-system.sh diff --git a/flake.lock b/flake.lock index ffcd509..7a28f38 100644 --- a/flake.lock +++ b/flake.lock @@ -158,6 +158,22 @@ "type": "github" } }, + "install-system": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "path": "scripts/install-system", + "type": "path" + }, + "original": { + "path": "scripts/install-system", + "type": "path" + }, + "parent": [] + }, "nixpkgs": { "locked": { "lastModified": 1753345091, @@ -203,6 +219,7 @@ "root": { "inputs": { "home-manager": "home-manager", + "install-system": "install-system", "nixpkgs": "nixpkgs", "stylix": "stylix" } diff --git a/flake.nix b/flake.nix index 1ae63c1..4f486ac 100644 --- a/flake.nix +++ b/flake.nix @@ -9,11 +9,16 @@ }; stylix = { url = "github:danth/stylix/release-25.05"; - inputs.nixpkgs.follows = "nixpkgs"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + install-system = { + url = "path:scripts/install-system"; + inputs.nixpkgs.follows = "nixpkgs"; }; }; - outputs = { nixpkgs, home-manager, ... } @ inputs: let + outputs = { nixpkgs, home-manager, install-system, ... } @ inputs: let system = "x86_64-linux"; host = "vm"; profile = "vm"; @@ -43,6 +48,7 @@ }; modules = [ (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix") + { environment.systemPackages = [ install-system.packages.${system}.default ]; } ./hosts/${host} ]; }; diff --git a/scripts/_template/flake.lock b/scripts/_template/flake.lock new file mode 100644 index 0000000..1615c89 --- /dev/null +++ b/scripts/_template/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1753749649, + "narHash": "sha256-+jkEZxs7bfOKfBIk430K+tK9IvXlwzqQQnppC2ZKFj4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1f08a4df998e21f4e8be8fb6fbf61d11a1a5076a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/scripts/_template/flake.nix b/scripts/_template/flake.nix new file mode 100644 index 0000000..b125a85 --- /dev/null +++ b/scripts/_template/flake.nix @@ -0,0 +1,30 @@ +{ + description = "_template package and shell environment"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + }; + + outputs = { self, nixpkgs, ... }: let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}.pkgs; + name = builtins.baseNameOf (builtins.toString ./.); + shellApplication = pkgs.writeShellApplication { + inherit name; + + text = builtins.readFile ./${name}.sh; + + runtimeInputs = with pkgs; [ + coreutils + gnused + unixtools.column + ]; + }; + in { + packages.${system}.default = shellApplication; + + devShells.${system}.default = pkgs.mkShell { + packages = [ shellApplication ]; + }; + }; +} \ No newline at end of file diff --git a/scripts/_template/template.sh b/scripts/_template/template.sh new file mode 100644 index 0000000..c00cc6f --- /dev/null +++ b/scripts/_template/template.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash +# https://github.com/nicolas-goudry/nix-config + +# set +e # Do not exit on error +set -e # Exit on error +set +u # Allow unset variables +# set -u # Exit on unset variable +# set +o pipefail # Disable pipefail +set -o pipefail # Enable pipefail + +script_name=$(basename "${0}") +nc="\e[0m" # Unset styles +bld="\e[1m" # Bold text +dim="\e[2m" # Dim text +red="\e[31m" # Red foreground +green="\e[32m" # Green foreground +yellow="\e[33m" # Yellow foreground +blue="\e[34m" # Blue foreground + +to_stderr() { + >&2 echo -e "${*}" +} + +to_stdout() { + echo -e "${*}" +} + +error() { + to_stderr " ${red}×${nc} ${*}" +} + +warn() { + to_stderr " ${yellow}⚠${nc} ${*}" +} + +info() { + to_stdout " ${blue}i${nc} ${*}" +} + +debug() { + if [ -n "${debug}" ]; then + to_stderr " ${dim}▶ ${*}${nc}" + fi +} + +success() { + to_stdout " ${green}✓${nc} ${*}" +} + +trace() { + to_stderr "Stacktrace:" + + local i=1 line file func + while read -r line func file < <(caller ${i}); do + to_stderr "[${i}] ${file}:${line} ${func}(): $(sed -n "${line}p" "${file}")" + ((i++)) + done +} + +# shellcheck disable=SC2120 +die() { + if [ "${#}" -gt 0 ]; then + error "${*}" + fi + + exit 1 +} + +needs_arg() { + if [ -z "${OPTARG}" ]; then + >&2 echo "${0}: option requires an argument -- ${OPT}" + usage + die + fi +} + +usage() { + echo + echo "Template script." + echo + to_stdout "${bld}Usage:${nc}" + to_stdout " ${dim}\$${nc} ${script_name}" + echo + to_stdout "${bld}Options:${nc}" + cat <&2 echo "${0}: illegal option -- $OPT" + usage + die + ;; + ? ) # bad short option (error reported via getopts) + usage + die + ;; + esac + done + + debug "Start of main" + echo "This is a template." + + if [ -n "${OPTION}" ]; then + debug "Option is not empty" + echo "Option is set to: ${OPTION}" + fi +} + +main "$@" \ No newline at end of file diff --git a/scripts/install-system/flake.lock b/scripts/install-system/flake.lock new file mode 100644 index 0000000..1615c89 --- /dev/null +++ b/scripts/install-system/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1753749649, + "narHash": "sha256-+jkEZxs7bfOKfBIk430K+tK9IvXlwzqQQnppC2ZKFj4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1f08a4df998e21f4e8be8fb6fbf61d11a1a5076a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/scripts/install-system/flake.nix b/scripts/install-system/flake.nix new file mode 100644 index 0000000..be569bd --- /dev/null +++ b/scripts/install-system/flake.nix @@ -0,0 +1,29 @@ +{ + description = "install-system package and shell environment"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + }; + + outputs = { self, nixpkgs, ... }: let + pkgs = nixpkgs.legacyPackages.x86_64-linux.pkgs; + name = builtins.baseNameOf (builtins.toString ./.); + shellApplication = pkgs.writeShellApplication { + inherit name; + + text = builtins.readFile ./${name}.sh; + + runtimeInputs = with pkgs; [ + coreutils + gnused + unixtools.column + ]; + }; + in { + packages.x86_64-linux.default = shellApplication; + + devShells.x86_64-linux.default = pkgs.mkShell { + packages = [ shellApplication ]; + }; + }; +} \ No newline at end of file diff --git a/scripts/install-system/install-system.sh b/scripts/install-system/install-system.sh new file mode 100644 index 0000000..8ee5452 --- /dev/null +++ b/scripts/install-system/install-system.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash + +set -e # Exit on error +set +u # Allow unset variables +set -o pipefail # Enable pipefail + +script_name=$(basename "${0}") +nc="\e[0m" # Unset styles +bld="\e[1m" # Bold text +dim="\e[2m" # Dim text +red="\e[31m" # Red foreground +green="\e[32m" # Green foreground +yellow="\e[33m" # Yellow foreground +blue="\e[34m" # Blue foreground + +to_stderr() { + >&2 echo -e "${*}" +} + +to_stdout() { + echo -e "${*}" +} + +error() { + to_stderr " ${red}×${nc} ${*}" +} + +warn() { + to_stderr " ${yellow}⚠${nc} ${*}" +} + +info() { + to_stdout " ${blue}i${nc} ${*}" +} + +debug() { + if [ -n "${debug}" ]; then + to_stderr " ${dim}▶ ${*}${nc}" + fi +} + +success() { + to_stdout " ${green}✓${nc} ${*}" +} + +trace() { + to_stderr "Stacktrace:" + + local i=1 line file func + while read -r line func file < <(caller ${i}); do + to_stderr "[${i}] ${file}:${line} ${func}(): $(sed -n "${line}p" "${file}")" + ((i++)) + done +} + +# shellcheck disable=SC2120 +die() { + if [ "${#}" -gt 0 ]; then + error "${*}" + fi + + exit 1 +} + +needs_arg() { + if [ -z "${OPTARG}" ]; then + to_stderr "${0}: option requires an argument -- ${OPT}" + usage + die + fi +} + +usage() { + to_stdout + to_stdout "NixOS installation helper script." + to_stdout + to_stdout "${bld}Usage:${nc}" + to_stdout " ${dim}\$${nc} ${script_name}" + to_stdout + to_stdout "${bld}Options:${nc}" + cat <&2 echo "${0}: illegal option -- $OPT" + usage + die + ;; + ? ) # bad short option (error reported via getopts) + usage + die + ;; + esac + done + + debug "Start of main" + info "This is a template." + + if [ -n "${OPTION}" ]; then + debug "Option is not empty" + debug "Option is set to: ${OPTION}" + fi +} + +main "${@}" \ No newline at end of file