#!/usr/bin/env bash VERSION=1.0 # Color codes 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 } ask_for_star() { _print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}" local response read -r response response=${response:-yes} # Set default response to 'yes' if input is empty if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then if [[ "$OS" == "Darwin" ]]; then open "https://github.com/dustinlyons/nixos-config" else xdg-open "https://github.com/dustinlyons/nixos-config" fi fi } ask_for_star # 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 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 enter the name of your boot disk (e.g., sda, nvme0n1). Do not include the full path ("/dev/"): ${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 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 _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice case "$choice" in [Nn] | [Nn][Oo] ) _print "${RED}Exiting script.${NC}" exit 1 ;; [Yy] | [Yy][Ee][Ss] ) _print "${GREEN}Continuing...${NC}" ;; * ) _print "${RED}Invalid option. Exiting script.${NC}" exit 1 ;; esac } 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" 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" fi fi } # 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}"