mirror of
https://github.com/smittix/intercept.git
synced 2026-04-29 00:59:59 -07:00
fix: convert start.sh line endings from CRLF to LF
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
300
start.sh
300
start.sh
@@ -1,150 +1,150 @@
|
||||
#!/usr/bin/env bash
|
||||
# INTERCEPT - Production Startup Script
|
||||
#
|
||||
# Starts INTERCEPT with gunicorn + gevent for production use.
|
||||
# Falls back to Flask dev server if gunicorn is not installed.
|
||||
#
|
||||
# Usage:
|
||||
# ./start.sh # Default: 0.0.0.0:5050
|
||||
# ./start.sh -p 8080 # Custom port
|
||||
# ./start.sh --https # HTTPS with self-signed cert
|
||||
# ./start.sh --debug # Debug mode (Flask dev server)
|
||||
# ./start.sh --check-deps # Check dependencies and exit
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ── Defaults (can be overridden by env vars or CLI flags) ────────────────────
|
||||
HOST="${INTERCEPT_HOST:-0.0.0.0}"
|
||||
PORT="${INTERCEPT_PORT:-5050}"
|
||||
DEBUG=0
|
||||
HTTPS=0
|
||||
CHECK_DEPS=0
|
||||
|
||||
# ── Parse CLI arguments ─────────────────────────────────────────────────────
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-p|--port)
|
||||
PORT="$2"
|
||||
shift 2
|
||||
;;
|
||||
-H|--host)
|
||||
HOST="$2"
|
||||
shift 2
|
||||
;;
|
||||
-d|--debug)
|
||||
DEBUG=1
|
||||
shift
|
||||
;;
|
||||
--https)
|
||||
HTTPS=1
|
||||
shift
|
||||
;;
|
||||
--check-deps)
|
||||
CHECK_DEPS=1
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
echo "Usage: start.sh [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -p, --port PORT Port to listen on (default: 5050)"
|
||||
echo " -H, --host HOST Host to bind to (default: 0.0.0.0)"
|
||||
echo " -d, --debug Run in debug mode (Flask dev server)"
|
||||
echo " --https Enable HTTPS with self-signed certificate"
|
||||
echo " --check-deps Check dependencies and exit"
|
||||
echo " -h, --help Show this help message"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ── Export for config.py ─────────────────────────────────────────────────────
|
||||
export INTERCEPT_HOST="$HOST"
|
||||
export INTERCEPT_PORT="$PORT"
|
||||
|
||||
# ── Dependency check (delegate to intercept.py) ─────────────────────────────
|
||||
if [[ "$CHECK_DEPS" -eq 1 ]]; then
|
||||
exec python intercept.py --check-deps
|
||||
fi
|
||||
|
||||
# ── Debug mode always uses Flask dev server ──────────────────────────────────
|
||||
if [[ "$DEBUG" -eq 1 ]]; then
|
||||
echo "[INTERCEPT] Starting in debug mode (Flask dev server)..."
|
||||
export INTERCEPT_DEBUG=1
|
||||
exec python intercept.py --host "$HOST" --port "$PORT" --debug
|
||||
fi
|
||||
|
||||
# ── HTTPS certificate generation ────────────────────────────────────────────
|
||||
CERT_DIR="certs"
|
||||
CERT_FILE="$CERT_DIR/intercept.crt"
|
||||
KEY_FILE="$CERT_DIR/intercept.key"
|
||||
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
if [[ ! -f "$CERT_FILE" || ! -f "$KEY_FILE" ]]; then
|
||||
echo "[INTERCEPT] Generating self-signed SSL certificate..."
|
||||
mkdir -p "$CERT_DIR"
|
||||
openssl req -x509 -newkey rsa:2048 \
|
||||
-keyout "$KEY_FILE" -out "$CERT_FILE" \
|
||||
-days 365 -nodes \
|
||||
-subj '/CN=intercept/O=INTERCEPT/C=US' 2>/dev/null
|
||||
echo "[INTERCEPT] SSL certificate generated: $CERT_FILE"
|
||||
else
|
||||
echo "[INTERCEPT] Using existing SSL certificate: $CERT_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── Detect gunicorn + gevent ─────────────────────────────────────────────────
|
||||
HAS_GUNICORN=0
|
||||
HAS_GEVENT=0
|
||||
|
||||
if python -c "import gunicorn" 2>/dev/null; then
|
||||
HAS_GUNICORN=1
|
||||
fi
|
||||
if python -c "import gevent" 2>/dev/null; then
|
||||
HAS_GEVENT=1
|
||||
fi
|
||||
|
||||
# ── Start the server ─────────────────────────────────────────────────────────
|
||||
if [[ "$HAS_GUNICORN" -eq 1 && "$HAS_GEVENT" -eq 1 ]]; then
|
||||
echo "[INTERCEPT] Starting production server (gunicorn + gevent)..."
|
||||
echo "[INTERCEPT] Listening on ${HOST}:${PORT}"
|
||||
|
||||
export INTERCEPT_USE_GEVENT=1
|
||||
|
||||
GUNICORN_ARGS=(
|
||||
-k gevent
|
||||
-w 1
|
||||
--timeout 300
|
||||
--worker-connections 1000
|
||||
--bind "${HOST}:${PORT}"
|
||||
--access-logfile -
|
||||
--error-logfile -
|
||||
)
|
||||
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
GUNICORN_ARGS+=(--certfile "$CERT_FILE" --keyfile "$KEY_FILE")
|
||||
echo "[INTERCEPT] HTTPS enabled"
|
||||
fi
|
||||
|
||||
exec gunicorn "${GUNICORN_ARGS[@]}" app:app
|
||||
else
|
||||
if [[ "$HAS_GUNICORN" -eq 0 ]]; then
|
||||
echo "[INTERCEPT] gunicorn not found — falling back to Flask dev server"
|
||||
fi
|
||||
if [[ "$HAS_GEVENT" -eq 0 ]]; then
|
||||
echo "[INTERCEPT] gevent not found — falling back to Flask dev server"
|
||||
fi
|
||||
echo "[INTERCEPT] Install with: pip install gunicorn gevent"
|
||||
echo ""
|
||||
|
||||
FLASK_ARGS=(--host "$HOST" --port "$PORT")
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
FLASK_ARGS+=(--https)
|
||||
fi
|
||||
|
||||
exec python intercept.py "${FLASK_ARGS[@]}"
|
||||
fi
|
||||
#!/usr/bin/env bash
|
||||
# INTERCEPT - Production Startup Script
|
||||
#
|
||||
# Starts INTERCEPT with gunicorn + gevent for production use.
|
||||
# Falls back to Flask dev server if gunicorn is not installed.
|
||||
#
|
||||
# Usage:
|
||||
# ./start.sh # Default: 0.0.0.0:5050
|
||||
# ./start.sh -p 8080 # Custom port
|
||||
# ./start.sh --https # HTTPS with self-signed cert
|
||||
# ./start.sh --debug # Debug mode (Flask dev server)
|
||||
# ./start.sh --check-deps # Check dependencies and exit
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ── Defaults (can be overridden by env vars or CLI flags) ────────────────────
|
||||
HOST="${INTERCEPT_HOST:-0.0.0.0}"
|
||||
PORT="${INTERCEPT_PORT:-5050}"
|
||||
DEBUG=0
|
||||
HTTPS=0
|
||||
CHECK_DEPS=0
|
||||
|
||||
# ── Parse CLI arguments ─────────────────────────────────────────────────────
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-p|--port)
|
||||
PORT="$2"
|
||||
shift 2
|
||||
;;
|
||||
-H|--host)
|
||||
HOST="$2"
|
||||
shift 2
|
||||
;;
|
||||
-d|--debug)
|
||||
DEBUG=1
|
||||
shift
|
||||
;;
|
||||
--https)
|
||||
HTTPS=1
|
||||
shift
|
||||
;;
|
||||
--check-deps)
|
||||
CHECK_DEPS=1
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
echo "Usage: start.sh [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -p, --port PORT Port to listen on (default: 5050)"
|
||||
echo " -H, --host HOST Host to bind to (default: 0.0.0.0)"
|
||||
echo " -d, --debug Run in debug mode (Flask dev server)"
|
||||
echo " --https Enable HTTPS with self-signed certificate"
|
||||
echo " --check-deps Check dependencies and exit"
|
||||
echo " -h, --help Show this help message"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ── Export for config.py ─────────────────────────────────────────────────────
|
||||
export INTERCEPT_HOST="$HOST"
|
||||
export INTERCEPT_PORT="$PORT"
|
||||
|
||||
# ── Dependency check (delegate to intercept.py) ─────────────────────────────
|
||||
if [[ "$CHECK_DEPS" -eq 1 ]]; then
|
||||
exec python intercept.py --check-deps
|
||||
fi
|
||||
|
||||
# ── Debug mode always uses Flask dev server ──────────────────────────────────
|
||||
if [[ "$DEBUG" -eq 1 ]]; then
|
||||
echo "[INTERCEPT] Starting in debug mode (Flask dev server)..."
|
||||
export INTERCEPT_DEBUG=1
|
||||
exec python intercept.py --host "$HOST" --port "$PORT" --debug
|
||||
fi
|
||||
|
||||
# ── HTTPS certificate generation ────────────────────────────────────────────
|
||||
CERT_DIR="certs"
|
||||
CERT_FILE="$CERT_DIR/intercept.crt"
|
||||
KEY_FILE="$CERT_DIR/intercept.key"
|
||||
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
if [[ ! -f "$CERT_FILE" || ! -f "$KEY_FILE" ]]; then
|
||||
echo "[INTERCEPT] Generating self-signed SSL certificate..."
|
||||
mkdir -p "$CERT_DIR"
|
||||
openssl req -x509 -newkey rsa:2048 \
|
||||
-keyout "$KEY_FILE" -out "$CERT_FILE" \
|
||||
-days 365 -nodes \
|
||||
-subj '/CN=intercept/O=INTERCEPT/C=US' 2>/dev/null
|
||||
echo "[INTERCEPT] SSL certificate generated: $CERT_FILE"
|
||||
else
|
||||
echo "[INTERCEPT] Using existing SSL certificate: $CERT_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── Detect gunicorn + gevent ─────────────────────────────────────────────────
|
||||
HAS_GUNICORN=0
|
||||
HAS_GEVENT=0
|
||||
|
||||
if python -c "import gunicorn" 2>/dev/null; then
|
||||
HAS_GUNICORN=1
|
||||
fi
|
||||
if python -c "import gevent" 2>/dev/null; then
|
||||
HAS_GEVENT=1
|
||||
fi
|
||||
|
||||
# ── Start the server ─────────────────────────────────────────────────────────
|
||||
if [[ "$HAS_GUNICORN" -eq 1 && "$HAS_GEVENT" -eq 1 ]]; then
|
||||
echo "[INTERCEPT] Starting production server (gunicorn + gevent)..."
|
||||
echo "[INTERCEPT] Listening on ${HOST}:${PORT}"
|
||||
|
||||
export INTERCEPT_USE_GEVENT=1
|
||||
|
||||
GUNICORN_ARGS=(
|
||||
-k gevent
|
||||
-w 1
|
||||
--timeout 300
|
||||
--worker-connections 1000
|
||||
--bind "${HOST}:${PORT}"
|
||||
--access-logfile -
|
||||
--error-logfile -
|
||||
)
|
||||
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
GUNICORN_ARGS+=(--certfile "$CERT_FILE" --keyfile "$KEY_FILE")
|
||||
echo "[INTERCEPT] HTTPS enabled"
|
||||
fi
|
||||
|
||||
exec gunicorn "${GUNICORN_ARGS[@]}" app:app
|
||||
else
|
||||
if [[ "$HAS_GUNICORN" -eq 0 ]]; then
|
||||
echo "[INTERCEPT] gunicorn not found — falling back to Flask dev server"
|
||||
fi
|
||||
if [[ "$HAS_GEVENT" -eq 0 ]]; then
|
||||
echo "[INTERCEPT] gevent not found — falling back to Flask dev server"
|
||||
fi
|
||||
echo "[INTERCEPT] Install with: pip install gunicorn gevent"
|
||||
echo ""
|
||||
|
||||
FLASK_ARGS=(--host "$HOST" --port "$PORT")
|
||||
if [[ "$HTTPS" -eq 1 ]]; then
|
||||
FLASK_ARGS+=(--https)
|
||||
fi
|
||||
|
||||
exec python intercept.py "${FLASK_ARGS[@]}"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user