20-sep: infra global - OmniRoute watchdog + plugin OpenCode + changelog sobremesa/portatil

This commit is contained in:
juanminsanz
2026-09-20 11:59:56 +02:00
commit 49bdf1ac76
8 changed files with 806 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
<#
.SYNOPSIS
Instala el arranque fiable de OmniRoute al iniciar sesion de Windows.
.DESCRIPTION
Sustituye el autostart fragil de OmniRoute (un .vbs en la carpeta Inicio, ya
afectado por la deprecacion de VBScript en Windows) por una tarea programada
que ejecuta el vigilante omniroute_watchdog.ps1:
- Se lanza al iniciar sesion del usuario.
- Arranca OmniRoute si no esta corriendo.
- Lo relanza si se cae durante la sesion (autocuracion).
Pasos:
1. Desactiva el autostart propio de OmniRoute (OmniRoute.vbs) para evitar dobles arranques.
2. Registra la tarea programada "OmniRoute Watchdog".
3. La arranca ahora mismo.
.NOTES
No requiere privilegios de administrador (tarea del propio usuario).
#>
[CmdletBinding()]
param(
[switch]$NoStart
)
$ErrorActionPreference = 'Stop'
$TaskName = 'OmniRoute Watchdog'
$ScriptPath = Join-Path $PSScriptRoot 'omniroute_watchdog.ps1'
$PwshExe = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
$NodeExe = 'C:\Program Files\nodejs\node.exe'
$OmniRouteMjs = Join-Path $env:APPDATA 'npm\node_modules\omniroute\bin\omniroute.mjs'
$UserId = "$env:USERDOMAIN\$env:USERNAME"
Write-Host '== Instalando arranque fiable de OmniRoute ==' -ForegroundColor Cyan
# 1) Desactivar el autostart VBS propio de OmniRoute -----------------------
$vbs = Join-Path ([Environment]::GetFolderPath('Startup')) 'OmniRoute.vbs'
if ((Test-Path $NodeExe) -and (Test-Path $OmniRouteMjs)) {
Write-Host ' - Desactivando autostart VBS de OmniRoute...' -ForegroundColor Yellow
$prevEap = $ErrorActionPreference
$ErrorActionPreference = 'Continue'
try { & $NodeExe $OmniRouteMjs autostart disable 2>&1 | Out-Null } catch { }
$ErrorActionPreference = $prevEap
}
if (Test-Path $vbs) {
Remove-Item -LiteralPath $vbs -Force
Write-Host ' - Eliminado OmniRoute.vbs de la carpeta Inicio.' -ForegroundColor Yellow
}
# 2) Registrar la tarea programada -----------------------------------------
if (Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue) {
Write-Host ' - Eliminando tarea anterior...' -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
}
$Action = New-ScheduledTaskAction `
-Execute $PwshExe `
-Argument "-NoProfile -NonInteractive -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$ScriptPath`"" `
-WorkingDirectory $env:USERPROFILE
$Trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 999 `
-RestartInterval (New-TimeSpan -Minutes 1) `
-MultipleInstances IgnoreNew
$Settings.ExecutionTimeLimit = 'PT0S' # sin limite de tiempo (vigilante permanente)
$Settings.Hidden = $true
$Principal = New-ScheduledTaskPrincipal -UserId $UserId -LogonType Interactive -RunLevel Limited
Register-ScheduledTask `
-TaskName $TaskName `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-Principal $Principal `
-Description 'Arranca y vigila OmniRoute (localhost:20128) al iniciar sesion. Autocuracion si se cae.' `
-Force | Out-Null
Write-Host " - Tarea '$TaskName' registrada." -ForegroundColor Green
# 3) Arrancar ahora ---------------------------------------------------------
if (-not $NoStart) {
Write-Host ' - Arrancando el vigilante ahora...' -ForegroundColor Yellow
Start-ScheduledTask -TaskName $TaskName
}
Write-Host ''
Write-Host 'Listo. Comandos utiles:' -ForegroundColor Cyan
Write-Host " Get-ScheduledTask -TaskName '$TaskName' | Get-ScheduledTaskInfo"
Write-Host " Start-ScheduledTask -TaskName '$TaskName'"
Write-Host " Stop-ScheduledTask -TaskName '$TaskName'"
Write-Host " Get-Content `"$env:USERPROFILE\.omniroute\watchdog.log`" -Tail 20"

View File

@@ -0,0 +1,174 @@
<#
.SYNOPSIS
Vigilante (watchdog) de OmniRoute: garantiza que el servidor local este SIEMPRE arriba.
.DESCRIPTION
OmniRoute escucha en http://127.0.0.1:20128 y tarda ~60 s en quedar listo.
Este vigilante:
- Comprueba el puerto 20128 periodicamente.
- Si no hay proceso, arranca el servidor en segundo plano (oculto, desde un
directorio neutro para no contaminarse con .env de repositorios).
- Si hay proceso pero no responde tras el tiempo de arranque, lo mata y lo relanza.
Se lanza al iniciar sesion mediante la tarea programada "OmniRoute Watchdog".
.PARAMETER Once
Comprueba/arranca una sola vez, espera a que responda y sale (para pruebas).
.PARAMETER IntervalSeconds
Segundos entre comprobaciones del bucle de vigilancia (por defecto 120).
.PARAMETER StartupTimeoutSeconds
Segundos maximos de espera a que OmniRoute responda antes de considerarlo colgado.
.PARAMETER UseTray
Arranca OmniRoute con icono en la bandeja del sistema (por defecto NO, para maxima
fiabilidad en el arranque desatendido).
.NOTES
Repo: biblioteca_negocio_prolongo. Regla 24 no aplica (no toca NET/VB/4GL).
#>
[CmdletBinding()]
param(
[switch]$Once,
[int]$IntervalSeconds = 120,
[int]$StartupTimeoutSeconds = 180,
[switch]$UseTray
)
$ErrorActionPreference = 'SilentlyContinue'
# --- Configuracion ---------------------------------------------------------
$OmniHost = '127.0.0.1'
$Port = 20128
$NodeExe = 'C:\Program Files\nodejs\node.exe'
$OmniRouteMjs = Join-Path $env:APPDATA 'npm\node_modules\omniroute\bin\omniroute.mjs'
$WorkDir = $env:USERPROFILE # directorio neutro (sin .env de repos)
$LogDir = Join-Path $env:USERPROFILE '.omniroute'
$LogFile = Join-Path $LogDir 'watchdog.log'
$MaxLogBytes = 1MB
# --- Utilidades ------------------------------------------------------------
function Write-Log {
param([string]$Message, [string]$Level = 'INFO')
$line = '{0} [{1}] {2}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $Level, $Message
if (-not (Test-Path $LogDir)) { New-Item -ItemType Directory -Path $LogDir -Force | Out-Null }
if ((Test-Path $LogFile) -and ((Get-Item $LogFile).Length -gt $MaxLogBytes)) {
Move-Item -LiteralPath $LogFile -Destination "$LogFile.1" -Force
}
Add-Content -LiteralPath $LogFile -Value $line -Encoding UTF8
}
function Resolve-NodeExe {
if (Test-Path $NodeExe) { return $NodeExe }
$cmd = Get-Command node -ErrorAction SilentlyContinue
if ($cmd) { return $cmd.Source }
return $NodeExe
}
function Test-OmniRoutePort {
$client = New-Object System.Net.Sockets.TcpClient
try {
$iar = $client.BeginConnect($OmniHost, $Port, $null, $null)
if ($iar.AsyncWaitHandle.WaitOne(2000)) {
$client.EndConnect($iar)
return $true
}
return $false
} catch {
return $false
} finally {
try { $client.Close() } catch { }
}
}
function Get-OmniRouteProcesses {
Get-CimInstance Win32_Process -Filter "Name='node.exe'" -ErrorAction SilentlyContinue |
Where-Object {
$_.CommandLine -and
($_.CommandLine -like '*omniroute*') -and
($_.CommandLine -like '*serve*')
}
}
function Start-OmniRouteServer {
$node = Resolve-NodeExe
if (-not (Test-Path $OmniRouteMjs)) {
Write-Log "No se encuentra omniroute.mjs en $OmniRouteMjs" 'ERROR'
return
}
$argList = @("`"$OmniRouteMjs`"", 'serve', '--no-open')
if ($UseTray) { $argList += '--tray' } else { $argList += '--no-tray' }
Start-Process -FilePath $node `
-ArgumentList $argList `
-WorkingDirectory $WorkDir `
-WindowStyle Hidden
Write-Log "Servidor OmniRoute lanzado (tray=$([bool]$UseTray))."
}
function Wait-OmniRouteUp {
param([int]$TimeoutSeconds)
for ($i = 0; $i -lt $TimeoutSeconds; $i += 3) {
Start-Sleep -Seconds 3
if (Test-OmniRoutePort) { return $true }
}
return $false
}
# --- Bloqueo de instancia unica -------------------------------------------
$mutex = New-Object System.Threading.Mutex($false, 'Local\OmniRouteWatchdog')
if (-not $mutex.WaitOne(0)) {
Write-Log 'Ya hay otro vigilante en ejecucion. Saliendo.' 'WARN'
exit 0
}
# --- Modo puntual (-Once) --------------------------------------------------
if ($Once) {
if (Test-OmniRoutePort) {
Write-Log "Comprobacion puntual: OmniRoute ya responde en $Port." 'OK'
exit 0
}
$procs = @(Get-OmniRouteProcesses)
if ($procs.Count -eq 0) {
Write-Log 'Comprobacion puntual: OmniRoute caido. Arrancando...' 'WARN'
Start-OmniRouteServer
} else {
Write-Log "Comprobacion puntual: proceso presente (PID $($procs[0].ProcessId)), esperando puerto..." 'WARN'
}
if (Wait-OmniRouteUp -TimeoutSeconds $StartupTimeoutSeconds) {
Write-Log "Comprobacion puntual: OmniRoute arriba en $Port." 'OK'
exit 0
}
Write-Log "Comprobacion puntual: OmniRoute NO respondio en $StartupTimeoutSeconds s." 'ERROR'
exit 1
}
# --- Bucle de vigilancia ---------------------------------------------------
Write-Log 'Vigilante de OmniRoute iniciado.'
$downSince = $null
while ($true) {
if (Test-OmniRoutePort) {
if ($downSince) { Write-Log "OmniRoute vuelve a responder en $Port." 'OK' }
$downSince = $null
}
else {
$procs = @(Get-OmniRouteProcesses)
if ($procs.Count -gt 0) {
if (-not $downSince) {
$downSince = Get-Date
Write-Log "Proceso OmniRoute presente (PID $($procs[0].ProcessId)) pero $Port aun no responde; esperando arranque (~60 s)..."
}
elseif (((Get-Date) - $downSince).TotalSeconds -gt $StartupTimeoutSeconds) {
Write-Log "OmniRoute lleva mas de $StartupTimeoutSeconds s sin responder. Matando procesos colgados y relanzando." 'WARN'
$procs | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }
Start-Sleep -Seconds 3
Start-OmniRouteServer
$downSince = Get-Date
}
}
else {
Write-Log "OmniRoute CAIDO (puerto $Port cerrado). Arrancando servidor..." 'WARN'
Start-OmniRouteServer
$downSince = Get-Date
}
}
Start-Sleep -Seconds $IntervalSeconds
}