From c6216e006e615fbd31b9d8de86cade08382afde8 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 6 Aug 2026 23:29:16 +0300 Subject: [PATCH] acces email Thunderbird + tabela de provenienta la top segmente in diagnosticul de spatiu --- docs/depanare-spatiu-oracle.md | 19 ++++++ docs/email-thunderbird.md | 41 +++++++++++++ docs/scripturi-uzuale.md | 1 + utile/citeste_email.ps1 | 103 +++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 docs/email-thunderbird.md create mode 100644 utile/citeste_email.ps1 diff --git a/docs/depanare-spatiu-oracle.md b/docs/depanare-spatiu-oracle.md index 265d741..e36b97c 100644 --- a/docs/depanare-spatiu-oracle.md +++ b/docs/depanare-spatiu-oracle.md @@ -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 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_@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: - **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 +- **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#` 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 )` — 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 `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 diff --git a/docs/email-thunderbird.md b/docs/email-thunderbird.md new file mode 100644 index 0000000..893fcf1 --- /dev/null +++ b/docs/email-thunderbird.md @@ -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\\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 [-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 - `. 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 `, cate un expeditor per client. Vezi `depanare-spatiu-oracle.md` | + +Emailul vine **doar la prag depasit**; tacere = totul in regula. diff --git a/docs/scripturi-uzuale.md b/docs/scripturi-uzuale.md index d079951..a21f5f7 100644 --- a/docs/scripturi-uzuale.md +++ b/docs/scripturi-uzuale.md @@ -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 [-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` | | 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 ]` | 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` doar semnaleaza ce lipseste (changelog neatins, binar VFP fara textul lui sincronizat). diff --git a/utile/citeste_email.ps1 b/utile/citeste_email.ps1 new file mode 100644 index 0000000..73cbf1b --- /dev/null +++ b/utile/citeste_email.ps1 @@ -0,0 +1,103 @@ +# Citeste emailurile din mbox-urile Thunderbird Portable (fara conectorul Gmail). +# citeste_email.ps1 [-Cauta ] [-Cont ] [-Ultimele ] -> lista mesaje +# citeste_email.ps1 -Nr [-Linii ] -> 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