scripts/scripts/setup_thorium_startup.sh

484 lines
14 KiB
Bash
Executable File

#!/bin/bash
# Script to set up automatic Thorium browser launch with Fitatu website on startup
# Opens https://www.fitatu.com/ in Thorium browser every time the system boots
set -e # Exit on any error
# Default to non-interactive mode
INTERACTIVE_MODE=false
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-i | --interactive)
INTERACTIVE_MODE=true
shift
;;
-h | --help)
echo "Usage: $0 [OPTIONS]"
echo "Options:"
echo " -i, --interactive Enable interactive prompts (default: auto-yes)"
echo " -h, --help Show this help message"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use -h or --help for usage information"
exit 1
;;
esac
done
# Function to check and request sudo privileges
check_sudo() {
if [[ $EUID -ne 0 ]]; then
echo "This script requires sudo privileges to create systemd services."
echo "Requesting sudo access..."
exec sudo "$0" "$@"
fi
}
# Check for sudo privileges after argument parsing
check_sudo "$@"
echo "Thorium Browser Auto-Startup Setup"
echo "=================================="
echo "Current Date: $(date)"
echo "User: $USER"
echo "Original user: ${SUDO_USER:-$USER}"
if [[ $INTERACTIVE_MODE == "true" ]]; then
echo "Mode: Interactive (prompts enabled)"
else
echo "Mode: Automatic (auto-yes, use --interactive for prompts)"
fi
# Target URL
TARGET_URL="https://www.fitatu.com/app/planner"
BROWSER_COMMAND="thorium-browser"
USER_HOME="/home/${SUDO_USER}"
echo ""
echo "Target URL: $TARGET_URL"
echo "Browser: $BROWSER_COMMAND"
echo "User home: $USER_HOME"
# Function to check if Thorium browser is installed
check_thorium_browser() {
echo ""
echo "1. Checking Thorium Browser Installation..."
echo "=========================================="
if ! command -v "$BROWSER_COMMAND" &> /dev/null; then
echo "Warning: Thorium browser not found in PATH"
echo "Checking alternative locations..."
# Check common installation paths
local alt_paths=(
"/opt/thorium/thorium"
"/usr/bin/thorium"
"/usr/local/bin/thorium"
"/opt/thorium-browser/thorium-browser"
"${USER_HOME}/.local/bin/thorium-browser"
)
local found=false
for path in "${alt_paths[@]}"; do
if [[ -x $path ]]; then
BROWSER_COMMAND="$path"
echo "✓ Found Thorium browser at: $path"
found=true
break
fi
done
if [[ $found != true ]]; then
echo "Error: Thorium browser not found!"
echo "Please install Thorium browser first or ensure it's in your PATH."
echo ""
echo "You can install Thorium browser from:"
echo "https://thorium.rocks/"
echo ""
local continue_anyway=false
if [[ $INTERACTIVE_MODE == "true" ]]; then
read -p "Continue anyway? The service will be created but may fail to start (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
continue_anyway=true
fi
else
echo "Auto-continuing anyway - service will be created but may fail to start (use --interactive to prompt)"
continue_anyway=true
fi
if [[ $continue_anyway != true ]]; then
exit 1
fi
fi
else
echo "✓ Thorium browser found: $(which $BROWSER_COMMAND)"
fi
}
# Function to create the browser launcher script
create_launcher_script() {
echo ""
echo "2. Creating Browser Launcher Script..."
echo "====================================="
local launcher_script="/usr/local/bin/thorium-fitatu-launcher.sh"
cat > "$launcher_script" << EOF
#!/bin/bash
# Thorium browser launcher for Fitatu website
# Created by setup_thorium_startup.sh on $(date)
# Set up environment
export DISPLAY=:0
export HOME="$USER_HOME"
# Function to wait for X11 server and desktop environment
wait_for_desktop() {
local max_attempts=30
local attempt=0
echo "Waiting for X11 server and window manager to be ready..." >&2
# Wait for X11 server
while [[ \$attempt -lt \$max_attempts ]]; do
if xset q &>/dev/null 2>&1; then
echo "X11 server is ready" >&2
break
fi
sleep 1
((attempt++))
done
if [[ \$attempt -eq \$max_attempts ]]; then
echo "Timeout waiting for X11 server" >&2
return 1
fi
# Quick check for window manager (no waiting loop)
if pgrep -x i3 >/dev/null 2>&1; then
echo "i3 window manager detected and running" >&2
elif pgrep -x "i3wm" >/dev/null 2>&1; then
echo "i3wm window manager detected and running" >&2
elif wmctrl -m >/dev/null 2>&1; then
echo "Window manager detected via wmctrl" >&2
else
echo "Window manager not detected, proceeding anyway" >&2
fi
return 0
}
# Function to launch browser
launch_browser() {
echo "Launching Thorium browser with Fitatu..." >&2
# Try to launch browser as the original user
if command -v sudo &>/dev/null && [[ -n "${SUDO_USER}" ]]; then
sudo -u "${SUDO_USER}" env DISPLAY=:0 HOME="$USER_HOME" "$BROWSER_COMMAND" "$TARGET_URL" &
else
"$BROWSER_COMMAND" "$TARGET_URL" &
fi
local browser_pid=\$!
echo "Browser launched with PID: \$browser_pid" >&2
return 0
}
# Main execution
echo "\$(date): Starting Thorium-Fitatu launcher" >&2
if wait_for_desktop; then
launch_browser
echo "\$(date): Thorium browser launch completed" >&2
else
echo "\$(date): Failed to launch - desktop environment not ready" >&2
exit 1
fi
EOF
chmod +x "$launcher_script"
echo "✓ Created launcher script: $launcher_script"
}
# Function to create systemd service for user session
create_user_systemd_service() {
echo ""
echo "3. Creating User Systemd Service..."
echo "=================================="
local user_systemd_dir="$USER_HOME/.config/systemd/user"
local service_file="$user_systemd_dir/thorium-fitatu-startup.service"
# Create user systemd directory
sudo -u "${SUDO_USER}" mkdir -p "$user_systemd_dir"
# Create the service file
sudo -u "${SUDO_USER}" tee "$service_file" > /dev/null << EOF
[Unit]
Description=Launch Thorium Browser with Fitatu on Startup
After=graphical-session.target
Wants=graphical-session.target
[Service]
Type=oneshot
Environment=DISPLAY=:0
Environment=HOME=$USER_HOME
ExecStart=/usr/local/bin/thorium-fitatu-launcher.sh
StandardOutput=journal
StandardError=journal
RemainAfterExit=yes
# Restart settings
Restart=no
# Timeout settings
TimeoutStartSec=120
[Install]
WantedBy=default.target
EOF
echo "✓ Created user systemd service: $service_file"
}
# Function to create system-wide systemd service (alternative approach)
create_system_systemd_service() {
echo ""
echo "4. Creating System Systemd Service..."
echo "===================================="
local service_file="/etc/systemd/system/thorium-fitatu-startup.service"
cat > "$service_file" << EOF
[Unit]
Description=Launch Thorium Browser with Fitatu on Startup
After=multi-user.target network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/thorium-fitatu-launcher.sh
StandardOutput=journal
StandardError=journal
RemainAfterExit=yes
# Environment
Environment=DISPLAY=:0
# Restart settings
Restart=no
# Timeout settings
TimeoutStartSec=180
[Install]
WantedBy=multi-user.target
EOF
echo "✓ Created system systemd service: $service_file"
}
# Function to create autostart desktop entry (additional method)
create_autostart_entry() {
echo ""
echo "5. Creating Autostart Desktop Entry..."
echo "====================================="
local autostart_dir="$USER_HOME/.config/autostart"
local desktop_file="$autostart_dir/thorium-fitatu.desktop"
# Create autostart directory
sudo -u "${SUDO_USER}" mkdir -p "$autostart_dir"
# Create desktop entry
sudo -u "${SUDO_USER}" tee "$desktop_file" > /dev/null << EOF
[Desktop Entry]
Type=Application
Name=Thorium Fitatu Startup
Comment=Launch Thorium Browser with Fitatu website
Exec=/usr/local/bin/thorium-fitatu-launcher.sh
Icon=thorium-browser
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
StartupNotify=false
Terminal=false
Categories=Network;WebBrowser;
EOF
echo "✓ Created autostart desktop entry: $desktop_file"
}
# Function to create i3 config autostart entry
create_i3_autostart() {
echo ""
echo "6. Creating i3 Config Autostart Entry..."
echo "======================================="
local i3_config="$USER_HOME/.config/i3/config"
local i3_config_dir="$USER_HOME/.config/i3"
# Create i3 config directory if it doesn't exist
sudo -u "${SUDO_USER}" mkdir -p "$i3_config_dir"
# Check if i3 config exists
if [[ -f $i3_config ]]; then
# Check if autostart entry already exists
if ! sudo -u "${SUDO_USER}" grep -q "thorium-fitatu-launcher" "$i3_config"; then
# Add autostart entry to i3 config
sudo -u "${SUDO_USER}" bash -c "echo '' >> '$i3_config'"
sudo -u "${SUDO_USER}" bash -c "echo '# Auto-start Thorium browser with Fitatu' >> '$i3_config'"
sudo -u "${SUDO_USER}" bash -c "echo 'exec --no-startup-id /usr/local/bin/thorium-fitatu-launcher.sh' >> '$i3_config'"
echo "✓ Added autostart entry to i3 config: $i3_config"
else
echo "✓ Autostart entry already exists in i3 config"
fi
else
echo "Warning: i3 config file not found at $i3_config"
echo "You may need to manually add the following line to your i3 config:"
echo "exec --no-startup-id /usr/local/bin/thorium-fitatu-launcher.sh"
fi
}
# Function to create a script to enable user service after login
create_user_enable_script() {
local enable_script="$USER_HOME/.config/thorium-enable-service.sh"
sudo -u "${SUDO_USER}" tee "$enable_script" > /dev/null << 'EOF'
#!/bin/bash
# Script to enable thorium-fitatu-startup user service
# This runs once to enable the service, then removes itself
# Enable the user service
systemctl --user daemon-reload
systemctl --user enable thorium-fitatu-startup.service
# Remove this script after successful execution
rm "$0"
EOF
sudo -u "${SUDO_USER}" chmod +x "$enable_script"
# Add to user's .bashrc to run on next login
local bashrc="$USER_HOME/.bashrc"
if [[ -f $bashrc ]]; then
sudo -u "${SUDO_USER}" bash -c "echo '' >> '$bashrc'"
sudo -u "${SUDO_USER}" bash -c "echo '# Auto-enable thorium service (temporary)' >> '$bashrc'"
sudo -u "${SUDO_USER}" bash -c "echo '[[ -x ~/.config/thorium-enable-service.sh ]] && ~/.config/thorium-enable-service.sh' >> '$bashrc'"
fi
}
# Function to enable services
enable_services() {
echo ""
echo "7. Enabling Services..."
echo "======================"
# Reload systemd daemon
systemctl daemon-reload
echo "✓ System daemon reloaded"
# Enable system service
systemctl enable thorium-fitatu-startup.service
echo "✓ System service enabled"
# Enable lingering for the user (allows user services to run without login)
loginctl enable-linger "${SUDO_USER}"
echo "✓ User lingering enabled"
# Create a script to enable user service after login
create_user_enable_script
echo "✓ User service will be enabled on next login"
}
# Function to test the setup
test_setup() {
echo ""
echo "8. Testing Setup..."
echo "=================="
local run_test=true
if [[ $INTERACTIVE_MODE == "true" ]]; then
echo "Would you like to test the browser launcher now?"
read -p "Test launch Thorium browser with Fitatu? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
run_test=false
fi
else
echo "Auto-testing the browser launcher (use --interactive to prompt)"
fi
if [[ $run_test == "true" ]]; then
echo "Testing browser launch..."
echo "Note: This will open Thorium browser with Fitatu website"
# Test the launcher immediately
if /usr/local/bin/thorium-fitatu-launcher.sh; then
echo "✓ Test launch completed successfully"
else
echo "✗ Test launch failed"
echo "Check that Thorium browser is properly installed and accessible"
fi
else
echo "Skipping test launch"
fi
}
# Function to show usage instructions
show_instructions() {
echo ""
echo "=========================================="
echo "Thorium Browser Auto-Startup Setup Complete"
echo "=========================================="
echo "Summary:"
echo "✓ Launcher script created: /usr/local/bin/thorium-fitatu-launcher.sh"
echo "✓ System service created: thorium-fitatu-startup.service"
echo "✓ User service created: ~/.config/systemd/user/thorium-fitatu-startup.service"
echo "✓ Autostart entry created: ~/.config/autostart/thorium-fitatu.desktop"
echo "✓ i3 autostart entry added to: ~/.config/i3/config"
echo "✓ Services enabled for automatic startup"
echo ""
echo "The system will now:"
echo "• Launch Thorium browser with $TARGET_URL on every startup"
echo "• Use multiple methods to ensure reliable startup"
echo "• Wait for desktop environment to be ready before launching"
echo "• User service will be enabled automatically on next login"
echo ""
echo "To check status:"
echo " systemctl status thorium-fitatu-startup.service"
echo " systemctl --user status thorium-fitatu-startup.service (after login)"
echo ""
echo "To view logs:"
echo " journalctl -u thorium-fitatu-startup.service"
echo " journalctl --user -u thorium-fitatu-startup.service"
echo ""
echo "To disable (if needed):"
echo " sudo systemctl disable thorium-fitatu-startup.service"
echo " systemctl --user disable thorium-fitatu-startup.service"
echo " rm ~/.config/autostart/thorium-fitatu.desktop"
echo ""
echo "IMPORTANT: Browser will launch automatically on next reboot!"
}
# Main execution
check_thorium_browser
create_launcher_script
create_user_systemd_service
create_system_systemd_service
create_autostart_entry
create_i3_autostart
enable_services
test_setup
show_instructions