mockapi/fix_service_env_vars.sh
2026-03-16 18:40:22 +00:00

226 lines
No EOL
7.3 KiB
Bash

#!/bin/bash
# Simple fix: Update service file to use $HOST and $PORT from .env
# No wrapper script, just fix the variable expansion
set -e
echo "=== Fix: Update service to use \$HOST and \$PORT from .env ==="
echo
APP_DIR="/opt/mockapi"
ENV_FILE="${APP_DIR}/.env"
SERVICE_FILE="/etc/systemd/system/mockapi.service"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
print_status() {
echo -e "${GREEN}[+]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[!]${NC} $1"
}
print_error() {
echo -e "${RED}[!]${NC} $1"
}
# Check if running as root
if [[ $EUID -ne 0 ]]; then
print_error "This script requires sudo privileges."
exit 1
fi
# Step 1: Check files
if [[ ! -f "$ENV_FILE" ]]; then
print_error ".env file not found: $ENV_FILE"
exit 1
fi
if [[ ! -f "$SERVICE_FILE" ]]; then
print_error "Service file not found: $SERVICE_FILE"
exit 1
fi
# Step 2: Ensure PORT exists in .env
print_status "Checking .env file..."
if ! grep -q "^PORT=" "$ENV_FILE"; then
print_warning "PORT not found in .env. Adding PORT=8000..."
echo "PORT=8000" >> "$ENV_FILE"
print_status "Added PORT=8000"
fi
if ! grep -q "^HOST=" "$ENV_FILE"; then
print_warning "HOST not found in .env. Adding HOST=0.0.0.0..."
echo "HOST=0.0.0.0" >> "$ENV_FILE"
fi
# Validate PORT is numeric
PORT_VALUE=$(grep "^PORT=" "$ENV_FILE" | cut -d'=' -f2)
if [[ ! "$PORT_VALUE" =~ ^[0-9]+$ ]]; then
print_error "PORT is not numeric: '$PORT_VALUE'. Fixing to 8000."
sed -i "s/^PORT=.*/PORT=8000/" "$ENV_FILE"
PORT_VALUE="8000"
fi
# Step 3: Backup service file
print_status "Backing up service file..."
BACKUP_FILE="${SERVICE_FILE}.backup.$(date +%s)"
cp "$SERVICE_FILE" "$BACKUP_FILE"
print_status "Backup created: $BACKUP_FILE"
# Step 4: Check current ExecStart
print_status "Checking current ExecStart line..."
CURRENT_EXEC=$(grep "^ExecStart=" "$SERVICE_FILE")
echo "Current: $CURRENT_EXEC"
# Step 5: Update ExecStart to use $HOST and $PORT
print_status "Updating ExecStart to use variables from .env..."
# We need to replace the ExecStart line with one that uses $HOST and $PORT
# But we need to be careful about escaping for sed
# First, get the current venv path from the existing ExecStart or Environment line
VENV_PATH=$(grep 'Environment="PATH=' "$SERVICE_FILE" | cut -d'=' -f2 | cut -d':' -f1 | sed 's/"//g')
if [[ -z "$VENV_PATH" ]]; then
# Try to extract from ExecStart
VENV_PATH=$(echo "$CURRENT_EXEC" | sed -n "s|^ExecStart=\(.*\)/waitress-serve.*|\1|p")
if [[ -z "$VENV_PATH" ]]; then
VENV_PATH="/opt/mockapi/venv"
print_warning "Could not detect venv path, using default: $VENV_PATH"
fi
fi
print_status "Detected venv path: $VENV_PATH"
# Create a temporary file with the updated service configuration
TMP_FILE=$(mktemp)
# Read the current service file and update ExecStart
while IFS= read -r line; do
if [[ "$line" =~ ^ExecStart= ]]; then
# Replace with new ExecStart using variables
echo "ExecStart=$VENV_PATH/bin/waitress-serve --host=\$HOST --port=\$PORT wsgi:wsgi_app"
print_status "Updated ExecStart line"
else
echo "$line"
fi
done < "$SERVICE_FILE" > "$TMP_FILE"
# Replace the service file
mv "$TMP_FILE" "$SERVICE_FILE"
# Step 6: Verify the change
print_status "Verifying update..."
UPDATED_EXEC=$(grep "^ExecStart=" "$SERVICE_FILE")
echo "Updated: $UPDATED_EXEC"
# Check if we have the escaped \$HOST and \$PORT
if echo "$UPDATED_EXEC" | grep -q "\\\\\$HOST\|\\\\\$PORT"; then
print_warning "Found escaped variables (\\\$HOST/\\\$PORT). This might still cause issues."
print_status "Trying alternative: unescaped variables..."
# Create alternative without backslashes
TMP_FILE2=$(mktemp)
while IFS= read -r line; do
if [[ "$line" =~ ^ExecStart= ]]; then
# Use unescaped variables
echo "ExecStart=$VENV_PATH/bin/waitress-serve --host=\$HOST --port=\$PORT wsgi:wsgi_app"
else
echo "$line"
fi
done < "$SERVICE_FILE" > "$TMP_FILE2"
# The issue: $HOST and $PORT in the HERE-document above will expand
# We need to write literal $HOST and $PORT. Let's use sed instead.
sed -i 's/--host=\\\$HOST --port=\\\$PORT/--host=$HOST --port=$PORT/' "$TMP_FILE2"
mv "$TMP_FILE2" "$SERVICE_FILE"
print_status "Updated with unescaped variables"
fi
# Final check
FINAL_EXEC=$(grep "^ExecStart=" "$SERVICE_FILE")
echo "Final ExecStart: $FINAL_EXEC"
# Step 7: Test if it looks correct
if echo "$FINAL_EXEC" | grep -q "--host=\$HOST --port=\$PORT"; then
print_status "✓ ExecStart looks correct (uses \$HOST and \$PORT)"
elif echo "$FINAL_EXEC" | grep -q "--host=\\\$HOST --port=\\\$PORT"; then
print_warning "ExecStart has escaped variables (\\\$HOST/\\\$PORT)"
print_warning "This might still cause the original error."
else
print_warning "ExecStart format unexpected: $FINAL_EXEC"
fi
# Step 8: Reload and restart
print_status "Reloading systemd..."
systemctl daemon-reload
print_status "Restarting service..."
if systemctl restart mockapi; then
print_status "Service restart initiated..."
sleep 3
if systemctl is-active --quiet mockapi; then
print_status "✓ Service is running!"
# Test health endpoint
print_status "Testing health endpoint on port $PORT_VALUE..."
if curl -f -s --max-time 10 http://localhost:$PORT_VALUE/health > /dev/null 2>&1; then
print_status "✓ Health check passed!"
echo
echo "=== SUCCESS ==="
echo "MockAPI service now uses PORT from .env file."
echo
echo "To change port:"
echo " 1. Edit $ENV_FILE"
echo " 2. Update the PORT value"
echo " 3. Run: sudo systemctl restart mockapi"
echo
echo "Current port: $PORT_VALUE"
echo "Access: http://localhost:$PORT_VALUE"
else
print_warning "Service running but health check failed."
journalctl -u mockapi -n 10 --no-pager
fi
else
print_error "Service failed to start."
echo "Checking logs..."
journalctl -u mockapi -n 20 --no-pager
# Try one more approach: use a simple hardcoded port as fallback
print_status "Trying fallback: hardcoding port $PORT_VALUE..."
sed -i "s|--host=\$HOST --port=\$PORT|--host=0.0.0.0 --port=$PORT_VALUE|" "$SERVICE_FILE"
systemctl daemon-reload
systemctl restart mockapi
sleep 3
if systemctl is-active --quiet mockapi; then
print_status "✓ Service running with hardcoded port $PORT_VALUE"
print_warning "Note: Port is now hardcoded. To change port, update service file."
else
print_error "All attempts failed. Restoring backup..."
cp "$BACKUP_FILE" "$SERVICE_FILE"
systemctl daemon-reload
systemctl restart mockapi
fi
fi
else
print_error "Failed to restart service."
systemctl status mockapi --no-pager -l
fi
echo
print_status "=== Fix completed ==="
echo "Backup: $BACKUP_FILE"
echo "To manually change port in the future:"
echo " 1. Edit $ENV_FILE (update PORT)"
echo " 2. Edit $SERVICE_FILE (update --port value in ExecStart)"
echo " 3. sudo systemctl daemon-reload"
echo " 4. sudo systemctl restart mockapi"