#!/usr/bin/env bash RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Determine the operating system export OS=$(uname) # Primary network interface if [[ "$OS" != "Darwin" ]]; then export PRIMARY_IFACE=$(ip -o -4 route show to default | awk '{print $5}') echo -e "${GREEN}Found primary network interface $PRIMARY_IFACE${NC}" fi # Custom print function _print() { if [[ "$OS" == "Darwin" ]]; then echo -e "$1" else echo "$1" fi } # Custom prompt function _prompt() { local message="$1" local variable="$2" _print "$message" read -r $variable } insert_secrets_output() { local pattern="outputs = { self, darwin, nix-homebrew, homebrew-bundle, homebrew-core, homebrew-cask, home-manager, nixpkgs, disko, agenix } @inputs:" local insert_text="secrets " awk -v pat="$pattern" -v insert="$insert_text" ' $0 ~ pat { sub(/} @inputs:/, ", " insert "} @inputs:"); # Replace the closing brace with the insert text followed by the brace gsub(/ ,/, ","); # Correct any spaces before commas print next } { print } ' flake.nix > flake.nix.tmp mv flake.nix.tmp flake.nix } insert_secrets_input() { # Define file path FILE_PATH="flake.nix" # Backup the original file cp "$FILE_PATH" "${FILE_PATH}.bak" # Temporary file for the text to insert TEMP_FILE="temp_insert.txt" # Write the formatted text to the temporary file cat > "$TEMP_FILE" << 'EOF' secrets = { url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git"; flake = false; }; EOF # Check if the 'secrets' block already exists if grep -q 'url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git"' "$FILE_PATH"; then echo "The 'secrets' block already exists in the file." rm "$TEMP_FILE" rm "${FILE_PATH}.bak" exit 0 fi # Find the start and end line numbers of the 'disko' block START_LINE=$(grep -n 'disko = {' "$FILE_PATH" | head -n 1 | cut -d: -f1) END_LINE=$(tail -n +$START_LINE "$FILE_PATH" | grep -n '};' | head -n 1 | cut -d: -f1) END_LINE=$((START_LINE + END_LINE - 1)) # Create a new file with the insertion { sed -n "1,${END_LINE}p" "$FILE_PATH" cat "$TEMP_FILE" sed -n "$((END_LINE + 1)),\$p" "$FILE_PATH" } > "${FILE_PATH}.new" # Replace the original file with the new file mv "${FILE_PATH}.new" "$FILE_PATH" # Clean up the temporary files rm "$TEMP_FILE" rm "${FILE_PATH}.bak" } # Fetch username from the system export USERNAME=$(whoami) # If the username is 'nixos' or 'root', ask the user for their username if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME fi # Check if git is available if command -v git >/dev/null 2>&1; then # Fetch email and name from git config export GIT_EMAIL=$(git config --get user.email) export GIT_NAME=$(git config --get user.name) else _print "${RED}Git is not available on this system.${NC}" fi # If git email is not found or git is not available, ask the user if [[ -z "$GIT_EMAIL" ]]; then _prompt "${YELLOW}Please enter your email: ${NC}" GIT_EMAIL fi # If git name is not found or git is not available, ask the user if [[ -z "$GIT_NAME" ]]; then _prompt "${YELLOW}Please enter your name: ${NC}" GIT_NAME fi _prompt "${YELLOW}Please enter your Github username: ${NC}" GITHUB_USER _prompt "${YELLOW}Please enter your Github secrets repository name: ${NC}" GITHUB_SECRETS_REPO export GITHUB_USER export GITHUB_SECRETS_REPO select_boot_disk() { local disks local _boot_disk _print "${YELLOW}Available disks:${NC}" disks=$(lsblk -nd --output NAME,SIZE | grep -v loop) echo "$disks" # Warning message for data deletion _print "${RED}WARNING: All data on the chosen disk will be erased during the installation!${NC}" _prompt "${YELLOW}Please choose your boot disk (e.g., nvme0n1, sda): ${NC}" _boot_disk # Confirmation for disk selection to prevent accidental data loss _print "${YELLOW}You have selected $_boot_disk as the boot disk. This will delete everything on this disk. Are you sure? (Y/N): ${NC}" read -r confirmation if [[ "$confirmation" =~ ^[Yy]$ ]]; then export BOOT_DISK=$_boot_disk else _print "${RED}Disk selection cancelled by the user. Please run the script again to select the correct disk.${NC}" exit 1 fi } # Set hostname and find primary disk if this is NixOS if [[ "$OS" != "Darwin" ]]; then _prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME export HOST_NAME select_boot_disk fi # Confirmation step confirm_details() { _print "${GREEN}Username: $USERNAME" _print "Email: $GIT_EMAIL" _print "Name: $GIT_NAME${NC}" if([[ "$OS" != "Darwin" ]]); then _print "${GREEN}Primary interface: $PRIMARY_IFACE" _print "Boot disk: $BOOT_DISK" _print "Hostname: $HOST_NAME${NC}" fi _print "${GREEN}Secrets repository: $GITHUB_USER/$GITHUB_SECRETS_REPO${NC}" _prompt "${YELLOW}Is this correct? (Y/N): ${NC}" choice case "$choice" in [Nn] ) _print "${RED}Exiting script.${NC}" && exit 1;; [Yy] ) _print "${GREEN}Continuing...${NC}";; * ) _print "${RED}Invalid option. Exiting script.${NC}" && exit 1;; esac } # Call the confirmation function confirm_details # Function to replace tokens in each file replace_tokens() { local file="$1" if [[ $(basename $1) != "apply" ]]; then if [[ "$OS" == "Darwin" ]]; then # macOS LC_ALL=C LANG=C sed -i '' -e "s/%USER%/$USERNAME/g" "$file" LC_ALL=C LANG=C sed -i '' -e "s/%EMAIL%/$GIT_EMAIL/g" "$file" LC_ALL=C LANG=C sed -i '' -e "s/%NAME%/$GIT_NAME/g" "$file" LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file" LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file" else # Linux or other sed -i -e "s/%USER%/$USERNAME/g" "$file" sed -i -e "s/%EMAIL%/$GIT_EMAIL/g" "$file" sed -i -e "s/%NAME%/$GIT_NAME/g" "$file" sed -i -e "s/%INTERFACE%/$PRIMARY_IFACE/g" "$file" sed -i -e "s/%DISK%/$BOOT_DISK/g" "$file" sed -i -e "s/%HOST%/$HOST_NAME/g" "$file" sed -i -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file" sed -i -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file" fi fi } # Insert secrets repo into flake insert_secrets_input insert_secrets_output # Traverse directories and call replace_tokens on each Nix file export -f replace_tokens find . -type f -exec bash -c 'replace_tokens "$0"' {} \; echo "$USERNAME" > /tmp/username.txt _print "${GREEN}User $USERNAME information applied.${NC}"