# ===== CONFIGURACION DE CORREO (editar con Notepad) ===== $CorreoActivo = $true $SmtpServer = "smtp.gmail.com" $SmtpPuerto = 587 $CorreoUsuario = "alertas@gridlab.mx" $CorreoPass = "vbqm cfja ytir jevw" $CorreoDestinos = @("gustavo@gridlab.mx","jovany@gridlab.mx") $CorreoAlArrancar = $true $CorreoCooldownMin = 15 # ======================================================== $Targets = @("Gateway","TotalPlay","Infinitum","CastrMX","CastrDallas") $Nombres = @{ Gateway="Router (Peplink)"; TotalPlay="TotalPlay"; Infinitum="Infinitum (Telmex)"; CastrMX="Castr Mexico (testigo)"; CastrDallas="Castr Dallas (STREAM)" } $script:UltimoCorreo = @{} function Enviar-Correo { param([string]$Asunto, [string]$Cuerpo) if (-not $CorreoActivo) { return } try { $sec = ConvertTo-SecureString $CorreoPass -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($CorreoUsuario, $sec) Send-MailMessage -From $CorreoUsuario -To $CorreoDestinos -Subject $Asunto -Body $Cuerpo -SmtpServer $SmtpServer -Port $SmtpPuerto -UseSsl -Credential $cred -Encoding UTF8 Add-Content C:\RedLogs\correo.log ((Get-Date -Format "yyyy-MM-dd HH:mm:ss") + " | ENVIADO | " + $Asunto) } catch { Add-Content C:\RedLogs\correo.log ((Get-Date -Format "yyyy-MM-dd HH:mm:ss") + " | ERROR | " + $PSItem.Exception.Message) } } if ($CorreoAlArrancar) { Enviar-Correo -Asunto "[La Perrada] Semaforo iniciado" -Cuerpo ("El semaforo de red arranco y esta vigilando. " + (Get-Date -Format "yyyy-MM-dd HH:mm:ss")) } while ($true) { $ahora = Get-Date $LogPath = "C:\RedLogs\monitor_red_{0}.log" -f $ahora.ToString("yyyy-MM-dd") $estado = @{} foreach ($t in $Targets) { $estado[$t] = $null } $lineas = Get-Content $LogPath -Tail 900 -ErrorAction SilentlyContinue foreach ($l in $lineas) { if ($l -match '\| RESUMEN \| (\w+) \| pings=\d+ \| perdidos=\d+ \| perdida=([\d\.]+)% \| lat_prom=(\d+)ms \| lat_max=(\d+)ms') { $estado[$Matches[1]] = @{ pct=[double]$Matches[2]; prom=[int]$Matches[3]; max=$Matches[4]; ev=$false } } } foreach ($l in $lineas) { if ($l -match '^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \| (\w+) \| [\d\.]+ \| (FAIL|CAIDO)') { try { $tEv = [datetime]$Matches[1] if (($ahora - $tEv).TotalSeconds -le 90 -and $estado[$Matches[2]]) { $estado[$Matches[2]].ev = $true } } catch { } } } $vivo = $false if (Test-Path $LogPath) { $vivo = (($ahora - (Get-Item $LogPath).LastWriteTime).TotalSeconds -lt 30) } $sev = @{} foreach ($t in $Targets) { $e = $estado[$t] if (-not $vivo -or -not $e) { $sev[$t] = -1 } elseif ($e.ev -or $e.pct -ge 5) { $sev[$t] = 2 } elseif ($e.pct -gt 0 -or $e.prom -ge 100) { $sev[$t] = 1 } else { $sev[$t] = 0 } } $dColor='#22c55e'; $dTitulo='TODO EN ORDEN'; $dTexto='Las cinco rutas sanas. Nada que hacer.' if (-not $vivo) { $dColor='#ef4444'; $dTitulo='MONITOR DETENIDO' $dTexto='No hay datos frescos. Doble clic a C:\RedLogs\lanzar_monitor.vbs o reiniciar sesion. Avisar a Gus.' } elseif ($sev["Gateway"] -ge 1) { $dColor='#ef4444'; $dTitulo='EL ROUTER SE ESTA AHOGANDO' $dTexto='El Peplink no responde (o el cable de red de ESTA PC esta desconectado). Abrir Client List y buscar quien mueve algo pesado. Puede afectar TODO, incluido el stream.' } elseif ($sev["CastrDallas"] -ge 1 -and $sev["Infinitum"] -ge 1) { $dColor='#ef4444'; $dTitulo='TELMEX AFECTANDO EL CAMINO DEL STREAM' $dTexto='La linea del stream y su camino a Dallas estan fallando juntos. El HELO puede caerse. Anotar la hora exacta y avisar a Gus. No tocar el router - se recupera solo.' } elseif ($sev["CastrDallas"] -ge 1) { $dColor='#ef4444'; $dTitulo='PROBLEMA EN LA RUTA A CASTR DALLAS (O SU SERVIDOR)' $dTexto='Tu red local esta limpia; el problema esta afuera, camino a Castr. El stream puede sufrir. Anotar hora exacta y avisar a Gus - es evidencia para el ticket con Castr.' } elseif ($sev["Infinitum"] -ge 1 -or $sev["CastrMX"] -ge 1) { $dColor='#f59e0b'; $dTitulo='RUTAS DE TELMEX DEGRADADAS - STREAM SANO' $dTexto='Fallan pruebas hacia Google y/o Castr Mexico, pero el camino del stream (Dallas) por la misma linea esta limpio. El aire esta a salvo. Solo vigilar el foco de Castr Dallas: mientras este verde, todo bien.' } elseif ($sev["TotalPlay"] -ge 1) { $dColor='#f59e0b'; $dTitulo='CONGESTION EN TOTALPLAY' $dTexto='NO afecta al stream (viaja por Infinitum). Afecta WiFi, monitoreo y llamadas. Suele ser descargas o previews pesados - revisar Client List si se sostiene.' } if ($dColor -eq '#ef4444') { $ya = $script:UltimoCorreo[$dTitulo] if (-not $ya -or ((Get-Date) - $ya).TotalMinutes -ge $CorreoCooldownMin) { $script:UltimoCorreo[$dTitulo] = Get-Date Enviar-Correo -Asunto ("[ALERTA La Perrada] " + $dTitulo) -Cuerpo ($dTexto + " Hora: " + $ahora.ToString("yyyy-MM-dd HH:mm:ss")) } } $filas = '' foreach ($t in $Targets) { $e = $estado[$t] switch ($sev[$t]) { -1 { $color='#6b7280'; $txt='sin datos' } 2 { $color='#ef4444'; if ($e.ev) { $txt='FALLA AHORA MISMO' } else { $txt=('perdida ' + $e.pct + '%') } } 1 { $color='#f59e0b'; $txt=('perdida ' + $e.pct + '% - ' + $e.prom + 'ms') } 0 { $color='#22c55e'; $txt=('0% perdida - ' + $e.prom + 'ms (max ' + $e.max + 'ms)') } } $filas += '
' + $dTexto + '