From 2b420c119e51c9313991eaae02b5a729b169bbf5 Mon Sep 17 00:00:00 2001 From: Nick Heppler Date: Sat, 28 Dec 2024 11:22:28 -0500 Subject: [PATCH] Sets the system timezone based on geolocation or user input. --- setup.sh | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 106 insertions(+), 8 deletions(-) diff --git a/setup.sh b/setup.sh index a49c40b..43390ea 100644 --- a/setup.sh +++ b/setup.sh @@ -1,10 +1,22 @@ #!/bin/bash - -# Script to update a RHEL-based Linux system, set the timezone, change the hostname, -# add a limited user account, modify sshd_config settings, and optionally install Docker CE +# +# Script to perform system maintenance on a RHEL-based Linux system. +# +# This script: +# - Updates package manager and installed packages +# - Sets the system timezone based on geolocation or user input +# - Changes the system hostname and updates /etc/hosts +# - Creates a limited user account and modifies SSH settings +# - Optionally installs Docker CE +# +# Prerequisites: +# - The script must be run as root or with sudo privileges +# +# Usage: +# - Run the script directly on the system or via SSH. +# - Respond to prompts as required during the script execution. # Variables -timezone="America/New_York" sshd_config="/etc/ssh/sshd_config" docker_installed=false @@ -53,6 +65,8 @@ install_docker() { usermod -aG docker "$username" echo "User $username added to the docker group." + # Clean up get-docker.sh + rm -f get-docker.sh } # Function to create a limited user account @@ -60,6 +74,13 @@ create_user_account() { read -p "Please enter the username for the new user account: " username read -sp "Please enter the password for the new user account: " password echo + read -sp "Please confirm the password: " password_confirm + echo + + if [ "$password" != "$password_confirm" ]; then + echo "Passwords do not match. Exiting." + exit 1 + fi # Create the user and add to the wheel group if id "$username" &>/dev/null; then @@ -97,8 +118,81 @@ elif command -v yum &> /dev/null; then fi # Change the timezone -echo "Setting timezone to $timezone..." -timedatectl set-timezone "$timezone" + +# Function to set the timezone to UTC in case of an error +set_utc_timezone() { + echo "Error occurred while determining the timezone. Falling back to UTC." + timedatectl set-timezone UTC +} + +# Function to get the timezone from the ipinfo.io API +get_timezone_from_api() { + # Fetch geolocation information using the ipinfo.io API + response=$(curl -s https://ipinfo.io) + + # Check if the curl command succeeded and the response contains the 'timezone' field + if [ $? -eq 0 ] && echo "$response" | grep -q "timezone"; then + # Extract the timezone directly from the JSON response + timezone=$(echo "$response" | jq -r '.timezone') + + echo "Detected timezone: $timezone" + return 0 + else + set_utc_timezone + return 1 + fi +} + +# Function to prompt the user to choose a timezone +prompt_for_timezone() { + echo "" + echo "Choose a timezone option:" + echo "1) Use the detected timezone ($1)" + echo "2) Use UTC" + echo "3) Enter a custom timezone" + + # Read user choice + read -p "Enter the number corresponding to your choice: " choice + + case "$choice" in + 1) + echo "You chose to use the detected timezone: $1" + timedatectl set-timezone "$1" + ;; + 2) + echo "You chose to use UTC." + timedatectl set-timezone UTC + ;; + 3) + # Ask for a custom timezone + read -p "Enter your preferred timezone (e.g., Europe/London, America/New_York): " custom_timezone + + if timedatectl list-timezones | grep -q "$custom_timezone"; then + timedatectl set-timezone "$custom_timezone" + else + echo "Invalid timezone. Falling back to UTC." + timedatectl set-timezone UTC + fi + ;; + *) + echo "Invalid choice. Falling back to UTC." + timedatectl set-timezone UTC + ;; + esac +} + +# Main script execution starts here +echo "Attempting to detect and set the timezone..." + +# Try to get the detected timezone from the API +if get_timezone_from_api; then + # If the timezone was successfully detected, prompt the user for their choice + prompt_for_timezone "$timezone" +else + # If no timezone was detected, ask the user to fall back to UTC + echo "Unable to detect timezone. Falling back to UTC." + timedatectl set-timezone UTC +fi # Change the hostname prompt_for_hostname @@ -115,7 +209,11 @@ create_user_account echo "Modifying SSH configuration..." if [ -f "$sshd_config" ]; then # Set PermitRootLogin to no - sed -i 's/^PermitRootLogin .*/PermitRootLogin no/' "$sshd_config" || echo "PermitRootLogin no" >> "$sshd_config" + if ! grep -q "^PermitRootLogin" "$sshd_config"; then + echo "PermitRootLogin no" >> "$sshd_config" + else + sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' "$sshd_config" + fi # Set PasswordAuthentication to no if grep -q '^#PasswordAuthentication' "$sshd_config"; then @@ -167,4 +265,4 @@ elif command -v yum &> /dev/null; then yum -y autoremove fi -echo "System update complete! Timezone set to $timezone, hostname set to $hostname, limited user created, sshd_config modified, and Docker installation completed if selected." \ No newline at end of file +echo "System update complete! Timezone set to ${timezone:-UTC}, hostname set to $hostname, limited user created, sshd_config modified, and Docker installation completed if selected."