--- name: roa-oracle-production-access description: Ridica lantul complet statie -> tunel SSH Bitvise -> alias TNS -> DSN ODBC 32-bit si interogheaza read-only un Oracle de PRODUCTIE al unui client ROA. Foloseste-l OBLIGATORIU cand utilizatorul spune "conecteaza-te la productia clientului X", "intra pe Oracle la client", "ridica tunelul SSH", "deschide tunelul Bitvise", "nu merge DSN-ul ODBC", "ORA-12541 TNS:no listener", "verifica TNS", "unde e tnsnames.ora", "seteaza TNS_ADMIN", "ruleaza un SELECT pe productie", "de ce nu se conecteaza sqlplus" sau cere orice acces la o baza Oracle care nu e expusa direct. Stapaneste exact capcanele care costa sesiuni intregi: portul local 1521 unic pentru mai multe destinatii, `BvSsh.exe` care tine portul legat, `odbcad32.exe` pe 32 de biti, `$` distrus in here-string PowerShell. Nu improviza, nu sari peste dovada si nu ghici parole. --- # Acces la productia Oracle: tunel SSH (Bitvise) + TNS + DSN ODBC Scopul e sa NU se mai piarda o sesiune redescoperind lantul: executa pasii de mai jos, nu trimite utilizatorul in alta parte. ## Cand se foloseste - "conecteaza-te la productia clientului X", "intra pe Oracle la client", "deschide baza de productie"; - "ridica tunelul SSH", "porneste tunelul Bitvise", "profilul vending.tlp / conpress.tlp"; - "nu merge DSN-ul ODBC", "eroare `ORA-12541: TNS:no listener`", "sqlplus nu se conecteaza"; - "verifica TNS", "unde e tnsnames.ora", "seteaza `TNS_ADMIN`", "SELECT pe productie" (read-only). Nu acopera: re-exportul sursei unui pachet PL/SQL si editarea de text VFP. ## Pasi 1. Fixeaza lantul. TREI nume trebuie sa se potriveasca, si e usor de ratat: - **profilul Bitvise** (`.tlp`) - ce port local deschide (de obicei `127.0.0.1:1521`); - **aliasul TNS** din `tnsnames.ora` - ce host:port foloseste (`127.0.0.1:1521`); - **DSN-ul ODBC** - ce alias TNS foloseste. `tcHost` din `oConn.Connect(tcHost, ...)` (`oproceduri_comune.prg`) e NUMELE DSN-ului, nu un host si nu un alias TNS. 2. Profilele Bitvise sunt pe statia curenta in `D:\roa\BITVISE\` (`vending.tlp`, `conpress.tlp`, `clever.tlp`, `automotive.tlp`, `avis.tlp`, `eduard.tlp`, `ems.tlp`, `romfast.tlp`, `sigma.tlp`, `vadeco.tlp`). 3. Ridica tunelul fara interfata grafica: `& 'C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe' -profile=D:\roa\BITVISE\vending.tlp` (sau `Start-Process ... -WindowStyle Hidden` cu redirect in `$env:TEMP\stnlc_out.txt`). `stnlc` foloseste singur parola din profil: NU o pune pe linia de comanda si ruleaza sub acelasi cont Windows sub care a fost salvat profilul, altfel DPAPI nu poate decripta. 4. Verifica tunelul inainte de orice altceva (nu te baza ca procesul traieste): `(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded`. 5. Seteaza TNS: `$env:TNS_ADMIN = 'D:\ROA\instantclient_11_2_0_2'` pentru driverul ODBC pe 32 de biti, sau `instantclient_19_18` pentru `sqlplus`. Aliasul care merge prin tunel are `HOST = 127.0.0.1`, `PORT = 1521`. 6. DSN: sunt pe 32 de biti, in `HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI`. Listeaza cu `Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI' | Select-Object -ExpandProperty PSChildName`. Administrare vizuala: `C:\Windows\SysWOW64\odbcad32.exe` (**NU** cel din `System32`). 7. Interogheaza: `& 'D:\ROA\instantclient_19_18\sqlplus.exe' -S -L '/@VENDING' '@script.sql'`. `-L` = o singura incercare de login. **Foloseste-l intotdeauna pe productie.** 8. Prima interogare, mereu, ca sa stii unde ai nimerit: `select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;` 9. La final inchide tunelul (opreste procesul `stnlc`); nu-l lasa deschis peste noapte. ## Capcane - **Port local 1521 unic pentru mai multe destinatii**: daca ai deja un tunel catre alt client, al doilea nu mai poate lega portul si interoghezi **alta baza** fara sa-ti dai seama. Proba e pasul 8. - **`BvSsh.exe` (GUI)** poate tine portul 1521 legat pe `0.0.0.0` cu o sesiune moarta -> `sqlplus` da `ORA-12541: TNS:no listener`, desi "tunelul pare sus". `stnlc` isi poate lega totusi regula pe `127.0.0.1:1521` peste ea. Nu te lua dupa `netstat`: proba reala e interogarea. - **DSN-urile sunt pe 32 de biti** (VFP e pe 32 de biti) si stau in `WOW6432Node\ODBC\ODBC.INI`; `odbcad32.exe` din `System32` e pe 64 de biti si nu le vede. - **`$` in here-string** cu ghilimele duble (`@"..."@`): PowerShell expandeaza `$`, iar un regex Oracle care se termina cu ancora `$` ajunge stricat in `.sql` -> interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof (`@'...'@`). - **`termout off`** ascunde si mesajele de eroare: un spool gol nu inseamna date lipsa; ruleaza din nou fara `termout off` inainte sa banuiesti datele. - **Fara credentiale in git** si **fara ghicit parole**: `FAILED_LOGIN_ATTEMPTS` poate bloca schema in PRODUCTIE dupa cateva incercari gresite. Cere parola. - **Doar `SELECT`**: fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` persistent; margineaza cu `fetch first N rows only`. Codurile fiscale publice pot sta in repo, denumirile de parteneri, adresele si soldurile NU. ## Criterii de acceptare si dovada Fara dovezile da/nu de mai jos, conexiunea NU se raporteaza ca functionala. "S-a conectat" nu e dovada. 1. `(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded` -> `True`. 2. In `%TEMP%\stnlc_out.txt` apare `Added client-to-server forwarding rule on 127.0.0.1:1521 to localhost:1521.` 3. `sqlplus -S -L` chiar intoarce randuri din `select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;` -> schema si baza asteptate. 4. DSN-ul rezolva la host:port corect: numele e prezent in `WOW6432Node\ODBC\ODBC.INI`, iar aliasul TNS folosit de el arata spre `127.0.0.1:1521`. 5. Tunelul e inchis la final (procesul `stnlc` oprit). ## Scripturi - `C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe` - tunel din linie de comanda. - `C:\Program Files (x86)\Bitvise SSH Client\BvSsh.exe` - GUI (sursa capcanei de port). - `D:\ROA\instantclient_19_18\sqlplus.exe` - interogare read-only. - `D:\ROA\instantclient_11_2_0_2\` - clientul pentru driverul ODBC pe 32 de biti (`TNS_ADMIN`). - `C:\Windows\SysWOW64\odbcad32.exe` - administrarea DSN-urilor pe 32 de biti. - `Test-NetConnection` (PowerShell) - proba ca tunelul e sus. ## Referinta (doar la nevoie) - Doar daca ai nevoie de tabelul schemelor cunoscute (profil -> alias/DSN -> schema) sau de exemplul de extragere a codurilor fiscale, citeste `COMUN\docs\conexiuni-tunel-ssh-odbc.md`; re-exportul sursei unui pachet PL/SQL nu e acoperit aici, vezi `COMUN\docs\oracle_export.md`.