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:
150
docs/handoff_instalare-doua-faze.md
Normal file
150
docs/handoff_instalare-doua-faze.md
Normal 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`.
|
||||
@@ -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`) |
|
||||
| 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` |
|
||||
| 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 |
|
||||
|
||||
`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`.
|
||||
|
||||
**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
|
||||
`SQLNET.ALLOWED_LOGON_VERSION_SERVER/CLIENT=8` (implicitul în 21c este 12 și **refuză**
|
||||
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 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"`.
|
||||
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
|
||||
LXC 108.
|
||||
|
||||
327
proxmox/lxc108-oracle/roa-windows-setup/FAZA1.cmd
Normal file
327
proxmox/lxc108-oracle/roa-windows-setup/FAZA1.cmd
Normal 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
|
||||
283
proxmox/lxc108-oracle/roa-windows-setup/FAZA2.cmd
Normal file
283
proxmox/lxc108-oracle/roa-windows-setup/FAZA2.cmd
Normal 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
BIN
proxmox/lxc108-oracle/roa-windows-setup/backup/backupora.exe
Normal file
BIN
proxmox/lxc108-oracle/roa-windows-setup/backup/backupora.exe
Normal file
Binary file not shown.
@@ -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".
|
||||
-->
|
||||
@@ -0,0 +1,2 @@
|
||||
SCREEN=OFF
|
||||
RESOURCE=OFF
|
||||
@@ -0,0 +1,2 @@
|
||||
SCHEMA1;PAROLA1@ORASID
|
||||
SCHEMA2;PAROLA2@ORASID
|
||||
@@ -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}}
|
||||
@@ -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;
|
||||
@@ -59,7 +59,15 @@ param(
|
||||
[switch]$Detailed,
|
||||
|
||||
[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'
|
||||
@@ -569,6 +577,264 @@ EXIT;
|
||||
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
|
||||
Add-ReportSection "Verification Summary"
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -350,7 +350,9 @@ CE E IN KIT
|
||||
DMPDIR\contafin_oracle.dmp schema comuna (drepturi, actualizari, NOM_FIRME)
|
||||
DMPDIR\FIRMANOUA.dmp sablon de firma goala
|
||||
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
|
||||
|
||||
|
||||
@@ -360,7 +362,37 @@ CUM SE INSTALEAZA
|
||||
Inainte de orice: instaleaza Oracle 21c XE pe server (docs\00-INSTALL-ORACLE-XE.md),
|
||||
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]
|
||||
|
||||
@@ -368,7 +400,10 @@ cu parola SYS/SYSTEM 'romfastsoft'. Apoi, din radacina kitului:
|
||||
Aplicatia scrie firma in CONTAFIN_ORACLE.NOM_FIRME si apeleaza
|
||||
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
|
||||
(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.
|
||||
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.
|
||||
|
||||
|
||||
@@ -398,6 +439,18 @@ DE STIUT
|
||||
o sesiune activa tinea userul ocupat) - nu porni instalarea peste ele.
|
||||
|
||||
- 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
|
||||
@@ -438,9 +491,15 @@ DE STIUT
|
||||
Write-Host " NOM_FIRME: $firme randuri in contafin_oracle.dmp"
|
||||
Write-Host ""
|
||||
Write-Host " La client, din radacina kitului:"
|
||||
Write-Host " INSTALEAZA.cmd curat <IdClient> (client nou)" -ForegroundColor Cyan
|
||||
Write-Host " INSTALEAZA.cmd migrare <IdClient> (are date existente)" -ForegroundColor Cyan
|
||||
Write-Host " FAZA1.cmd <IdClient> /vechi:<gazda> /parolavechi:<parola>" -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 ""
|
||||
|
||||
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 ""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user