Files
Nomarchy/installer/install-nomarchy.sh
Bernardo Magri 1b4535aa0a feat(installer): add internet wizard, localization, and software profiles
- Add interactive internet connectivity check with nmtui wizard
- Implement searchable timezone selection using gum filter
- Add keyboard layout selection with custom input fallback
- Implement multi-select software profiles (Dev, Gaming, Media)
- Generate clean downstream scaffolding with system.nix/home.nix stubs
2026-04-03 21:06:53 +01:00

342 lines
11 KiB
Bash

#!/usr/bin/env bash
set -e
echo "Welcome to the Nomarchy - A NixOS-based distribution with Omarchy flavour Installer"
echo "Checking internet connectivity..."
while ! ping -c 1 8.8.8.8 &> /dev/null; do
echo "Error: No internet connection detected. An active connection is required to install Nomarchy."
CHOICE=$(gum choose "Open Network Manager (nmtui)" "Retry Connection" "Exit Installer")
if [ "$CHOICE" = "Open Network Manager (nmtui)" ]; then
nmtui
elif [ "$CHOICE" = "Exit Installer" ]; then
echo "Exiting installer."
exit 1
fi
echo "Re-checking internet connectivity..."
done
echo "Internet connection verified."
# 0. Environment Setup
NOMARCHY_REPO=""
if [ -d "/etc/nomarchy" ]; then
NOMARCHY_REPO="/etc/nomarchy"
elif [ -d "$(dirname "$0")/.." ] && [ -f "$(dirname "$0")/../flake.nix" ]; then
NOMARCHY_REPO="$(realpath "$(dirname "$0")/..")"
fi
if [ -z "$NOMARCHY_REPO" ]; then
echo "Nomarchy repository not found. Please run this script from the repository root or on a Nomarchy live ISO."
exit 1
fi
# 1. Hardware Detection & Mapping
PRODUCT_NAME=$(cat /sys/class/dmi/id/product_name 2>/dev/null || echo "Unknown")
BOARD_NAME=$(cat /sys/class/dmi/id/board_name 2>/dev/null || echo "Unknown")
CPU_VENDOR=$(lscpu | grep "Vendor ID" | awk '{print $3}')
echo "Detected hardware: $PRODUCT_NAME ($BOARD_NAME)"
echo "Detected CPU: $CPU_VENDOR"
HARDWARE_MODULES=""
NOMARCHY_HW_OPTS=""
# Add generic CPU optimizations
if [[ "$CPU_VENDOR" == "AuthenticAMD" ]]; then
HARDWARE_MODULES="inputs.nixos-hardware.nixosModules.common-cpu-amd"
elif [[ "$CPU_VENDOR" == "GenuineIntel" ]]; then
HARDWARE_MODULES="inputs.nixos-hardware.nixosModules.common-cpu-intel"
fi
# Comprehensive Hardware Selection
echo "Searching for optimized hardware profiles..."
echo "Select your hardware vendor/category:"
VENDOR=$(gum choose --header "Select Vendor" \
"acer" "apple" "asus" "dell" "framework" "google" "hp" "lenovo" "microsoft" "msi" "purism" "samsung" "starlabs" "system76" "toshiba" "None/Generic")
if [ "$VENDOR" != "None/Generic" ]; then
echo "Select specific model for $VENDOR:"
case $VENDOR in
dell)
MODEL=$(gum choose "xps-13-9300" "xps-13-9310" "xps-13-9343" "xps-13-9360" "xps-13-9370" "xps-13-9380" "xps-15-7590" "xps-15-9500" "xps-15-9510" "xps-15-9550" "precision-5510" "precision-5530")
HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.dell-$MODEL"
[[ "$MODEL" == *"xps"* ]] && NOMARCHY_HW_OPTS="nomarchy.hardware.isXPS = true;"
;;
lenovo)
MODEL=$(gum choose "thinkpad-x1-carbon-gen7" "thinkpad-x1-carbon-gen8" "thinkpad-x1-carbon-gen9" "thinkpad-x1-carbon-gen10" "thinkpad-x1-extreme" "thinkpad-t480" "thinkpad-t490" "thinkpad-t14-amd" "thinkpad-t14-intel" "thinkpad-p1-gen3")
HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.lenovo-$MODEL"
;;
framework)
MODEL=$(gum choose "13-7040-amd" "13-intel-12th-gen" "13-intel-13th-gen" "16-7040-amd")
HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.framework-$MODEL"
NOMARCHY_HW_OPTS="nomarchy.hardware.isFramework = true;"
;;
microsoft)
MODEL=$(gum choose "surface-pro-7" "surface-pro-8" "surface-pro-9" "surface-laptop-3" "surface-laptop-4")
HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.microsoft-$MODEL"
;;
apple)
MODEL=$(gum choose "macbook-pro-12-1" "macbook-air-6-2" "t2")
if [ "$MODEL" == "t2" ]; then
NOMARCHY_HW_OPTS="nomarchy.hardware.isT2Mac = true;"
else
HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.apple-$MODEL"
fi
;;
*)
echo "Enter the nixos-hardware module path (e.g. inputs.nixos-hardware.nixosModules.common-cpu-amd):"
INPUT_MOD=$(gum input --placeholder "inputs.nixos-hardware.nixosModules.xxx")
HARDWARE_MODULES="$HARDWARE_MODULES\n $INPUT_MOD"
;;
esac
fi
# 2. Storage Setup
echo "Select the target drive for installation:"
DRIVES=$(lsblk -d -n -p -o NAME,SIZE | grep -v loop)
TARGET_DRIVE=$(echo "$DRIVES" | gum choose | awk '{print $1}')
if [ -z "$TARGET_DRIVE" ]; then
echo "No drive selected. Exiting."
exit 1
fi
echo "Select the partition layout:"
LAYOUT=$(gum choose "Standard Ext4" "Encrypted BTRFS (LUKS2)")
IMPERMANENCE="No"
if [ "$LAYOUT" = "Standard Ext4" ]; then
DISKO_FILE="installer/disko-ext4.nix"
else
DISKO_FILE="installer/disko-btrfs-luks.nix"
echo "Enable Impermanence? (Erase root partition on every boot)"
IMPERMANENCE=$(gum choose "Yes" "No")
fi
if [ -f "/etc/$(basename "$DISKO_FILE")" ]; then
DISKO_NIX="/etc/$(basename "$DISKO_FILE")"
else
DISKO_NIX="$NOMARCHY_REPO/$DISKO_FILE"
fi
TMP_DISKO=$(mktemp --suffix=.nix)
sed "s|@TARGET_DRIVE@|$TARGET_DRIVE|g" "$DISKO_NIX" > "$TMP_DISKO"
sudo env PATH="$PATH" disko --mode disko "$TMP_DISKO"
# 3. User Details
USERNAME=$(gum input --placeholder "Enter target username")
if [ -z "$USERNAME" ]; then
echo "No username entered. Exiting."
exit 1
fi
# 4. Localization
echo "Select your Timezone (e.g., America/New_York, Europe/London):"
TIMEZONES=$(timedatectl list-timezones || echo "UTC")
TIMEZONE=$(echo "$TIMEZONES" | gum filter --placeholder "Type to search timezones...")
if [ -z "$TIMEZONE" ]; then
echo "No timezone selected. Defaulting to UTC."
TIMEZONE="UTC"
fi
echo "Select your Keyboard Layout:"
LAYOUT_SELECTION=$(gum choose "us" "uk" "de" "fr" "es" "it" "br-abnt2" "latam" "Other...")
if [ "$LAYOUT_SELECTION" = "Other..." ]; then
KEYBOARD_LAYOUT=$(gum input --placeholder "Enter your keyboard layout (e.g., jp, se, ch)")
else
KEYBOARD_LAYOUT="$LAYOUT_SELECTION"
fi
if [ -z "$KEYBOARD_LAYOUT" ]; then
echo "No layout selected. Defaulting to us."
KEYBOARD_LAYOUT="us"
fi
# 4.5. Software Profiles
echo "Select additional software profiles to install (Press Space to select, Enter to confirm):"
PROFILES=$(gum choose --no-limit "Development (VSCode, Docker, DBs)" "Gaming (Steam, Lutris)" "Media Production (OBS, Kdenlive)")
PROFILE_SYSTEM_PKGS=""
PROFILE_HOME_PKGS=""
PROFILE_SYSTEM_CONFIG=""
if [[ $PROFILES == *"Development"* ]]; then
PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n vscode\n docker-compose\n dbeaver-bin"
PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n virtualisation.docker.enable = true;"
fi
if [[ $PROFILES == *"Gaming"* ]]; then
PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n lutris\n protonup-qt\n mangohud"
PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n programs.steam.enable = true;"
fi
if [[ $PROFILES == *"Media Production"* ]]; then
PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n obs-studio\n kdenlive\n gimp\n audacity"
fi
if [[ "$IMPERMANENCE" == "Yes" ]]; then
PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n nomarchy.system.impermanence.enable = true;"
fi
# 5. Login Preferences
echo "Select login preference:"
LOGIN_PREF=$(gum choose "SDDM Auto-login" "Require Password")
# Generate /mnt/etc/nixos/login-preference.nix
mkdir -p /mnt/etc/nixos/
cat <<EOF > /mnt/etc/nixos/login-preference.nix
{
services.displayManager.autoLogin.enable = $(if [ "$LOGIN_PREF" = "SDDM Auto-login" ]; then echo "true"; else echo "false"; fi);
services.displayManager.autoLogin.user = "$USERNAME";
}
EOF
# Generate /mnt/etc/nixos/localization.nix
cat <<EOF > /mnt/etc/nixos/localization.nix
{
time.timeZone = "$TIMEZONE";
services.xserver.xkb.layout = "$KEYBOARD_LAYOUT";
console.keyMap = "$KEYBOARD_LAYOUT";
}
EOF
# Generate /mnt/etc/nixos/hardware-selection.nix
cat <<EOF > /mnt/etc/nixos/hardware-selection.nix
{ inputs, ... }:
{
imports = [
$(echo -e "$HARDWARE_MODULES")
];
$NOMARCHY_HW_OPTS
}
EOF
# 6. Hardware Config
nixos-generate-config --root /mnt
# 7. Modular Downstream Scaffolding
mkdir -p /mnt/etc/nixos/
# Create system.nix (User System Customization)
cat <<EOF > /mnt/etc/nixos/system.nix
{ pkgs, ... }:
{
# Add your personal system-level NixOS settings here.
# This file is for your own custom NixOS modules.
$(echo -e "$PROFILE_SYSTEM_CONFIG")
environment.systemPackages = with pkgs; [
# Add extra system-wide packages here
# wget
# htop$(echo -e "$PROFILE_SYSTEM_PKGS")
];
# Example: How to persist extra directories if using Impermanence
# environment.persistence."/persist" = {
# directories = [
# "/var/lib/docker"
# "/root/.ssh"
# ];
# files = [
# "/etc/my-secret-token.txt"
# ];
# };
}
EOF
# Create home.nix (User Home Customization)
cat <<EOF > /mnt/etc/nixos/home.nix
{ pkgs, ... }:
{
# Add your personal Home Manager settings here.
# This file is for your own custom user modules.
home.packages = with pkgs; [
# Add extra user-level packages here
# neofetch
# ripgrep$(echo -e "$PROFILE_HOME_PKGS")
];
# Example: How to override Nomarchy defaults
# nomarchy.home.terminal = "kitty";
# nomarchy.home.themeOverride = "catppuccin-mocha";
}
EOF
# Create the Master Flake
cat <<EOF > /mnt/etc/nixos/flake.nix
{
description = "My Nomarchy - Downstream Configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nomarchy.url = "path:./nomarchy"; # Offline bundled nomarchy
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
home-manager = {
url = "github:nix-community/home-manager/release-25.11";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, nomarchy, home-manager, ... }@inputs: {
nixosConfigurations.default = nixpkgs.lib.nixosSystem {
specialArgs = { inputs = nomarchy.inputs // inputs; };
modules = [
{ nixpkgs.hostPlatform = "x86_64-linux"; }
# 1. Hardware
./hardware-configuration.nix
./hardware-selection.nix
# 2. Login & Preferences
./login-preference.nix
./localization.nix
# 3. Upstream Nomarchy Core
nomarchy.nixosModules.system
# 4. User System Customization
./system.nix
# 5. Home Manager Integration
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.$USERNAME = {
imports = [
nomarchy.nixosModules.home
./home.nix
];
home.username = "$USERNAME";
home.homeDirectory = "/home/$USERNAME";
home.stateVersion = "25.11";
};
}
];
};
};
}
EOF
# 7. Copy Bundled Flake
echo "Copying bundled upstream Nomarchy flake from $NOMARCHY_REPO..."
cp -rL "$NOMARCHY_REPO" /mnt/etc/nixos/nomarchy
chmod -R u+w /mnt/etc/nixos/nomarchy
# 8. Version Control
cd /mnt/etc/nixos/
git init
git add .
git config user.name "Nomarchy Installer"
git config user.email "installer@nomarchy"
git commit -m "Initial Nomarchy generation"
# 8.5. Impermanence Redirection
if [[ "$IMPERMANENCE" == "Yes" ]]; then
echo "Redirecting /etc/nixos to persistent storage..."
mkdir -p /mnt/persist/etc
mv /mnt/etc/nixos /mnt/persist/etc/
mkdir -p /mnt/etc
ln -s /persist/etc/nixos /mnt/etc/nixos
fi
# 9. Execution
nixos-install --flake /mnt/etc/nixos#default --no-root-passwd