20-sep: infra global - OmniRoute watchdog + plugin OpenCode + changelog sobremesa/portatil
This commit is contained in:
98
omniroute/install_omniroute_autostart.ps1
Normal file
98
omniroute/install_omniroute_autostart.ps1
Normal 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"
|
||||
174
omniroute/omniroute_watchdog.ps1
Normal file
174
omniroute/omniroute_watchdog.ps1
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user