feat(oracle): instalare ROA in doua faze, licente, IIS si export zilnic

Adauga FAZA1.cmd/FAZA2.cmd, care despart migrarea in partea care se poate
face in timpul programului (contafin, obiecte SYS, sinonime, licente, IIS)
si partea de seara (schemele de firma). Scripturi noi: 09 pentru licentele
din SYS.AUTH_SERII/AUTH_DETALII, 10 pentru publicarea D:\ROAUPDATE in IIS,
11 pentru exportul zilnic cu backupora.exe, drop-contafin pentru reimport.

backupora.exe si sabloanele sale intra in repo ca sa fie kitul autonom.
Pasul 07 primeste verificarile corespunzatoare pentru licente, IIS si task.

Nerulat inca pe o baza reala - vezi docs/handoff_instalare-doua-faze.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
This commit is contained in:
Marius
2026-08-25 20:57:23 +03:00
parent 7fce925349
commit 5a746990ce
18 changed files with 3446 additions and 854 deletions

View File

@@ -0,0 +1,150 @@
# Handoff — instalare ROA în două faze, licențe, IIS, export zilnic
Stare la 2026-08-25. Blocul de lucru e terminat; nimic nu e într-o stare periculoasă.
Toate modificările sunt scrise pe disc, **necomise**.
## Ce s-a livrat
| Fișier | Stare |
|---|---|
| `proxmox/lxc108-oracle/roa-windows-setup/FAZA1.cmd` | nou, parsare testată |
| `proxmox/lxc108-oracle/roa-windows-setup/FAZA2.cmd` | nou, parsare testată |
| `.../scripts/09-copy-licenses.ps1` | nou, **nerulat pe o bază reală** |
| `.../scripts/10-setup-roaupdate-iis.ps1` | nou, **nerulat** |
| `.../scripts/11-setup-backup-export.ps1` | nou, **nerulat**; blocat pe `backupora.exe` |
| `.../scripts/drop-contafin.ps1` | nou, **nerulat** |
| `.../sql/export-licente.sql` | nou, **nerulat** |
| `.../backup/settings.ini.template` | nou, format **presupus**, nu confirmat |
| `.../scripts/07-verify-installation.ps1` | modificat: +268 linii de verificări noi |
| `.../README.md` | rescris, 846 → 620 linii |
| `proxmox/lxc108-oracle/scripts/build-client-kit.ps1` | modificat: text `CITESTE-MA.txt` + avertisment `backupora.exe` |
| `proxmox/lxc108-oracle/docs/instalare-si-migrare-oracle.md` | modificat: tabelul pașilor + cele trei fluxuri |
## Ce s-a verificat efectiv
- Toate cele 13 scripturi `.ps1` din `roa-windows-setup/scripts/` plus
`build-client-kit.ps1` parsează curat (`PSParser::Tokenize`).
- `FAZA1.cmd` și `FAZA2.cmd`: parsarea argumentelor, inclusiv căile cu literă de
disc (`/roaupdate:D:\RU` ajunge întreg), flagurile fără valoare, ecranul de
utilizare, codurile de ieșire.
- Toate cele 12 linkuri relative din README-ul nou duc la fișiere existente.
## Ce NU s-a verificat
**Niciun script nou nu a fost rulat pe o bază Oracle.** Nu există mediu pornit —
VM 302 e oprit. Toate verificările de mai sus sunt statice.
## Blocajul de la `backupora.exe` — REZOLVAT
Găsit local, în `D:\ROA\EXPORT_ORADMP\` pe stația de dezvoltare. Copiat în kit
(`roa-windows-setup/backup/`): `backupora.exe` (49 KB), `config.fpw`,
`setari.ini.tmpl`, `schema.tmpl`, `changelog_backupora.txt`.
**Presupunerile mele inițiale erau greșite pe trei puncte, toate corectate:**
1. Fișierul de config se cheamă **`setari.ini`**, nu `settings.ini`.
Redenumit peste tot: scriptul 11, verificarea 07, README, `build-client-kit.ps1`,
`instalare-si-migrare-oracle.md`. (Referințele la `settings.ini` rămase în
`proxmox/vm201-windows/` sunt **alt fișier** — endpointul de raportare erori
din `D:\ROAUPDATE` — corect, nu se ating.)
2. Secțiunile reale sunt `[schema]`, `[backup]`, `[oracle]`. Nu există host/port/
service/parole în ini. Șablonul `backup/setari.ini.template` are acum formatul
real, cu 10 marcaje: `{{EXPORT_DIR}}`, `{{BACKUP_PATH}}`, `{{SCHEMA_FILE}}`,
`{{RETENTION_DAYS}}`, `{{EXPDP_EXE}}`, `{{DMPDIR_PATH}}`, `{{DMPDIR_NAME}}`,
`{{ORACLE_HOME}}`, `{{DB_SERVICE}}`, `{{DATA_GENERARII}}`.
Verificat automat: toate 10 sunt substituite de script.
3. **`schema.txt` nu e o listă de nume de scheme.** Formatul (din `schema.tmpl`) e
`SCHEMA;PAROLA@SERVICIU`, câte una pe linie. `New-SchemaFile` citește acum și
`NOM_FIRME.parola`, nu doar `schema`. Fișierul conține parole în clar — scriptul
avertizează să nu fie scos de pe server.
**Două capcane confirmate în sursa VFP (`main.prg`), documentate în script:**
- programul **scrie** în ini-ul implicit cheia `delete_backups_olther_xdays`
(cu typo, `main.prg:76`) dar **citește** `delete_backups_older_xdays`
(`main.prg:117`). Șablonul o are pe cea corectă — **nu o „corecta" înapoi**.
- alege între `exp` clasic și Data Pump **după numele executabilului** din
`oracleexpfile` (changelog v3.0.0: *„Numele executabilului trebuie sa fie
expdp.exe"*). De aceea `{{EXPDP_EXE}}` arată către `<OracleHome>\bin\expdp.exe`,
nu către stub-ul de 0 octeți din directorul programului.
**Decizie de confirmat cu Marius:** `backuppath` (unde ajung dump-urile) e acum
implicit **egal cu `ExportPath`**, deci `D:\ROA\EXPORT_ORADMP\<AAAALLZZ>\`.
Pe instalarea de referință de pe stația de dezvoltare valoarea era `C:\BACKUP_ORACLE`,
cu programul în `D:\ROA\EXPORT_ORADMP`. Există parametrul `-BackupPath` pentru
convenția veche. **Nu știu care e corectă la clienți.**
## Decizii deja luate — nu se reiau
1. **Faza 1 importă contafin-ul REAL al clientului**, nu șablonul. Motiv: pe
`CONTAFIN_ORACLE` nu se lucrează activ, deci poate fi exportat în timpul
programului. Doar firmele se schimbă sub picioare. Șablonul rămâne ca fallback.
2. **Faza 2 înlocuiește contafin prin `DROP USER CASCADE` + import curat**, nu prin
`TABLE_EXISTS_ACTION=REPLACE`. Opțional, prin `/reimportcontafin`.
3. **Pasul 08 se reia obligatoriu în faza 2.** `SERVER_INFO` e o tabelă în
`CONTAFIN_ORACLE` (`sql/synonyms-public.sql:270`); dump-ul clientului aduce cu
el căile, parolele și SMTP-ul serverului vechi.
4. **Licențele: rețea întâi, fișier ca fallback.** `sql/export-licente.sql` produce
INSERT-uri pe stdout; `09-copy-licenses.ps1` fie îl rulează prin rețea pe
serverul vechi, fie citește rezultatul cu `-FromFile`.
5. **IIS: scriptul instalează rolul dacă lipsește** (`Install-WindowsFeature` pe
Server, `Enable-WindowsOptionalFeature` pe Windows Pro). Poate cere restart.
6. **Directoarele de modul se creează în două locuri diferite**, intenționat:
pasul 08 face `_ARHIVE\<MODUL>` (pentru obiectele Oracle `DIRECTORY`), pasul 10
face `D:\ROAUPDATE\<MODUL>` (binarele curente, servite de IIS). Lista de 55 de
module e duplicată în ambele scripturi — **la adăugarea unui modul se modifică
ambele**.
## Comenzi de testare, când există mediu
```bash
ssh root@10.0.20.201 "qm start 302"
```
Pe VM 302, din rădăcina kitului:
```bat
Run.cmd 99-uninstall-roa.ps1 -Force
FAZA1.cmd 999 /faralicente /farabackup
FAZA2.cmd 999
Run.cmd 07-verify-installation.ps1
```
Logurile: `roa-windows-setup\logs\<script>_<data>.log`.
Codul de ieșire 0 la pasul 07 = instalare bună.
Ordinea de testat, de la ieftin la scump:
1. `10-setup-roaupdate-iis.ps1` — nu atinge baza, se poate rula izolat;
2. `09-copy-licenses.ps1 -ExportOnly` pe o bază existentă — doar `SELECT`;
3. `FAZA1.cmd` complet;
4. `FAZA2.cmd` cu și fără `/reimportcontafin`;
5. `11-setup-backup-export.ps1` — abia după ce apare `backupora.exe`.
## Ce mai lipsește
- **Confirmarea lui `backuppath`** — vezi decizia de mai sus (`ExportPath` vs
`C:\BACKUP_ORACLE`).
- Confirmarea că numele obiectului Oracle `DIRECTORY` pentru export e chiar
`BACKUP_ORACLE` (așa l-am scris în `11-setup-backup-export.ps1`).
- **Dacă `backupora.exe` are nevoie de runtime VFP9** (`vfp9r.dll`, `vfp9renu.dll`)
pe un server curat. Pe stația de dezvoltare merge pentru că runtime-ul e deja
instalat. Dacă la client dă „Cannot locate the Microsoft Visual FoxPro support
library", trebuie adăugate DLL-urile în `backup/` sau instalat runtime-ul.
**Netestat.**
- `schema.txt` folosește `@$ServiceName` (deci `XEPDB1`). De verificat că
`backupora.exe` acceptă un service name EZConnect, nu doar un SID/alias TNS —
pe instalările vechi acolo era un SID (`ORASID` în șablon).
- Verificarea că aplicația ROA de pe stații acceptă `http://localhost/roaupdate/`
ca sursă — scriptul publică acolo, dar configurarea stațiilor nu e acoperită de kit.
- `SERVER_INFO.UPD_URL_APP` rămâne `https://update.romfast.ro/roa/` (serverul
clientului trage de la ROMFAST). Dacă undeva trebuie scrisă adresa oglinzii
locale pentru stații, nu e în baza de date — nu am găsit unde.
## Ce e interzis
- Nu comite `config.ps1` — poate conține parolele altui client.
- Nu comite fișiere `.dmp`.
- Nu rula scripturile pe `10.0.20.121` (LXC 108) — e sursa șabloanelor, nu o țintă
de instalare. `PDB ROA` de acolo e producția `ROA_CENTRAL`.

View File

@@ -44,12 +44,30 @@ Diferența esențială: `migration/` îți lasă o bază cu schemele înăuntru;
| 05 | `05-import-companies.ps1` | import în lot al schemelor de firme (parfile: `par/import-company.par`) | | 05 | `05-import-companies.ps1` | import în lot al schemelor de firme (parfile: `par/import-company.par`) |
| 06 | `06-add-company.ps1` | adaugă o firmă nouă pe un server deja instalat (opțional) | | 06 | `06-add-company.ps1` | adaugă o firmă nouă pe un server deja instalat (opțional) |
| 08 | `08-post-install-config.ps1` | 54 directoare `ROAUPDATE` (fizice + obiecte `DIRECTORY`), `SERVER_INFO`, `AUTH_DETALII` (Customer ID), joburile `UPDATEROA_ZILNIC` / `UPDATERTVAI_ZILNIC` / `SYSINFO_PURJARE_ZILNIC` | | 08 | `08-post-install-config.ps1` | 54 directoare `ROAUPDATE` (fizice + obiecte `DIRECTORY`), `SERVER_INFO`, `AUTH_DETALII` (Customer ID), joburile `UPDATEROA_ZILNIC` / `UPDATERTVAI_ZILNIC` / `SYSINFO_PURJARE_ZILNIC` |
| 07 | `07-verify-installation.ps1` | raport de verificare: versiune/ediție, tablespace, obiecte, obiecte invalide, sinonime, **granturi de dicționar**, firme din `NOM_FIRME` vs. scheme reale, ACL | | 09 | `09-copy-licenses.ps1` | `SYS.AUTH_SERII` + `SYS.AUTH_DETALII` de pe serverul vechi, prin rețea sau din fișier (`sql/export-licente.sql`); recreează `SEQ_AUTH_SERII` peste `MAX(ID_SERIE)+1` |
| 10 | `10-setup-roaupdate-iis.ps1` | directoarele de modul `D:\ROAUPDATE\<MODUL>`, instalarea rolului IIS dacă lipsește, aplicația `/roaupdate` către `D:\ROAUPDATE` |
| 11 | `11-setup-backup-export.ps1` | `D:\ROA\EXPORT_ORADMP` cu `backupora.exe`, `setari.ini` (din șablon), `schema.txt` (din `NOM_FIRME`), `DIRECTORY BACKUP_ORACLE`, task zilnic Windows |
| 07 | `07-verify-installation.ps1` | raport de verificare: versiune/ediție, tablespace, obiecte, obiecte invalide, sinonime, **granturi de dicționar**, firme din `NOM_FIRME` vs. scheme reale, ACL, **licențe**, **oglinda de update + IIS**, **exportul zilnic** |
| — | `drop-contafin.ps1` | `DROP USER CONTAFIN_ORACLE CASCADE`, doar pentru reimportul din faza 2 |
| 99 | `99-uninstall-roa.ps1` | curățare completă, pentru re-testare | | 99 | `99-uninstall-roa.ps1` | curățare completă, pentru re-testare |
`RunAll.cmd` le rulează în ordinea `01 → 02 → 03 → 04 → 05 → 08 → 07`. **Cele trei fluxuri de rulare:**
| Fișier | Ordinea | Când |
|---|---|---|
| `FAZA1.cmd` | `01 → 02 → 03 → 04 → 09 → 08 → 10 → 11 → 07` | migrare, în timpul programului |
| `FAZA2.cmd` | `[drop → 01 → 03 → 04] → 05 → 08 → 11 -SchemaOnly → 07` | migrare, după program |
| `INSTALEAZA.cmd` | `01 → 02 → 03 → 04 → 05 → 08 → 07` | într-o singură rulare; **fără** 09/10/11 |
`RunAll.cmd` e varianta interactivă a lui `INSTALEAZA.cmd`.
`Run.cmd <script>` rulează unul singur, rezolvând `ExecutionPolicy`. `Run.cmd <script>` rulează unul singur, rezolvând `ExecutionPolicy`.
**De ce se poate împărți în două faze:** pe `CONTAFIN_ORACLE` nu se lucrează activ,
deci poate fi exportat de pe serverul vechi în timpul programului; doar schemele
de firmă se schimbă sub picioare. Faza 2 reia obligatoriu pasul 08 pentru că
`SERVER_INFO` e o **tabelă în `CONTAFIN_ORACLE`**: dump-ul clientului aduce cu el
căile și parolele serverului vechi.
Compatibilitate cu clienți vechi: `01-setup-database.ps1` scrie Compatibilitate cu clienți vechi: `01-setup-database.ps1` scrie
`SQLNET.ALLOWED_LOGON_VERSION_SERVER/CLIENT=8` (implicitul în 21c este 12 și **refuză** `SQLNET.ALLOWED_LOGON_VERSION_SERVER/CLIENT=8` (implicitul în 21c este 12 și **refuză**
Instant Client 10/11). Detalii și capcanele — în Instant Client 10/11). Detalii și capcanele — în
@@ -194,9 +212,12 @@ Validarea se face pe **VM 302 (`oracle-test-302`, 10.0.20.130)** — vezi
|---|---| |---|---|
| 21c XE (CDB/PDB) | OK — `RunAll.cmd` rulează complet | | 21c XE (CDB/PDB) | OK — `RunAll.cmd` rulează complet |
| 21c SE (non-CDB) | **NETESTAT** — în producție au apărut erori, vezi [`issues-se-prod.md`](../../vm302-oracle-test/docs/issues-se-prod.md) | | 21c SE (non-CDB) | **NETESTAT** — în producție au apărut erori, vezi [`issues-se-prod.md`](../../vm302-oracle-test/docs/issues-se-prod.md) |
| `FAZA1.cmd` / `FAZA2.cmd` | **NETESTATE pe VM 302** — scrise, dar nerulate încă end-to-end |
| Pașii 09 / 10 / 11 | **NETESTAȚI** — 11 are nevoie de `backupora.exe`, care încă nu e în kit |
VM 302 stă oprit; se pornește cu `ssh root@10.0.20.201 "qm start 302"`. VM 302 stă oprit; se pornește cu `ssh root@10.0.20.201 "qm start 302"`.
Ciclul de re-testare: `99-uninstall-roa.ps1 -Force` → `RunAll.cmd` → `07-verify-installation.ps1`. Ciclul de re-testare: `99-uninstall-roa.ps1 -Force` → `RunAll.cmd` → `07-verify-installation.ps1`.
Pentru fluxul în două faze: `99-uninstall-roa.ps1 -Force` → `FAZA1.cmd` → `FAZA2.cmd` → `07-verify-installation.ps1`.
Scripturile din `migration/` **nu** au un mediu de test dedicat — se validează direct pe Scripturile din `migration/` **nu** au un mediu de test dedicat — se validează direct pe
LXC 108. LXC 108.

View File

@@ -0,0 +1,327 @@
@echo off
REM =============================================================================
REM ROA Oracle - FAZA 1: tot ce se poate face IN TIMPUL PROGRAMULUI
REM =============================================================================
REM Instaleaza si configureaza sistemul ROA complet, fara schemele de firma.
REM Utilizatorii lucreaza mai departe pe serverul vechi cat ruleaza asta.
REM
REM Ce intra in faza 1:
REM - baza, tablespace, user CONTAFIN_ORACLE, profil (01)
REM - obiectele SYS: AUTH_PACK, NEWSCHEMA, INFO... (02)
REM - CONTAFIN_ORACLE: al clientului daca e in DMPDIR, (03)
REM altfel sablonul din kit
REM - sinonime publice, granturi, sys-grants (04)
REM - licentele de pe serverul vechi (09, optional)
REM - directoare ROAUPDATE, SERVER_INFO, joburi, SMTP (08)
REM - oglinda de update publicata in IIS (10)
REM - exportul zilnic in D:\ROA\EXPORT_ORADMP (11)
REM - verificare (07)
REM
REM Ce NU intra: schemele de firma. Alea vin in FAZA2.cmd, dupa program.
REM
REM De ce merge asa: pe CONTAFIN_ORACLE nu se lucreaza activ, deci el poate
REM fi exportat de pe serverul vechi inca din timpul programului. Doar
REM firmele se schimba sub picioare.
REM
REM Utilizare:
REM FAZA1.cmd <IdClient> [optiuni]
REM
REM Optiuni:
REM /smtp:<server> server SMTP (implicit mail.romfast.ro)
REM /vechi:<gazda> serverul vechi, pentru licente
REM /serviciuvechi:<nume> serviciul de pe serverul vechi (implicit XE)
REM /parolavechi:<parola> parola SYS de pe serverul vechi
REM /licente:<fisier.sql> licente dintr-un fisier, in loc de retea
REM /roaupdate:<cale> radacina oglinzii (implicit D:\ROAUPDATE)
REM /export:<cale> director export (implicit D:\ROA\EXPORT_ORADMP)
REM /faralicente sari peste pasul 09
REM /faraiis sari peste pasul 10
REM /farabackup sari peste pasul 11
REM
REM Exemple:
REM FAZA1.cmd 138
REM FAZA1.cmd 138 /vechi:10.0.0.5 /parolavechi:oracle /serviciuvechi:XE
REM FAZA1.cmd 214 /licente:C:\kit\licente.sql /faraiis
REM =============================================================================
setlocal enabledelayedexpansion
set "KIT=%~dp0"
set "IDCLIENT=%~1"
set "DMPDEST=C:\DMPDIR"
REM Valori implicite
set "SMTP=mail.romfast.ro"
set "VECHI="
set "SERVICIUVECHI=XE"
set "PAROLAVECHI="
set "LICENTEFIS="
set "ROAUPDATE=D:\ROAUPDATE"
set "EXPORTDIR=D:\ROA\EXPORT_ORADMP"
set "FARALICENTE=0"
set "FARAIIS=0"
set "FARABACKUP=0"
if "%IDCLIENT%"=="" goto :utilizare
if /i "%IDCLIENT%"=="/?" goto :utilizare
REM ---------------------------------------------------------------------------
REM Parsarea optiunilor
REM ---------------------------------------------------------------------------
shift
:parsare
if "%~1"=="" goto :parsare_gata
set "ARG=%~1"
if /i "!ARG!"=="/faralicente" ( set "FARALICENTE=1" & shift & goto :parsare )
if /i "!ARG!"=="/faraiis" ( set "FARAIIS=1" & shift & goto :parsare )
if /i "!ARG!"=="/farabackup" ( set "FARABACKUP=1" & shift & goto :parsare )
for /f "tokens=1,* delims=:" %%A in ("!ARG!") do (
set "OPT=%%A"
set "VAL=%%B"
)
if /i "!OPT!"=="/smtp" set "SMTP=!VAL!"
if /i "!OPT!"=="/vechi" set "VECHI=!VAL!"
if /i "!OPT!"=="/serviciuvechi" set "SERVICIUVECHI=!VAL!"
if /i "!OPT!"=="/parolavechi" set "PAROLAVECHI=!VAL!"
if /i "!OPT!"=="/licente" set "LICENTEFIS=!VAL!"
if /i "!OPT!"=="/roaupdate" set "ROAUPDATE=!VAL!"
if /i "!OPT!"=="/export" set "EXPORTDIR=!VAL!"
shift
goto :parsare
:parsare_gata
echo.
echo ============================================================
echo ROA Oracle - FAZA 1 (in timpul programului)
echo ============================================================
echo.
echo Kit: %KIT%
echo Id client: %IDCLIENT%
echo SMTP: %SMTP%
echo ROAUPDATE: %ROAUPDATE%
echo Export: %EXPORTDIR%
if not "%VECHI%"=="" echo Server vechi: %VECHI% / %SERVICIUVECHI%
if not "%LICENTEFIS%"=="" echo Licente din: %LICENTEFIS%
echo.
REM ---------------------------------------------------------------------------
REM [1/9] DMPDIR
REM ---------------------------------------------------------------------------
if not exist "%KIT%DMPDIR\FIRMANOUA.dmp" (
echo [EROARE] Lipseste "%KIT%DMPDIR\FIRMANOUA.dmp".
echo Fara sablonul de firma noua, clientul nu va putea adauga firme.
exit /b 1
)
dir /b "%KIT%DMPDIR\*contafin*.dmp" >nul 2>&1
if errorlevel 1 (
echo [EROARE] Lipseste un fisier *contafin*.dmp din "%KIT%DMPDIR".
exit /b 1
)
if not exist "%DMPDEST%" mkdir "%DMPDEST%"
echo [1/9] Copiez DMP-urile in %DMPDEST% ...
copy /Y "%KIT%DMPDIR\*.dmp" "%DMPDEST%\" >nul
if errorlevel 1 (
echo [EROARE] Copierea DMP-urilor a esuat.
exit /b 1
)
REM Serviciul Oracle citeste fisierele cu contul lui, nu cu al tau.
icacls "%DMPDEST%" /grant "NT SERVICE\OracleServiceXE:(OI)(CI)F" /T >nul 2>&1
echo Gata.
REM ---------------------------------------------------------------------------
REM [2/9] 01 - baza si userul
REM ---------------------------------------------------------------------------
echo.
echo [2/9] 01-setup-database.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\01-setup-database.ps1"
if errorlevel 1 goto :esec_01
REM ---------------------------------------------------------------------------
REM [3/9] 02 - obiectele SYS
REM ---------------------------------------------------------------------------
echo.
echo [3/9] 02-create-sys-objects.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\02-create-sys-objects.ps1"
if errorlevel 1 goto :esec_02
REM ---------------------------------------------------------------------------
REM [4/9] 03 - CONTAFIN_ORACLE
REM ---------------------------------------------------------------------------
echo.
echo [4/9] 03-import-contafin.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\03-import-contafin.ps1"
set RC=!ERRORLEVEL!
REM Codul 5 e normal: Data Pump raporteaza "completed with errors" pentru
REM ORA-31684 (userul e creat deja de pasul 01) si ORA-39082 (warning-uri de
REM compilare, rezolvate la pasul 04). Orice alt cod nenul e esec real.
if "!RC!"=="0" goto :pas_04
if "!RC!"=="5" (
echo [INFO] Cod de iesire 5 - normal pentru Data Pump, se continua.
goto :pas_04
)
echo [EROARE] 03-import-contafin.ps1 a iesit cu codul !RC!.
exit /b !RC!
:pas_04
REM ---------------------------------------------------------------------------
REM [5/9] 04 - sinonime si granturi
REM ---------------------------------------------------------------------------
echo.
echo [5/9] 04-create-synonyms-grants.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\04-create-synonyms-grants.ps1"
if errorlevel 1 goto :esec_04
REM ---------------------------------------------------------------------------
REM [6/9] 09 - licentele de pe serverul vechi
REM ---------------------------------------------------------------------------
echo.
if "%FARALICENTE%"=="1" (
echo [6/9] 09-copy-licenses.ps1 - sarit ^(/faralicente^)
goto :pas_08
)
if not "%LICENTEFIS%"=="" (
echo [6/9] 09-copy-licenses.ps1 ^(din fisier^)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\09-copy-licenses.ps1" -FromFile "%LICENTEFIS%" -Replace
if errorlevel 1 goto :avert_09
goto :pas_08
)
if not "%VECHI%"=="" (
if "%PAROLAVECHI%"=="" (
echo [6/9] 09-copy-licenses.ps1 - sarit: ai dat /vechi dar nu si /parolavechi.
goto :pas_08
)
echo [6/9] 09-copy-licenses.ps1 ^(prin retea de la %VECHI%^)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\09-copy-licenses.ps1" -OldHost "%VECHI%" -OldService "%SERVICIUVECHI%" -OldSysPassword "%PAROLAVECHI%" -Replace
if errorlevel 1 goto :avert_09
goto :pas_08
)
echo [6/9] 09-copy-licenses.ps1 - sarit: nu ai dat nici /vechi, nici /licente.
echo ATENTIE: la o migrare, fara pasul asta clientul ramane fara licente.
goto :pas_08
:avert_09
echo.
echo [ATENTIE] Copierea licentelor a esuat. Instalarea CONTINUA - restul
echo pasilor nu depind de ea - dar clientul nu va avea licente
echo pana nu reiei:
echo Run.cmd 09-copy-licenses.ps1 -FromFile ^<fisier^> -Replace
echo.
:pas_08
REM ---------------------------------------------------------------------------
REM [7/9] 08 - configurare post-instalare
REM ---------------------------------------------------------------------------
echo.
echo [7/9] 08-post-install-config.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\08-post-install-config.ps1" -CustomerId "%IDCLIENT%" -EmailSmtp "%SMTP%" -RoaUpdatePath "%ROAUPDATE%"
if errorlevel 1 goto :esec_08
REM ---------------------------------------------------------------------------
REM [8/9] 10 si 11 - IIS si exportul zilnic
REM ---------------------------------------------------------------------------
echo.
if "%FARAIIS%"=="1" (
echo [8/9] 10-setup-roaupdate-iis.ps1 - sarit ^(/faraiis^)
) else (
echo [8/9] 10-setup-roaupdate-iis.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\10-setup-roaupdate-iis.ps1" -RoaUpdatePath "%ROAUPDATE%"
if errorlevel 1 (
echo [ATENTIE] Publicarea in IIS a esuat. Instalarea continua.
echo Statiile nu vor lua actualizari pana nu reiei pasul 10.
)
)
echo.
if "%FARABACKUP%"=="1" (
echo 11-setup-backup-export.ps1 - sarit ^(/farabackup^)
) else (
echo 11-setup-backup-export.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\11-setup-backup-export.ps1" -ExportPath "%EXPORTDIR%"
if errorlevel 1 (
echo [ATENTIE] Configurarea exportului zilnic a esuat. Instalarea continua.
echo Reia cu: Run.cmd 11-setup-backup-export.ps1
)
)
REM ---------------------------------------------------------------------------
REM [9/9] 07 - verificare
REM ---------------------------------------------------------------------------
echo.
echo [9/9] 07-verify-installation.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\07-verify-installation.ps1"
set RCVERIF=!ERRORLEVEL!
echo.
echo ============================================================
if "!RCVERIF!"=="0" (
echo FAZA 1 COMPLETA - verificarea a trecut integral.
) else (
echo FAZA 1 TERMINATA, CU OBSERVATII.
echo.
echo "N company schemas are missing" e NORMAL la faza 1: firmele
echo se importa abia in faza 2. Orice altceva citeste cu atentie.
)
echo ============================================================
echo.
echo PANA LA FAZA 2:
echo - utilizatorii lucreaza mai departe pe serverul VECHI;
echo - nu porni joburile de actualizare pe serverul nou;
echo - daca in intervalul asta se adauga o firma noua pe serverul vechi,
echo spune-i lui FAZA2.cmd sa reimporte si CONTAFIN_ORACLE
echo ^(/reimportcontafin^), altfel NOM_FIRME ramane in urma.
echo.
echo FAZA 2, dupa ce utilizatorii termina:
echo 1. exporta schemele de firma de pe serverul vechi;
echo 2. pune DMP-urile in %DMPDEST%;
echo 3. FAZA2.cmd %IDCLIENT%
echo.
endlocal & exit /b %RCVERIF%
REM ---------------------------------------------------------------------------
:esec_01
echo [EROARE] 01-setup-database.ps1 a esuat. Faza 1 se opreste.
exit /b 1
:esec_02
echo [EROARE] 02-create-sys-objects.ps1 a esuat. Faza 1 se opreste.
exit /b 1
:esec_04
echo [EROARE] 04-create-synonyms-grants.ps1 a esuat. Faza 1 se opreste.
exit /b 1
:esec_08
echo [EROARE] 08-post-install-config.ps1 a esuat. Faza 1 se opreste.
exit /b 1
:utilizare
echo.
echo Utilizare:
echo FAZA1.cmd ^<IdClient^> [optiuni]
echo.
echo Optiuni:
echo /smtp:^<server^> server SMTP ^(implicit mail.romfast.ro^)
echo /vechi:^<gazda^> serverul vechi, pentru licente
echo /serviciuvechi:^<nume^> serviciul de pe serverul vechi ^(implicit XE^)
echo /parolavechi:^<parola^> parola SYS de pe serverul vechi
echo /licente:^<fisier.sql^> licente dintr-un fisier, in loc de retea
echo /roaupdate:^<cale^> radacina oglinzii ^(implicit D:\ROAUPDATE^)
echo /export:^<cale^> director export ^(implicit D:\ROA\EXPORT_ORADMP^)
echo /faralicente sari peste pasul 09
echo /faraiis sari peste pasul 10
echo /farabackup sari peste pasul 11
echo.
echo Exemple:
echo FAZA1.cmd 138
echo FAZA1.cmd 138 /vechi:10.0.0.5 /parolavechi:oracle /serviciuvechi:XE
echo FAZA1.cmd 214 /licente:C:\kit\licente.sql /faraiis
echo.
echo In DMPDIR trebuie sa fie:
echo - FIRMANOUA.dmp ^(sablon, mereu^)
echo - *contafin*.dmp ^(al clientului la migrare, sablonul la client nou^)
echo.
exit /b 2

View File

@@ -0,0 +1,283 @@
@echo off
REM =============================================================================
REM ROA Oracle - FAZA 2: dupa ce utilizatorii au terminat de lucrat
REM =============================================================================
REM Aduce datele reale ale clientului peste sistemul deja instalat si
REM configurat de FAZA1.cmd. Asta e fereastra de downtime; tine-o scurta.
REM
REM Ce face:
REM - optional, reimporta CONTAFIN_ORACLE de pe serverul vechi (/reimportcontafin)
REM prin DROP USER CASCADE + recreare + import curat
REM - importa schemele de firma din DMPDIR (05)
REM - reface SERVER_INFO, directoarele si joburile (08)
REM - regenereaza schema.txt pentru exportul zilnic (11 -SchemaOnly)
REM - verifica (07)
REM
REM DE CE se reia pasul 08:
REM SERVER_INFO e o TABELA in CONTAFIN_ORACLE, nu in SYS. Cand vine
REM contafin-ul clientului peste, aduce cu el SERVER_INFO de pe serverul
REM VECHI - cai vechi, parole vechi, SMTP vechi. Fara reluarea pasului 08,
REM actualizarile ar cauta fisiere pe calea serverului vechi.
REM
REM Utilizare:
REM FAZA2.cmd <IdClient> [optiuni]
REM
REM Optiuni:
REM /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
REM /smtp:<server> server SMTP (implicit mail.romfast.ro)
REM /roaupdate:<cale> radacina oglinzii (implicit D:\ROAUPDATE)
REM /export:<cale> director export (implicit D:\ROA\EXPORT_ORADMP)
REM /dmp:<cale> de unde se copiaza DMP-urile (implicit <kit>\DMPDIR)
REM /faraschema nu regenera schema.txt
REM
REM Exemple:
REM FAZA2.cmd 138
REM FAZA2.cmd 138 /reimportcontafin
REM FAZA2.cmd 214 /dmp:E:\export-client /reimportcontafin
REM =============================================================================
setlocal enabledelayedexpansion
set "KIT=%~dp0"
set "IDCLIENT=%~1"
set "DMPDEST=C:\DMPDIR"
set "SMTP=mail.romfast.ro"
set "ROAUPDATE=D:\ROAUPDATE"
set "EXPORTDIR=D:\ROA\EXPORT_ORADMP"
set "DMPSURSA=%KIT%DMPDIR"
set "REIMPORT=0"
set "FARASCHEMA=0"
if "%IDCLIENT%"=="" goto :utilizare
if /i "%IDCLIENT%"=="/?" goto :utilizare
shift
:parsare
if "%~1"=="" goto :parsare_gata
set "ARG=%~1"
if /i "!ARG!"=="/reimportcontafin" ( set "REIMPORT=1" & shift & goto :parsare )
if /i "!ARG!"=="/faraschema" ( set "FARASCHEMA=1" & shift & goto :parsare )
for /f "tokens=1,* delims=:" %%A in ("!ARG!") do (
set "OPT=%%A"
set "VAL=%%B"
)
REM "tokens=1,*" pastreaza in %%B tot ce urmeaza dupa PRIMUL ':', inclusiv
REM ':' din caile de tip D:\ROAUPDATE. Deci /roaupdate:D:\ROAUPDATE ajunge
REM corect ca OPT=/roaupdate, VAL=D:\ROAUPDATE.
if /i "!OPT!"=="/smtp" set "SMTP=!VAL!"
if /i "!OPT!"=="/roaupdate" set "ROAUPDATE=!VAL!"
if /i "!OPT!"=="/export" set "EXPORTDIR=!VAL!"
if /i "!OPT!"=="/dmp" set "DMPSURSA=!VAL!"
shift
goto :parsare
:parsare_gata
echo.
echo ============================================================
echo ROA Oracle - FAZA 2 (dupa program)
echo ============================================================
echo.
echo Id client: %IDCLIENT%
echo DMP sursa: %DMPSURSA%
echo DMP tinta: %DMPDEST%
echo ROAUPDATE: %ROAUPDATE%
echo Export: %EXPORTDIR%
if "%REIMPORT%"=="1" (
echo CONTAFIN: SE REIMPORTA ^(drop user cascade^)
) else (
echo CONTAFIN: se pastreaza cel din faza 1
)
echo.
REM ---------------------------------------------------------------------------
REM [1/6] DMP-urile firmelor
REM ---------------------------------------------------------------------------
if not exist "%DMPSURSA%" (
echo [EROARE] Directorul sursa "%DMPSURSA%" nu exista.
exit /b 1
)
set /a TOTALDMP=0
for %%F in ("%DMPSURSA%\*.dmp") do set /a TOTALDMP+=1
if !TOTALDMP! EQU 0 (
echo [EROARE] Nu am gasit niciun fisier .dmp in "%DMPSURSA%".
exit /b 1
)
REM Kitul contine 2 sabloane: *contafin*.dmp si FIRMANOUA.dmp. Orice peste 2
REM sunt DMP-urile de firma ale clientului.
if !TOTALDMP! LEQ 2 (
echo [ATENTIE] In "%DMPSURSA%" sunt doar !TOTALDMP! fisiere DMP, adica doar
echo sabloanele. Faza 2 are rost doar cu DMP-urile firmelor.
echo Exporta-le de pe serverul vechi si pune-le acolo.
echo.
echo Continui oricum - pasul 05 va raporta ce lipseste.
echo.
)
if not exist "%DMPDEST%" mkdir "%DMPDEST%"
echo [1/6] Copiez %TOTALDMP% fisiere DMP in %DMPDEST% ...
copy /Y "%DMPSURSA%\*.dmp" "%DMPDEST%\" >nul
if errorlevel 1 (
echo [EROARE] Copierea DMP-urilor a esuat.
exit /b 1
)
icacls "%DMPDEST%" /grant "NT SERVICE\OracleServiceXE:(OI)(CI)F" /T >nul 2>&1
echo Gata.
REM ---------------------------------------------------------------------------
REM [2/6] Reimportul lui CONTAFIN_ORACLE (optional)
REM ---------------------------------------------------------------------------
echo.
if "%REIMPORT%"=="0" (
echo [2/6] Reimport CONTAFIN_ORACLE - sarit.
echo Foloseste /reimportcontafin daca intre faze s-au adaugat firme
echo sau s-au modificat nomenclatoare pe serverul vechi.
goto :pas_05
)
echo [2/6] Reimport CONTAFIN_ORACLE
echo Se sterge schema existenta si se importa cea din %DMPDEST%.
echo.
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\drop-contafin.ps1" -Force -KillSessions
if errorlevel 1 goto :esec_drop
echo.
echo 01-setup-database.ps1 (recreare user)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\01-setup-database.ps1"
if errorlevel 1 goto :esec_01
echo.
echo 03-import-contafin.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\03-import-contafin.ps1"
set RC=!ERRORLEVEL!
if "!RC!"=="0" goto :dupa_03
if "!RC!"=="5" (
echo [INFO] Cod de iesire 5 - normal pentru Data Pump, se continua.
goto :dupa_03
)
echo [EROARE] 03-import-contafin.ps1 a iesit cu codul !RC!.
exit /b !RC!
:dupa_03
echo.
echo 04-create-synonyms-grants.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\04-create-synonyms-grants.ps1"
if errorlevel 1 goto :esec_04
:pas_05
REM ---------------------------------------------------------------------------
REM [3/6] Schemele de firma
REM ---------------------------------------------------------------------------
echo.
echo [3/6] 05-import-companies.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\05-import-companies.ps1"
if errorlevel 1 goto :esec_05
REM ---------------------------------------------------------------------------
REM [4/6] Reconfigurare post-import
REM ---------------------------------------------------------------------------
echo.
echo [4/6] 08-post-install-config.ps1 (reluare)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\08-post-install-config.ps1" -CustomerId "%IDCLIENT%" -EmailSmtp "%SMTP%" -RoaUpdatePath "%ROAUPDATE%"
if errorlevel 1 goto :esec_08
REM ---------------------------------------------------------------------------
REM [5/6] schema.txt pentru exportul zilnic
REM ---------------------------------------------------------------------------
echo.
if "%FARASCHEMA%"=="1" (
echo [5/6] schema.txt - sarit ^(/faraschema^)
) else (
echo [5/6] 11-setup-backup-export.ps1 -SchemaOnly
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\11-setup-backup-export.ps1" -ExportPath "%EXPORTDIR%" -SchemaOnly
if errorlevel 1 (
echo [ATENTIE] Nu am putut regenera schema.txt. Exportul zilnic va
echo exporta lista veche. Reia cu:
echo Run.cmd 11-setup-backup-export.ps1 -SchemaOnly
)
)
REM ---------------------------------------------------------------------------
REM [6/6] Verificare
REM ---------------------------------------------------------------------------
echo.
echo [6/6] 07-verify-installation.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\07-verify-installation.ps1"
set RCVERIF=!ERRORLEVEL!
echo.
echo ============================================================
if "!RCVERIF!"=="0" (
echo FAZA 2 COMPLETA - verificarea a trecut integral.
) else (
echo FAZA 2 TERMINATA, DAR VERIFICAREA A SEMNALAT PROBLEME.
echo.
echo "N company schemas are missing" inseamna ca lipsesc DMP-urile
echo firmelor respective. Copiaza-le in %DMPDEST% si reia doar pasul 05:
echo Run.cmd 05-import-companies.ps1
)
echo ============================================================
echo.
echo INAINTE SA PLECI DE LA CLIENT:
echo.
echo 1. Pasul 08 a RECREAT joburile de actualizare, dezactivate.
echo Daca trebuie sa mearga, activeaza-le:
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATERTVAI_ZILNIC');
echo.
echo 2. Verifica oglinda de update: http://localhost/roaupdate/
echo.
echo 3. Ruleaza o data exportul, sa vezi ca scrie:
echo Start-ScheduledTask -TaskName "ROA Export Oracle"
echo.
echo 4. NU sterge FIRMANOUA.dmp din %DMPDEST% - e folosit la fiecare
echo firma noua, oricand pe viitor.
echo.
echo 5. Opreste serverul VECHI sau cel putin listener-ul, ca sa nu se
echo conecteze cineva din greseala la datele vechi.
echo.
endlocal & exit /b %RCVERIF%
REM ---------------------------------------------------------------------------
:esec_drop
echo [EROARE] Nu am putut sterge CONTAFIN_ORACLE. Faza 2 se opreste.
echo Verifica daca mai are sesiuni deschise:
echo SELECT sid, serial#, program FROM v$session WHERE username = 'CONTAFIN_ORACLE';
exit /b 1
:esec_01
echo [EROARE] 01-setup-database.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_04
echo [EROARE] 04-create-synonyms-grants.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_05
echo [EROARE] 05-import-companies.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_08
echo [EROARE] 08-post-install-config.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:utilizare
echo.
echo Utilizare:
echo FAZA2.cmd ^<IdClient^> [optiuni]
echo.
echo Optiuni:
echo /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
echo /smtp:^<server^> server SMTP ^(implicit mail.romfast.ro^)
echo /roaupdate:^<cale^> radacina oglinzii ^(implicit D:\ROAUPDATE^)
echo /export:^<cale^> director export ^(implicit D:\ROA\EXPORT_ORADMP^)
echo /dmp:^<cale^> de unde se copiaza DMP-urile
echo /faraschema nu regenera schema.txt
echo.
echo Faza 2 se ruleaza DUPA FAZA1.cmd, cand utilizatorii au terminat de lucrat.
echo.
exit /b 2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,33 @@
<!--
04/04/2012
BACKUPORA - 3.0.0
:nou:
Se poate exporta si cu expdp.exe, nu numai cu exp.exe.
Trebuie configurate DATAPUMPDIR si DATAPUMPDIRNAME in setari.ini.
Trebuie creat directorul DMP_DIR si dat drepturi read,write (vezi in setari.ini.tmpl)
Numele executabilului trebuie sa fie "expdp.exe"
-->
<!--
26/06/2009
BACKUPORA - 2.0.1
:modificare:
Tratare erori posibile la crearea directoarelor de backup.
-->
<!--
28/05/2009
BACKUPORA - 2.0.0
:nou:
La programul de backup baza de date s-a adaugat optiunea de curatare backup-uri mai vechi de x zile.
OBS:
Trebuie configurata setarea "delete_backups_olther_xdays" in sectiunea "backup" in fisierul setari.ini cu numarul de zile
ex: delete_backups_olther_xdays=10 va sterge backup-urile mai vechi de 10 zile
:modificare:
Modificari interne la apelarea programului de export "exp.exe".
-->

View File

@@ -0,0 +1,2 @@
SCREEN=OFF
RESOURCE=OFF

View File

@@ -0,0 +1,2 @@
SCHEMA1;PAROLA1@ORASID
SCHEMA2;PAROLA2@ORASID

View File

@@ -0,0 +1,43 @@
; ============================================================================
; setari.ini pentru backupora.exe -- SABLON
; ============================================================================
; 11-setup-backup-export.ps1 il copiaza in <ExportPath>\setari.ini,
; inlocuind marcajele {{...}} cu valorile reale de la client.
;
; Formatul e cel citit efectiv de backupora.exe (verificat in main.prg).
; Sablonul original al programului e alaturi, ca setari.ini.tmpl.
;
; Scriptul NU interpreteaza cheile - doar substituie marcajele. Poti schimba
; structura fara sa modifici PowerShell-ul.
;
; Marcaje disponibile:
; {{EXPORT_DIR}} directorul in care sta backupora.exe
; {{SCHEMA_FILE}} calea completa catre schema.txt
; {{BACKUP_PATH}} unde ajung dump-urile (subdirector YYYYMMDD per zi)
; {{RETENTION_DAYS}} cate zile se pastreaza dump-urile (0 = pastreaza tot)
; {{EXPDP_EXE}} calea catre expdp.exe din Oracle home
; {{DMPDIR_PATH}} calea fizica a directorului Oracle DMPDIR
; {{DMPDIR_NAME}} numele obiectului Oracle DIRECTORY (DMPDIR)
; {{ORACLE_HOME}} Oracle home detectat
; {{DB_SERVICE}} numele serviciului (XEPDB1 / XE / ROA)
; {{DATA_GENERARII}} data la care a fost generat fisierul
; ============================================================================
[schema]
schemafile={{SCHEMA_FILE}}
[backup]
backuppath={{BACKUP_PATH}}
backupcd=no
backupcdpath={{BACKUP_PATH}}
delete_backups_older_xdays={{RETENTION_DAYS}}
datapumpdir={{DMPDIR_PATH}}
datapumpdirname={{DMPDIR_NAME}}
[oracle]
; ATENTIE: backupora.exe alege intre exportul clasic si Data Pump dupa NUMELE
; fisierului. Ca sa foloseasca expdp, fisierul trebuie sa se cheme "expdp.exe"
; (vezi changelog_backupora.txt, versiunea 3.0.0). De aceea aratam direct catre
; expdp.exe din Oracle home, nu catre stub-ul de 0 octeti din directorul
; programului.
oracleexpfile={{EXPDP_EXE}}

View File

@@ -0,0 +1,17 @@
[schema]
schemafile=C:\BACKUP_ORACLE\schema.txt
[backup]
backuppath=C:\BACKUP_ORACLE
backupcd=yes
backupcdpath=C:\BACKUP_ORACLE_NERO
delete_backups_olther_xdays=0
datapumpdirname=DMPDIR
datapumpdir=C:\DMPDIR
[oracle]
oracleexpfile=C:\ORACLE\PRODUCT\10.2.0\BIN\exp.exe
[citeste]
dmpdir_creare=create or replace directory DMP_DIR as 'C:\DMP_DIR';
dmpdir_drepturi=grant read, write on directory DMP_DIR to public;

View File

@@ -59,7 +59,15 @@ param(
[switch]$Detailed, [switch]$Detailed,
[Parameter(Mandatory = $false)] [Parameter(Mandatory = $false)]
[string]$OutputFile [string]$OutputFile,
# Folosite doar ca valoare de rezerva: caile reale se citesc din
# SERVER_INFO.ROAUPDATEPATH si din obiectul DIRECTORY BACKUP_ORACLE.
[Parameter(Mandatory = $false)]
[string]$RoaUpdatePath = "D:\ROAUPDATE",
[Parameter(Mandatory = $false)]
[string]$ExportPath = "D:\ROA\EXPORT_ORADMP"
) )
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
@@ -569,6 +577,264 @@ EXIT;
Add-ReportLine $ctxResult Add-ReportLine $ctxResult
} }
# ------------------------------------------------------------------------
# Licente
# ------------------------------------------------------------------------
# AUTH_DETALII tine Id-ul de client, AUTH_SERII seriile propriu-zise pe
# care AUTH_PACK le decripteaza. Pasul 08 scrie doar Id-ul; seriile vin
# de pe serverul vechi prin 09-copy-licenses.ps1. O baza cu Id de client
# dar fara serii e cazul tipic de migrare facuta pe jumatate: aplicatia
# porneste si apoi refuza fiecare modul.
Add-ReportSection "Licente"
$licSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 300
SELECT 'SERII:' || COUNT(*) FROM sys.auth_serii;
SELECT 'SERII_ACTIVE:' || COUNT(*) FROM sys.auth_serii WHERE sters = 0;
SELECT 'IDCLIENT:' || NVL(MAX(detalii), '<nesetat>') FROM sys.auth_detalii;
SELECT 'EXPIRA:' || nume || '|' || TO_CHAR(data_val, 'YYYY-MM-DD')
FROM sys.vauth_serii
WHERE data_val IS NOT NULL AND data_val < SYSDATE + 60
ORDER BY data_val;
EXIT;
"@
$licResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $licSql -AsSysdba -Silent
$nrSerii = 0
$nrSeriiActive = 0
$idClient = '<nesetat>'
$expiraCurand = @()
foreach ($line in $licResult -split "`n") {
$line = $line.Trim()
if ($line -match "^SERII:(\d+)$") { $nrSerii = [int]$Matches[1] }
if ($line -match "^SERII_ACTIVE:(\d+)$") { $nrSeriiActive = [int]$Matches[1] }
if ($line -match "^IDCLIENT:(.+)$") { $idClient = $Matches[1].Trim() }
if ($line -match "^EXPIRA:(.+)\|(.+)$") { $expiraCurand += "$($Matches[1].Trim()) expira la $($Matches[2].Trim())" }
}
Add-ReportLine "Id client (AUTH_DETALII): $idClient"
Add-ReportLine "Serii de licenta: $nrSerii ($nrSeriiActive active)"
if ($nrSeriiActive -eq 0) {
Add-ReportLine ""
Add-ReportLine "[WARNING] Nicio serie activa in SYS.AUTH_SERII."
Add-ReportLine " La un client NOU e normal - licentele se adauga ulterior."
Add-ReportLine " La o MIGRARE inseamna ca pasul 09 nu a rulat sau a esuat:"
Add-ReportLine " Run.cmd 09-copy-licenses.ps1 -OldHost <gazda> -OldSysPassword <parola> -Replace"
$extraIssues += "No active license series in SYS.AUTH_SERII"
}
if ($expiraCurand.Count -gt 0) {
Add-ReportLine ""
Add-ReportLine "[NOTA] Licente care expira in urmatoarele 60 de zile:"
foreach ($e in $expiraCurand) { Add-ReportLine " - $e" }
}
# ------------------------------------------------------------------------
# Oglinda de update + IIS
# ------------------------------------------------------------------------
# Doua etaje: serverul trage modulele de la ROMFAST in ROAUPDATE (jobul
# UPDATEROA_ZILNIC), statiile le iau de la serverul clientului prin IIS.
# Daca al doilea etaj lipseste, primul merge si nu se vede nimic - statiile
# raman pe versiunile vechi la nesfarsit.
Add-ReportSection "Actualizarea aplicatiilor"
$caleRoaUpdate = $RoaUpdatePath
$siSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 300
SELECT 'ROAUPDATEPATH:' || value FROM contafin_oracle.server_info WHERE name = 'ROAUPDATEPATH';
SELECT 'UPD_URL_APP:' || value FROM contafin_oracle.server_info WHERE name = 'UPD_URL_APP';
EXIT;
"@
$siResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $siSql -Silent
$urlApp = $null
foreach ($line in $siResult -split "`n") {
$line = $line.Trim()
if ($line -match "^ROAUPDATEPATH:(.+)$") { $caleRoaUpdate = $Matches[1].Trim() }
if ($line -match "^UPD_URL_APP:(.+)$") { $urlApp = $Matches[1].Trim() }
}
Add-ReportLine "SERVER_INFO.ROAUPDATEPATH: $caleRoaUpdate"
Add-ReportLine "SERVER_INFO.UPD_URL_APP: $(if ($urlApp) { $urlApp } else { '<nesetat>' })"
if (-not $urlApp) {
$extraIssues += "SERVER_INFO.UPD_URL_APP not set (server cannot pull updates)"
}
if (-not (Test-Path $caleRoaUpdate)) {
Add-ReportLine "Directorul fizic: LIPSA"
Add-ReportLine "[WARNING] $caleRoaUpdate nu exista. Ruleaza 10-setup-roaupdate-iis.ps1."
$extraIssues += "ROAUPDATE directory missing: $caleRoaUpdate"
}
else {
$caleArhiva = Join-Path $caleRoaUpdate "_ARHIVE"
$dirModule = @(Get-ChildItem -Path $caleRoaUpdate -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -notlike "_*" })
$dirArhiva = @(Get-ChildItem -Path $caleArhiva -Directory -ErrorAction SilentlyContinue)
Add-ReportLine "Directorul fizic: OK"
Add-ReportLine "Directoare de modul: $($dirModule.Count)"
Add-ReportLine "Directoare _ARHIVE: $($dirArhiva.Count)"
if ($dirModule.Count -eq 0) {
Add-ReportLine "[WARNING] Nu exista directoare de modul in $caleRoaUpdate."
Add-ReportLine " Ruleaza 10-setup-roaupdate-iis.ps1."
$extraIssues += "No module directories under $caleRoaUpdate"
}
# Cate module au macar un ZIP si cat de proaspata e oglinda. Asta e
# masura practica a "aplicatiile sunt actualizate": daca nu s-a
# descarcat nimic, sau ce e acolo e vechi de luni, actualizarea nu
# merge indiferent ce spune jobul.
$moduleCuZip = 0
$celMaiNou = $null
foreach ($d in $dirArhiva) {
$zips = @(Get-ChildItem -Path $d.FullName -Filter "*.zip" -File -ErrorAction SilentlyContinue)
if ($zips.Count -gt 0) {
$moduleCuZip++
$max = ($zips | Sort-Object LastWriteTime -Descending | Select-Object -First 1).LastWriteTime
if (-not $celMaiNou -or $max -gt $celMaiNou) { $celMaiNou = $max }
}
}
Add-ReportLine "Module cu ZIP-uri in arhiva: $moduleCuZip"
if ($celMaiNou) {
$zile = [math]::Round(((Get-Date) - $celMaiNou).TotalDays)
Add-ReportLine "Cel mai recent ZIP: $($celMaiNou.ToString('yyyy-MM-dd')) (acum $zile zile)"
if ($zile -gt 30) {
Add-ReportLine "[NOTA] Oglinda nu s-a mai improspatat de peste 30 de zile."
Add-ReportLine " Verifica jobul UPDATEROA_ZILNIC si accesul la $urlApp."
}
}
else {
Add-ReportLine "Cel mai recent ZIP: niciunul"
Add-ReportLine "[NOTA] Oglinda e goala. La o instalare noua e normal - se umple"
Add-ReportLine " la prima rulare a jobului UPDATEROA_ZILNIC."
}
}
# Publicarea in IIS
$urlLocal = "http://localhost/roaupdate/"
try {
$respIis = Invoke-WebRequest -Uri $urlLocal -UseBasicParsing -TimeoutSec 10
Add-ReportLine "IIS $($urlLocal): OK ($($respIis.StatusCode))"
}
catch {
Add-ReportLine "IIS $($urlLocal): NU RASPUNDE"
Add-ReportLine "[WARNING] Statiile de lucru nu pot lua actualizari de la serverul asta."
Add-ReportLine " Ruleaza 10-setup-roaupdate-iis.ps1."
$extraIssues += "IIS mirror at $urlLocal not responding"
}
# Joburile de actualizare
$jobSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 300
SELECT 'JOB:' || job_name || '|' || enabled || '|' || state ||
'|' || NVL(TO_CHAR(last_start_date, 'YYYY-MM-DD HH24:MI'), 'niciodata')
FROM dba_scheduler_jobs
WHERE owner = 'CONTAFIN_ORACLE'
AND job_name IN ('UPDATEROA_ZILNIC', 'UPDATERTVAI_ZILNIC')
ORDER BY job_name;
EXIT;
"@
$jobResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $jobSql -AsSysdba -Silent
Add-ReportLine ""
$joburiGasite = 0
foreach ($line in $jobResult -split "`n") {
if ($line.Trim() -match "^JOB:([^|]+)\|([^|]+)\|([^|]+)\|(.+)$") {
$joburiGasite++
Add-ReportLine ("{0,-20} activat={1,-6} stare={2,-10} ultima rulare: {3}" -f `
$Matches[1].Trim(), $Matches[2].Trim(), $Matches[3].Trim(), $Matches[4].Trim())
}
}
if ($joburiGasite -eq 0) {
Add-ReportLine "Joburile de actualizare: LIPSA"
Add-ReportLine "[WARNING] Ruleaza 08-post-install-config.ps1."
$extraIssues += "Update scheduler jobs missing"
}
# ------------------------------------------------------------------------
# Exportul zilnic
# ------------------------------------------------------------------------
Add-ReportSection "Export zilnic (EXPORT_ORADMP)"
$expSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 300
SELECT 'BACKUPDIR:' || directory_path FROM dba_directories WHERE directory_name = 'BACKUP_ORACLE';
EXIT;
"@
$expResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $expSql -AsSysdba -Silent
$caleExport = $ExportPath
if ($expResult -match "BACKUPDIR:(.+)") { $caleExport = $Matches[1].Trim() }
Add-ReportLine "DIRECTORY BACKUP_ORACLE: $(if ($expResult -match 'BACKUPDIR:') { $caleExport } else { 'LIPSA' })"
if ($expResult -notmatch "BACKUPDIR:") {
$extraIssues += "Oracle directory BACKUP_ORACLE missing"
}
if (-not (Test-Path $caleExport)) {
Add-ReportLine "Directorul fizic: LIPSA ($caleExport)"
Add-ReportLine "[WARNING] Ruleaza 11-setup-backup-export.ps1."
$extraIssues += "Export directory missing: $caleExport"
}
else {
Add-ReportLine "Directorul fizic: OK"
foreach ($f in @('backupora.exe', 'setari.ini', 'schema.txt')) {
$cale = Join-Path $caleExport $f
if (Test-Path $cale) {
if ($f -eq 'schema.txt') {
$nrScheme = @(Get-Content $cale | Where-Object { $_.Trim() -ne '' }).Count
Add-ReportLine ("{0,-28} OK ({1} scheme)" -f "${f}:", $nrScheme)
} else {
Add-ReportLine ("{0,-28} OK" -f "${f}:")
}
}
else {
Add-ReportLine ("{0,-28} LIPSA" -f "${f}:")
$extraIssues += "$f missing from $caleExport"
}
}
$dumpuri = @(Get-ChildItem -Path $caleExport -Filter "*.dmp" -File -ErrorAction SilentlyContinue)
if ($dumpuri.Count -gt 0) {
$celMaiNouDmp = ($dumpuri | Sort-Object LastWriteTime -Descending | Select-Object -First 1)
$zileDmp = [math]::Round(((Get-Date) - $celMaiNouDmp.LastWriteTime).TotalDays)
Add-ReportLine "Dump-uri prezente: $($dumpuri.Count), cel mai recent acum $zileDmp zile"
if ($zileDmp -gt 2) {
Add-ReportLine "[NOTA] Ultimul export e vechi de $zileDmp zile. Verifica task-ul."
}
}
else {
Add-ReportLine "Dump-uri prezente: niciunul (exportul nu a rulat inca)"
}
}
# Task-ul din Windows
$task = $null
try { $task = Get-ScheduledTask -TaskName "ROA Export Oracle" -ErrorAction Stop } catch { }
if ($task) {
$info = Get-ScheduledTaskInfo -TaskName "ROA Export Oracle"
$ultima = if ($info.LastRunTime -and $info.LastRunTime.Year -gt 1999) {
$info.LastRunTime.ToString('yyyy-MM-dd HH:mm')
} else { 'niciodata' }
Add-ReportLine "Task 'ROA Export Oracle': $($task.State), ultima rulare: $ultima (cod $($info.LastTaskResult))"
}
else {
Add-ReportLine "Task 'ROA Export Oracle': LIPSA"
Add-ReportLine "[WARNING] Nu exista task zilnic de export. Ruleaza 11-setup-backup-export.ps1."
$extraIssues += "Scheduled task 'ROA Export Oracle' missing"
}
# Final Summary # Final Summary
Add-ReportSection "Verification Summary" Add-ReportSection "Verification Summary"

View File

@@ -0,0 +1,387 @@
#Requires -Version 5.1
<#
.SYNOPSIS
Copiaza licentele ROA (SYS.AUTH_SERII + SYS.AUTH_DETALII) de pe serverul
vechi pe cel nou.
.DESCRIPTION
Fara acest pas, un client migrat ramane fara licente: sys-objects.sql
creeaza tabelele goale, iar 08-post-install-config.ps1 scrie doar
AUTH_DETALII (Customer ID). Seriile propriu-zise din AUTH_SERII, pe care
AUTH_PACK le decripteaza ca sa afle ce module si cate firme sunt permise,
nu se creeaza nicaieri.
Doua moduri:
1. Prin retea. Se conecteaza cu SQL*Plus la serverul VECHI (parametrii
-OldHost / -OldPort / -OldService / -OldSysPassword), ruleaza
sql\export-licente.sql si captureaza INSERT-urile generate.
Serverul vechi nu e modificat - se face doar SELECT.
2. Din fisier (-FromFile). Cand serverul vechi nu e accesibil din cel
nou, rulezi manual pe el:
sqlplus -S "sys/PAROLA@GAZDA:1521/SERVICIU as sysdba" @export-licente.sql > licente.sql
si aduci licente.sql la client.
Inainte de a scrie ceva, salveaza starea curenta a licentelor de pe
serverul NOU in logs\licente-backup-server-nou_<data>.sql, in acelasi
format. Daca ceva merge prost, ala e drumul inapoi.
Dupa import, recreeaza SYS.SEQ_AUTH_SERII peste MAX(ID_SERIE)+1, altfel
prima licenta adaugata ulterior din aplicatie ar incalca PK_AUTH_SERII.
.PARAMETER OldHost
Gazda serverului VECHI. Prezenta ei porneste modul prin retea.
.PARAMETER OldPort
Portul listener-ului de pe serverul vechi. Implicit 1521.
.PARAMETER OldService
Numele serviciului de pe serverul vechi (ex. XE, ORCL, XEPDB1).
Implicit XE - bazele vechi de client sunt de regula non-CDB.
.PARAMETER OldSysPassword
Parola SYS de pe serverul vechi. Obligatorie in modul prin retea.
.PARAMETER FromFile
Fisierul .sql produs de export-licente.sql. Ocoleste conexiunea la
serverul vechi.
.PARAMETER OracleHome
Oracle home local. Autodetectat daca lipseste.
.PARAMETER ServiceName
Serviciul bazei NOI. Implicit XEPDB1.
.PARAMETER SystemPassword
Parola SYS de pe serverul NOU. Implicit romfastsoft.
.PARAMETER Replace
Sterge licentele existente de pe serverul nou inainte de import.
Fara el, scriptul refuza sa scrie peste licente deja prezente.
.PARAMETER ExportOnly
Doar scoate licentele de pe serverul vechi intr-un fisier, fara sa
importe nimic. Util cand pregatesti kitul de pe alta statie.
.EXAMPLE
.\09-copy-licenses.ps1 -OldHost 192.168.1.10 -OldSysPassword "parolaveche"
Ia licentele prin retea si le importa.
.EXAMPLE
.\09-copy-licenses.ps1 -OldHost 192.168.1.10 -OldService ORCL -OldSysPassword "x" -ExportOnly
Doar salveaza licentele in logs\, pentru import ulterior.
.EXAMPLE
.\09-copy-licenses.ps1 -FromFile "C:\kit\licente.sql" -Replace
Importa dintr-un fisier adus manual, peste licentele existente.
.NOTES
File Name : 09-copy-licenses.ps1
Prerequisite : 02-create-sys-objects.ps1 (tabelele AUTH_* trebuie sa existe)
Copyright 2026 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$OldHost,
[Parameter(Mandatory = $false)]
[int]$OldPort = 1521,
[Parameter(Mandatory = $false)]
[string]$OldService = "XE",
[Parameter(Mandatory = $false)]
[string]$OldSysPassword,
[Parameter(Mandatory = $false)]
[string]$FromFile,
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[switch]$Replace,
[Parameter(Mandatory = $false)]
[switch]$ExportOnly
)
$ErrorActionPreference = "Stop"
. (Join-Path $PSScriptRoot "lib\logging-functions.ps1")
. (Join-Path $PSScriptRoot "lib\oracle-functions.ps1")
$configFile = Join-Path $PSScriptRoot "..\config.ps1"
if (Test-Path $configFile) {
. $configFile
if (-not $PSBoundParameters.ContainsKey('OracleHome') -and $Config.OracleHome) { $OracleHome = $Config.OracleHome }
if (-not $PSBoundParameters.ContainsKey('ServiceName') -and $Config.ServiceName) { $ServiceName = $Config.ServiceName }
if (-not $PSBoundParameters.ContainsKey('SystemPassword') -and $Config.SystemPassword) { $SystemPassword = $Config.SystemPassword }
}
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$logDir = Join-Path $PSScriptRoot "..\logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
Initialize-LogFile -LogPath (Join-Path $logDir "09-copy-licenses_$stamp.log") -ScriptName "09-copy-licenses.ps1"
$MarkerStart = '-- ROA-LICENTE-EXPORT v1'
$MarkerEnd = '-- ROA-LICENTE-SFARSIT'
function Test-LicenseDump {
param([string]$Path)
if (-not (Test-Path $Path)) { throw "Fisierul de licente nu exista: $Path" }
$text = Get-Content -Path $Path -Raw
if ($null -eq $text) { $text = "" }
if ($text -notmatch [regex]::Escape($MarkerStart)) {
throw "Fisierul $Path nu contine marcajul '$MarkerStart'. Nu e o iesire valida a lui export-licente.sql."
}
if ($text -notmatch [regex]::Escape($MarkerEnd)) {
throw "Fisierul $Path nu contine marcajul de final '$MarkerEnd'. Exportul s-a intrerupt la mijloc - nu il import."
}
if ($text -match 'ORA-\d{5}:|SP2-\d{4}:') {
throw "Fisierul $Path contine erori Oracle. Corecteaza exportul inainte de import."
}
$nextval = 1
if ($text -match '-- ROA-LICENTE-NEXTVAL=(\d+)') { $nextval = [int]$Matches[1] }
return [PSCustomObject]@{
Serii = ([regex]::Matches($text, 'INSERT INTO SYS\.AUTH_SERII')).Count
Detalii = ([regex]::Matches($text, 'INSERT INTO SYS\.AUTH_DETALII')).Count
NextVal = $nextval
}
}
try {
Write-LogSection "Copiere licente ROA (AUTH_SERII + AUTH_DETALII)"
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
$exportSql = Join-Path $PSScriptRoot "..\sql\export-licente.sql"
if (-not (Test-Path $exportSql)) {
throw "Lipseste sql\export-licente.sql din kit."
}
# ------------------------------------------------------------------
# Sursa licentelor: retea sau fisier
# ------------------------------------------------------------------
$dumpFile = $null
if ($FromFile) {
Write-LogSection "Sursa: fisier"
$dumpFile = (Resolve-Path $FromFile).Path
Write-Log "Fisier: $dumpFile"
}
elseif ($OldHost) {
Write-LogSection "Sursa: serverul vechi, prin retea"
if (-not $OldSysPassword) {
throw "-OldSysPassword e obligatoriu cand dai -OldHost."
}
Write-Log "Server vechi: ${OldHost}:${OldPort}/${OldService}"
Write-Log "Se testeaza conexiunea..."
$reachable = $false
try {
$reachable = Test-OracleConnection -OracleHome $oraHome -ServiceName $OldService `
-DbHost $OldHost -Port $OldPort -Password $OldSysPassword
}
catch {
Write-LogDebug $_.Exception.Message
}
if (-not $reachable) {
Write-LogError "Nu ma pot conecta la ${OldHost}:${OldPort}/${OldService}."
Write-LogError "Verifica: listener-ul pornit, firewall-ul, numele serviciului, parola SYS."
Write-LogError ""
Write-LogError "Varianta manuala - ruleaza PE SERVERUL VECHI:"
Write-LogError " sqlplus -S ""sys/PAROLA@localhost:$OldPort/$OldService as sysdba"" @export-licente.sql > licente.sql"
Write-LogError "apoi adu licente.sql aici si ruleaza:"
Write-LogError " .\09-copy-licenses.ps1 -FromFile licente.sql -Replace"
throw "Serverul vechi nu e accesibil."
}
Write-LogSuccess "Conexiune la serverul vechi: OK"
Write-Log "Se extrag licentele (doar SELECT, serverul vechi nu se modifica)..."
$raw = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $OldService `
-DbHost $OldHost -Port $OldPort `
-Username "sys" -Password $OldSysPassword -AsSysdba `
-SqlFile $exportSql -Silent
$dumpFile = Join-Path $logDir "licente-de-pe-server-vechi_$stamp.sql"
Set-Content -Path $dumpFile -Value $raw -Encoding ASCII
Write-LogSuccess "Salvat: $dumpFile"
}
else {
throw "Da fie -OldHost (+ -OldSysPassword), fie -FromFile. Vezi 'Get-Help .\09-copy-licenses.ps1 -Full'."
}
$info = Test-LicenseDump -Path $dumpFile
Write-LogSuccess "Export valid: $($info.Serii) serii, $($info.Detalii) inregistrari AUTH_DETALII"
Write-Log "SEQ_AUTH_SERII va porni de la $($info.NextVal)"
if ($info.Serii -eq 0) {
Write-LogWarning "Serverul vechi nu are nicio serie in AUTH_SERII."
Write-LogWarning "Ori clientul chiar nu are licente, ori te-ai conectat la baza gresita."
}
if ($ExportOnly) {
Write-LogSection "Gata (ExportOnly)"
Write-Log "Fisierul de licente: $dumpFile"
Write-Log "Il importi mai tarziu cu:"
Write-Log " .\09-copy-licenses.ps1 -FromFile ""$dumpFile"" -Replace"
Close-LogFile
exit 0
}
# ------------------------------------------------------------------
# Serverul nou: verificari si backup
# ------------------------------------------------------------------
Write-LogSection "Serverul nou"
if (-not (Test-OracleConnection -OracleHome $oraHome -ServiceName $ServiceName -Password $SystemPassword)) {
throw "Nu ma pot conecta la baza noua ($ServiceName)."
}
Write-LogSuccess "Conexiune: OK"
$check = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -Silent -SqlCommand @"
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF VERIFY OFF
SELECT 'TABELE=' || COUNT(*) FROM dba_tables
WHERE owner = 'SYS' AND table_name IN ('AUTH_SERII','AUTH_DETALII');
SELECT 'SERII=' || COUNT(*) FROM sys.auth_serii;
EXIT
"@
if ($check -notmatch 'TABELE=2') {
throw "SYS.AUTH_SERII / SYS.AUTH_DETALII nu exista pe serverul nou. Ruleaza intai 02-create-sys-objects.ps1."
}
$seriiExistente = 0
if ($check -match 'SERII=(\d+)') { $seriiExistente = [int]$Matches[1] }
Write-Log "Licente deja prezente pe serverul nou: $seriiExistente serii"
if ($seriiExistente -gt 0 -and -not $Replace) {
Write-LogError "Serverul nou are deja $seriiExistente serii de licenta."
Write-LogError "Ruleaza din nou cu -Replace daca vrei sa le inlocuiesti cu cele de pe serverul vechi."
throw "Import oprit ca sa nu dublez licentele."
}
# Backup in acelasi format, ca sa poata fi re-importat cu -FromFile.
$backupFile = Join-Path $logDir "licente-backup-server-nou_$stamp.sql"
Write-Log "Salvez licentele curente in $backupFile ..."
$backupRaw = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba `
-SqlFile $exportSql -Silent
Set-Content -Path $backupFile -Value $backupRaw -Encoding ASCII
Write-LogSuccess "Backup salvat."
Write-Log "Drumul inapoi: .\09-copy-licenses.ps1 -FromFile ""$backupFile"" -Replace"
# ------------------------------------------------------------------
# Import
# ------------------------------------------------------------------
Write-LogSection "Import licente"
$inserts = @(Get-Content -Path $dumpFile | Where-Object { $_ -match '^\s*INSERT INTO SYS\.AUTH_' })
$seqBlock = @"
DECLARE
v_next NUMBER := $($info.NextVal);
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE SYS.SEQ_AUTH_SERII';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2289 THEN RAISE; END IF; -- -2289 = secventa nu exista
END;
EXECUTE IMMEDIATE 'CREATE SEQUENCE SYS.SEQ_AUTH_SERII ' ||
'MINVALUE 1 MAXVALUE 99999999999999999 INCREMENT BY 1 ' ||
'START WITH ' || v_next || ' NOCACHE NOORDER NOCYCLE';
DBMS_OUTPUT.PUT_LINE(' SEQ_AUTH_SERII recreata, START WITH ' || v_next);
END;
/
"@
$importLines = @()
$importLines += "SET FEEDBACK ON SERVEROUTPUT ON VERIFY OFF"
$importLines += "WHENEVER SQLERROR EXIT FAILURE ROLLBACK"
$importLines += "DELETE FROM sys.auth_serii;"
$importLines += "DELETE FROM sys.auth_detalii;"
$importLines += $inserts
$importLines += "COMMIT;"
$importLines += $seqBlock
$importLines += "SET PAGESIZE 0 HEADING OFF FEEDBACK OFF"
$importLines += "SELECT 'IMPORTAT_SERII=' || COUNT(*) FROM sys.auth_serii;"
$importLines += "SELECT 'IMPORTAT_DETALII=' || COUNT(*) FROM sys.auth_detalii;"
$importLines += "EXIT"
$importFile = Join-Path $logDir "licente-import_$stamp.sql"
Set-Content -Path $importFile -Value ($importLines -join "`r`n") -Encoding ASCII
$result = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -SqlFile $importFile
Write-LogDebug $result
if ($result -match 'ORA-\d{5}:') {
Write-LogError "Importul a returnat erori Oracle. Vezi $importFile."
throw "Import esuat - tranzactia a fost anulata (ROLLBACK)."
}
$importateSerii = -1
if ($result -match 'IMPORTAT_SERII=(\d+)') { $importateSerii = [int]$Matches[1] }
if ($importateSerii -ne $info.Serii) {
Write-LogError "Am importat $importateSerii serii, dar exportul avea $($info.Serii)."
throw "Numarul de licente nu se potriveste."
}
Write-LogSuccess "$importateSerii serii de licenta importate"
# ------------------------------------------------------------------
# Verificare finala: ce vede AUTH_PACK prin VAUTH_SERII
# ------------------------------------------------------------------
Write-LogSection "Licente active"
$lista = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -Silent -SqlCommand @"
SET PAGESIZE 200 LINESIZE 200 FEEDBACK OFF VERIFY OFF
COLUMN nume FORMAT A25
SELECT nume, nr_util, TO_CHAR(data_val,'YYYY-MM-DD') AS data_val
FROM sys.vauth_serii
ORDER BY nume;
EXIT
"@
Write-Host $lista
Write-LogSection "Gata"
Write-Log "Backup inainte de import: $backupFile"
Write-Log "Sursa importata: $dumpFile"
Close-LogFile
exit 0
}
catch {
Write-LogError $_.Exception.Message
Write-LogDebug $_.ScriptStackTrace
Close-LogFile
exit 1
}

View File

@@ -0,0 +1,411 @@
#Requires -Version 5.1
<#
.SYNOPSIS
Pregateste D:\ROAUPDATE ca oglinda locala de update si o publica in IIS
la http://localhost/roaupdate/.
.DESCRIPTION
Mecanismul de actualizare ROA are doua etaje:
1. Serverul clientului trage modulele de la ROMFAST. Jobul
CONTAFIN_ORACLE.UPDATEROA_ZILNIC apeleaza PACK_UPDATE.UPDATEROA,
care descarca de la SERVER_INFO.UPD_URL_APP (https://update.romfast.ro/roa/)
in D:\ROAUPDATE.
2. Statiile de lucru iau modulele de la serverul clientului, prin HTTP.
Pentru asta D:\ROAUPDATE trebuie publicat in IIS. Fara pasul asta,
etajul 1 functioneaza si nu se vede nimic - statiile raman pe
versiunile vechi la nesfarsit.
Ce face scriptul:
- creeaza D:\ROAUPDATE, _ARHIVE\<MODUL>, <MODUL> si _UPDATE;
08-post-install-config.ps1 face doar _ARHIVE\<MODUL> (pentru
obiectele Oracle DIRECTORY), aici se adauga directoarele de modul de
la nivelul de sus, in care ajung binarele curente;
- instaleaza rolul IIS daca lipseste (Windows Server sau Windows Pro);
- creeaza aplicatia /roaupdate in Default Web Site, catre D:\ROAUPDATE;
- activeaza directory browsing si se asigura ca .zip si .xml se servesc;
- da drept de citire lui IIS_IUSRS pe D:\ROAUPDATE;
- verifica la final ca http://localhost/roaupdate/ raspunde 200.
.PARAMETER RoaUpdatePath
Radacina oglinzii de update. Implicit D:\ROAUPDATE.
Trebuie sa fie aceeasi valoare ca la 08-post-install-config.ps1, altfel
obiectele Oracle DIRECTORY arata in alta parte decat IIS.
.PARAMETER SiteName
Site-ul IIS in care se creeaza aplicatia. Implicit "Default Web Site".
.PARAMETER AppName
Numele aplicatiei (segmentul din URL). Implicit "roaupdate".
.PARAMETER SkipIisInstall
Nu instala rolul IIS. Daca lipseste, scriptul se opreste cu instructiuni.
Foloseste-l pe servere unde nu ai voie sa adaugi roluri.
.PARAMETER SkipDirectories
Nu crea directoarele fizice, doar configureaza IIS.
.PARAMETER Modules
Lista modulelor pentru care se creeaza directoare. Implicit lista
standard ROA (aceeasi ca in 08-post-install-config.ps1).
.EXAMPLE
.\10-setup-roaupdate-iis.ps1
Varianta obisnuita: D:\ROAUPDATE publicat la http://localhost/roaupdate/.
.EXAMPLE
.\10-setup-roaupdate-iis.ps1 -RoaUpdatePath "E:\ROAUPDATE" -SkipIisInstall
Alta litera de disc, pe un server unde IIS e deja instalat de altcineva.
.NOTES
File Name : 10-setup-roaupdate-iis.ps1
Prerequisite : drepturi de administrator; instalarea rolului IIS poate cere restart
Copyright 2026 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$RoaUpdatePath = "D:\ROAUPDATE",
[Parameter(Mandatory = $false)]
[string]$SiteName = "Default Web Site",
[Parameter(Mandatory = $false)]
[string]$AppName = "roaupdate",
[Parameter(Mandatory = $false)]
[switch]$SkipIisInstall,
[Parameter(Mandatory = $false)]
[switch]$SkipDirectories,
[Parameter(Mandatory = $false)]
[string[]]$Modules
)
$ErrorActionPreference = "Stop"
. (Join-Path $PSScriptRoot "lib\logging-functions.ps1")
$configFile = Join-Path $PSScriptRoot "..\config.ps1"
if (Test-Path $configFile) {
. $configFile
if (-not $PSBoundParameters.ContainsKey('RoaUpdatePath') -and $Config.RoaUpdatePath) {
$RoaUpdatePath = $Config.RoaUpdatePath
}
}
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$logDir = Join-Path $PSScriptRoot "..\logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
Initialize-LogFile -LogPath (Join-Path $logDir "10-setup-roaupdate-iis_$stamp.log") -ScriptName "10-setup-roaupdate-iis.ps1"
# Aceeasi lista ca in 08-post-install-config.ps1. Daca adaugi un modul,
# adauga-l in ambele locuri - 08 face obiectele Oracle DIRECTORY pe
# _ARHIVE\<MODUL>, scriptul asta face directoarele fizice de modul.
if (-not $Modules -or $Modules.Count -eq 0) {
$Modules = @(
"COMUNROA", "USERREPORTS",
"ROAAPROV", "ROAAUTO", "ROABAVERT", "ROACASA", "ROACOMENZI",
"ROACONIMPORT", "ROACONSTRUCTII", "ROACONT", "ROACONTRACTE",
"ROADECL", "ROADEF", "ROADEFSALARII", "ROADEPOZIT", "ROADEVIZE",
"ROAFACTURARE", "ROAFURNIZORI",
"ROAGEN", "ROAGEST",
"ROAGRESTAURANT", "ROAHOTEL", "ROAHOTELCONFIG",
"ROAIMOB", "ROAINCHIDSAL",
"ROALUCRARI", "ROAMANAGER", "ROAMASINI",
"ROANOR", "ROANORFRUVIMED", "ROANORRENAV", "ROANORUTMIDIA",
"ROAOBINV", "ROAOFERTARE", "ROAPRETURI",
"ROAPRINT", "ROAPRINT_INITIALIZARI",
"ROAPRODAGR", "ROAPRODUCTIE",
"ROAREGISTRATURA", "ROAREPARTIZSAL",
"ROARES", "ROARESTAURANT", "ROARETAIL", "ROARETAILMON",
"ROASAL", "ROASALSPEC",
"ROASITFIN", "ROASITOP",
"ROASTART", "ROASUPORT",
"ROATELCOMM", "ROATELMON",
"ROAVIN"
)
}
function Test-Administrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function Get-WindowsKind {
# 1 = Workstation (Win 10/11), 2 = Domain Controller, 3 = Server
$osInfo = Get-CimInstance -ClassName Win32_OperatingSystem
if ($osInfo.ProductType -eq 1) { return "Client" } else { return "Server" }
}
function Test-IisInstalled {
return (Test-Path "$env:SystemRoot\System32\inetsrv\appcmd.exe")
}
try {
Write-LogSection "Oglinda de update ROA + publicare in IIS"
if (-not (Test-Administrator)) {
throw "Scriptul are nevoie de drepturi de administrator (instaleaza roluri Windows si scrie in configul IIS)."
}
Write-Log "Radacina: $RoaUpdatePath"
Write-Log "Site IIS: $SiteName"
Write-Log "Aplicatie: /$AppName"
# ------------------------------------------------------------------
# 1. Directoare fizice
# ------------------------------------------------------------------
if (-not $SkipDirectories) {
Write-LogSection "Directoare"
$drive = Split-Path -Qualifier $RoaUpdatePath
if ($drive -and -not (Test-Path $drive)) {
throw "Discul $drive nu exista. Da alta cale cu -RoaUpdatePath (si aceeasi la 08-post-install-config.ps1)."
}
$creat = 0
$exista = 0
foreach ($dir in @($RoaUpdatePath,
(Join-Path $RoaUpdatePath "_ARHIVE"),
(Join-Path $RoaUpdatePath "_UPDATE"))) {
if (-not (Test-Path $dir)) {
New-Item -ItemType Directory -Path $dir -Force | Out-Null
Write-Log "Creat: $dir"
$creat++
} else { $exista++ }
}
foreach ($modul in $Modules) {
# Directorul de modul de la nivelul de sus - aici stau binarele
# curente pe care le vad statiile.
$caleModul = Join-Path $RoaUpdatePath $modul
if (-not (Test-Path $caleModul)) {
New-Item -ItemType Directory -Path $caleModul -Force | Out-Null
$creat++
} else { $exista++ }
# Arhiva de versiuni; 08 creeaza si obiectul Oracle DIRECTORY
# care arata aici. O facem si noi, ca scriptul sa poata rula
# independent de ordinea pasilor.
$caleArhiva = Join-Path (Join-Path $RoaUpdatePath "_ARHIVE") $modul
if (-not (Test-Path $caleArhiva)) {
New-Item -ItemType Directory -Path $caleArhiva -Force | Out-Null
$creat++
} else { $exista++ }
}
Write-LogSuccess "$creat directoare create, $exista existau deja ($($Modules.Count) module)"
}
else {
Write-Log "Sar peste crearea directoarelor (-SkipDirectories)"
}
if (-not (Test-Path $RoaUpdatePath)) {
throw "$RoaUpdatePath nu exista. Ruleaza fara -SkipDirectories sau creeaza-l manual."
}
# ------------------------------------------------------------------
# 2. IIS
# ------------------------------------------------------------------
Write-LogSection "IIS"
if (-not (Test-IisInstalled)) {
if ($SkipIisInstall) {
Write-LogError "IIS nu e instalat si mi-ai cerut sa nu il instalez (-SkipIisInstall)."
Write-LogError "Instaleaza-l manual:"
if ((Get-WindowsKind) -eq "Server") {
Write-LogError " Install-WindowsFeature -Name Web-Server -IncludeManagementTools"
} else {
Write-LogError " Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole, IIS-WebServer, IIS-StaticContent, IIS-DirectoryBrowsing, IIS-DefaultDocument, IIS-HttpErrors, IIS-ManagementConsole -All"
}
throw "IIS lipseste."
}
$kind = Get-WindowsKind
Write-Log "IIS nu e instalat. Sistem detectat: Windows $kind. Il instalez..."
if ($kind -eq "Server") {
Import-Module ServerManager -ErrorAction Stop
$res = Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Write-Log "Install-WindowsFeature: Success=$($res.Success) ExitCode=$($res.ExitCode)"
if ($res.RestartNeeded -eq 'Yes') {
Write-LogWarning "Windows cere restart pentru a finaliza instalarea IIS."
Write-LogWarning "Reporneste serverul si ruleaza din nou scriptul asta."
}
if (-not $res.Success) {
throw "Instalarea rolului Web-Server a esuat."
}
}
else {
$features = @(
'IIS-WebServerRole', 'IIS-WebServer', 'IIS-CommonHttpFeatures',
'IIS-StaticContent', 'IIS-DefaultDocument', 'IIS-DirectoryBrowsing',
'IIS-HttpErrors', 'IIS-RequestFiltering', 'IIS-HttpLogging',
'IIS-WebServerManagementTools', 'IIS-ManagementConsole'
)
foreach ($f in $features) {
try {
$state = (Get-WindowsOptionalFeature -Online -FeatureName $f -ErrorAction Stop).State
if ($state -ne 'Enabled') {
Enable-WindowsOptionalFeature -Online -FeatureName $f -All -NoRestart -ErrorAction Stop | Out-Null
Write-Log "Activat: $f"
}
}
catch {
Write-LogWarning "Nu am putut activa $f : $($_.Exception.Message)"
}
}
}
if (-not (Test-IisInstalled)) {
throw "IIS tot nu e disponibil dupa instalare. Probabil e nevoie de restart - reporneste si reia scriptul."
}
Write-LogSuccess "IIS instalat"
}
else {
Write-LogSuccess "IIS e deja instalat"
}
Import-Module WebAdministration -ErrorAction Stop
Write-LogSuccess "Modulul WebAdministration incarcat"
# Site-ul gazda
if (-not (Test-Path "IIS:\Sites\$SiteName")) {
Write-LogError "Site-ul IIS '$SiteName' nu exista. Site-uri disponibile:"
Get-ChildItem "IIS:\Sites" | ForEach-Object { Write-LogError " - $($_.Name)" }
throw "Da numele corect cu -SiteName."
}
$siteState = (Get-Website -Name $SiteName).State
if ($siteState -ne 'Started') {
Write-Log "Site-ul '$SiteName' e $siteState; il pornesc..."
Start-Website -Name $SiteName
}
# ------------------------------------------------------------------
# 3. Aplicatia /roaupdate
# ------------------------------------------------------------------
Write-LogSection "Aplicatia /$AppName"
$appPath = "IIS:\Sites\$SiteName\$AppName"
if (Test-Path $appPath) {
$existing = (Get-WebApplication -Site $SiteName -Name $AppName).PhysicalPath
if ($existing -eq $RoaUpdatePath) {
Write-LogSuccess "Aplicatia exista deja si arata corect catre $RoaUpdatePath"
}
else {
Write-LogWarning "Aplicatia exista dar arata catre '$existing'. O reorientez catre $RoaUpdatePath."
Set-ItemProperty -Path $appPath -Name physicalPath -Value $RoaUpdatePath
Write-LogSuccess "Cale actualizata"
}
}
else {
New-WebApplication -Site $SiteName -Name $AppName -PhysicalPath $RoaUpdatePath -Force | Out-Null
Write-LogSuccess "Aplicatie creata: /$AppName -> $RoaUpdatePath"
}
$appLocation = "$SiteName/$AppName"
# Directory browsing: statiile si omul de la suport trebuie sa poata
# vedea ce ZIP-uri exista fara sa ghiceasca numele.
Set-WebConfigurationProperty -Filter "/system.webServer/directoryBrowse" `
-Name enabled -Value $true -PSPath "IIS:\" -Location $appLocation
Write-LogSuccess "Directory browsing activat"
# ZIP-urile si XML-urile trebuie servite ca fisiere, nu blocate.
foreach ($ext in @('.zip', '.xml', '.dbf', '.fpt', '.cdx')) {
try {
$existing = Get-WebConfiguration -Filter "/system.webServer/staticContent/mimeMap[@fileExtension='$ext']" `
-PSPath "IIS:\" -Location $appLocation
if (-not $existing) {
$type = switch ($ext) {
'.zip' { 'application/zip' }
'.xml' { 'text/xml' }
default { 'application/octet-stream' }
}
Add-WebConfigurationProperty -Filter "/system.webServer/staticContent" -Name "." `
-Value @{ fileExtension = $ext; mimeType = $type } `
-PSPath "IIS:\" -Location $appLocation
Write-Log "MIME adaugat: $ext -> $type"
}
}
catch {
Write-LogDebug "MIME $ext : $($_.Exception.Message)"
}
}
# Request filtering blocheaza implicit unele extensii; ne asiguram ca
# limita de dimensiune nu taie ZIP-urile mari la download (maxAllowedContentLength
# afecteaza uploadul, dar il ridicam oricum pentru simetrie cu serverul ROMFAST).
try {
Set-WebConfigurationProperty -Filter "/system.webServer/security/requestFiltering/requestLimits" `
-Name maxAllowedContentLength -Value 4294967295 -PSPath "IIS:\" -Location $appLocation
}
catch {
Write-LogDebug "requestLimits: $($_.Exception.Message)"
}
# ------------------------------------------------------------------
# 4. Permisiuni NTFS
# ------------------------------------------------------------------
Write-LogSection "Permisiuni"
foreach ($cont in @('IIS_IUSRS', 'IUSR')) {
$null = & icacls.exe $RoaUpdatePath /grant "${cont}:(OI)(CI)RX" /T /Q 2>&1
if ($LASTEXITCODE -eq 0) {
Write-LogSuccess "Drept de citire pentru $cont pe $RoaUpdatePath"
} else {
Write-LogWarning "icacls pentru $cont a returnat codul $LASTEXITCODE"
}
}
# ------------------------------------------------------------------
# 5. Verificare
# ------------------------------------------------------------------
Write-LogSection "Verificare"
$url = "http://localhost/$AppName/"
Write-Log "Cer $url ..."
try {
$resp = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 20
if ($resp.StatusCode -eq 200) {
Write-LogSuccess "$url raspunde 200 OK"
}
else {
Write-LogWarning "$url a raspuns cu codul $($resp.StatusCode)"
}
}
catch {
Write-LogError "$url nu raspunde: $($_.Exception.Message)"
Write-LogError "Verifica: serviciul W3SVC pornit, portul 80 liber (netstat -ano | findstr :80),"
Write-LogError "si ca site-ul '$SiteName' are un binding pe portul 80."
throw "Publicarea in IIS nu s-a putut verifica."
}
Write-LogSection "Gata"
Write-Log "Oglinda de update: $RoaUpdatePath"
Write-Log "URL local: $url"
Write-Log ""
Write-Log "Statiile de lucru se configureaza catre $url"
Write-Log "Serverul trage modulele de la SERVER_INFO.UPD_URL_APP prin"
Write-Log "jobul CONTAFIN_ORACLE.UPDATEROA_ZILNIC (creat de pasul 08, dezactivat implicit)."
Close-LogFile
exit 0
}
catch {
Write-LogError $_.Exception.Message
Write-LogDebug $_.ScriptStackTrace
Close-LogFile
exit 1
}

View File

@@ -0,0 +1,528 @@
#Requires -Version 5.1
<#
.SYNOPSIS
Pregateste exportul zilnic al bazei: D:\ROA\EXPORT_ORADMP cu backupora.exe,
setari.ini, schema.txt si task-ul zilnic din Windows Task Scheduler.
.DESCRIPTION
Ce face, in ordine:
1. Creeaza D:\ROA\EXPORT_ORADMP (+ subdirectorul LOG).
2. Copiaza backupora.exe si config.fpw din kit (backup\).
3. Genereaza setari.ini din backup\setari.ini.template, inlocuind
marcajele {{...}} cu valorile reale ale instalarii.
4. Genereaza schema.txt cu schemele de exportat, in formatul cerut de
backupora.exe: SCHEMA;PAROLA@SERVICIU, cate una pe linie.
CONTAFIN_ORACLE + firmele active din CONTAFIN_ORACLE.NOM_FIRME
(parolele se citesc din NOM_FIRME.parola).
Alternativ, il copiaza de pe serverul vechi (-SchemaFromPath).
5. Creeaza obiectul Oracle DIRECTORY BACKUP_ORACLE catre acelasi
director, ca Data Pump sa poata scrie acolo, si da drepturi
serviciului Oracle pe folder.
6. Inregistreaza un task zilnic in Windows Task Scheduler.
Formatul lui setari.ini NU e cimentat in cod: sablonul e un fisier de
date, iar scriptul doar substituie marcajele.
ATENTIE la doua capcane ale lui backupora.exe, verificate in sursa lui
(main.prg):
- programul SCRIE in ini-ul implicit cheia "delete_backups_olther_xdays"
(cu typo) dar CITESTE "delete_backups_older_xdays". Sablonul o are pe
cea corecta. Nu o "corecta" inapoi.
- alege intre exportul clasic si Data Pump dupa NUMELE executabilului din
oracleexpfile. Ca sa foloseasca expdp, fisierul trebuie sa se cheme
"expdp.exe"; de aceea aratam catre <OracleHome>\bin\expdp.exe.
Dump-urile ajung in <BackupPath>\<AAAALLZZ>\ - backupora.exe creeaza singur
subdirectorul pe zi.
.PARAMETER ExportPath
Directorul in care sta backupora.exe. Implicit D:\ROA\EXPORT_ORADMP.
.PARAMETER BackupPath
Unde ajung dump-urile. Implicit acelasi cu ExportPath, deci
D:\ROA\EXPORT_ORADMP\<AAAALLZZ>\. Pe instalarile mai vechi de la clienti
valoarea uzuala e C:\BACKUP_ORACLE - daca vrei sa pastrezi conventia aia,
da-o explicit.
.PARAMETER ContafinPassword
Parola CONTAFIN_ORACLE, pentru linia lui din schema.txt.
Implicit ROMFASTSOFT.
.PARAMETER OracleHome
Oracle home. Autodetectat daca lipseste.
.PARAMETER ServiceName
Serviciul bazei. Implicit XEPDB1.
.PARAMETER SystemPassword
Parola SYSTEM/SYS. Implicit romfastsoft.
.PARAMETER SchemaFromPath
Cale (locala sau UNC) catre un schema.txt existent, de regula de pe
serverul vechi: \\server-vechi\d$\ROA\EXPORT_ORADMP\schema.txt
Daca e dat si fisierul e citibil, se copiaza in loc sa se genereze.
.PARAMETER RetentionDays
Cate zile se pastreaza dump-urile. Ajunge in setari.ini. Implicit 7.
.PARAMETER TaskTime
Ora rularii zilnice, format HH:mm. Implicit 22:30.
.PARAMETER TaskName
Numele task-ului din Task Scheduler. Implicit "ROA Export Oracle".
.PARAMETER TaskUser
Contul sub care ruleaza task-ul. Implicit SYSTEM.
.PARAMETER SkipTask
Nu crea task-ul zilnic; doar directorul, fisierele si obiectul DIRECTORY.
.PARAMETER SkipSchema
Nu genera si nu copia schema.txt (il completezi manual dupa).
.PARAMETER SchemaOnly
Regenereaza doar schema.txt si iese. Nu atinge setari.ini, backupora.exe
sau task-ul. Asa se reia pasul dupa faza 2, cand firmele exista in
NOM_FIRME, fara sa pierzi corecturile facute manual in setari.ini.
.EXAMPLE
.\11-setup-backup-export.ps1
Varianta obisnuita, cu schema.txt generat din NOM_FIRME.
.EXAMPLE
.\11-setup-backup-export.ps1 -SchemaFromPath "\\10.0.0.5\d$\ROA\EXPORT_ORADMP\schema.txt"
Preia schema.txt de pe serverul vechi, exact cum era acolo.
.EXAMPLE
.\11-setup-backup-export.ps1 -TaskTime "23:00" -RetentionDays 14
Alta ora si alta retentie.
.NOTES
File Name : 11-setup-backup-export.ps1
Prerequisite : drepturi de administrator; backup\backupora.exe prezent in kit
Copyright 2026 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ExportPath = "D:\ROA\EXPORT_ORADMP",
[Parameter(Mandatory = $false)]
[string]$BackupPath,
[Parameter(Mandatory = $false)]
[string]$ContafinPassword = "ROMFASTSOFT",
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[string]$SchemaFromPath,
[Parameter(Mandatory = $false)]
[int]$RetentionDays = 7,
[Parameter(Mandatory = $false)]
[ValidatePattern('^\d{1,2}:\d{2}$')]
[string]$TaskTime = "22:30",
[Parameter(Mandatory = $false)]
[string]$TaskName = "ROA Export Oracle",
[Parameter(Mandatory = $false)]
[string]$TaskUser = "SYSTEM",
[Parameter(Mandatory = $false)]
[switch]$SkipTask,
[Parameter(Mandatory = $false)]
[switch]$SkipSchema,
[Parameter(Mandatory = $false)]
[switch]$SchemaOnly
)
$ErrorActionPreference = "Stop"
. (Join-Path $PSScriptRoot "lib\logging-functions.ps1")
. (Join-Path $PSScriptRoot "lib\oracle-functions.ps1")
$configFile = Join-Path $PSScriptRoot "..\config.ps1"
if (Test-Path $configFile) {
. $configFile
if (-not $PSBoundParameters.ContainsKey('OracleHome') -and $Config.OracleHome) { $OracleHome = $Config.OracleHome }
if (-not $PSBoundParameters.ContainsKey('ServiceName') -and $Config.ServiceName) { $ServiceName = $Config.ServiceName }
if (-not $PSBoundParameters.ContainsKey('SystemPassword') -and $Config.SystemPassword) { $SystemPassword = $Config.SystemPassword }
}
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$logDir = Join-Path $PSScriptRoot "..\logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
Initialize-LogFile -LogPath (Join-Path $logDir "11-setup-backup-export_$stamp.log") -ScriptName "11-setup-backup-export.ps1"
$kitBackupDir = Join-Path $PSScriptRoot "..\backup"
function Test-Administrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
<#
Scrie schema.txt: lista schemelor pe care le exporta backupora.exe.
Fie copiaza fisierul de pe serverul vechi, fie il genereaza din
CONTAFIN_ORACLE.NOM_FIRME. Se apeleaza si din fluxul complet, si din
-SchemaOnly (reluarea de dupa faza 2, cand firmele exista).
#>
function New-SchemaFile {
param(
[string]$SchemaFile,
[string]$SourcePath,
[string]$OraHome,
[string]$Service,
[string]$Password,
[string]$ContafinPwd
)
Write-LogSection "schema.txt"
if ($SourcePath) {
if (Test-Path $SourcePath) {
Copy-Item -Path $SourcePath -Destination $SchemaFile -Force
$n = @(Get-Content $SchemaFile | Where-Object { $_.Trim() -ne '' }).Count
Write-LogSuccess "Copiat de pe serverul vechi: $n linii"
Write-LogWarning "Verifica-l: parolele si numele serviciului din el sunt cele de pe"
Write-LogWarning "serverul VECHI. Daca difera, corecteaza-le sau regenereaza cu -SchemaOnly."
return
}
Write-LogWarning "Nu pot citi $SourcePath. Generez schema.txt din NOM_FIRME."
}
Write-Log "Citesc schemele si parolele din CONTAFIN_ORACLE.NOM_FIRME..."
# Formatul cerut de backupora.exe (vezi schema.tmpl):
# SCHEMA;PAROLA@SERVICIU
# Delimitatorul e ';', nu '|' - alegem alt separator la SELECT ca sa nu se
# confunde daca o parola ar contine ';'.
$sql = @"
SET PAGESIZE 10000 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 500
SELECT schema || '~' || parola
FROM CONTAFIN_ORACLE.NOM_FIRME
WHERE sters = 0
AND schema IS NOT NULL
ORDER BY schema;
EXIT
"@
$rez = Invoke-SqlPlus -OracleHome $OraHome -ServiceName $Service `
-Username "SYSTEM" -Password $Password -SqlCommand $sql -Silent
$firme = @()
foreach ($linie in ($rez -split "`n")) {
$linie = $linie.Trim()
if ($linie -match '^([A-Z0-9_]+)~(.*)$') {
$schema = $Matches[1]
$parola = $Matches[2].Trim()
if (-not $parola) { $parola = "ROMFASTSOFT" }
$firme += "$schema;$parola@$Service"
}
}
# CONTAFIN_ORACLE nu e in NOM_FIRME, dar trebuie exportat primul: fara el,
# dump-urile de firma nu se pot reimporta (NOM_FIRME tine parolele si
# maparea firma -> schema).
$linii = @("CONTAFIN_ORACLE;$ContafinPwd@$Service") + ($firme | Sort-Object -Unique)
Set-Content -Path $SchemaFile -Value ($linii -join "`r`n") -Encoding ASCII
Write-LogSuccess "Generat: $SchemaFile (CONTAFIN_ORACLE + $($firme.Count) firme)"
Write-LogWarning "Fisierul contine parole in clar - asa il cere backupora.exe."
Write-LogWarning "Nu il copia in afara serverului si nu il pune in kit."
if ($firme.Count -eq 0) {
Write-LogWarning "NOM_FIRME nu are nicio firma activa."
Write-LogWarning "In faza 1 e normal - reia cu -SchemaOnly dupa faza 2."
}
}
try {
Write-LogSection "Export zilnic Oracle (EXPORT_ORADMP)"
# -SchemaOnly nu scrie in Task Scheduler, deci nu cere administrator.
if (-not $SchemaOnly -and -not (Test-Administrator)) {
throw "Scriptul are nevoie de drepturi de administrator (creeaza un task in Task Scheduler)."
}
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
if (-not $BackupPath) { $BackupPath = $ExportPath }
Write-Log "Director program: $ExportPath"
Write-Log "Dump-uri in: $BackupPath\<AAAALLZZ>\"
# ------------------------------------------------------------------
# Reluare doar pentru schema.txt (dupa faza 2, cand firmele exista).
# Nu atinge setari.ini, backupora.exe sau task-ul.
# ------------------------------------------------------------------
if ($SchemaOnly) {
if (-not (Test-Path $ExportPath)) {
throw "$ExportPath nu exista. Ruleaza intai scriptul fara -SchemaOnly."
}
New-SchemaFile -SchemaFile (Join-Path $ExportPath "schema.txt") -SourcePath $SchemaFromPath `
-OraHome $oraHome -Service $ServiceName -Password $SystemPassword `
-ContafinPwd $ContafinPassword
Write-LogSection "Gata (SchemaOnly)"
Close-LogFile
exit 0
}
# ------------------------------------------------------------------
# 1. Directoare
# ------------------------------------------------------------------
Write-LogSection "Directoare"
$drive = Split-Path -Qualifier $ExportPath
if ($drive -and -not (Test-Path $drive)) {
throw "Discul $drive nu exista. Da alta cale cu -ExportPath."
}
$logSubDir = Join-Path $ExportPath "LOG"
foreach ($d in @($ExportPath, $logSubDir, $BackupPath)) {
if (-not (Test-Path $d)) {
New-Item -ItemType Directory -Path $d -Force | Out-Null
Write-LogSuccess "Creat: $d"
} else {
Write-Log "Exista: $d"
}
}
# Data Pump scrie cu contul serviciului Oracle, nu cu al tau. Fara
# dreptul asta, expdp da ORA-39002 la deschiderea fisierului.
$oracleServices = @(Get-Service -Name "Oracle*XE*" -ErrorAction SilentlyContinue |
Where-Object { $_.Name -like "OracleService*" })
foreach ($svc in $oracleServices) {
$cont = "NT SERVICE\$($svc.Name)"
foreach ($tinta in (@($ExportPath, $BackupPath) | Select-Object -Unique)) {
$null = & icacls.exe $tinta /grant "${cont}:(OI)(CI)F" /T /Q 2>&1
if ($LASTEXITCODE -eq 0) {
Write-LogSuccess "Drepturi depline pentru $cont pe $tinta"
} else {
Write-LogWarning "icacls pentru $cont pe $tinta a returnat codul $LASTEXITCODE"
}
}
}
if ($oracleServices.Count -eq 0) {
Write-LogWarning "Nu am gasit niciun serviciu OracleService*. Verifica manual drepturile pe $ExportPath."
}
# ------------------------------------------------------------------
# 2. backupora.exe + config.fpw
# ------------------------------------------------------------------
# config.fpw e configul runtime VFP (SCREEN=OFF, RESOURCE=OFF). Fara el,
# backupora.exe ar deschide o fereastra si ar astepta - inacceptabil
# pentru un task programat care ruleaza fara sesiune interactiva.
Write-LogSection "backupora.exe"
$tintaExe = Join-Path $ExportPath "backupora.exe"
foreach ($fis in @('backupora.exe', 'config.fpw', 'setari.ini.tmpl', 'schema.tmpl', 'changelog_backupora.txt')) {
$sursa = Join-Path $kitBackupDir $fis
$tinta = Join-Path $ExportPath $fis
if (Test-Path $sursa) {
Copy-Item -Path $sursa -Destination $tinta -Force
$dim = [math]::Round((Get-Item $tinta).Length / 1KB, 1)
Write-LogSuccess "Copiat: $fis ($dim KB)"
}
elseif ($fis -eq 'backupora.exe') {
if (Test-Path $tinta) {
Write-LogWarning "backup\backupora.exe lipseste din kit, dar exista deja $tinta. Il las cum e."
}
else {
Write-LogError "Lipseste backup\backupora.exe din kit SI din $ExportPath."
Write-LogError "Fara el, task-ul zilnic nu are ce rula."
Write-LogError "Pune backupora.exe in kit, in directorul backup\, si reconstruieste kitul."
throw "backupora.exe lipseste."
}
}
else {
Write-LogDebug "backup\$fis lipseste din kit - optional, se continua."
}
}
# ------------------------------------------------------------------
# 3. setari.ini
# ------------------------------------------------------------------
Write-LogSection "setari.ini"
$sablon = Join-Path $kitBackupDir "setari.ini.template"
$tintaIni = Join-Path $ExportPath "setari.ini"
if (-not (Test-Path $sablon)) {
throw "Lipseste backup\setari.ini.template din kit."
}
if (Test-Path $tintaIni) {
$backupIni = Join-Path $ExportPath "setari.ini.bak_$stamp"
Copy-Item -Path $tintaIni -Destination $backupIni -Force
Write-LogWarning "setari.ini exista deja; l-am salvat ca $(Split-Path -Leaf $backupIni) inainte sa il rescriu."
}
# backupora.exe alege exp vs expdp dupa numele executabilului, deci
# aratam direct catre expdp.exe din Oracle home. Stub-ul de 0 octeti din
# directorul programului (asa apare pe instalarile vechi) nu ar exporta nimic.
$expdpExe = Join-Path $oraHome "bin\expdp.exe"
if (-not (Test-Path $expdpExe)) {
Write-LogWarning "Nu gasesc $expdpExe. Verifica manual cheia oracleexpfile din setari.ini."
}
# Calea fizica a directorului Oracle DMPDIR, pentru cheile datapumpdir*.
$dmpDirPath = "C:\DMPDIR"
$dmpDirName = "DMPDIR"
try {
$r = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -Silent -SqlCommand @"
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF VERIFY OFF
SELECT 'DMPDIR=' || directory_path FROM dba_directories WHERE directory_name = 'DMPDIR';
EXIT
"@
if ($r -match 'DMPDIR=(.+)') { $dmpDirPath = $Matches[1].Trim() }
}
catch {
Write-LogDebug "Nu am putut citi DMPDIR: $($_.Exception.Message)"
}
$schemaFile = Join-Path $ExportPath "schema.txt"
$inlocuiri = @{
'{{ORACLE_HOME}}' = $oraHome
'{{DB_SERVICE}}' = $ServiceName
'{{EXPORT_DIR}}' = $ExportPath
'{{BACKUP_PATH}}' = $BackupPath
'{{SCHEMA_FILE}}' = $schemaFile
'{{RETENTION_DAYS}}' = "$RetentionDays"
'{{EXPDP_EXE}}' = $expdpExe
'{{DMPDIR_PATH}}' = $dmpDirPath
'{{DMPDIR_NAME}}' = $dmpDirName
'{{DATA_GENERARII}}' = (Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
}
$continut = Get-Content -Path $sablon -Raw
foreach ($cheie in $inlocuiri.Keys) {
$continut = $continut.Replace($cheie, $inlocuiri[$cheie])
}
Set-Content -Path $tintaIni -Value $continut -Encoding ASCII
Write-LogSuccess "Generat: $tintaIni"
$ramase = [regex]::Matches($continut, '\{\{[A-Z_]+\}\}')
if ($ramase.Count -gt 0) {
$lista = ($ramase | ForEach-Object { $_.Value } | Select-Object -Unique) -join ", "
Write-LogWarning "Marcaje nesubstituite in setari.ini: $lista"
Write-LogWarning "Completeaza-le manual sau adauga-le in tabelul de inlocuiri din scriptul asta."
}
# ------------------------------------------------------------------
# 4. schema.txt
# ------------------------------------------------------------------
if (-not $SkipSchema) {
New-SchemaFile -SchemaFile $schemaFile -SourcePath $SchemaFromPath `
-OraHome $oraHome -Service $ServiceName -Password $SystemPassword `
-ContafinPwd $ContafinPassword
}
else {
Write-Log "Sar peste schema.txt (-SkipSchema). Completeaza-l manual in $ExportPath."
}
# ------------------------------------------------------------------
# 5. Obiectul Oracle DIRECTORY
# ------------------------------------------------------------------
Write-LogSection "Obiectul DIRECTORY BACKUP_ORACLE"
$dirSql = @"
SET FEEDBACK ON SERVEROUTPUT ON VERIFY OFF
CREATE OR REPLACE DIRECTORY BACKUP_ORACLE AS '$ExportPath';
GRANT READ, WRITE ON DIRECTORY BACKUP_ORACLE TO SYSTEM;
GRANT READ, WRITE ON DIRECTORY BACKUP_ORACLE TO CONTAFIN_ORACLE;
SET PAGESIZE 0 HEADING OFF FEEDBACK OFF
SELECT 'DIRECTORY=' || directory_path FROM dba_directories WHERE directory_name = 'BACKUP_ORACLE';
EXIT
"@
$rezDir = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -SqlCommand $dirSql
if ($rezDir -match "DIRECTORY=(.+)") {
Write-LogSuccess "BACKUP_ORACLE -> $($Matches[1].Trim())"
} else {
Write-LogWarning "Nu am putut confirma obiectul DIRECTORY BACKUP_ORACLE."
Write-LogDebug $rezDir
}
# ------------------------------------------------------------------
# 6. Task zilnic
# ------------------------------------------------------------------
if (-not $SkipTask) {
Write-LogSection "Task zilnic in Windows Task Scheduler"
$existent = $null
try { $existent = Get-ScheduledTask -TaskName $TaskName -ErrorAction Stop } catch { }
if ($existent) {
Write-LogWarning "Task-ul '$TaskName' exista deja; il inlocuiesc."
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
}
$actiune = New-ScheduledTaskAction -Execute $tintaExe -WorkingDirectory $ExportPath
$declansator = New-ScheduledTaskTrigger -Daily -At $TaskTime
$principal = New-ScheduledTaskPrincipal -UserId $TaskUser -LogonType ServiceAccount -RunLevel Highest
$setari = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
-StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 6)
Register-ScheduledTask -TaskName $TaskName -Action $actiune -Trigger $declansator `
-Principal $principal -Settings $setari `
-Description "Export zilnic al schemelor ROA in $ExportPath (backupora.exe)" | Out-Null
Write-LogSuccess "Task '$TaskName' creat, zilnic la $TaskTime, sub contul $TaskUser"
Write-Log "Rulare de proba: Start-ScheduledTask -TaskName ""$TaskName"""
Write-Log "Stare: Get-ScheduledTaskInfo -TaskName ""$TaskName"""
}
else {
Write-Log "Sar peste task-ul zilnic (-SkipTask)"
}
# ------------------------------------------------------------------
Write-LogSection "Gata"
Write-Log "Director program: $ExportPath"
Write-Log "Executabil: $tintaExe"
Write-Log "Config: $tintaIni"
if (-not $SkipSchema) { Write-Log "Scheme: $schemaFile" }
Write-Log "Dump-uri in: $BackupPath\<AAAALLZZ>\"
Write-Log "DIRECTORY: BACKUP_ORACLE"
if (-not $SkipTask) { Write-Log "Task zilnic: $TaskName la $TaskTime" }
Write-Log ""
Write-LogWarning "Verifica manual prima rulare inainte sa pleci de la client:"
Write-LogWarning " Start-ScheduledTask -TaskName ""$TaskName"""
Write-LogWarning "apoi uita-te in $logSubDir si vezi ca s-au scris dump-urile."
Close-LogFile
exit 0
}
catch {
Write-LogError $_.Exception.Message
Write-LogDebug $_.ScriptStackTrace
Close-LogFile
exit 1
}

View File

@@ -0,0 +1,203 @@
#Requires -Version 5.1
<#
.SYNOPSIS
Sterge schema CONTAFIN_ORACLE, pentru reimportul din faza 2.
.DESCRIPTION
DROP USER CONTAFIN_ORACLE CASCADE. Se foloseste doar in FAZA2.cmd cu
/reimportcontafin, inainte de a recrea userul (01) si a importa contafin-ul
real al clientului (03).
Nu e un pas numerotat pentru ca nu face parte din instalare - e o operatie
distructiva, apelata explicit.
Ce se pierde odata cu schema, si trebuie refacut dupa:
- tabela SERVER_INFO -> se reface la reluarea pasului 08;
- joburile UPDATEROA_ZILNIC / UPDATERTVAI_ZILNIC -> tot pasul 08;
- sinonimele publice catre obiectele ei -> pasul 04.
FAZA2.cmd le ruleaza pe toate in ordinea corecta.
Ce NU se pierde: licentele (SYS.AUTH_SERII, SYS.AUTH_DETALII) si restul
obiectelor SYS traiesc in alta schema.
Inainte de drop, raporteaza sesiunile deschise ale userului. Daca exista,
dropul esueaza cu ORA-01940 si scriptul spune exact ce sa faci.
.PARAMETER OracleHome
Oracle home. Autodetectat daca lipseste.
.PARAMETER ServiceName
Serviciul bazei. Implicit XEPDB1.
.PARAMETER SystemPassword
Parola SYS. Implicit romfastsoft.
.PARAMETER KillSessions
Inchide fortat sesiunile CONTAFIN_ORACLE inainte de drop.
.PARAMETER Force
Nu cere confirmare. Obligatoriu cand rulezi neinteractiv (FAZA2.cmd il da).
.EXAMPLE
.\drop-contafin.ps1 -Force
.EXAMPLE
.\drop-contafin.ps1 -Force -KillSessions
Cand mai sunt utilizatori conectati si nu ai timp sa ii cauti.
.NOTES
File Name : drop-contafin.ps1
Copyright 2026 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[switch]$KillSessions,
[Parameter(Mandatory = $false)]
[switch]$Force
)
$ErrorActionPreference = "Stop"
. (Join-Path $PSScriptRoot "lib\logging-functions.ps1")
. (Join-Path $PSScriptRoot "lib\oracle-functions.ps1")
$configFile = Join-Path $PSScriptRoot "..\config.ps1"
if (Test-Path $configFile) {
. $configFile
if (-not $PSBoundParameters.ContainsKey('OracleHome') -and $Config.OracleHome) { $OracleHome = $Config.OracleHome }
if (-not $PSBoundParameters.ContainsKey('ServiceName') -and $Config.ServiceName) { $ServiceName = $Config.ServiceName }
if (-not $PSBoundParameters.ContainsKey('SystemPassword') -and $Config.SystemPassword) { $SystemPassword = $Config.SystemPassword }
}
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$logDir = Join-Path $PSScriptRoot "..\logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
Initialize-LogFile -LogPath (Join-Path $logDir "drop-contafin_$stamp.log") -ScriptName "drop-contafin.ps1"
try {
Write-LogSection "Stergere CONTAFIN_ORACLE"
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
if (-not (Test-OracleConnection -OracleHome $oraHome -ServiceName $ServiceName -Password $SystemPassword)) {
throw "Nu ma pot conecta la baza ($ServiceName)."
}
if (-not (Test-OracleUser -OracleHome $oraHome -ServiceName $ServiceName -Password $SystemPassword -SchemaName "CONTAFIN_ORACLE")) {
Write-LogSuccess "CONTAFIN_ORACLE nu exista. Nimic de sters."
Close-LogFile
exit 0
}
# Cate obiecte pierdem - util in log, daca ceva merge prost.
$stare = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -Silent -SqlCommand @"
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF VERIFY OFF
SELECT 'OBIECTE=' || COUNT(*) FROM dba_objects WHERE owner = 'CONTAFIN_ORACLE';
SELECT 'SESIUNI=' || COUNT(*) FROM v`$session WHERE username = 'CONTAFIN_ORACLE';
EXIT
"@
$obiecte = 0
$sesiuni = 0
if ($stare -match 'OBIECTE=(\d+)') { $obiecte = [int]$Matches[1] }
if ($stare -match 'SESIUNI=(\d+)') { $sesiuni = [int]$Matches[1] }
Write-Log "Obiecte in schema: $obiecte"
Write-Log "Sesiuni deschise: $sesiuni"
if ($sesiuni -gt 0) {
if ($KillSessions) {
Write-LogWarning "Inchid fortat cele $sesiuni sesiuni..."
$kill = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -SqlCommand @"
SET SERVEROUTPUT ON FEEDBACK OFF VERIFY OFF
BEGIN
FOR s IN (SELECT sid, serial# FROM v`$session WHERE username = 'CONTAFIN_ORACLE') LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''' IMMEDIATE';
DBMS_OUTPUT.PUT_LINE(' Sesiune inchisa: ' || s.sid);
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(' Nu am putut inchide ' || s.sid || ': ' || SQLERRM);
END;
END LOOP;
END;
/
EXIT
"@
Write-LogDebug $kill
}
else {
Write-LogWarning "CONTAFIN_ORACLE are $sesiuni sesiuni deschise. Dropul va esua cu ORA-01940."
Write-LogWarning "Ori opresti aplicatiile, ori reiei cu -KillSessions."
}
}
if (-not $Force) {
Write-Host ""
Write-Host " Se sterge schema CONTAFIN_ORACLE cu tot cu cele $obiecte obiecte." -ForegroundColor Yellow
$raspuns = Read-Host " Scrie DA ca sa continui"
if ($raspuns -ne "DA") {
Write-Log "Anulat de utilizator."
Close-LogFile
exit 2
}
}
Write-Log "DROP USER CONTAFIN_ORACLE CASCADE ..."
$rez = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -SqlCommand @"
SET FEEDBACK ON VERIFY OFF
DROP USER CONTAFIN_ORACLE CASCADE;
EXIT
"@
if ($rez -match 'ORA-01918') {
Write-LogSuccess "Userul nu exista (ORA-01918). Nimic de facut."
Close-LogFile
exit 0
}
if ($rez -match 'ORA-01940') {
Write-LogError "ORA-01940: userul are sesiuni conectate. Reia cu -KillSessions."
throw "Drop esuat: sesiuni active."
}
if ($rez -match 'ORA-(\d{5})') {
Write-LogError "Drop esuat cu ORA-$($Matches[1])."
Write-LogDebug $rez
throw "Drop esuat."
}
if (Test-OracleUser -OracleHome $oraHome -ServiceName $ServiceName -Password $SystemPassword -SchemaName "CONTAFIN_ORACLE") {
throw "Comanda a trecut, dar userul CONTAFIN_ORACLE inca exista."
}
Write-LogSuccess "CONTAFIN_ORACLE sters ($obiecte obiecte)"
Write-Log ""
Write-Log "Urmeaza, in ordine: 01 (recreare user) -> 03 (import) -> 04 (sinonime) -> 08 (SERVER_INFO, joburi)."
Close-LogFile
exit 0
}
catch {
Write-LogError $_.Exception.Message
Write-LogDebug $_.ScriptStackTrace
Close-LogFile
exit 1
}

View File

@@ -0,0 +1,86 @@
-- ============================================================================
-- EXPORT LICENTE ROA (SYS.AUTH_SERII + SYS.AUTH_DETALII)
-- ============================================================================
-- Se ruleaza pe serverul VECHI, ca SYSDBA. Nu modifica nimic - doar citeste.
--
-- Scoate pe stdout un script SQL cu INSERT-urile echivalente, gata de rulat
-- pe serverul NOU. SERIE e RAW(128), deci se transporta ca HEXTORAW().
--
-- Doua moduri de folosire:
--
-- a) automat - 09-copy-licenses.ps1 se conecteaza la serverul vechi si
-- captureaza singur iesirea;
--
-- b) manual, cand serverul vechi nu e accesibil din cel nou:
-- sqlplus -S "sys/PAROLA@GAZDA:1521/SERVICIU as sysdba" @export-licente.sql > licente.sql
-- apoi duci licente.sql la client si rulezi:
-- .\09-copy-licenses.ps1 -FromFile licente.sql
--
-- ATENTIE: iesirea nu trebuie sa contina nimic altceva decat SQL. De aceea
-- toate PROMPT-urile lipsesc si totul e SET ... OFF.
-- ============================================================================
SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET ECHO OFF
SET TERMOUT ON
SET TRIMSPOOL ON
SET TRIMOUT ON
SET LINESIZE 32767
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET SERVEROUTPUT OFF
WHENEVER SQLERROR EXIT FAILURE
-- Antet: marcaj de validare citit de 09-copy-licenses.ps1.
SELECT '-- ROA-LICENTE-EXPORT v1' FROM dual;
SELECT '-- sursa: ' || SYS_CONTEXT('USERENV','DB_NAME') ||
' / ' || SYS_CONTEXT('USERENV','SERVER_HOST') ||
' la ' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- ---------------------------------------------------------------------------
-- AUTH_DETALII (Customer ID). Are o singura coloana, VARCHAR2(15).
-- ---------------------------------------------------------------------------
SELECT '-- AUTH_DETALII: ' || COUNT(*) || ' inregistrari' FROM sys.auth_detalii;
SELECT 'INSERT INTO SYS.AUTH_DETALII (DETALII) VALUES (''' ||
REPLACE(detalii, '''', '''''') || ''');'
FROM sys.auth_detalii;
-- ---------------------------------------------------------------------------
-- AUTH_SERII (seriile de licenta propriu-zise).
-- SERIE e RAW(128) -> RAWTOHEX la export, HEXTORAW la import.
-- ---------------------------------------------------------------------------
SELECT '-- AUTH_SERII: ' || COUNT(*) || ' inregistrari' FROM sys.auth_serii;
SELECT 'INSERT INTO SYS.AUTH_SERII (ID_SERIE,ID_PROGRAM,SERIE,STERS,DATAORA,ID_UTIL,DATAORAS,ID_UTILS) VALUES (' ||
TO_CHAR(id_serie) || ',' ||
TO_CHAR(id_program) || ',' ||
'HEXTORAW(''' || RAWTOHEX(serie) || ''')' || ',' ||
TO_CHAR(sters) || ',' ||
'TO_DATE(''' || TO_CHAR(dataora,'YYYY-MM-DD HH24:MI:SS') ||
''',''YYYY-MM-DD HH24:MI:SS'')' || ',' ||
TO_CHAR(id_util) || ',' ||
CASE WHEN dataoras IS NULL THEN 'NULL'
ELSE 'TO_DATE(''' || TO_CHAR(dataoras,'YYYY-MM-DD HH24:MI:SS') ||
''',''YYYY-MM-DD HH24:MI:SS'')' END || ',' ||
NVL(TO_CHAR(id_utils), 'NULL') || ');'
FROM sys.auth_serii
ORDER BY id_serie;
-- ---------------------------------------------------------------------------
-- Secventa: pe serverul nou trebuie sa continue de unde a ramas cea veche,
-- altfel prima licenta adaugata ulterior calca peste un ID_SERIE existent.
-- ---------------------------------------------------------------------------
SELECT '-- SEQ_AUTH_SERII trebuie sa porneasca de la ' ||
TO_CHAR(NVL(MAX(id_serie),0) + 1) FROM sys.auth_serii;
SELECT '-- ROA-LICENTE-NEXTVAL=' || TO_CHAR(NVL(MAX(id_serie),0) + 1)
FROM sys.auth_serii;
SELECT 'COMMIT;' FROM dual;
SELECT '-- ROA-LICENTE-SFARSIT' FROM dual;
EXIT

View File

@@ -350,7 +350,9 @@ CE E IN KIT
DMPDIR\contafin_oracle.dmp schema comuna (drepturi, actualizari, NOM_FIRME) DMPDIR\contafin_oracle.dmp schema comuna (drepturi, actualizari, NOM_FIRME)
DMPDIR\FIRMANOUA.dmp sablon de firma goala DMPDIR\FIRMANOUA.dmp sablon de firma goala
scripts\, sql\, config\ scripturile de instalare scripts\, sql\, config\ scripturile de instalare
INSTALEAZA.cmd ruleaza toti pasii, in ordine backup\ backupora.exe + sablonul de setari.ini
FAZA1.cmd / FAZA2.cmd instalare in doua faze (recomandat la migrari)
INSTALEAZA.cmd instalare intr-o singura rulare
README.md documentatia completa README.md documentatia completa
@@ -360,7 +362,37 @@ CUM SE INSTALEAZA
Inainte de orice: instaleaza Oracle 21c XE pe server (docs\00-INSTALL-ORACLE-XE.md), Inainte de orice: instaleaza Oracle 21c XE pe server (docs\00-INSTALL-ORACLE-XE.md),
cu parola SYS/SYSTEM 'romfastsoft'. Apoi, din radacina kitului: cu parola SYS/SYSTEM 'romfastsoft'. Apoi, din radacina kitului:
A. CLIENT NOU, fara firme anterioare: A. MIGRARE IN DOUA FAZE (recomandat: downtime de minute, nu de ore)
Ideea: pe CONTAFIN_ORACLE nu se lucreaza activ, deci poate fi exportat
de pe serverul vechi inca din timpul programului. Doar schemele de firma
se schimba sub picioare. Deci tot ce nu depinde de firme se face ziua,
iar seara raman doar firmele.
FAZA 1 - in timpul programului, utilizatorii lucreaza mai departe
pe serverul vechi:
1. Exporta DOAR contafin_oracle de pe serverul vechi si pune-l in
DMPDIR\ peste sablon.
2. FAZA1.cmd <IdClient> /vechi:<gazda-veche> /parolavechi:<parola-SYS>
Se instaleaza baza, obiectele SYS, contafin-ul clientului,
sinonimele, LICENTELE de pe serverul vechi, directoarele ROAUPDATE,
publicarea in IIS si exportul zilnic. La final, verificarea va
spune "N company schemas are missing" - e NORMAL, firmele vin abia
in faza 2.
FAZA 2 - dupa ce utilizatorii au terminat:
1. Exporta schemele de firma de pe serverul vechi.
2. Pune DMP-urile in C:\DMPDIR (sau da /dmp:<cale>).
3. FAZA2.cmd <IdClient>
Daca intre faze s-a adaugat o firma noua sau s-au modificat
nomenclatoare pe serverul vechi, adauga /reimportcontafin -
altfel NOM_FIRME ramane in urma.
B. CLIENT NOU, fara firme anterioare (o singura rulare)
INSTALEAZA.cmd curat <IdClient> [ServerSMTP] INSTALEAZA.cmd curat <IdClient> [ServerSMTP]
@@ -368,7 +400,10 @@ cu parola SYS/SYSTEM 'romfastsoft'. Apoi, din radacina kitului:
Aplicatia scrie firma in CONTAFIN_ORACLE.NOM_FIRME si apeleaza Aplicatia scrie firma in CONTAFIN_ORACLE.NOM_FIRME si apeleaza
SYS.NEWSCHEMA, care ii importa structura din FIRMANOUA.dmp. SYS.NEWSCHEMA, care ii importa structura din FIRMANOUA.dmp.
B. MIGRARE de pe un Oracle mai vechi: Sau, echivalent si cu IIS + export zilnic incluse:
FAZA1.cmd <IdClient> /faralicente
C. MIGRARE INTR-O SINGURA RULARE (cand downtime-ul nu conteaza)
1. Inlocuieste DMPDIR\contafin_oracle.dmp cu cel exportat de la client 1. Inlocuieste DMPDIR\contafin_oracle.dmp cu cel exportat de la client
(cel din kit are NOM_FIRME goala). (cel din kit are NOM_FIRME goala).
@@ -376,6 +411,12 @@ cu parola SYS/SYSTEM 'romfastsoft'. Apoi, din radacina kitului:
3. LASA FIRMANOUA.dmp pe loc - nu vine de la client, dar e obligatoriu. 3. LASA FIRMANOUA.dmp pe loc - nu vine de la client, dar e obligatoriu.
4. INSTALEAZA.cmd migrare <IdClient> [ServerSMTP] 4. INSTALEAZA.cmd migrare <IdClient> [ServerSMTP]
Atentie: INSTALEAZA.cmd NU copiaza licentele, NU publica in IIS si NU
configureaza exportul zilnic. Ruleaza dupa el, manual:
Run.cmd 09-copy-licenses.ps1 -OldHost <gazda> -OldSysPassword <parola> -Replace
Run.cmd 10-setup-roaupdate-iis.ps1
Run.cmd 11-setup-backup-export.ps1
Instalarea e gata cand ultimul pas (07-verify-installation) iese cu codul 0. Instalarea e gata cand ultimul pas (07-verify-installation) iese cu codul 0.
@@ -398,6 +439,18 @@ DE STIUT
o sesiune activa tinea userul ocupat) - nu porni instalarea peste ele. o sesiune activa tinea userul ocupat) - nu porni instalarea peste ele.
- Logurile fiecarui pas sunt in logs\. - Logurile fiecarui pas sunt in logs\.
- LICENTELE nu vin din DMP-uri. Stau in SYS.AUTH_SERII pe serverul vechi si
se copiaza separat, cu 09-copy-licenses.ps1. Daca sari peste pasul asta,
aplicatia porneste dar refuza fiecare modul. FAZA1.cmd il ruleaza singur
daca ii dai /vechi si /parolavechi.
- Fara backup\backupora.exe in kit, pasul 11 (exportul zilnic) se opreste
cu eroare. Restul instalarii nu depinde de el.
- setari.ini pentru backupora.exe se genereaza din backup\setari.ini.template
prin inlocuirea marcajelor {{...}}. Daca formatul difera de ce asteapta
executabilul, corecteaza SABLONUL, nu scriptul.
"@ "@
Set-Content -Path (Join-Path $KitDir 'CITESTE-MA.txt') -Value $citeste -Encoding UTF8 Set-Content -Path (Join-Path $KitDir 'CITESTE-MA.txt') -Value $citeste -Encoding UTF8
@@ -438,9 +491,15 @@ DE STIUT
Write-Host " NOM_FIRME: $firme randuri in contafin_oracle.dmp" Write-Host " NOM_FIRME: $firme randuri in contafin_oracle.dmp"
Write-Host "" Write-Host ""
Write-Host " La client, din radacina kitului:" Write-Host " La client, din radacina kitului:"
Write-Host " INSTALEAZA.cmd curat <IdClient> (client nou)" -ForegroundColor Cyan Write-Host " FAZA1.cmd <IdClient> /vechi:<gazda> /parolavechi:<parola>" -ForegroundColor Cyan
Write-Host " INSTALEAZA.cmd migrare <IdClient> (are date existente)" -ForegroundColor Cyan Write-Host " FAZA2.cmd <IdClient> (dupa program)" -ForegroundColor Cyan
Write-Host " INSTALEAZA.cmd curat <IdClient> (client nou, o rulare)" -ForegroundColor Cyan
Write-Host "" Write-Host ""
if (-not (Test-Path (Join-Path $KitDir 'backup\backupora.exe'))) {
Write-Warn "backup\backupora.exe lipseste din kit - pasul 11 (export zilnic) va esua la client."
Write-Host ""
}
Write-Host " Detalii complete: $KitDir\CITESTE-MA.txt" Write-Host " Detalii complete: $KitDir\CITESTE-MA.txt"
Write-Host "" Write-Host ""
} }