#!/bin/bash # TuneVault Oracle Proxy — Install Script (Python Edition) # Run as root on your Oracle server (Oracle Linux 7+, RHEL 7+). # # Usage: # chmod +x oracle-proxy-install.sh # sudo ./oracle-proxy-install.sh # # What this does: # 1. Installs Python 3 if not present (yum install python3) # 2. Installs cx_Oracle (pip3 install cx_Oracle) # 3. Detects ORACLE_HOME and sets LD_LIBRARY_PATH # 4. Generates a random API key # 5. Creates a systemd service for persistence # 6. Starts the service set -e INSTALL_DIR="${INSTALL_DIR:-/opt/tunevault-proxy}" PROXY_PORT="${PROXY_PORT:-3100}" SERVICE_NAME="tunevault-proxy" echo "" echo "==================================================" echo " TuneVault Oracle Proxy — Installer (Python)" echo "==================================================" echo "" # ── Root check ────────────────────────────────────────── if [ "$(id -u)" -ne 0 ]; then echo "WARNING: Running without root. systemd service creation may fail." echo "Re-run with: sudo ./oracle-proxy-install.sh" echo "" fi # ── Python 3 check ───────────────────────────────────── if ! command -v python3 &>/dev/null; then echo "Python 3 not found. Installing..." if command -v yum &>/dev/null; then yum install -y python3 elif command -v dnf &>/dev/null; then dnf install -y python3 elif command -v apt-get &>/dev/null; then apt-get update && apt-get install -y python3 python3-pip else echo "ERROR: Cannot install Python 3 automatically." echo "Install it manually: yum install python3" exit 1 fi fi PYTHON_VERSION=$(python3 --version 2>&1) echo "OK Python: ${PYTHON_VERSION}" # ── pip3 check ────────────────────────────────────────── if ! command -v pip3 &>/dev/null; then echo "pip3 not found. Installing..." if command -v yum &>/dev/null; then yum install -y python3-pip 2>/dev/null || python3 -m ensurepip --default-pip 2>/dev/null || true elif command -v dnf &>/dev/null; then dnf install -y python3-pip 2>/dev/null || python3 -m ensurepip --default-pip 2>/dev/null || true elif command -v apt-get &>/dev/null; then apt-get install -y python3-pip fi fi if ! command -v pip3 &>/dev/null && ! python3 -m pip --version &>/dev/null 2>&1; then echo "ERROR: pip3 is not available. Install it: yum install python3-pip" exit 1 fi echo "OK pip3 available" # ── Detect ORACLE_HOME ────────────────────────────────── if [ -z "$ORACLE_HOME" ]; then echo "" echo "ORACLE_HOME not set. Detecting..." # Try /etc/oratab first if [ -f /etc/oratab ]; then DETECTED_HOME=$(grep -v '^#' /etc/oratab | grep -v '^$' | head -1 | cut -d: -f2) if [ -n "$DETECTED_HOME" ] && [ -d "$DETECTED_HOME" ]; then export ORACLE_HOME="$DETECTED_HOME" echo "OK Detected ORACLE_HOME from /etc/oratab: $ORACLE_HOME" fi fi # Try common EBS paths if [ -z "$ORACLE_HOME" ]; then for candidate in /u01/app/oracle/product/*/dbhome_1 /u01/app/oracle/product/*/* /opt/oracle/product/*/dbhome_1; do if [ -d "$candidate/lib" ]; then export ORACLE_HOME="$candidate" echo "OK Detected ORACLE_HOME from filesystem: $ORACLE_HOME" break fi done fi # Try running oracle process if [ -z "$ORACLE_HOME" ]; then ORACLE_PID=$(pgrep -f "ora_pmon" 2>/dev/null | head -1) if [ -n "$ORACLE_PID" ]; then DETECTED_HOME=$(strings /proc/$ORACLE_PID/environ 2>/dev/null | grep "^ORACLE_HOME=" | cut -d= -f2) if [ -n "$DETECTED_HOME" ] && [ -d "$DETECTED_HOME" ]; then export ORACLE_HOME="$DETECTED_HOME" echo "OK Detected ORACLE_HOME from running Oracle process: $ORACLE_HOME" fi fi fi if [ -z "$ORACLE_HOME" ]; then echo "WARNING: Could not detect ORACLE_HOME." echo "Set it manually: export ORACLE_HOME=/path/to/oracle/home" echo "Continuing anyway — cx_Oracle may still work if Oracle libs are in system path." fi fi # ── Set LD_LIBRARY_PATH ───────────────────────────────── if [ -n "$ORACLE_HOME" ]; then export LD_LIBRARY_PATH="${ORACLE_HOME}/lib:${LD_LIBRARY_PATH:-}" echo "OK LD_LIBRARY_PATH includes ${ORACLE_HOME}/lib" fi # ── Install cx_Oracle ────────────────────────────────── echo "" echo "Installing cx_Oracle..." if command -v pip3 &>/dev/null; then pip3 install cx_Oracle 2>&1 | tail -3 else python3 -m pip install cx_Oracle 2>&1 | tail -3 fi echo "OK cx_Oracle installed" # ── Verify cx_Oracle can load ─────────────────────────── echo "" echo "Verifying cx_Oracle..." if python3 -c "import cx_Oracle; print('cx_Oracle version:', cx_Oracle.version)" 2>/dev/null; then echo "OK cx_Oracle loads successfully" else echo "WARNING: cx_Oracle imported but Oracle client libs may not be in LD_LIBRARY_PATH." echo "Make sure ORACLE_HOME and LD_LIBRARY_PATH are set correctly." fi # ── Install directory ────────────────────────────────── mkdir -p "$INSTALL_DIR" echo "OK Install directory: $INSTALL_DIR" # ── Copy proxy script ────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/oracle-proxy.py" ]; then cp "$SCRIPT_DIR/oracle-proxy.py" "$INSTALL_DIR/oracle-proxy.py" echo "OK Copied oracle-proxy.py" else echo "Downloading oracle-proxy.py from TuneVault..." if command -v curl &>/dev/null; then curl -sL "https://tunevault.app/downloads/oracle-proxy.py" -o "$INSTALL_DIR/oracle-proxy.py" elif command -v wget &>/dev/null; then wget -q "https://tunevault.app/downloads/oracle-proxy.py" -O "$INSTALL_DIR/oracle-proxy.py" else echo "ERROR: oracle-proxy.py not found and no curl/wget available." exit 1 fi echo "OK Downloaded oracle-proxy.py" fi chmod +x "$INSTALL_DIR/oracle-proxy.py" # ── Generate API key ────────────────────────────────── if command -v openssl &>/dev/null; then GENERATED_KEY=$(openssl rand -hex 32) else GENERATED_KEY=$(python3 -c "import os; print(os.urandom(32).hex())") fi # ── Create env file ─────────────────────────────────── if [ ! -f "$INSTALL_DIR/.env" ]; then cat > "$INSTALL_DIR/.env" << ENVFILE # TuneVault Oracle Proxy Configuration # Generated: $(date) # REQUIRED: Secret API key -- copy this into TuneVault when adding a proxy connection TUNEVAULT_API_KEY=${GENERATED_KEY} # Optional: Change proxy port (default: 3100) # PORT=3100 # Optional: Bind host (default: 127.0.0.1 -- localhost only) # BIND_HOST=127.0.0.1 ENVFILE echo "OK Created .env with generated API key" else echo "! .env already exists -- keeping existing API key" GENERATED_KEY=$(grep TUNEVAULT_API_KEY "$INSTALL_DIR/.env" | cut -d= -f2) fi # ── Create systemd service ──────────────────────────── if [ -d /etc/systemd/system ] && [ "$(id -u)" -eq 0 ]; then echo "" echo "Creating systemd service..." # Build Environment lines ENV_LINES="Environment=TUNEVAULT_API_KEY=${GENERATED_KEY}" if [ -n "$ORACLE_HOME" ]; then ENV_LINES="${ENV_LINES} Environment=ORACLE_HOME=${ORACLE_HOME} Environment=LD_LIBRARY_PATH=${ORACLE_HOME}/lib" fi cat > "/etc/systemd/system/${SERVICE_NAME}.service" << SERVICEEOF [Unit] Description=TuneVault Oracle HTTP Proxy After=network.target oracle-ohasd.service [Service] Type=simple ExecStart=/usr/bin/python3 ${INSTALL_DIR}/oracle-proxy.py WorkingDirectory=${INSTALL_DIR} EnvironmentFile=${INSTALL_DIR}/.env ${ENV_LINES} Restart=always RestartSec=5 StandardOutput=journal StandardError=journal SyslogIdentifier=tunevault-proxy [Install] WantedBy=multi-user.target SERVICEEOF systemctl daemon-reload systemctl enable "${SERVICE_NAME}" 2>/dev/null || true systemctl restart "${SERVICE_NAME}" echo "OK systemd service '${SERVICE_NAME}' created, enabled, and started" echo " Check status: systemctl status ${SERVICE_NAME}" echo " View logs: journalctl -u ${SERVICE_NAME} -f" else echo "" echo "Systemd not available or not running as root." echo "To run manually:" echo " cd $INSTALL_DIR && source .env && python3 oracle-proxy.py" fi # ── Create manual start script ─────────────────────── cat > "$INSTALL_DIR/start.sh" << 'STARTSH' #!/bin/bash cd "$(dirname "$0")" if [ -f .env ]; then set -a . .env set +a fi # Detect ORACLE_HOME if not set if [ -z "$ORACLE_HOME" ] && [ -f /etc/oratab ]; then ORACLE_HOME=$(grep -v '^#' /etc/oratab | grep -v '^$' | head -1 | cut -d: -f2) export ORACLE_HOME fi if [ -n "$ORACLE_HOME" ]; then export LD_LIBRARY_PATH="${ORACLE_HOME}/lib:${LD_LIBRARY_PATH:-}" fi exec python3 oracle-proxy.py STARTSH chmod +x "$INSTALL_DIR/start.sh" echo "OK Created start.sh" # ── Test HTTP endpoint ───────────────────────────────── echo "" echo "Testing proxy health endpoint..." sleep 2 HEALTH_OK=0 for i in 1 2 3; do if command -v curl &>/dev/null; then if curl -s "http://localhost:${PROXY_PORT}/health" 2>/dev/null | grep -q '"status"'; then HEALTH_OK=1 break fi fi sleep 1 done if [ "$HEALTH_OK" -eq 1 ]; then echo "OK Proxy is running and responding on port ${PROXY_PORT}" else echo "WARNING: Could not verify proxy health endpoint." echo "Check logs: journalctl -u ${SERVICE_NAME} --no-pager -n 20" fi # ── Summary ──────────────────────────────────────────── echo "" echo "==================================================" echo " Installation Complete!" echo "==================================================" echo "" echo " Install dir: $INSTALL_DIR" echo " Service: systemctl status ${SERVICE_NAME}" echo " Manual start: $INSTALL_DIR/start.sh" echo "" echo " YOUR API KEY (copy into TuneVault):" echo " +---------------------------------------------+" echo " | $GENERATED_KEY |" echo " +---------------------------------------------+" echo "" echo " Next steps:" echo " 1. Verify it's running: curl http://localhost:${PROXY_PORT}/health" echo " 2. Update your reverse proxy (HTTPS proxy) to route:" echo " hostname: oracledb.yourdomain.com" echo " service: http://localhost:${PROXY_PORT} (was tcp://localhost:1521)" echo " 3. In TuneVault dashboard -> Add Connection -> select 'Proxy / HTTPS Proxy'" echo " Proxy URL: https://oracledb.yourdomain.com" echo " API Key: (paste key above)" echo ""