acces email Thunderbird + tabela de provenienta la top segmente in diagnosticul de spatiu

This commit is contained in:
2026-08-06 23:29:16 +03:00
parent d0c2af8a31
commit c6216e006e
4 changed files with 164 additions and 0 deletions

View File

@@ -22,6 +22,16 @@ cu `diag_spatiu.ps1`; **email doar la prag depasit**, tacere completa altfel. Su
Sectiunile informative (recyclebin, UNDO, TEMP, istoric statistici/scheduler, top segmente, audit Sectiunile informative (recyclebin, UNDO, TEMP, istoric statistici/scheduler, top segmente, audit
SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza singure. SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza singure.
`co_2026_08_06_08_DIAG_SPATIU_PACK` + `sys_2026_08_06_07_DIAG_SPATIU_GRANT3` (06.08.2026) scriu la
top segmente si **tabela/coloana din care provine segmentul** (`DetaliuSegment`: `DBA_LOBS`,
`DBA_LOB_PARTITIONS`, `DBA_INDEXES`; segmentele temporare se marcheaza ca atare) — fara asta un
`SYS_LOB0000630560C00017$$` de 4 GB in email nu spune nimic, iar serverul clientului nu e accesibil
direct. Atentie: pentru `LOB PARTITION`, `dba_segments.segment_name` e `lob_name`, nu
`lob_partition_name`.
Emailurile ajung pe `marius.mutu@romfast.ro`, cate un expeditor per client
(`roaupdate_<client>@romfast.ro`); citirea lor: `email-thunderbird.md`.
`co_2026_08_06_01_DIAG_SPATIU_PACK` (06.08.2026) corecteaza doua lucruri vazute pe primele rulari: `co_2026_08_06_01_DIAG_SPATIU_PACK` (06.08.2026) corecteaza doua lucruri vazute pe primele rulari:
- **pragul absolut (2048 MB) nu se mai aplica tablespace-urilor al caror maxim e sub el** — orice - **pragul absolut (2048 MB) nu se mai aplica tablespace-urilor al caror maxim e sub el** — orice
@@ -80,6 +90,15 @@ SYS, disc) se scriu doar cand exista deja o alerta — dau context, nu alerteaza
## Capcane ## Capcane
- **Segmentele `TEMPORARY` dintr-un tablespace permanent nu dispar intotdeauna la restart** (ACN,
06.08.2026: 1.3 GB ramasi si dupa repornirea serviciului). Daca `v$sort_usage` e gol, sunt orfane
si se curata fortat, ca `SYS`: `alter session set events 'immediate trace name DROP_SEGMENTS level
<ts#+1>'` (`ts#` din `v$tablespace`) — la ACN au disparut instantaneu, cu tot spatiul recuperat.
Daca nici asa nu pleaca, apartin unui DDL neterminat — cauta `SYS_JOURNAL%` (index online) sau
obiecte `INVALID/UNUSABLE` in schema respectiva.
- **`shrink space` pe un LOB cere ASSM**; pe un tablespace MSSM da `ORA-10635` (cazul `ROA` la ACN).
Echivalentul care merge: `alter table t move lob (col) store as (tablespace <ts>)` — reconstruieste
segmentul, tine tabela blocata cat dureaza si cere spatiu liber cat segmentul mutat.
- **Privilegiile `ANY` nu se aplica pe obiectele din schema `SYS`** cat timp - **Privilegiile `ANY` nu se aplica pe obiectele din schema `SYS`** cat timp
`O7_DICTIONARY_ACCESSIBILITY=FALSE` — orice curatare acolo cere `SYSDBA`. `O7_DICTIONARY_ACCESSIBILITY=FALSE` — orice curatare acolo cere `SYSDBA`.
- Parola `SYS` e de obicei cea generica (vezi `COMUN\docs\local\oracle.md`), dar **nu la toti - Parola `SYS` e de obicei cea generica (vezi `COMUN\docs\local\oracle.md`), dar **nu la toti

41
docs/email-thunderbird.md Normal file
View File

@@ -0,0 +1,41 @@
# Citirea emailurilor (Thunderbird Portable)
Conectorul Gmail din Claude vede **doar** `mmarius28@gmail.com`. Conturile de lucru
(`marius.mutu@romfast.ro` etc.) nu sunt acolo — se citesc local, din mbox-urile Thunderbird:
```
D:\UTIL\portable\PortableApps\ThunderbirdPortable\Data\profile\ImapMail\<cont>\INBOX
```
Conturi active (dupa `LastWriteTime`): `mail.romfast.ro` (~36 MB, contul principal) si
`mail.romfast-1.ro` (~108 MB). Restul (`seanet.ro`, `romfast-4.ro`, `imap.googlemail.com`, …)
sunt vechi de ani.
```powershell
powershell -File COMUN\utile\citeste_email.ps1 -Cauta 'Diagnostic spatiu' -Ultimele 10
powershell -File COMUN\utile\citeste_email.ps1 -Nr <linie> [-Linii 200]
```
Prima forma listeaza `Cont / Linie / Data / De_la / Subiect` (filtru `-Cauta` pe subiect **sau**
expeditor, `-Cont mail.romfast.ro` restrange la un cont); a doua tipareste mesajul care incepe la
linia respectiva, pana la urmatorul separator mbox.
## Capcane
- **Nu da `Grep`/ripgrep pe folder**: `INBOX.sbd\Sent` are ~2.5 GB si cautarea expira.
- **Numerotarea liniilor difera intre unelte** (`Select-String` vs `Get-Content` vs `StreamReader`)
— mbox-ul are linii cu `\r` singur. Foloseste numarul dat de `citeste_email.ps1`, pentru ca
`-Nr` citeste cu acelasi cititor; daca linia ceruta nu e inceput de mesaj, scriptul trece la
contul urmator (`-Nr` fara `-Cont` cauta in toate).
- Thunderbird tine fisierul deschis → citire doar cu `FileShare::ReadWrite` (scriptul o face).
- Mesajele sunt in ordine cronologica, **cel mai nou la sfarsitul fisierului**; separatorul e
`From - <data>`. Corpurile HTML/base64 se tipar brut — pentru ele ia doar `Content-Type` si
primele linii, nu tot mesajul.
## Emailuri automate ROA
| Expeditor | Ce e |
|---|---|
| `roaupdate_acn@`, `roaupdate-sigma@`, `roaupdate-clever@`, `roaupdate-automotive@` … | jobul `DIAGSPATIU_ZILNIC`, subiect `Diagnostic spatiu Oracle <BAZA> <data> <ora>`, cate un expeditor per client. Vezi `depanare-spatiu-oracle.md` |
Emailul vine **doar la prag depasit**; tacere = totul in regula.

View File

@@ -14,6 +14,7 @@ a doua oara — daca a doua oara e nevoie de acelasi lucru, scrie scriptul.
| spatiu plin la un client | `COMUN\utile\diag_spatiu.ps1 -Alias <TNS> [-Disc] [-SysPassword]` | tablespace, audit, ADR, FRA, disc server, top segmente. Vezi `depanare-spatiu-oracle.md` | | spatiu plin la un client | `COMUN\utile\diag_spatiu.ps1 -Alias <TNS> [-Disc] [-SysPassword]` | tablespace, audit, ADR, FRA, disc server, top segmente. Vezi `depanare-spatiu-oracle.md` |
| publicare scripturi de baza de date | `COMUN\utile\publicare_scripturi.ps1 [-Luna YYYY-MM] [-Fisier ...] [-DryRun]` | import in `UPD_DATABASE` → arhiva lunara `database[n]_*.zip` + indexi in `_UPDATE`, cu verificare octet cu octet. Vezi `publicare-scripturi-db.md` | | publicare scripturi de baza de date | `COMUN\utile\publicare_scripturi.ps1 [-Luna YYYY-MM] [-Fisier ...] [-DryRun]` | import in `UPD_DATABASE` → arhiva lunara `database[n]_*.zip` + indexi in `_UPDATE`, cu verificare octet cu octet. Vezi `publicare-scripturi-db.md` |
| teste UI VFP | harness din `COMUN\utile\Teste` | vezi `testare-ui-vfp.md` | | teste UI VFP | harness din `COMUN\utile\Teste` | vezi `testare-ui-vfp.md` |
| citirea emailurilor de pe conturile romfast | `COMUN\utile\citeste_email.ps1 [-Cauta ...] [-Nr <linie>]` | listeaza/extrage mesaje din mbox-urile Thunderbird Portable (conectorul Gmail nu vede conturile romfast). Vezi `email-thunderbird.md` |
Documentatia **nu** se genereaza automat si nu exista niciun hook care s-o scrie — `livrare.ps1` Documentatia **nu** se genereaza automat si nu exista niciun hook care s-o scrie — `livrare.ps1`
doar semnaleaza ce lipseste (changelog neatins, binar VFP fara textul lui sincronizat). doar semnaleaza ce lipseste (changelog neatins, binar VFP fara textul lui sincronizat).

103
utile/citeste_email.ps1 Normal file
View File

@@ -0,0 +1,103 @@
# Citeste emailurile din mbox-urile Thunderbird Portable (fara conectorul Gmail).
# citeste_email.ps1 [-Cauta <text>] [-Cont <nume>] [-Ultimele <n>] -> lista mesaje
# citeste_email.ps1 -Nr <linie> [-Linii <n>] -> corpul unui mesaj
param(
[string]$Cauta = '',
[string]$Cont = '',
[int]$Ultimele = 20,
[int]$Nr = 0,
[int]$Linii = 200,
[string]$Radacina = 'D:\UTIL\portable\PortableApps\ThunderbirdPortable\Data\profile\ImapMail'
)
$ErrorActionPreference = 'Stop'
function Get-Mboxuri {
param([string]$Cont)
$c = if ($Cont) { $Cont } else { '*' }
Get-ChildItem $Radacina -Directory -Filter $c |
ForEach-Object { Join-Path $_.FullName 'INBOX' } |
Where-Object { Test-Path $_ } |
Where-Object { (Get-Item $_).LastWriteTime -gt (Get-Date).AddYears(-2) }
}
function Deschide-Fisier {
param([string]$Cale)
# Thunderbird tine fisierul deschis -> FileShare ReadWrite obligatoriu
$fs = New-Object IO.FileStream($Cale, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::ReadWrite)
New-Object IO.StreamReader($fs, [Text.Encoding]::GetEncoding(28591))
}
function Decodeaza-Subiect {
param([string]$S)
$rx = [regex]'=\?([^?]+)\?([BbQq])\?([^?]*)\?='
$rx.Replace($S, {
param($m)
$enc = [Text.Encoding]::GetEncoding($m.Groups[1].Value)
$txt = $m.Groups[3].Value
if ($m.Groups[2].Value -match '[Bb]') {
$enc.GetString([Convert]::FromBase64String($txt))
} else {
$b = New-Object Collections.Generic.List[byte]
for ($i = 0; $i -lt $txt.Length; $i++) {
if ($txt[$i] -eq '=') { $b.Add([Convert]::ToByte($txt.Substring($i + 1, 2), 16)); $i += 2 }
elseif ($txt[$i] -eq '_') { $b.Add(32) }
else { $b.Add([byte][char]$txt[$i]) }
}
$enc.GetString($b.ToArray())
}
})
}
# ---- corpul unui mesaj: de la linia data pana la urmatorul separator mbox ----
if ($Nr -gt 0) {
foreach ($f in Get-Mboxuri -Cont $Cont) {
$r = Deschide-Fisier $f
try {
$i = 0; $scris = 0; $pornit = $false
while ($null -ne ($l = $r.ReadLine())) {
$i++
if ($i -lt $Nr) { continue }
# linia ceruta trebuie sa fie inceput de mesaj, altfel e alt cont
if ($i -eq $Nr -and $l -notmatch '^From - \w\w\w \w\w\w ') { break }
if ($pornit -and $l -match '^From - \w\w\w \w\w\w ') { break }
$pornit = $true
$l
if (++$scris -ge $Linii) { "... (taiat la $Linii linii, mareste cu -Linii)"; break }
}
if ($pornit) { return }
} finally { $r.Dispose() }
}
Write-Warning "Linia $Nr nu exista in mbox-urile cautate."
return
}
# ---- lista de mesaje ----
$mesaje = @()
foreach ($f in Get-Mboxuri -Cont $Cont) {
$cont = Split-Path (Split-Path $f -Parent) -Leaf
$r = Deschide-Fisier $f
try {
$i = 0; $inAntet = $false; $m = $null
while ($null -ne ($l = $r.ReadLine())) {
$i++
if ($l -match '^From - \w\w\w \w\w\w ') {
if ($m) { $mesaje += $m }
$m = [pscustomobject]@{ Cont = $cont; Linie = $i; Data = ''; De_la = ''; Subiect = '' }
$inAntet = $true
continue
}
if (-not $inAntet -or -not $m) { continue }
if ($l -eq '') { $inAntet = $false; continue }
if ($l -like 'Date: *' -and -not $m.Data) { $m.Data = $l.Substring(6).Trim() }
elseif ($l -like 'From: *' -and -not $m.De_la) { $m.De_la = $l.Substring(6).Trim() }
elseif ($l -like 'Subject: *' -and -not $m.Subiect) { $m.Subiect = Decodeaza-Subiect $l.Substring(9).Trim() }
}
if ($m) { $mesaje += $m }
} finally { $r.Dispose() }
}
if ($Cauta) {
$mesaje = $mesaje | Where-Object { $_.Subiect -like "*$Cauta*" -or $_.De_la -like "*$Cauta*" }
}
$mesaje | Select-Object -Last $Ultimele | Format-Table -AutoSize -Wrap