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

249 lines
No EOL
6.9 KiB
Bash

#!/bin/bash
# Change MockAPI port configuration
# Run this script to change the port MockAPI runs on
set -e
echo "=== MockAPI Port Change Utility ==="
echo
APP_DIR="/opt/mockapi"
ENV_FILE="${APP_DIR}/.env"
SERVICE_FILE="/etc/systemd/system/mockapi.service"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
print_status() {
echo -e "${GREEN}[+]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[!]${NC} $1"
}
print_error() {
echo -e "${RED}[!]${NC} $1"
}
print_info() {
echo -e "${BLUE}[i]${NC} $1"
}
# Check if running as root or with sudo
if [[ $EUID -ne 0 ]]; then
print_error "This script requires sudo privileges."
print_info "Run with: sudo bash $0"
exit 1
fi
# Step 1: Check if files exist
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: Show current configuration
print_status "Current configuration:"
CURRENT_PORT=$(grep "^PORT=" "$ENV_FILE" | cut -d'=' -f2 || echo "8000")
CURRENT_HOST=$(grep "^HOST=" "$ENV_FILE" | cut -d'=' -f2 || echo "0.0.0.0")
CURRENT_ISSUER=$(grep "^OAUTH2_ISSUER=" "$ENV_FILE" | cut -d'=' -f2 || echo "http://localhost:${CURRENT_PORT}")
echo " Current PORT: $CURRENT_PORT"
echo " Current HOST: $CURRENT_HOST"
echo " Current OAUTH2_ISSUER: $CURRENT_ISSUER"
echo
# Step 3: Ask for new port
read -p "Enter new port number [$CURRENT_PORT]: " NEW_PORT
NEW_PORT=${NEW_PORT:-$CURRENT_PORT}
# Validate new port
if [[ ! "$NEW_PORT" =~ ^[0-9]+$ ]]; then
print_error "Invalid port number: '$NEW_PORT'. Must be numeric."
exit 1
fi
if [[ "$NEW_PORT" -lt 1 ]] || [[ "$NEW_PORT" -gt 65535 ]]; then
print_error "Port number must be between 1 and 65535."
exit 1
fi
# Check if port is already in use
if command -v netstat &> /dev/null; then
if netstat -tuln | grep -q ":$NEW_PORT "; then
print_warning "Port $NEW_PORT appears to be in use!"
read -p "Continue anyway? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
elif command -v ss &> /dev/null; then
if ss -tuln | grep -q ":$NEW_PORT "; then
print_warning "Port $NEW_PORT appears to be in use!"
read -p "Continue anyway? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
fi
# Step 4: Ask for host (optional)
read -p "Enter host address [$CURRENT_HOST]: " NEW_HOST
NEW_HOST=${NEW_HOST:-$CURRENT_HOST}
# Step 5: Backup files
print_status "Creating backups..."
BACKUP_DIR="${APP_DIR}/backup_port_change_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp "$ENV_FILE" "$BACKUP_DIR/.env.backup"
cp "$SERVICE_FILE" "$BACKUP_DIR/mockapi.service.backup"
print_status "Backups saved to: $BACKUP_DIR"
# Step 6: Update .env file
print_status "Updating .env file..."
# Update PORT
if grep -q "^PORT=" "$ENV_FILE"; then
sed -i "s/^PORT=.*/PORT=$NEW_PORT/" "$ENV_FILE"
else
echo "PORT=$NEW_PORT" >> "$ENV_FILE"
fi
# Update HOST
if grep -q "^HOST=" "$ENV_FILE"; then
sed -i "s/^HOST=.*/HOST=$NEW_HOST/" "$ENV_FILE"
else
echo "HOST=$NEW_HOST" >> "$ENV_FILE"
fi
# Update OAUTH2_ISSUER
NEW_ISSUER="http://localhost:${NEW_PORT}"
if grep -q "^OAUTH2_ISSUER=" "$ENV_FILE"; then
sed -i "s|^OAUTH2_ISSUER=.*|OAUTH2_ISSUER=$NEW_ISSUER|" "$ENV_FILE"
else
echo "OAUTH2_ISSUER=$NEW_ISSUER" >> "$ENV_FILE"
fi
print_status "Updated .env file:"
echo " PORT=$NEW_PORT"
echo " HOST=$NEW_HOST"
echo " OAUTH2_ISSUER=$NEW_ISSUER"
# Step 7: Update service file
print_status "Updating service file..."
# Get virtual environment path
VENV_DIR=$(grep 'Environment="PATH=' "$SERVICE_FILE" | cut -d'=' -f2 | cut -d':' -f1 | sed 's/"//g' || echo "/opt/mockapi/venv")
# Get user and group from current service file
SERVICE_USER=$(grep "^User=" "$SERVICE_FILE" | cut -d'=' -f2)
SERVICE_GROUP=$(grep "^Group=" "$SERVICE_FILE" | cut -d'=' -f2)
# Create updated service file
cat > /tmp/mockapi_new.service << EOF
[Unit]
Description=Mock API Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=$SERVICE_USER
Group=$SERVICE_GROUP
WorkingDirectory=$APP_DIR
Environment="PATH=$VENV_DIR/bin"
Environment="PYTHONPATH=$APP_DIR"
EnvironmentFile=$APP_DIR/.env
# Hardcoded port from .env (updated)
ExecStart=$VENV_DIR/bin/waitress-serve --host=$NEW_HOST --port=$NEW_PORT wsgi:wsgi_app
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mockapi
# Security hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=$APP_DIR
[Install]
WantedBy=multi-user.target
EOF
# Replace service file
cp /tmp/mockapi_new.service "$SERVICE_FILE"
rm -f /tmp/mockapi_new.service
print_status "Service file updated with new port $NEW_PORT."
# Step 8: Reload systemd
print_status "Reloading systemd daemon..."
systemctl daemon-reload
# Step 9: Restart service
print_status "Restarting MockAPI service..."
if systemctl restart mockapi; then
print_status "Service restart initiated."
# Wait for service to start
sleep 3
if systemctl is-active --quiet mockapi; then
print_status "✓ Service is running on port $NEW_PORT!"
# Test health endpoint
print_status "Testing health endpoint..."
if curl -f -s --max-time 10 http://localhost:$NEW_PORT/health > /dev/null 2>&1; then
print_status "✓ Health check passed!"
echo
echo "=== Port Change Successful ==="
echo
echo "MockAPI is now running on:"
echo " URL: http://localhost:$NEW_PORT"
echo " Admin: http://localhost:$NEW_PORT/admin/login"
echo " Docs: http://localhost:$NEW_PORT/docs"
echo " Health: http://localhost:$NEW_PORT/health"
echo
echo "If accessing remotely, use:"
echo " http://$(hostname -I | awk '{print $1}'):$NEW_PORT"
else
print_warning "Service is running but health check failed."
print_info "This might be normal during initial startup."
echo
print_status "Service status:"
systemctl status mockapi --no-pager -l
fi
else
print_error "Service failed to start after port change."
echo
print_warning "Checking service logs..."
journalctl -u mockapi -n 30 --no-pager
echo
print_warning "Restoring from backup..."
cp "$BACKUP_DIR/.env.backup" "$ENV_FILE"
cp "$BACKUP_DIR/mockapi.service.backup" "$SERVICE_FILE"
systemctl daemon-reload
systemctl restart mockapi
print_status "Restored original configuration."
fi
else
print_error "Failed to restart service."
systemctl status mockapi --no-pager -l
fi
echo
print_status "=== Port Change Complete ==="
echo "Backup files are in: $BACKUP_DIR"
echo "If you need to revert, copy files from backup directory."