# Raport lane src — de ce cade ramura 1 (curl/PowerShell) pe ROMFAST 10.0.20.36 READ ONLY. Nu s-a rulat nimic pe Oracle, nu s-a modificat niciun fisier de cod. Comanda ceruta pentru teste: niciuna (nu e caz de test). Dovezi = citate din scripturi. ## Fisiere de referinta (aliasuri folosite mai jos) - **PU** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\co_2026_09_16_02_COMUN_PACK_UTILS.sql` (azi) - **PU_old** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\01\co_2026_01_14_01_PACK_UTILS.sql` (versiunea anterioara) - **PUF** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\co_2026_09_16_01_COMUN_PACK_UTILS_FILE.sql` (azi) - **PUPD** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\co_2026_09_16_03_COMUN_PACK_UPDATE.sql` (azi) - **ESO** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2025\09\sys_2025_09_24_03_EXECUTESCRIPTOS.sql` - **SRV** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2025\09\co_2025_09_24_02_COMUN_SERVER_INFO.sql` - **UPD25** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2025\10\co_2025_10_05_01_COMUN_UPDATE.sql` - **DMP** = `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\co_2026_08_20_01_DIAG_SPATIU_PACK.sql` --- ## 1. `DownloadFileOS` integral + preconditiile de pe serverul Oracle ### 1.1 Codul (PU:681-786) ```plsql 681: function DownloadFileOS(tcURL in varchar2, 682: tcProgramUPDDirectory in varchar2, 683: tcFileName in varchar2) return boolean as 684: lcScript clob; 685: lcDir varchar2(20) := 'DMPDIR'; 686: lcFileName varchar2(60) := 'download_' || 687: to_char(systimestamp, 'YYYYMMDDHH24MISSFF') || 688: '.ps1'; 689: lcPowerShellPath server_info.value%type; 690: lcCURLPath server_info.value%type; 691: lcDMPDIR varchar2(1000); 692: lcScriptFilePath varchar2(1000); 693: llReturn boolean := False; 694: tcDestination varchar2(1000) := PACK_UTILS_FILE.DirectoryPath(tcProgramUPDDirectory) || 695: tcFileName; 696: lcTimeOut varchar2(5) := '60'; 697: lnTimeOut number(5) := 60; 698: begin 699: BEGIN 700: select value 701: into lcPowerShellPath 702: from SERVER_INFO 703: WHERE UPPER(name) = 'POWERSHELLPATH'; 704: 705: EXCEPTION 706: WHEN NO_DATA_FOUND THEN 707: NULL; 708: END; 709: 710: BEGIN 711: select value 712: into lcTimeOut 713: from SERVER_INFO 714: WHERE UPPER(name) = 'POWERSHELLTIMEOUT'; 715: 716: EXCEPTION 717: WHEN NO_DATA_FOUND THEN 718: NULL; 719: END; 720: lnTimeOut := GREATEST(TO_NUMBER(lcTimeOut), 5); 721: 722: 723: BEGIN 724: select value 725: into lcCURLPath 726: from SERVER_INFO 727: WHERE UPPER(name) = 'CURLPATH'; 728: 729: EXCEPTION 730: WHEN NO_DATA_FOUND THEN 731: NULL; 732: END; 733: 734: lcDMPDIR := PACK_UTILS_FILE.DirectoryPath(lcDir); 735: 736: if lcDMPDIR is not null then 737: lcScriptFilePath := lcDMPDIR || lcFileName; 738: END if; 739: 740: -- Nu se continua daca nu exista calea catre POWERSHELL 741: if lcPowerShellPath is null or lcScriptFilePath is null then 742: goto sfarsit; 743: end if; 744: 745: -- Sterg scriptul ps anterior si fisierul destinatie ramas de la o rulare anterioara 746: pack_utils_file.filedelete(lcDir, lcFileName); 747: pack_utils_file.filedelete(tcProgramUPDDirectory, tcFileName); 748: 749: -- Creez pe disk scriptul ps pentru download 750: -- Descarc in .part si redenumesc la final, ca fisierul destinatie 751: -- sa apara doar complet si eliberat de curl (altfel citirea lui da ORA-29283/ORA-29291) 752: if lcCURLPath is null then 753: lcCURLPath := 'C:\Windows\System32\curl.exe'; 754: end if; 755: 756: lcScript := '& "' || lcCURLPath || '" -k -o "' || tcDestination || 757: '.part" "' || tcURL || '"' || chr(13) || chr(10) || 758: 'if ($LASTEXITCODE -eq 0) { Move-Item -Force -LiteralPath "' || 759: tcDestination || '.part" -Destination "' || tcDestination || 760: '" } else { Remove-Item -Force -ErrorAction SilentlyContinue -LiteralPath "' || 761: tcDestination || '.part" }'; 762: 763: pack_utils_file.clob2fileX(lcScript, lcDir, lcFileName); 764: 765: -- Execut scriptul ps 766: sys.ExecuteScriptOS(lcPowerShellPath, lcScriptFilePath); 767: 768: llReturn := True; 769: 770: -- Astept maxim 10 minute sa se descarce fisierul 771: for lnSleep in 1 .. lnTimeOut loop 772: exit when PACK_UTILS_FILE.FileExists(tcProgramUPDDirectory, 773: tcFileName); 774: sys.dbms_lock.sleep(1); 775: end loop; 776: 777: llReturn := PACK_UTILS_FILE.FileExists(tcProgramUPDDirectory, 778: tcFileName); 779: 780: -- Sterg scriptul ps (are nume unic, altfel se aduna in DMPDIR) 781: pack_utils_file.filedelete(lcDir, lcFileName); 782: 783: <> 784: 785: return llReturn; 786: end DownloadFileOS; ``` Intrarea in functie, dar si toata `URL2Clob` (contractul apelantului), se citeste la PU:333-376; ramura 1 se deschide doar la PU:347 (`IF lcPowerShellDownload = '1' THEN`), citirea fiind PU:341-344. ### 1.2 Fiecare preconditie care trebuie indeplinita PE SERVERUL ORACLE | # | Preconditie | Unde se citeste/consuma | Valoare asteptata | Daca nu e indeplinita | |---|---|---|---|---| | P1 | `SERVER_INFO(NAME='POWERSHELLDOWNLOAD')` | PU:341-347 | `VALUE = '1'` exact | ramura 1 nu se intra deloc → direct `HTTPURITYPE` (PU:367) → ORA-29273/29024. Daca randul lipseste: `NO_DATA_FOUND` neprins, alta eroare. | | P2 | `SERVER_INFO(NAME='POWERSHELLPATH')` | PU:700-703, garda PU:741 | non-NULL, ex. `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` (SRV:7) | `goto sfarsit` (PU:741-743) → `return FALSE`, FARA nicio urma | | P3 | directorul Oracle `DMPDIR` exista (si, mai jos, e scriibil) | `DirectoryPath('DMPDIR')` PUF:327-343 → PU:734-738 | rand in `all_directories` | `lcScriptFilePath` ramane NULL → `goto sfarsit` (PU:741) → `FALSE`, fara urma. Scriptul `.ps1` nu se poate scrie (PUF `CLOB2FILEX` → `dbms_xslprocessor.clob2file`) → exceptie | | P4 | directorul de destinatie `tcProgramUPDDirectory` (ex. `UPD_ROACONT`, `DMPDIR`) exista | `DirectoryPath(...)` PUF:327-343 → PU:694 | rand in `all_directories` | `DirectoryPath` intoarce NULL → `tcDestination = NULL||tcFileName = tcFileName` (doar numele, fara cale, PU:694) → curl scrie in CWD-ul jobului; `FileExists` pe un director inexistent ridica ORA-29280 (PUF:169 `utl_file.fgetattr`) | | P5 | `sys.ExecuteScriptOS` exista si e executabil din `CONTAFIN_ORACLE` | PU:766, definit in ESO:1-21 | procedura in schema SYS + grant | `ORACLE` nu-l vede / PLS-00201 sau ORA-06550; `ESO:16` in varianta curenta NU mai contine grant-ul (vezi 1.4) | | P6 | contul OS al jobului extern | DBMS_SCHEDULER job `job_type=>'executable'` (ESO:7-13) | contul de rulare al serviciului OracleJobScheduler are drept de executare `powershell.exe`, citire `.ps1`, scriere in DMPDIR si in directorul destinatie, executare `curl.exe`, acces retea+TLS catre `https://roa.romfast.ro` | jobul extern nu porneste / porneste si nu are drepturi → `.ps1` scris pe disc dar fara efect. **Punctul cel mai probabil de esec pe o instanta neconfigurata.** | | P7 | `SERVER_INFO(NAME='POWERSHELLTIMEOUT')` | PU:710-720, folosit PU:771 | numeric, ex. `'30'` (SRV:11) sau lipsa → default `'60'` (PU:696) | daca randul EXISTA dar e gol/NULL: `GREATEST(TO_NUMBER(NULL),5)=NULL` → `for lnSleep in 1..NULL` = 0 iteratii → verificarea de existenta se face imediat → `FALSE` (fals negativ), desi descarcarea ar fi reusit in cateva secunde | | P8 | `SERVER_INFO(NAME='CURLPATH')` (optional) | PU:723-727, folosit PU:752-754 | cale valida la `curl.exe` | NU e preconditie: daca lipseste, codul cade pe `C:\Windows\System32\curl.exe` (PU:753). Daca acel fisier nu exista pe OS, scriptul PowerShell da eroare → fara fisier | **Criteriul de succes este exclusiv existenta fisierului** (PU:777-778). Codul de iesire al `curl.exe` este folosit doar in interiorul scriptului `.ps1` ca sa decida redenumirea (PU:758) — Oracle nu il vede niciodata. Preconditiile P6/P7/P8 sunt OS, deci SQL nu le poate confirma direct. ### 1.3 Unde scrie `.part` si unde il muta - `tcDestination` = `DirectoryPath(tcProgramUPDDirectory) || tcFileName` (PU:694-695) — calea FIZICA a directorului Oracle. - curl scrie in `.part` (`-o`, PU:756-757), apoi `Move-Item -Force` in `` doar daca `$LASTEXITCODE -eq 0`; altfel `Remove-Item` pe `.part` (PU:758-761). - Daca directorul nu exista (P4) → `tcDestination` fara cale → fisierul ajunge in directorul curent al procesului jobului. - Daca directorul nu e scriibil pentru contul OS (P6): curl da eroare → nu apare `.part` si nu apare nici destinatia → `FALSE`. Pe vechiul cod (fara `.part`) eroarea se manifesta la CITIRE (ORA-29283/29291), pe cel nou se manifesta ca „fisier lipsa“ (vezi sectiunea 3). ### 1.4 `sys.ExecuteScriptOS` — ce e exact si ce cere Definitie (ESO:1-21): ```plsql 1: create or replace procedure ExecuteScriptOS(tcPowerShellPath in varchar2, 2: tcScriptPath in varchar2) as 3: lcJobName varchar2(500); 4: begin 5: lcJobName := 'exec_ps_' || SUBSTR(SYS_GUID(), 1, 8); 6: DBMS_SCHEDULER.CREATE_JOB( 7: job_name => lcJobName, 8: job_action => tcPowerShellPath, 9: number_of_arguments => 4, 10: job_type => 'executable', 11: enabled => FALSE 12: ); 13: DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 1, '-ExecutionPolicy'); 14: DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 2, 'Bypass'); 15: DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 3, '-File'); 16: DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 4, tcScriptPath); 17: DBMS_SCHEDULER.ENABLE(lcJobName); 18: end ExecuteScriptOS; ``` - **Nu** e Java stored proc, **nu** e DBMS_SCHEDULER „program“ cu credential, **nu** e extproc: e un **DBMS_SCHEDULER external executable job** (`job_type => 'executable'`, ESO:10). Comanda lansata pe OS: ` -ExecutionPolicy Bypass -File ` (ESO:13-16). - Proprietar: **SYS** — fisierul e `sys_*`, iar `UpdateVersiune('sys_2025_09_24_03_EXECUTESCRIPTOS','','SYS')` (ESO:24); apelul e calificat `sys.ExecuteScriptOS` (PU:766). S-a schimbat de la 1 argument (2023/05 si 2024/02) la 4 argumente (`-ExecutionPolicy Bypass -File`) in `sys_2025_09_24_03`. - Componente/privilegii cerute: - `EXECUTE` pe `SYS.ExecuteScriptOS` pentru `CONTAFIN_ORACLE`. In ESO:24 (versiunea din 16.09.2026) **nu mai exista linia de grant** — trimite la `grant execute on EXECUTESCRIPTOS to CONTAFIN_ORACLE` din scriptul de instalare `ALTELE\Creare_server_scripturi\sys_2024_02_22_01_COMUN.sql:16`. Daca procedura a fost recreata de ESO (fara grant), grant-ul mai vechi **se pastreaza** (CREATE OR REPLACE nu-l pierde), dar pe o instanta curata trebuie rulat scriptul de instalare. **Neverificat pe ROMFAST.** - Componenta `DBMS_SCHEDULER` si `CREATE JOB` — se executa in SYS (droits de definer), deci nu cere `CREATE EXTERNAL JOB` in `CONTAFIN_ORACLE`. - **Contul OS al jobului extern** — conditionarea reala: procesul `OracleJobScheduler` (Windows) ruleaza ca un cont de serviciu; acel cont trebuie sa poata executa `powershell.exe`, sa citeasca `.ps1`-ul din DMPDIR, sa scrie in DMPDIR si in directorul destinatie, sa execute `curl.exe` si sa iasa in retea pe `https://roa.romfast.ro`. Fara aceste drepturi, jobul ruleaza si esueaza fara ca Oracle sa vada ceva (codul de iesire nu e citit). - Nu s-a gasit niciun script in `SCRIPTURI_CLAR` / `ALTELE` care sa acorde `CREATE ANY DIRECTORY` sau `READ,WRITE ON DIRECTORY DMPDIR` (grep pe tot `D:\ROA\DATABASE`): DMPDIR vine din instalare — `create or replace directory DMPDIR as 'C:\DMPDIR'` (`ALTELE\Creare_server_scripturi\sys_2012_06_21_01_FIRMA.sql:119`) si `grant all on directory DMPDIR to CONTAFIN_ORACLE` (`SCRIPTURI_CLAR\2013\01\sys_2013_01_23_02.sql:8`). Atentie: in `SCRIPTURI_CLAR\2012\06\sys_2012_06_21_01_FIRMA.sql:388` linia de grant este **comentata** (`rem grant all on directory DMPDIR to CONTAFIN_ORACLE;`) — pe instantele instalate din acel script, grant-ul poate lipsi. **Neverificat pe ROMFAST.** - Jobul NU are `auto_drop` (ESO:6-12) → dupa rulare ramane in `DBA_SCHEDULER_JOBS` ca job one-time, cu nume unic `exec_ps_<8 hex>`. Util pentru a dovedi daca jobul a fost lansat vreodata. ### 1.5 Normalizarea directorului — de unde vine `lcDir` `lcDir` este **hardcodat** `'DMPDIR'` in ambele locuri (PU:336 in URL2Clob, PU:685 in DownloadFileOS); nu vine nici din parametru, nici din `SERVER_INFO`. `PACK_UTILS_FILE.DirectoryPath` (PUF:327-343) il rezolva la calea fizica prin `select DIRECTORY_PATH into lcPath from all_directories where directory_name = UPPER(tcDirectoryName)` si adauga bara (PUF:336). Deci: - numele `DMPDIR` este un **obiect Oracle DIRECTORY**, nu o cale; - drepturile semnificative sunt pe obiectul DIRECTORY: `READ` (pentru `FGETATTR`/`FREMOVE`/`READ2CLOB`) si `WRITE` (pentru `CLOBFILE2FILE`/`FREMOVE`) — PUF:169, PUF:185, PUF:302, PUF:321. --- ## 2. Ce se logheaza la esecul ramurii 1 **Raspuns explicit: in ramura 1 nu se logheaza absolut nimic.** `DownloadFileOS` nu are `UPD_LOG`, nu are `DBMS_OUTPUT`, nu are `RAISE`; singurul rezultat al esecului este `return FALSE` (PU:693, PU:777-785). Nu exista nici macar urma ca a fost incercata. Traseul erorii, in continuare: 1. `URL2Clob` cade pe `HTTPURITYPE.createuri(tcURL).getclob()` (PU:367) → ORA-29273 (peste `https` fara wallet → ORA-29024). 2. Handler-ul `URL2Clob` (PU:369-375) sterge doar fisierul temporar si face `RAISE`; **nu logheaza**. 3. `UPDLOG` nu este apelat pe acest drum inainte de `URL2Clob` — singurul `UPDLOG` din pasul listelor este DUPĂ ambele descarcari, la PUPD:427, deci nu se executa niciodata daca `URL2Clob` a aruncat. Locul exact al apelului (PUPD:416-427): ```plsql 418: lcListaPrograme := PACK_UTILS.URL2Clob(lcURLAppXml); ... 423: lcListaRoastart := PACK_UTILS.URL2Clob(lcURLRoastartXml); ... 427: UPDLOG(lcText, ldDataOraS); ``` Apelurile 418/423 sunt in corpul procedurii `UpdateApp` (inceput la PUPD:309), **in afara** blocului `begin/exception` de la PUPD:434-520 (care prinde doar bucla de scanare a programelor, PUPD:514-519). `UpdateApp` este `pragma autonomous_transaction` (PUPD:310) si nu are handler propriu → exceptia iese din `UpdateApp`, iar `UpdateROA` **nu are nici el handler** (apel la PUPD:275; `UpdateROA` se termina la PUPD:303) → nu se ajunge nici la `EmailLog` de la PUPD:300-302. **Unde s-ar fi putut loga:** - PUPD:427 (primul `UPDLOG`) — dar e dupa `URL2Clob`; - un `begin/exception` in jurul lui PUPD:418/423 (modelul exista la buletinul informativ, PUPD:729-737, care logheaza `'ERR: ' || lcURL... || sqlcode || sqlerrm`); - in `DownloadFileOS` sau in handler-ul `URL2Clob` (PU:369-375). **Ce urme ramane totusi:** - `UPD_ISTORIC.STARE` = `UPDATE_STARE_APLICATII`, scris la PUPD:274 inainte de `UpdateApp` (`UpdateIstoric`, PUPD:2408-2436) → stare lasata „blocat la aplicatii“. - Un rand de eroare in jobul DBMS_SCHEDULER `UPDATEROA_JOB` (creat la PUPD:178-186, `job_action => 'PACK_UPDATE.UpdateROA'`) — deci `DBA_SCHEDULER_JOB_LOG` / `_RUN_DETAILS.ADDITIONAL_INFO`, nu `UPD_LOG`. - **Diferenta importanta de diagnostic:** daca esecul e pe buletinul informativ (PUPD:730), `UPD_LOG` **contine** un rand `'ERR: ORA-29273 ... ORA-29024'` (PUPD:732-736). Daca `UPD_LOG` nu are niciun rand `ERR:` pentru rularea respectiva, esecul e la PUPD:418 sau 423. --- ## 3. Ce a schimbat scriptul de azi fata de versiunea anterioara Versiunea precedenta a lui PACK_UTILS: **PU_old** (`co_2026_01_14_01_PACK_UTILS.sql`, 14.01.2026). Urmatoarea in istoricul de fisiere: `2025/09/co_2025_09_24_01_COMUN_PACK_UTILS.sql` (introduce DownloadFileOS + POWERSHELLDOWNLOAD). ### 3.1 Diff conceptual (numai `DownloadFileOS`) | Element | PU_old | PU (azi) | |---|---|---| | numele scriptului `.ps1` | `varchar2(30) := 'download_file.ps1'` (PU_old:680) — FIX | `varchar2(60) := 'download_' || to_char(systimestamp,'YYYYMMDDHH24MISSFF') || '.ps1'` (PU:686-688) — unic | | sterge fisierul destinatie inainte | nu | `pack_utils_file.filedelete(tcProgramUPDDirectory, tcFileName)` (PU:747) | | scrie in | direct `` (PU_old:743-747) | `.part`, apoi `Move-Item -Force` (PU:756-761) | | rezultat partial | fisier partial vizibil (de aceea bug-ul ORA-29283/29291, PU:750-751) | fisierul final apare doar dupa `Move-Item` reusit | | sterge `.ps1` la final | nu | `pack_utils_file.filedelete(lcDir, lcFileName)` (PU:781) | | preconditii de intrare | identice (POWERSHELLDOWNLOAD / POWERSSHELLPATH / DMPDIR / CURLPATH / TIMEOUT) | identice, neschimbate | | `URL2Clob` / `URL2Blob` | — | neschimbate logic (se schimba doar diacriticele din comentarii) | ### 3.2 Verdict: **NU** — modificarea de azi nu a „rupt“ ramura 1 prin preconditii Cu citat: garda de intrare din `URL2Clob` este neschimbata (`IF lcPowerShellDownload = '1' THEN` PU:347, identic PU_old:292), garda de iesire din `DownloadFileOS` este neschimbata (`if lcPowerShellPath is null or lcScriptFilePath is null then goto sfarsit;` PU:741-743, identic PU_old:733-735), aceleasi nume de `SERVER_INFO` (PU:703/714/727 vs PU_old:695/706/719) si acelasi `lcDir := 'DMPDIR'` (PU:685 vs PU_old:679). **Niciun director nou, nicio preconditie in minus.** ### 3.3 Ce s-a schimbat, totusi, in comportamentul de esec (relevant pentru simptom) Modificarea poate fi **neverificat** cauza incidentului, dar nu prin preconditii, ci prin **felul in care se manifesta un esec deja existent**: - Inainte: curl scria direct in ``; daca fisierul era tinut deschis de alt proces, citirea dadea **ORA-29283/ORA-29291** (exact motivul notat in comentariul de azi, PU:750-751). - Acum: curl scrie in `.part`, iar `` apare **doar daca `Move-Item` reuseste** (PU:758). Un `Move-Item` care esueaza (fisier destinatie blocat, drepturi, antivirus) este **inghitit tacit** — scriptul nu scrie nimic in log, iar Oracle testeaza doar existenta fisierului (PU:777-778) → `FALSE` → fallback `HTTPURITYPE` → **ORA-29273/ORA-29024**. - Deci: daca pe ROMFAST conditia de baza era deja marginala, eroarea raportata acum **se schimba** din ORA-29291 in ORA-29024, fara ca vreo preconditie sa fi fost scoasa. - A doua schimbare de azi, in `PACK_UTILS_FILE` (**PUF**), merge in acelasi sens: `FileDelete` a devenit best-effort (`when others then null`, PUF:187-192), deci nu mai poate masca eroarea originala cu ORA-29291. Nici aceasta nu introduce preconditii. Concluzie punct 3: **NU** (nu a rupt-o prin preconditii) + **neverificat** daca a contribuit la simptomul de azi (ar cere dovezi OS: exista `.part` sau `.ps1` ramase in DMPDIR?). --- ## 4. Interogari read-only de rulat pe ROMFAST (scrise, NU rulate) Toate sunt `SELECT`. Pentru Oracle 10.2 compatibil (fara `FETCH FIRST`). **Q1 — configurarea, cheia de departajare a ipotezelor.** ```sql SELECT name, value FROM SERVER_INFO WHERE UPPER(name) IN ('POWERSHELLDOWNLOAD','POWERSHELLPATH','POWERSHELLTIMEOUT', 'CURLPATH','DMPDIR','ROAUPDATEPATH','UPDATEPREREQ') ORDER BY name; ``` - `POWERSHELLDOWNLOAD` ∈ {`'0'`, `''`, NULL} → **confirma** ca ramura 1 nu se intra (cauza = P1) si ca ORA-29024 e garantat; `='1'` → **infirma**, ramura 1 se incearca. - `POWERSHELLPATH` NULL/`''` → **confirma** ca `DownloadFileOS` iese imediat cu `FALSE` (P2) — suspectul principal; non-NULL → infirma. - `POWERSHELLTIMEOUT` prezent dar gol → **confirma** falsul negativ din P7; absent → default 60s (ok). - `UPDATEPREREQ='1'` → explica de ce DMPDIR/update dirs **nu** mai sunt re-verificate la fiecare update. **Q2 — directorul Oracle (P3/P4).** ```sql SELECT directory_name, directory_path FROM all_directories WHERE directory_name = 'DMPDIR' OR directory_name LIKE 'UPD_%' ORDER BY 1; ``` Lipsa lui `DMPDIR` → **confirma** ca ramura 1 e imposibila (`lcScriptFilePath` NULL); lipsa unui `UPD_` → alta eroare (ORA-29280), nu ORA-29024. **Q3 — drepturile pe DMPDIR si pe SYS.ExecuteScriptOS (P5).** ```sql SELECT grantee, privilege FROM all_tab_privs WHERE table_name = 'DMPDIR' AND privilege IN ('READ','WRITE') ORDER BY 1; SELECT owner, object_name, status FROM all_objects WHERE object_name = 'EXECUTESCRIPTOS' AND object_type = 'PROCEDURE'; SELECT grantee FROM all_tab_privs WHERE table_name = 'EXECUTESCRIPTOS' AND privilege = 'EXECUTE'; ``` Lipsa `READ`/`WRITE` pentru `CONTAFIN_ORACLE`/`PUBLIC` → confirma ca fisierul nu se poate scrie/citi; `STATUS='INVALID'` sau lipsa grant → confirma P5. **Q4 — urma din UPD_LOG / UPD_ISTORIC (punctul 2).** ```sql SELECT secventa, TO_CHAR(dataora,'DD.MM.YYYY HH24:MI:SS') d, SUBSTR(explizatie,1,300) t FROM UPD_LOG WHERE dataora > SYSDATE - 7 ORDER BY secventa; SELECT TO_CHAR(dataora_start,'DD.MM.YYYY HH24:MI:SS') s, stare, id_util FROM UPD_ISTORIC WHERE dataora_start > SYSDATE - 7 ORDER BY dataora_start; ``` Prezenta unui rand `ERR:` cu `ORA-29273`/`ORA-29024` → esecul e pe buletinul informativ (PUPD:730). **Absenta** oricarui `ERR:` + `STARE` = starea „aplicatii“ → confirma esecul la PUPD:418/423 (nelogat). **Q5 — joburile externe si jobul de update (P6) — dovedeste daca PowerShell a fost lansat vreodata.** ```sql SELECT job_name, TO_CHAR(log_date,'DD.MM.YYYY HH24:MI:SS') d, status, error#, SUBSTR(additional_info,1,500) info FROM (SELECT * FROM dba_scheduler_job_log ORDER BY log_date DESC) WHERE (job_name LIKE 'exec_ps_%' OR job_name = 'UPDATEROA_JOB') AND ROWNUM <= 50; SELECT job_name, enabled, state, TO_CHAR(last_start_date,'DD.MM.YYYY HH24:MI:SS') last_start FROM dba_scheduler_jobs WHERE job_name LIKE 'exec_ps_%' OR job_name = 'UPDATEROA_JOB'; ``` Existenta joburilor `exec_ps_*` cu `status='SUCCEEDED'` → PowerShell a rulat cel putin o data (**infirma** „instanta neconfigurata“); zero joburi `exec_ps_*` → **confirma** ca `sys.ExecuteScriptOS` nu s-a executat niciodata; `UPDATEROA_JOB` esuat cu ORA-29273/29024 in `additional_info` → confirma locul erorii. **Q6 — URL-urile reale (ca sa nu banuim degeaba https-ul).** ```sql SELECT varname, varvalue FROM OPTIUNI WHERE varname LIKE 'UPD_URL%'; SELECT TO_NUMBER(detalii) customerid FROM SYS.AUTH_DETALII; ``` `UPD_URL_APP` fara `https://` sau NULL → s-ar lua default-ul http (PUPD:379/381), unde `HTTPURITYPE` ar putea functiona — deci **infirma** ipoteza „https fara wallet“ si muta cauza in alta parte. `https://roa.romfast.ro` → **confirma** ca esecul ramurii 1 duce obligatoriu in ORA-29024. **Q7 — identitatea instantei (sa nu raportam de pe alt server).** ```sql SELECT SYS_CONTEXT('USERENV','SERVER_HOST') host, SYS_CONTEXT('USERENV','DB_NAME') db, SYS_CONTEXT('USERENV','INSTANCE_NAME') inst FROM dual; ``` ### Verificari OS (NU se pot face prin SQL — marcat neverificat pana se fac) In directorul fizic al `DMPDIR` (Q2/Q1), pe ROMFAST: - exista fisiere `url2clob_*.tmp.part` sau `url2app_*.part` rămase → curl **a scris**, dar `Move-Item` a esuat (blocare/drepturi) → confirma scenariul din 3.3; - exista fisiere `download_*.ps1` acumulate → scriptul se scrie, dar jobul extern nu ruleaza/vrea sa-l ruleze → confirma P5/P6; - nu exista nici `.part`, nici `.ps1` → `DownloadFileOS` nu a ajuns la scriere deloc → confirma P1/P2/P3; - `C:\Windows\System32\curl.exe` exista si depinde daca `CURLPATH` e setat (PU:752-754). - in `DBA_SCHEDULER_JOB_RUN_DETAILS.ADDITIONAL_INFO` se vede codul de iesire OS al jobului extern PowerShell (singurul loc unde ajunge `$LASTEXITCODE`-ul real al scenariului). --- ## 5. Nefacut / deschis - Nu s-a rulat nicio interogare si nicio comanda pe ROMFAST/10.0.20.36 (interzis de sarcina): **cine a produs incidentul de azi ramane neverificat pana la Q1-Q7 + verificarile OS.** - Nu am putut confirma daca `POWERSHELLPATH` / `CURLPATH` / grant-urile pe `DMPDIR` sunt configurate pe ROMFAST — nu apar in niciun script de migrare (verificat prin grep pe `D:\ROA\DATABASE`), deci sunt setari de instalare/OS. - Nu s-a facut write-back, nu s-a modificat niciun fisier (in afara de acest raport), nu s-a pornit niciun proces. - Stare periculoasa: **niciuna**. GATA src