143 lines
		
	
	
		
			4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4 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
 | |
| }
 | |
| 
 | |
| # 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 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
 | |
| 
 | |
|   _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"
 | |
|     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}"
 |