Add HM bootstrap script and tidy installer workflow
This commit is contained in:
parent
dd15c09fdd
commit
d1713bdc99
10 changed files with 184 additions and 43 deletions
75
scripts/hm-bootstrap.sh
Normal file
75
scripts/hm-bootstrap.sh
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Ensure basic PATH for user units
|
||||
export PATH="/run/current-system/sw/bin:${PATH:-}"
|
||||
|
||||
# Try to hook into the session bus if available
|
||||
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && [ -S "/run/user/$(id -u)/bus" ]; then
|
||||
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
|
||||
fi
|
||||
|
||||
# Only continue in an active, unlocked user session
|
||||
if command -v loginctl >/dev/null 2>&1 && [ -n "${XDG_SESSION_ID:-}" ]; then
|
||||
session_class=$(loginctl show-session "${XDG_SESSION_ID}" -p Class --value 2>/dev/null || echo "")
|
||||
session_state=$(loginctl show-session "${XDG_SESSION_ID}" -p State --value 2>/dev/null || echo "")
|
||||
session_locked=$(loginctl show-session "${XDG_SESSION_ID}" -p LockedHint --value 2>/dev/null || echo "yes")
|
||||
if [ "${session_class}" != "user" ] || [ "${session_state}" != "active" ] || [ "${session_locked}" != "no" ]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
wait_for_notifications() {
|
||||
# Wait briefly for GNOME Shell notifications to come up and the session to be unlocked.
|
||||
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] || ! command -v gdbus >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Do not notify in greeter sessions.
|
||||
if [ "${XDG_SESSION_CLASS:-}" != "user" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# If loginctl is available, wait until this session is unlocked and class=user (not greeter).
|
||||
if command -v loginctl >/dev/null 2>&1 && [ -n "${XDG_SESSION_ID:-}" ]; then
|
||||
for _ in 1 2 3 4 5 6 7; do
|
||||
session_class=$(loginctl show-session "${XDG_SESSION_ID}" -p Class --value 2>/dev/null || echo "")
|
||||
locked=$(loginctl show-session "${XDG_SESSION_ID}" -p LockedHint --value 2>/dev/null || echo "yes")
|
||||
if [ "${session_class}" = "user" ] && [ "${locked}" = "no" ]; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
fi
|
||||
|
||||
for _ in 1 2 3 4 5 6 7; do
|
||||
if gdbus introspect --session \
|
||||
--dest org.freedesktop.Notifications \
|
||||
--object-path /org/freedesktop/Notifications >/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
notify() {
|
||||
local title="$1"
|
||||
shift || true
|
||||
if command -v notify-send >/dev/null 2>&1 && wait_for_notifications; then
|
||||
notify-send --app-name="Bootstrap" --urgency=critical --expire-time=0 "$title" "$@" >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
notify "System setup running" "Please wait until setup completes."
|
||||
trap 'notify "System setup finished" "You may continue using the system."' EXIT
|
||||
|
||||
mkdir -p "$HOME/.config/home-manager"
|
||||
for f in flake.nix home.nix; do
|
||||
if [ -f "/etc/skel/.config/home-manager/$f" ] && [ ! -e "$HOME/.config/home-manager/$f" ]; then
|
||||
cp "/etc/skel/.config/home-manager/$f" "$HOME/.config/home-manager/$f"
|
||||
fi
|
||||
done
|
||||
|
||||
home-manager switch --flake "$HOME/.config/home-manager#admin"
|
||||
touch "$HOME/.config/home-manager/.hm_bootstrap_done"
|
||||
|
|
@ -2,10 +2,10 @@
|
|||
set -euo pipefail
|
||||
|
||||
# Non-interactive Btrfs installer using the flake in this repo.
|
||||
# Defaults: DISK=/dev/vda HOSTNAME=nanuqsaurus
|
||||
# Defaults: DISK=/dev/vda TARGET_HOST=nanuqsaurus
|
||||
|
||||
DISK=${DISK:-/dev/vda}
|
||||
HOSTNAME=${HOSTNAME:-nanuqsaurus}
|
||||
TARGET_HOST=${TARGET_HOST:-nanuqsaurus}
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_ROOT=$(cd -- "${SCRIPT_DIR}/.." && pwd)
|
||||
|
|
@ -44,9 +44,9 @@ fi
|
|||
|
||||
echo "[6/7] Generating hardware config"
|
||||
mkdir -p /mnt/etc/nixos/hosts
|
||||
nixos-generate-config --root /mnt --show-hardware-config > "/mnt/etc/nixos/hosts/local-${HOSTNAME}-hardware.nix"
|
||||
nixos-generate-config --root /mnt --show-hardware-config > "/mnt/etc/nixos/hosts/local-${TARGET_HOST}-hardware.nix"
|
||||
|
||||
host_file="/mnt/etc/nixos/hosts/local-${HOSTNAME}.nix"
|
||||
host_file="/mnt/etc/nixos/hosts/local-${TARGET_HOST}.nix"
|
||||
if [ ! -e "${host_file}" ]; then
|
||||
cat > "${host_file}" <<EOF
|
||||
{ inputs, ... }:
|
||||
|
|
@ -55,18 +55,20 @@ if [ ! -e "${host_file}" ]; then
|
|||
imports = [
|
||||
inputs.lix-module.nixosModules.lixFromNixpkgs
|
||||
../modules/system/base.nix
|
||||
../modules/system/packages.nix
|
||||
../modules/system/home-manager-skel.nix
|
||||
../modules/desktop/gnome-minimal.nix
|
||||
../modules/users/admin.nix
|
||||
./local-${HOSTNAME}-hardware.nix
|
||||
./local-${TARGET_HOST}-hardware.nix
|
||||
];
|
||||
|
||||
networking.hostName = "${HOSTNAME}";
|
||||
networking.hostName = "${TARGET_HOST}";
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "[7/7] Installing ${HOSTNAME} via flake"
|
||||
nixos-install --root /mnt --flake "/mnt/etc/nixos#${HOSTNAME}" --no-root-passwd |& tee /tmp/nixos-install.log
|
||||
echo "[7/7] Installing ${TARGET_HOST} via flake (local-${TARGET_HOST})"
|
||||
nixos-install --root /mnt --flake "/mnt/etc/nixos#local-${TARGET_HOST}" --no-root-passwd |& tee /tmp/nixos-install.log
|
||||
echo "Install log saved to /tmp/nixos-install.log"
|
||||
|
||||
echo "Install complete. You can reboot now."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue