#!/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" chmod u+rw "$HOME/.config/home-manager/$f" fi done home-manager switch --flake "$HOME/.config/home-manager#admin" touch "$HOME/.config/home-manager/.hm_bootstrap_done"