Files
ROMFASTSQL/proxmox/lxc108-oracle/roa-windows-setup/scripts/07-verify-installation.ps1
Marius 7fce925349 feat(oracle): kit de instalare la client + corectarea lipsurilor din instalare
Blocul de instalare/migrare Oracle 21c XE, terminat si validat pe VM 302.

Kit de instalare (nou)

  scripts/build-client-kit.ps1 exporta CONTAFIN_ORACLE si FIRMANOUA de pe
  LXC 108 (PDB ROA2, nu ROA - ROA e productia ROA_CENTRAL), le aduce local
  prin cele trei hopuri container -> LXC -> host -> statie, le redenumeste la
  numele pe care le asteapta scripturile si le impacheteaza cu o copie a
  directorului roa-windows-setup. Citeste logul expdp si raporteaza cate
  firme are NOM_FIRME, ca sa nu plece din greseala datele unui client.

  roa-windows-setup/INSTALEAZA.cmd ruleaza pasii 01..08 fara "set /p", deci
  merge si prin SSH - RunAll.cmd nu poate fi rulat neinteractiv. Trateaza
  corect codul 5 de la pasul 03 si se opreste la prima eroare reala.

Corectii

  01-setup-database.ps1 nu mai scrie SQLNET.RECV_TIMEOUT / SEND_TIMEOUT in
  sqlnet.ora. Le hardcoda la 30 s, iar fisierul e citit si de impdp: in timpul
  unui import serverul poate lucra minute fara sa trimita un pachet, clientul
  murea cu ORA-12609 iar scriptul raporta esec pentru un import care se
  terminase cu bine pe server. Reprodus si reparat pe VM 302.

  01-setup-database.ps1: Step 4c optional (-ResetSystemPassword) care curata
  EXPIRED(GRACE) pe SYSTEM in CDB root; ALTER PROFILE opreste expirarile
  viitoare dar nu reseteaza un cont deja intrat in gratie.

  uninstall-roa.sql: retry la DROP USER dupa KILL SESSION, plus un bloc final
  de verdict care numara ce a ramas si iese cu ORA-20900 daca baza nu e
  curata. Pana acum toate sectiunile prindeau exceptiile in WHEN OTHERS si
  scriptul tiparea "UNINSTALL COMPLETE" chiar si cand un user supravietuise,
  iar instalarea urmatoare dadea ORA-31684 in lant. 99-uninstall-roa.ps1
  propaga codul de iesire.

  08-post-install-config.ps1: Step 7b seteaza SMTP_OUT_SERVER si ACL-ul de
  retea pentru CONTAFIN_ORACLE. UTL_MAIL se instala si primea EXECUTE, adica
  destul cat sa compileze, dar nu si cat sa trimita. Privilegiul resolve nu
  accepta interval de porturi (ORA-24244), deci se acorda separat de connect.

  07-verify-installation.ps1: sectiune noua care verifica prezenta lui
  FIRMANOUA.dmp in DMPDIR si o raporteaza ca eroare daca lipseste. Fara el,
  adaugarea unei firme noi pica in DBMS_DATAPUMP.ADD_FILE peste luni de la
  instalare, cand nimeni nu mai leaga eroarea de instalare.

  configure-profile.sql: antetul spune ca e unealta de remediere manuala, nu
  parte din flux; pas nou la final pentru CDB root.

Documentatie

  README-ul roa-windows-setup descrie acum explicit cele doua scenarii -
  instalare pe curat si migrare - de unde se iau DMP-urile sablon, si capcana
  ORA-12609. Handoff-urile de sesiune au fost sterse; ce era durabil in ele a
  intrat in README-uri si in docs/diagnostic-spatiu-clienti.md.

Validare pe VM 302: ciclu complet din kit, instalare pe curat, verificarea
finala "[OK] All checks passed!".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
2026-08-25 18:05:56 +03:00

635 lines
22 KiB
PowerShell

#Requires -Version 5.1
<#
.SYNOPSIS
Verify ROA Oracle installation.
.DESCRIPTION
Performs comprehensive verification of the ROA Oracle installation:
- Database info (version, CDB/non-CDB, service name)
- Tablespace ROA status
- User CONTAFIN_ORACLE status and object count
- SYS custom objects status
- Public synonyms count
- Invalid objects count
- Company schemas list with object counts
.PARAMETER OracleHome
Oracle home directory. If not specified, auto-detects.
.PARAMETER ServiceName
Database service name. Default: XEPDB1
.PARAMETER SystemPassword
SYSTEM user password. Default: romfastsoft
.PARAMETER Detailed
Show detailed object counts per schema.
.PARAMETER OutputFile
Optional path to save verification report.
.EXAMPLE
.\07-verify-installation.ps1
.EXAMPLE
.\07-verify-installation.ps1 -Detailed -OutputFile "C:\reports\verification.txt"
.EXAMPLE
.\07-verify-installation.ps1 -ServiceName "ROA" -SystemPassword "mypassword"
.NOTES
File Name : 07-verify-installation.ps1
Prerequisite : ROA Oracle installation completed
Copyright 2024 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[switch]$Detailed,
[Parameter(Mandatory = $false)]
[string]$OutputFile
)
$ErrorActionPreference = 'Stop'
# Source library functions
. "$PSScriptRoot\lib\logging-functions.ps1"
. "$PSScriptRoot\lib\oracle-functions.ps1"
# Initialize logging
$logPath = Join-Path $PSScriptRoot "..\logs\07-verify-installation_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
Initialize-LogFile -LogPath $logPath -ScriptName "07-verify-installation.ps1"
# Initialize report
$report = [System.Text.StringBuilder]::new()
function Add-ReportLine {
param([string]$Line)
[void]$report.AppendLine($Line)
Write-Host $Line
}
function Add-ReportSection {
param([string]$Title)
Add-ReportLine ""
Add-ReportLine ("=" * 60)
Add-ReportLine " $Title"
Add-ReportLine ("=" * 60)
Add-ReportLine ""
}
try {
Add-ReportSection "ROA Oracle Installation Verification Report"
Add-ReportLine "Generated: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
Add-ReportLine "Computer: $env:COMPUTERNAME"
# Validate Oracle installation
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
# Test connection
Write-Log "Testing database connection..."
if (-not (Test-OracleConnection -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword)) {
throw "Cannot connect to database. Please verify ServiceName and SystemPassword."
}
Write-LogSuccess "Database connection successful"
# Database Information
Add-ReportSection "Database Information"
$dbInfoSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 500
SELECT 'VERSION:' || version_full FROM v`$instance;
SELECT 'EDITION:' || edition FROM v`$instance;
SELECT 'INSTANCE:' || instance_name FROM v`$instance;
SELECT 'HOST:' || host_name FROM v`$instance;
SELECT 'STARTUP:' || TO_CHAR(startup_time, 'YYYY-MM-DD HH24:MI:SS') FROM v`$instance;
SELECT 'STATUS:' || status FROM v`$instance;
SELECT 'CDB:' || CDB FROM v`$database;
SELECT 'DBNAME:' || name FROM v`$database;
SELECT 'OPEN_MODE:' || open_mode FROM v`$database;
EXIT;
"@
$dbInfo = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $dbInfoSql -Silent
$dbData = @{}
foreach ($line in $dbInfo -split "`n") {
if ($line -match "^([A-Z_]+):(.*)$") {
$dbData[$Matches[1]] = $Matches[2].Trim()
}
}
Add-ReportLine "Oracle Version: $($dbData['VERSION'])"
Add-ReportLine "Edition: $($dbData['EDITION'])"
Add-ReportLine "Instance Name: $($dbData['INSTANCE'])"
Add-ReportLine "Host Name: $($dbData['HOST'])"
Add-ReportLine "Database Name: $($dbData['DBNAME'])"
Add-ReportLine "CDB Mode: $($dbData['CDB'])"
Add-ReportLine "Open Mode: $($dbData['OPEN_MODE'])"
Add-ReportLine "Instance Status: $($dbData['STATUS'])"
Add-ReportLine "Startup Time: $($dbData['STARTUP'])"
Add-ReportLine "Service Name: $ServiceName"
Add-ReportLine "Oracle Home: $oraHome"
# Container Information
$containerInfo = Test-PDB -OracleHome $oraHome -ServiceName $ServiceName -Password $SystemPassword
Add-ReportLine "Container: $($containerInfo.ContainerName)"
Add-ReportLine "Container ID: $($containerInfo.ConId)"
# Tablespace ROA Status
Add-ReportSection "Tablespace ROA Status"
$tsSql = @"
SET PAGESIZE 100 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF LINESIZE 200
COLUMN tablespace_name FORMAT A20
COLUMN status FORMAT A10
COLUMN contents FORMAT A10
COLUMN allocation_type FORMAT A10
SELECT tablespace_name, status, contents, allocation_type
FROM dba_tablespaces
WHERE tablespace_name = 'ROA';
COLUMN file_name FORMAT A60
COLUMN size_mb FORMAT 999,999.99
COLUMN maxsize_mb FORMAT 999,999.99
COLUMN autoextensible FORMAT A5
SELECT file_name,
ROUND(bytes/1024/1024, 2) AS size_mb,
ROUND(maxbytes/1024/1024, 2) AS maxsize_mb,
autoextensible
FROM dba_data_files
WHERE tablespace_name = 'ROA';
EXIT;
"@
$tsResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $tsSql -Silent
Add-ReportLine $tsResult
# Check if ROA tablespace exists
if ($tsResult -notmatch "ROA") {
Add-ReportLine ""
Add-ReportLine "[WARNING] Tablespace ROA not found!"
}
# CONTAFIN_ORACLE Status
Add-ReportSection "CONTAFIN_ORACLE Schema Status"
$coExistsSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT 'USER_EXISTS' FROM dba_users WHERE username = 'CONTAFIN_ORACLE';
EXIT;
"@
$coExists = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $coExistsSql -Silent
if ($coExists -match "USER_EXISTS") {
Add-ReportLine "Status: EXISTS"
$coCounts = Get-SchemaObjectCount -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword -SchemaName "CONTAFIN_ORACLE"
$coTotal = if ($coCounts['TOTAL']) { $coCounts['TOTAL'] } else { 0 }
$coInvalid = if ($coCounts['INVALID']) { $coCounts['INVALID'] } else { 0 }
Add-ReportLine "Total Objects: $coTotal"
Add-ReportLine "Invalid Objects: $coInvalid"
if ($Detailed) {
Add-ReportLine ""
Add-ReportLine "Object counts by type:"
foreach ($key in $coCounts.Keys | Sort-Object) {
if ($key -ne 'TOTAL' -and $key -ne 'INVALID') {
Add-ReportLine " $($key.PadRight(25)) $($coCounts[$key])"
}
}
}
}
else {
Add-ReportLine "Status: NOT FOUND"
Add-ReportLine "[WARNING] CONTAFIN_ORACLE user does not exist!"
}
# SYS Custom Objects
Add-ReportSection "SYS Custom Objects"
$sysObjSql = @"
SET PAGESIZE 100 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF LINESIZE 200
COLUMN object_name FORMAT A30
COLUMN object_type FORMAT A15
COLUMN status FORMAT A10
SELECT object_name, object_type, status
FROM dba_objects
WHERE owner = 'SYS'
AND object_name IN (
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
'PACK_UPDATE', 'PACK_UTILS', 'NEWSCHEMA', 'NEWSCHEMAPOST',
'NEWSCHEMAPROGRESS', 'DMPDIR'
)
ORDER BY object_type, object_name;
EXIT;
"@
$sysResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $sysObjSql -AsSysdba -Silent
Add-ReportLine $sysResult
# Dictionary Grants required by PACK_DIAG_SPATIU
Add-ReportSection "Dictionary Grants (PACK_DIAG_SPATIU)"
$dictSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 200
SELECT 'GRANTED:' || table_name
FROM dba_tab_privs
WHERE grantee = 'CONTAFIN_ORACLE'
AND grantor = 'SYS'
AND privilege = 'SELECT'
ORDER BY table_name;
EXIT;
"@
$dictResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $dictSql -Silent
$granted = @()
foreach ($line in $dictResult -split "`n") {
if ($line -match "^GRANTED:(.+)$") { $granted += $Matches[1].Trim() }
}
# Lista din sql\sys-grants.sql, sectiunea [5/5]
$expectedDict = @(
'DBA_DATA_FILES', 'DBA_FREE_SPACE', 'DBA_TEMP_FILES', 'DBA_SEGMENTS',
'DBA_TAB_STATS_HISTORY', 'DBA_SCHEDULER_JOB_RUN_DETAILS', 'DBA_RECYCLEBIN',
'V_$INSTANCE', 'V_$DATABASE', 'V_$PARAMETER', 'V_$TRANSACTION',
'V_$TEMP_SPACE_HEADER', 'V_$FLASH_RECOVERY_AREA_USAGE',
'DBA_TABLESPACES', 'V_$VERSION',
'DBA_LOBS', 'DBA_LOB_PARTITIONS', 'DBA_INDEXES'
)
$missingDict = $expectedDict | Where-Object { $granted -notcontains $_ }
Add-ReportLine "Expected grants: $($expectedDict.Count)"
Add-ReportLine "Present grants: $($expectedDict.Count - $missingDict.Count)"
if ($missingDict.Count -eq 0) {
Add-ReportLine "Status: OK"
}
else {
Add-ReportLine "Status: INCOMPLETE"
Add-ReportLine ""
Add-ReportLine "Missing:"
foreach ($m in $missingDict) { Add-ReportLine " - $m" }
Add-ReportLine ""
Add-ReportLine "[WARNING] CONTAFIN_ORACLE.PACK_DIAG_SPATIU va ramane INVALID."
Add-ReportLine " Rolul DBA nu se aplica in pachetele cu drepturi de definitor."
Add-ReportLine " Rezolvare: sqlplus sys/<parola>@$ServiceName as sysdba @sql\sys-grants.sql"
}
# Public Synonyms Count
Add-ReportSection "Public Synonyms"
$synSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT 'TOTAL_SYNONYMS:' || COUNT(*) FROM dba_synonyms WHERE owner = 'PUBLIC';
SELECT 'CO_SYNONYMS:' || COUNT(*) FROM dba_synonyms WHERE owner = 'PUBLIC' AND table_owner = 'CONTAFIN_ORACLE';
SELECT 'SYS_SYNONYMS:' || COUNT(*) FROM dba_synonyms WHERE owner = 'PUBLIC' AND table_owner = 'SYS' AND table_name LIKE 'AUTH%';
EXIT;
"@
$synResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $synSql -Silent
$synData = @{}
foreach ($line in $synResult -split "`n") {
if ($line -match "^([A-Z_]+):(\d+)\s*$") {
$synData[$Matches[1]] = [int]$Matches[2]
}
}
Add-ReportLine "Total public synonyms: $($synData['TOTAL_SYNONYMS'])"
Add-ReportLine "CONTAFIN_ORACLE synonyms: $($synData['CO_SYNONYMS'])"
Add-ReportLine "SYS AUTH synonyms: $($synData['SYS_SYNONYMS'])"
# All Invalid Objects
Add-ReportSection "Invalid Objects Summary"
$invalidSql = @"
SET PAGESIZE 100 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF LINESIZE 200
COLUMN owner FORMAT A20
COLUMN invalid_count FORMAT 999,999
SELECT owner, COUNT(*) AS invalid_count
FROM dba_objects
WHERE status = 'INVALID'
AND owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'XDB', 'ORDSYS',
'ORDDATA', 'MDSYS', 'CTXSYS', 'WMSYS', 'APEX_PUBLIC_USER')
GROUP BY owner
ORDER BY invalid_count DESC;
EXIT;
"@
$invalidResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $invalidSql -Silent
if ($invalidResult.Trim() -eq "" -or $invalidResult -match "no rows selected") {
Add-ReportLine "No invalid objects found in application schemas."
}
else {
Add-ReportLine $invalidResult
}
# Company Schemas
Add-ReportSection "Company Schemas"
# Get company list from NOM_FIRME
$companySql = @"
SET PAGESIZE 1000 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 200
SELECT schema FROM CONTAFIN_ORACLE.NOM_FIRME WHERE sters = 0 AND schema IS NOT NULL ORDER BY schema;
EXIT;
"@
$companyList = @()
try {
$companyResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $companySql -Silent
foreach ($line in $companyResult -split "`n") {
$schema = $line.Trim()
if ($schema -match "^[A-Z0-9_]+$") {
$companyList += $schema
}
}
}
catch {
Add-ReportLine "[WARNING] Could not query NOM_FIRME table"
}
Add-ReportLine "Companies registered in NOM_FIRME: $($companyList.Count)"
Add-ReportLine ""
if ($companyList.Count -gt 0) {
# Check which schemas exist
$existingSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 200
SELECT username FROM dba_users WHERE username NOT IN (
'SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'XDB', 'ORDSYS', 'ORDDATA', 'MDSYS',
'CTXSYS', 'WMSYS', 'APEX_PUBLIC_USER', 'CONTAFIN_ORACLE', 'ANONYMOUS',
'APEX_040200', 'APEX_050000', 'APPQOSSYS', 'AUDSYS', 'DIP', 'DVF', 'DVSYS',
'FLOWS_FILES', 'GGSYS', 'GSMADMIN_INTERNAL', 'GSMCATUSER', 'GSMUSER',
'LBACSYS', 'MDDATA', 'OJVMSYS', 'OLAPSYS', 'ORACLE_OCM', 'REMOTE_SCHEDULER_AGENT',
'SI_INFORMTN_SCHEMA', 'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR',
'SYSBACKUP', 'SYSDG', 'SYSKM', 'SYSRAC', 'XS`$NULL'
) ORDER BY username;
EXIT;
"@
$existingResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $existingSql -Silent
$existingSchemas = @()
foreach ($line in $existingResult -split "`n") {
$schema = $line.Trim()
if ($schema -match "^[A-Z0-9_]+$") {
$existingSchemas += $schema
}
}
Add-ReportLine "Existing company schemas: $($existingSchemas.Count)"
Add-ReportLine ""
# Show details
Add-ReportLine ("Schema".PadRight(25) + "Status".PadRight(12) + "Objects".PadRight(10) + "Invalid")
Add-ReportLine ("-" * 60)
foreach ($schema in $companyList) {
$status = if ($existingSchemas -contains $schema) { "EXISTS" } else { "MISSING" }
if ($status -eq "EXISTS") {
$counts = Get-SchemaObjectCount -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword -SchemaName $schema
$total = if ($counts['TOTAL']) { $counts['TOTAL'] } else { 0 }
$invalid = if ($counts['INVALID']) { $counts['INVALID'] } else { 0 }
Add-ReportLine ("$schema".PadRight(25) + "$status".PadRight(12) + "$total".PadRight(10) + "$invalid")
}
else {
Add-ReportLine ("$schema".PadRight(25) + "$status".PadRight(12) + "-".PadRight(10) + "-")
}
}
# Check for orphan schemas (exist in DB but not in NOM_FIRME)
$orphanSchemas = $existingSchemas | Where-Object { $companyList -notcontains $_ }
if ($orphanSchemas.Count -gt 0) {
Add-ReportLine ""
Add-ReportLine "Orphan schemas (not in NOM_FIRME):"
foreach ($schema in $orphanSchemas) {
$counts = Get-SchemaObjectCount -OracleHome $oraHome -ServiceName $ServiceName `
-Password $SystemPassword -SchemaName $schema
$total = if ($counts['TOTAL']) { $counts['TOTAL'] } else { 0 }
Add-ReportLine " - $schema ($total objects)"
}
}
}
# Company Template + SMTP
# ------------------------------------------------------------------------
# SYS.NEWSCHEMA (si 06-add-company.ps1) creeaza o firma noua importand
# sablonul FIRMANOUA.dmp din directorul Oracle DMPDIR. Daca fisierul nu e
# acolo, adaugarea de firme noi pica in DBMS_DATAPUMP.ADD_FILE - dar abia
# peste luni, cand clientul chiar adauga o firma. Il verificam la instalare.
Add-ReportSection "Company Template + SMTP"
# Lipsa sablonului e un defect real (blocheaza adaugarea de firme), deci
# intra in $issues si in codul de iesire. SMTP nesetat ramane doar o nota:
# nu toti clientii folosesc notificarile pe email.
$extraIssues = @()
$tmplSql = @"
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 200
SELECT 'DMPDIR_PATH:' || directory_path FROM dba_directories WHERE directory_name = 'DMPDIR';
SELECT 'SMTP_OUT:' || NVL(value, '<nesetat>') FROM v`$parameter WHERE name = 'smtp_out_server';
EXIT;
"@
$tmplResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $tmplSql -AsSysdba -Silent
$dmpDirPath = $null
$smtpOut = $null
foreach ($line in $tmplResult -split "`n") {
$line = $line.Trim()
if ($line -match "^DMPDIR_PATH:(.+)$") { $dmpDirPath = $Matches[1].Trim() }
if ($line -match "^SMTP_OUT:(.+)$") { $smtpOut = $Matches[1].Trim() }
}
if (-not $dmpDirPath) {
Add-ReportLine "[WARNING] Directorul Oracle DMPDIR nu exista."
$extraIssues += "Oracle directory DMPDIR missing"
}
else {
Add-ReportLine "DMPDIR: $dmpDirPath"
$tmplPath = Join-Path $dmpDirPath "FIRMANOUA.dmp"
if (Test-Path $tmplPath) {
$sizeMb = [math]::Round((Get-Item $tmplPath).Length / 1MB, 1)
Add-ReportLine "FIRMANOUA.dmp: OK ($sizeMb MB)"
}
else {
Add-ReportLine "FIRMANOUA.dmp: LIPSA"
Add-ReportLine ""
Add-ReportLine "[WARNING] Fara sablonul FIRMANOUA.dmp in DMPDIR, adaugarea unei firme"
Add-ReportLine " noi (SYS.NEWSCHEMA / 06-add-company.ps1) va esua la"
Add-ReportLine " DBMS_DATAPUMP.ADD_FILE. Copiaza-l in $dmpDirPath."
Add-ReportLine " Sursa: LXC 108, container oracle-xe,"
Add-ReportLine " /tmp/oracle-import-roa2/firmanoua.dmp"
$extraIssues += "FIRMANOUA.dmp missing from DMPDIR (adding new companies will fail)"
}
}
Add-ReportLine ""
if ($smtpOut -and $smtpOut -ne '<nesetat>') {
Add-ReportLine "SMTP_OUT_SERVER: $smtpOut"
}
else {
Add-ReportLine "SMTP_OUT_SERVER: NESETAT"
Add-ReportLine "[NOTA] UTL_MAIL.SEND va da ORA-29278/29279 pana cand e setat."
Add-ReportLine " Ruleaza 08-post-install-config.ps1 -EmailSmtp <server>."
}
# Network ACL Status
Add-ReportSection "Network ACL Status"
$aclSql = @"
SET PAGESIZE 100 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF LINESIZE 200
COLUMN acl FORMAT A30
COLUMN principal FORMAT A20
COLUMN privilege FORMAT A15
COLUMN is_grant FORMAT A8
SELECT acl, principal, privilege, is_grant
FROM dba_network_acl_privileges
WHERE principal = 'CONTAFIN_ORACLE';
EXIT;
"@
$aclResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYS" -Password $SystemPassword -SqlCommand $aclSql -AsSysdba -Silent
if ($aclResult.Trim() -eq "" -or $aclResult -match "no rows selected") {
Add-ReportLine "No ACL configured for CONTAFIN_ORACLE"
}
else {
Add-ReportLine $aclResult
}
# Context Status
Add-ReportSection "Context Status"
$ctxSql = @"
SET PAGESIZE 100 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF LINESIZE 200
COLUMN namespace FORMAT A20
COLUMN schema FORMAT A25
COLUMN package FORMAT A25
SELECT namespace, schema, package
FROM dba_context
WHERE namespace = 'SESIUNE';
EXIT;
"@
$ctxResult = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "SYSTEM" -Password $SystemPassword -SqlCommand $ctxSql -Silent
if ($ctxResult.Trim() -eq "" -or $ctxResult -match "no rows selected") {
Add-ReportLine "SESIUNE context not found"
}
else {
Add-ReportLine $ctxResult
}
# Final Summary
Add-ReportSection "Verification Summary"
$issues = @()
# Check for issues
if ($tsResult -notmatch "ROA") {
$issues += "Tablespace ROA not found"
}
if ($coExists -notmatch "USER_EXISTS") {
$issues += "CONTAFIN_ORACLE user not found"
}
elseif ($coCounts -and $coCounts['INVALID'] -gt 0) {
$issues += "CONTAFIN_ORACLE has $($coCounts['INVALID']) invalid objects"
}
if ($synData['CO_SYNONYMS'] -eq 0) {
$issues += "No public synonyms for CONTAFIN_ORACLE"
}
$missingCompanies = $companyList | Where-Object { $existingSchemas -notcontains $_ }
if ($missingCompanies.Count -gt 0) {
$issues += "$($missingCompanies.Count) company schemas are missing"
}
if ($extraIssues.Count -gt 0) {
$issues += $extraIssues
}
if ($issues.Count -eq 0) {
Add-ReportLine "[OK] All checks passed!"
Add-ReportLine ""
Add-ReportLine "The ROA Oracle installation appears to be complete and functional."
}
else {
Add-ReportLine "[WARNING] Issues found:"
Add-ReportLine ""
foreach ($issue in $issues) {
Add-ReportLine " - $issue"
}
}
Add-ReportLine ""
Add-ReportLine ("=" * 60)
Add-ReportLine " End of Verification Report"
Add-ReportLine ("=" * 60)
# Save report if requested
if ($OutputFile) {
Set-Content -Path $OutputFile -Value $report.ToString() -Encoding UTF8
Write-LogSuccess "Report saved to: $OutputFile"
}
Close-LogFile -Success ($issues.Count -eq 0)
exit $(if ($issues.Count -eq 0) { 0 } else { 1 })
}
catch {
Write-LogError "Verification failed: $_"
Write-LogError $_.ScriptStackTrace
Close-LogFile -Success $false
exit 1
}