sync SVN r18142
This commit is contained in:
@@ -15,6 +15,9 @@ temporar in `DMPDIR`). Foloseste-l intai; sectiunile de mai jos explica ce cites
|
|||||||
Cand cauza e spatiul (tablespace plin, audit/loguri Oracle care umplu discul), continua cu
|
Cand cauza e spatiul (tablespace plin, audit/loguri Oracle care umplu discul), continua cu
|
||||||
`depanare-spatiu-oracle.md` si `COMUN\utile\diag_spatiu.ps1`.
|
`depanare-spatiu-oracle.md` si `COMUN\utile\diag_spatiu.ps1`.
|
||||||
|
|
||||||
|
Fluxul complet (ce ruleaza pe ce masina, rutele serverului, cele doua emailuri):
|
||||||
|
`flux-actualizare-si-buletine.md`.
|
||||||
|
|
||||||
Cand eroarea e de retea/HTTP (`ORA-29273` / `ORA-29024` / descarcare esuata), cauza e aproape sigur
|
Cand eroarea e de retea/HTTP (`ORA-29273` / `ORA-29024` / descarcare esuata), cauza e aproape sigur
|
||||||
pe serverul de actualizari, nu pe client: continua cu `depanare-server-update-roa.md`.
|
pe serverul de actualizari, nu pe client: continua cu `depanare-server-update-roa.md`.
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,16 @@ de ce se intampla **pe serverul care livreaza actualizarile**. Foloseste documen
|
|||||||
`PACK_UPDATE` esueaza cu erori de retea / HTTP, adica atunci cand clientul e in regula dar nu
|
`PACK_UPDATE` esueaza cu erori de retea / HTTP, adica atunci cand clientul e in regula dar nu
|
||||||
primeste fisierele.
|
primeste fisierele.
|
||||||
|
|
||||||
|
Ansamblul fluxului, fara depanare: `flux-actualizare-si-buletine.md`.
|
||||||
|
|
||||||
## Lantul complet, de la eroare la cauza
|
## Lantul complet, de la eroare la cauza
|
||||||
|
|
||||||
```
|
```
|
||||||
job UPDATEROA_ZILNIC -> PACK_UPDATE.UpdateROA
|
job UPDATEROA_ZILNIC -> PACK_UPDATE.UpdateROA
|
||||||
-> PACK_UTILS.URL2Clob / URL2Blob
|
-> PACK_UTILS.URL2Clob / URL2Blob
|
||||||
daca SERVER_INFO.POWERSHELLDOWNLOAD = 1:
|
daca SERVER_INFO.POWERSHELLDOWNLOAD = 1:
|
||||||
-> PACK_UTILS.DownloadFileOS -> scrie C:\DMPDIR\download_file.ps1
|
-> PACK_UTILS.DownloadFileOS -> scrie C:\DMPDIR\download_<timestamp>.ps1 (pana la co_2026_09_16_02: download_file.ps1)
|
||||||
-> sys.ExecuteScriptOS -> powershell -> curl.exe -k -o <tmp> <url>
|
-> sys.ExecuteScriptOS -> powershell -> curl.exe -k -o <tmp>.part <url>, redenumit la final (pana la co_2026_09_16_02: direct in <tmp>)
|
||||||
-> asteapta max SERVER_INFO.POWERSHELLTIMEOUT secunde sa apara <tmp>
|
-> asteapta max SERVER_INFO.POWERSHELLTIMEOUT secunde sa apara <tmp>
|
||||||
daca fisierul NU apare (sau POWERSHELLDOWNLOAD <> 1):
|
daca fisierul NU apare (sau POWERSHELLDOWNLOAD <> 1):
|
||||||
-> cade pe HTTPURITYPE.createuri(url).getclob()/getblob()
|
-> cade pe HTTPURITYPE.createuri(url).getclob()/getblob()
|
||||||
@@ -46,7 +48,7 @@ curl.exe -k -s -o NUL --max-time 20 -w "HTTP=%{http_code} t=%{time_total}" "http
|
|||||||
|
|
||||||
`HTTP=000` cu `t` egal cu `--max-time` = blocat (nu refuzat). `exit=28` = timeout.
|
`HTTP=000` cu `t` egal cu `--max-time` = blocat (nu refuzat). `exit=28` = timeout.
|
||||||
|
|
||||||
Ultima comanda reala rulata de Oracle e in **`C:\DMPDIR\download_file.ps1`** pe serverul clientului
|
Ultima comanda reala rulata de Oracle e in **`C:\DMPDIR\download_*.ps1`** (un singur fisier, cu nume fix, pana la co_2026_09_16_02) pe serverul clientului
|
||||||
- contine URL-ul exact si numele fisierului tinta. Daca `.tmp`-ul corespunzator nu exista, stii
|
- contine URL-ul exact si numele fisierului tinta. Daca `.tmp`-ul corespunzator nu exista, stii
|
||||||
sigur ca descarcarea a picat.
|
sigur ca descarcarea a picat.
|
||||||
|
|
||||||
@@ -165,7 +167,7 @@ Dupa kill, totul revine imediat - nu e nevoie de restart de sit sau de recycle d
|
|||||||
## Lista scurta de verificare
|
## Lista scurta de verificare
|
||||||
|
|
||||||
1. `user_scheduler_job_run_details` pe clientul afectat: care e eroarea reala si **din ce zi**.
|
1. `user_scheduler_job_run_details` pe clientul afectat: care e eroarea reala si **din ce zi**.
|
||||||
2. `C:\DMPDIR\download_file.ps1` pe client: URL-ul exact; exista `.tmp`-ul?
|
2. scriptul `download_*.ps1` din `C:\DMPDIR` pe client: URL-ul exact; exista `.tmp`-ul?
|
||||||
3. `curl` de pe client pe acel URL: raspunde sau timeout?
|
3. `curl` de pe client pe acel URL: raspunde sau timeout?
|
||||||
4. Pe ROACENTRAL, `curl` local cu `--resolve`, pentru mai multi clienti: e global sau doar unul?
|
4. Pe ROACENTRAL, `curl` local cu `--resolve`, pentru mai multi clienti: e global sau doar unul?
|
||||||
5. `log.txt` al aplicatiei: pana la ce linie ajunge cererea blocata.
|
5. `log.txt` al aplicatiei: pana la ce linie ajunge cererea blocata.
|
||||||
|
|||||||
127
docs/flux-actualizare-si-buletine.md
Normal file
127
docs/flux-actualizare-si-buletine.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
# Fluxul actualizarii ROA si al buletinului informativ
|
||||||
|
|
||||||
|
Referinta de ansamblu: cine cheama pe cine, de pe ce masina si cu ce fisiere. Pentru depanare
|
||||||
|
mergi la `depanare-pack-update.md` (baza clientului) si `depanare-server-update-roa.md`
|
||||||
|
(serverul care livreaza).
|
||||||
|
|
||||||
|
## Masinile
|
||||||
|
|
||||||
|
| Rol | Masina | Ce ruleaza |
|
||||||
|
|---|---|---|
|
||||||
|
| baza clientului | serverul Oracle al clientului | jobul `UPDATEROA_ZILNIC` -> `CONTAFIN_ORACLE.PACK_UPDATE` |
|
||||||
|
| serverul de actualizari | **ROACENTRAL**, 10.0.20.122 | IIS + ActiveVFP, `D:\APPUPDATESERVERAVFP`; rutele `updroa` |
|
||||||
|
| baza centrala | **ROA_CENTRAL**, 10.0.20.121 | `SOFT_SERII` (contracte, clienti), `CONTAFIN_ORACLE` (`UPD_DATABASE`, scripturi) |
|
||||||
|
| proxy public | 10.0.20.36 | `roa.romfast.ro` -> ROACENTRAL |
|
||||||
|
| SMTP | `mail.romfast.ro` = 185.141.190.195 | Exim (a2hosting), **cerut cu TLS** |
|
||||||
|
|
||||||
|
## 1. Actualizarea, pe client
|
||||||
|
|
||||||
|
`UPDATEROA_ZILNIC` -> `PACK_UPDATE.UpdateROA`, trei etape secventiale; una esuata le opreste pe
|
||||||
|
urmatoarele si starea ramane in `UPD_ISTORIC` (`0` start, `1` aplicatii, `2` scripturi, `3`
|
||||||
|
aplicare, `4` incheiat):
|
||||||
|
|
||||||
|
1. **UpdateApp** - descarca `roa_app.xml` / `roastart_app.xml` (lista de versiuni) si arhivele
|
||||||
|
programelor cu versiune mai noua, in directoarele Oracle `UPD_<PROGRAM>`; la final cere
|
||||||
|
serverului trimiterea buletinului informativ (vezi mai jos).
|
||||||
|
2. **UpdateScripts** - descarca `roa_database.xml` + arhivele de scripturi si umple `UPD_DATABASE`.
|
||||||
|
3. **UpdateDatabaseSqlPlus** - genereaza in `DMPDIR` (`C:\DMPDIR`) `script_<SCHEMA>.sql` +
|
||||||
|
`script_master.sql` si le da unui SQL*Plus extern; iesirea in `C:\DMPDIR\script_master.log`
|
||||||
|
(erorile de aici **nu** ajung in `UPD_LOG`).
|
||||||
|
|
||||||
|
Logul rularii curente e in `UPD_LOG` (se goleste la fiecare rulare); esecul real al jobului in
|
||||||
|
`dba_scheduler_job_run_details`.
|
||||||
|
|
||||||
|
### Cum se descarca, de fapt
|
||||||
|
|
||||||
|
```
|
||||||
|
PACK_UTILS.URL2Clob / URL2Blob
|
||||||
|
daca SERVER_INFO.POWERSHELLDOWNLOAD = 1:
|
||||||
|
-> PACK_UTILS.DownloadFileOS
|
||||||
|
scrie in DMPDIR un script ps (download_<timestamp>.ps1; inainte de
|
||||||
|
co_2026_09_16_02_COMUN_PACK_UTILS era un nume fix, download_file.ps1)
|
||||||
|
-> sys.ExecuteScriptOS (job scheduler 'executable', asincron)
|
||||||
|
-> powershell -ExecutionPolicy Bypass -File <script>
|
||||||
|
-> curl.exe -k -o "<fisier>.part" "<url>"; la exit 0, Move-Item pe numele final
|
||||||
|
-> asteapta max SERVER_INFO.POWERSHELLTIMEOUT secunde sa apara fisierul final
|
||||||
|
daca fisierul nu apare (sau POWERSHELLDOWNLOAD <> 1):
|
||||||
|
-> HTTPURITYPE.createuri(url).getclob()/getblob() <- pe https nu poate functiona fara wallet
|
||||||
|
```
|
||||||
|
|
||||||
|
Descarcarea in `.part` cu redenumire la final a fost introdusa de
|
||||||
|
`co_2026_09_16_02_COMUN_PACK_UTILS` (16.09.2026). Inainte, bucla iesea din prima secunda pentru ca
|
||||||
|
`curl` creeaza fisierul gol la inceputul cererii si il tine deschis: citirea lui dadea
|
||||||
|
**ORA-29283**, iar stergerea **ORA-29291**, si actualizarea se oprea. Tot atunci:
|
||||||
|
`PACK_UTILS_FILE.FileDelete` a devenit best-effort si `PACK_UPDATE.EmailLog` nu mai ridica
|
||||||
|
`ORA-20000` peste eroarea reala.
|
||||||
|
|
||||||
|
URL-urile vin din `OPTIUNI.UPD_URL_APP`, `UPD_URL_DATABASE`, `UPD_URL_BULETININF` (daca lipsesc,
|
||||||
|
din default-urile din cod), cu `|CUSTOMERID|` inlocuit din `sys.auth_detalii.detalii`.
|
||||||
|
|
||||||
|
## 2. Rutele de pe serverul de actualizari
|
||||||
|
|
||||||
|
`D:\APPUPDATESERVERAVFP\prg\rest\controllers\updroa.prg`, chemate prin
|
||||||
|
`.../contafinupdate/default.aspx/updroa/<ruta>/<parametri>`:
|
||||||
|
|
||||||
|
| Ruta | Ce face |
|
||||||
|
|---|---|
|
||||||
|
| `download/<customerid>/<fisier>` | serveste `roa_app.xml`, `roastart_app.xml`, `roa_database.xml`, arhivele de programe si de scripturi din `D:\ROAUPDATE\_UPDATE\` |
|
||||||
|
| `buletin_informativ/<id_client>` | **compune si trimite** emailul de buletin catre clientul respectiv; intoarce un text de stare |
|
||||||
|
|
||||||
|
`updroa.prg` **nu se compileaza**: ActiveVFP compileaza `.prg`-ul din mers. Directorul e o copie de
|
||||||
|
lucru SVN (`http://svnroa:3001/svn/fox/Appupdate/activevfp`), deci modificarile se vad imediat, iar
|
||||||
|
`svn diff` / `svn revert` sunt plasa de siguranta.
|
||||||
|
|
||||||
|
Ambele rute trec intai prin `GetCustomer`, care interogheaza
|
||||||
|
`SOFT_SERII.VGEN_CONTRACTESUPORTTEHNIC` pe ROA_CENTRAL (view care ia datele contractului peste db
|
||||||
|
link `DBL_ROMFAST2` -> 10.0.20.36) si tine un cache local in `D:\APPUPDATESERVERAVFP\data\contracte.dbf`.
|
||||||
|
|
||||||
|
Log-ul aplicatiei: `D:\APPUPDATESERVERAVFP\prg\rest\controllers\log.txt` (fiecare cerere se
|
||||||
|
incheie cu `<id_client> | <mesajul returnat>`). Loguri IIS: `C:\inetpub\logs\LogFiles\W3SVC1\`.
|
||||||
|
|
||||||
|
## 3. Cele doua emailuri - nu se confunda
|
||||||
|
|
||||||
|
| | Log de actualizare | Buletin informativ |
|
||||||
|
|---|---|---|
|
||||||
|
| Cine trimite | **baza clientului**, `PACK_UPDATE.EmailLog`, `UTL_SMTP` direct | **serverul de actualizari**, `SendViaCDOSYS` din `prg\utility\sendemail.prg` |
|
||||||
|
| Cand | doar pe esecul actualizarii | la finalul etapei `UpdateApp`, prin GET pe `UPD_URL_BULETININF` |
|
||||||
|
| Catre | `SERVER_INFO.EMAIL_TO` + `EMAIL_CC` | adresa clientului din `customers.email` (ROA_CENTRAL), cu BCC `office@romfast.ro` |
|
||||||
|
| Continut | liniile din `UPD_LOG` | raport HTML generat de server |
|
||||||
|
| Ce vede clientul in `UPD_LOG` | - | raspunsul HTTP, verbatim |
|
||||||
|
|
||||||
|
Un buletin esuat nu opreste actualizarea: raspunsul (`ERR-1-...`) e text normal, se scrie in
|
||||||
|
`UPD_LOG` si fluxul merge mai departe.
|
||||||
|
|
||||||
|
### SMTP: de ce trebuie TLS
|
||||||
|
|
||||||
|
`mail.romfast.ro` **nu anunta `AUTH` pe sesiune necriptata**. Fara TLS, CDOSYS trimitea
|
||||||
|
neautentificat, iar pentru sesiuni neautentificate Exim verifica numele din `EHLO`: ROACENTRAL e in
|
||||||
|
`WORKGROUP`, fara sufix DNS, deci CDOSYS trimitea `EHLO ROACENTRAL` si primea
|
||||||
|
`550 Access denied - Invalid HELO name`. Niciun buletin nu a plecat intre 20.04.2026 si 16.09.2026.
|
||||||
|
|
||||||
|
Configuratia corecta (`sendemail.prg`, `SendViaCDOSYS`): `smtpserverport = 465`,
|
||||||
|
`smtpusessl = .T.`, `smtpauthenticate = 1` + user/parola. Cu TLS si autentificare, acelasi
|
||||||
|
`EHLO ROACENTRAL` e acceptat, deci **nu e nevoie de sufix DNS pe masina si nici de repornire**.
|
||||||
|
|
||||||
|
Verificare rapida, de pe serverul de trimitere (nu trimite nimic, doar deschide sesiunea):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 465, implicit SSL: dupa AUTH LOGIN trebuie "235 Authentication succeeded", apoi MAIL FROM -> 250
|
||||||
|
```
|
||||||
|
|
||||||
|
Test cap-coada fara sa deranjezi un client: clientii `1` si `22` sunt ROMFAST S.R.L.
|
||||||
|
(`customers.id = 1701`, email `office@romfast.ro`), deci buletinul lor ajunge la noi:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
curl.exe -s "http://localhost:81/contafinupdate/default.aspx/updroa/buletin_informativ/22"
|
||||||
|
# -> BULETIN INFORMATIV TRIMIS CU SUCCES <data>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Raspunsurile rutei de buletin
|
||||||
|
|
||||||
|
`BULETIN INFORMATIV TRIMIS CU SUCCES <data>` | `ERR-1-BULETIN INFORMATIV NU S-A TRIMIS. MOTIVUL: ...`
|
||||||
|
| `ERR-1-CONTRACT DE SUPORT TEHNIC INEXISTENT` | `ERR-0-EROARE DE CONECTARE SQL ...` |
|
||||||
|
`OK-0-NU EXISTA MODIFICARI DE RAPORTAT IN BULETINUL INFORMATIV`.
|
||||||
|
|
||||||
|
Ultimul a fost adaugat pe 16.09.2026: pana atunci, cand nu erau modificari de raportat, ruta
|
||||||
|
raspundea **200 cu corp gol** (1848 din 2948 apeluri), iar baza clientului scria o eroare la
|
||||||
|
fiecare rulare. Textul nu e parsat de nimeni - `PACK_UPDATE` doar il scrie in `UPD_LOG`.
|
||||||
Reference in New Issue
Block a user