Agents SSH Targets EBS Validation Proxy Self-Test Agent Upgrades

Progress Checklist

○ 1. VirtualBox + Oracle XE installed
○ 2. Network ports forwarded
○ 3. SSH confirmed working
○ 4. TUNEVAULT_RO user created
○ 5. Proxy installed + configured
○ 6. Validator bundle downloaded + run
1
VirtualBox + Oracle XE Setup
▶
ℹ

Oracle XE 21c is free for development/testing. It supports all the V$ and DBA_ views TuneVault reads. Real Oracle EBS requires licensed media — on XE the EBS-specific probes will return ebs_detected: false, which is the correct negative-path test.

Step 1.1 — Download VirtualBox 7.x

Get the installer for your host OS from the official site:

virtualbox.org/wiki/Downloads — choose "VirtualBox 7.x platform packages" for your OS.

Step 1.2 — Get Oracle XE 21c VirtualBox appliance

Oracle provides a free pre-built OVA (requires Oracle account, free registration):

oracle.com/database/technologies/xe-downloads.html

Download Oracle Database 21c Express Edition for Linux x86-64 (RPM installer). You'll install it inside an Oracle Linux 8 / AlmaLinux 8 VM, or use an existing Oracle XE appliance if you have one.

Alternatively, search VirtualBox Appliance Gallery for a pre-built Oracle XE 21c OVA to import directly.

Step 1.3 — Import + boot the VM

Import the OVA in VirtualBox: File → Import Appliance → select the .ova file.

Start the VM. Default credentials are typically oracle/oracle or shown in the appliance README.

Inside the VM, verify Oracle is running:

systemctl status oracle-xe-21c
# Should show: active (running)
Step 1.4 — Change SYS/SYSTEM passwords
su - oracle
sqlplus / as sysdba
ALTER USER SYS   IDENTIFIED BY "YourSysPassword123!";
ALTER USER SYSTEM IDENTIFIED BY "YourSystemPassword123!";
exit
Step 1.5 — Enable SSH
sudo systemctl enable --now sshd
# Verify it's listening:
sudo ss -tlnp | grep 22
2
VirtualBox Network + Port Forwarding
▶

With NAT networking (default), set up port forwarding in VirtualBox so your host machine can reach the VM's Oracle listener and SSH daemon.

VirtualBox GUI method
  1. Select the VM → Settings → Network → Adapter 1
  2. Confirm: Attached to = NAT
  3. Click Port Forwarding
  4. Add three rules:
NameProtocolHost IPHost PortGuest IPGuest Port
SSHTCP127.0.0.1222222
OracleTCP127.0.0.115211521
EM ExpressTCP127.0.0.180808080
Or via VBoxManage CLI
VBoxManage modifyvm "OracleXE" --natpf1 "ssh,tcp,,2222,,22"
VBoxManage modifyvm "OracleXE" --natpf1 "oracle,tcp,,1521,,1521"
VBoxManage modifyvm "OracleXE" --natpf1 "em-express,tcp,,8080,,8080"

Replace OracleXE with the name of your VM.

Verify SSH from your host
ssh -p 2222 oracle@localhost
# Accept the host key fingerprint
# You should land in the Oracle Linux VM shell
Verify Oracle listener from your host
# Quick TCP test (macOS / Linux)
timeout 3 bash -c "echo > /dev/tcp/localhost/1521" && echo "✓ Port 1521 reachable" || echo "✗ Not reachable"

# Or with sqlplus if you have Oracle client installed:
sqlplus TUNEVAULT_RO/password@localhost:1521/XE
3
Oracle User Setup (TUNEVAULT_RO)
▶

TuneVault uses a dedicated read-only user with SELECT_CATALOG_ROLE. Run this SQL block inside the VM as SYSDBA:

SSH into the VM + connect as SYSDBA
ssh -p 2222 oracle@localhost
su - oracle
sqlplus / as sysdba
Create user + grant roles (paste this in SQLPlus)
-- Create the monitoring user
CREATE USER TUNEVAULT_RO IDENTIFIED BY "TVReadOnly2024!";

-- Basic connection + catalog read
GRANT CREATE SESSION TO TUNEVAULT_RO;
GRANT SELECT_CATALOG_ROLE TO TUNEVAULT_RO;

-- V$ dynamic performance views (needed for all core checks)
GRANT SELECT ANY DICTIONARY TO TUNEVAULT_RO;

-- Additional grants for specific checks
GRANT SELECT ON v_$session        TO TUNEVAULT_RO;
GRANT SELECT ON v_$sql            TO TUNEVAULT_RO;
GRANT SELECT ON v_$sqlarea        TO TUNEVAULT_RO;
GRANT SELECT ON v_$sysstat        TO TUNEVAULT_RO;
GRANT SELECT ON v_$parameter      TO TUNEVAULT_RO;
GRANT SELECT ON v_$tablespace     TO TUNEVAULT_RO;
GRANT SELECT ON v_$datafile       TO TUNEVAULT_RO;
GRANT SELECT ON v_$sga            TO TUNEVAULT_RO;
GRANT SELECT ON v_$sgastat        TO TUNEVAULT_RO;
GRANT SELECT ON v_$pgastat        TO TUNEVAULT_RO;
GRANT SELECT ON v_$rman_backup_job_details TO TUNEVAULT_RO;
GRANT SELECT ON dba_segments      TO TUNEVAULT_RO;
GRANT SELECT ON dba_tablespaces   TO TUNEVAULT_RO;
GRANT SELECT ON dba_free_space    TO TUNEVAULT_RO;
GRANT SELECT ON dba_objects       TO TUNEVAULT_RO;
GRANT SELECT ON dba_users         TO TUNEVAULT_RO;
GRANT SELECT ON dba_sys_privs     TO TUNEVAULT_RO;

-- Confirm grants
SELECT granted_role FROM dba_role_privs WHERE grantee = 'TUNEVAULT_RO';
exit
Test the user from your host
# With sqlplus (if Oracle client installed on host):
sqlplus TUNEVAULT_RO/"TVReadOnly2024!"@localhost:1521/XE

# Verify V$ access:
SELECT banner FROM v$version WHERE ROWNUM = 1;
4
Proxy Install + Self-Test
▶
⚡

For local testing, the proxy can run on your host machine (not inside the VM) since you've port-forwarded Oracle :1521 to localhost:1521. The --validate-only flag tests connectivity without starting an HTTP server.

Option A — Run proxy on host (simplest for testing)
# Download oracle-proxy.py from TuneVault dashboard or use the validator bundle below

# Create proxy.env (copy from proxy.env.template, edit values)
cat > proxy.env << 'EOF'
ORACLE_HOST=localhost
ORACLE_PORT=1521
ORACLE_SERVICE=XE
ORACLE_USER=TUNEVAULT_RO
ORACLE_PASSWORD=TVReadOnly2024!
TUNEVAULT_API_KEY=local-test-key
EOF

# Self-test without starting the HTTP server:
python3 oracle-proxy.py --validate-only
# Exit 0 = all pass, 1 = failures
Option B — Run proxy inside the VM
# Copy proxy to VM:
scp -P 2222 oracle-proxy.py oracle@localhost:~/

# SSH in + set up:
ssh -p 2222 oracle@localhost

# Inside VM:
pip3 install cx_Oracle

cat > proxy.env << 'EOF'
ORACLE_HOST=localhost
ORACLE_PORT=1521
ORACLE_SERVICE=XE
ORACLE_USER=TUNEVAULT_RO
ORACLE_PASSWORD=TVReadOnly2024!
TUNEVAULT_API_KEY=local-test-key
EOF

# Self-test:
python3 oracle-proxy.py --validate-only
Start the proxy normally (after --validate-only passes)
export TUNEVAULT_API_KEY=local-test-key
python3 oracle-proxy.py
# Listening on 127.0.0.1:3100

# From your host, hit the health endpoint:
curl http://localhost:3100/health
# {"status":"ok","version":"..."}

For the proxy to be reachable from TuneVault, you'll need an HTTPS tunnel or reverse proxy to expose the local port over HTTPS. For local-only testing, the validator bundle below handles this directly.

5
Expected Results on Oracle XE 21c (no EBS)
▶

On a vanilla Oracle XE 21c instance (no Oracle EBS installed), here's what the validator should return:

Check Expected Reason
cx_Oracle import ✓ PASS Library installed via pip3 install cx_Oracle
TCP connectivity ✓ PASS Port 1521 forwarded from host to guest
Oracle connection ✓ PASS TUNEVAULT_RO user exists with correct password
SELECT_CATALOG_ROLE ✓ PASS DBA_ views accessible — role granted in setup SQL
Payload structure (Bug 1) ✓ PASS collect_metrics() returns all required keys
EBS probe variants (Bug 2) ✓ PASS APPS.* tables don't exist on XE — all probes fail gracefully, ebs_detected=false
Health check coverage (Bug 3) ✓ PASS All 5 core V$ queries accessible on XE 21c
Edition detection (Bug 4) ✓ PASS XE banner detected as "Express Edition"
CM multi-row handling (Bug 5) ✓ PASS FND_CONCURRENT_QUEUES doesn't exist on XE — proxy returns gracefully
EBS detection (in proxy) ! EXPECTED APPS.FND_APPLICATION not present → ebs_detected=false. Correct for XE.
FND_CONCURRENT_QUEUES query ! EXPECTED Table doesn't exist on non-EBS → ORA-00942. Proxy must NOT crash.
⚠

If the proxy crashes when EBS probes fail (ORA-00942 / table not found), that is Bug #1 reproduced. The fix is shipped in the current proxy version — all APPS.* queries are wrapped in try/except with graceful fallback to ebs_detected=false.

6
Download Validator Bundle
▶

The bundle contains everything needed to run the full validation locally:

  • oracle-proxy.py — the TuneVault proxy (with --validate-only flag)
  • run-local-validation.sh — shell wrapper with pre-flight checks
  • local_validation.py — Python harness (9 checks, exercises all 5 bugs)
  • proxy.env.template — copy to proxy.env and fill in your values
Download + extract
# Download the bundle (requires admin session cookie):
curl -O -b "$(cat ~/.tv_cookie)" https://tunevault.app/api/test-harness/validator-bundle
# File: tunevault-validator.tar

# Extract:
tar xf tunevault-validator.tar

# Edit config:
cp proxy.env.template proxy.env
nano proxy.env   # set ORACLE_HOST, PORT, SERVICE, USER, PASSWORD
Or click to download directly
Download Validator Bundle (.tar)
Run the validation
chmod +x run-local-validation.sh
./run-local-validation.sh

# Or directly with Python:
python3 local_validation.py

# With explicit args (overrides proxy.env):
python3 local_validation.py \
  --host localhost --port 1521 --service XE \
  --user TUNEVAULT_RO --password "TVReadOnly2024!"
Use oracle-proxy.py --validate-only directly
# Self-test mode — reads proxy.env, no HTTP server started
python3 oracle-proxy.py --validate-only

# Exit code 0 = all pass
# Exit code 1 = one or more failures
# Report: validation-report.json written to same directory

Note: The validator writes validation-report.json to its working directory. Share this file with TuneVault support if you're reporting a proxy bug — it contains all check results with Oracle version, edition, and EBS detection state.