Files
comun/skills/roa-oracle-production-access/SKILL.md
Marius Mutu d64124386c skills: 9 skill-uri de agent ROA (COMUN\skills) + legare si rutare
- leaga_skills.ps1: expune skill-urile in ~/.claude/skills prin symlink (citit si de Claude Code, si de opencode), fara copiere
- rutare zona->skill in reguli_lucru pct. 7, README, AGENTS.md; skill-ul devine proprietarul procedurii, docurile raman referinta conditionata
- rec_skills.md: decizia, inventarul si cum se adauga un skill nou
2026-09-16 11:54:37 +03:00

92 lines
6.6 KiB
Markdown

---
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 '<schema>/<parola>@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`.