222 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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}"
 |