fix/windows-actualizacion-silenciosa #27
Reference in New Issue
Block a user
No description provided.
Delete Branch "fix/windows-actualizacion-silenciosa"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
La actualizacion ya fallaba ruidosamente en vez de mentir, pero el arreglo no podia llegar al servidor: el install.ps1 que se ejecuta viaja DENTRO del zip, y el artefacto 1.1.3 se construyo antes de que el instalador aprendiera a realinear la tarea. Verificado sobre el zip: trae -UpdateInPlace y cero Sync-AgentTaskPath. Un instalador ya publicado no se arregla hacia atras. - alignWindowsTask realinea la accion de la tarea por SSH tras instalar el binario, conservando disparador, principal, ajustes y argumentos, y asienta la ruta ANTERIOR y la nueva para que el cambio sea reversible si la ruta declarada estuviera mal. Si no se puede corregir, aborta con 409 nombrando ambas: seguir significaria arrancar a sabiendas el binario viejo. Funciona con cualquier artefacto ya distribuido. - restartWindowsAgent rearranca y espera a que corra el binario del prefijo, no cualquier proceso con ese nombre. Vive en cras-install y no en cras-agent-control porque este es el modulo de abajo; al reves habria un ciclo. Y el diagnostico deja de ser una tarea para el operador. El error de sello ausente decia "revisa a que binario apunta el arranque automatico" cuando el panel YA lo sabe, y la bitacora del run donde si estaba no la encontraba nadie ("no se donde verlo"). Ahora se sondea tarea y proceso ANTES de evaluar el sello y el mensaje nombra a que apunta la tarea, desde donde corre el proceso, y la cola de CloudRestoreAS-crash.log — que runner.py escribe precisamente para esto y que nunca se leia. El banner de error apunta al run por numero. startOnWindows deja de esperar por nombre y usa la misma sonda de ruta, para que Verificar no pueda contradecir al instalador. PowerShell generado validado con PowerShell real: los seis scripts parsean, y el de realineacion ejercitado contra una tarea simulada reapunta la accion Exec, conserva los argumentos y respeta las acciones que no son Exec. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>El panel rechazaba actualizar con 1.1.4 diciendo que su install.ps1 no declara -UpdateInPlace. Era falso: el zip trae UpdateInPlace 8 veces y Sync-AgentTaskPath 3. El bloqueo lo causaba la sonda. const supportsInPlace = supportsProbe.stdout.trim() === 'si'; Cualquier fallo —una excepcion, un codigo de salida distinto de cero, stdout vacio— colapsaba a false. Mientras eso solo elegia entre -UpdateInPlace y -Service, un falso negativo degradaba la instalacion; al convertirlo en un 409 duro paso a ser un candado permanente sobre un artefacto correcto. Por que fallaba en ese servidor y no en la maquina donde se probo no se sabe con certeza. El candidato mas probable es Constrained Language Mode (AppLocker/WDAC son habituales en servidores endurecidos): restringe el acceso a propiedades de objetos .NET como .Parameters mientras `& install.ps1` sigue funcionando, que es justo lo que se observaba. Pero el arreglo no es adivinarlo: - probeInstallerUpdateSupport lee el TEXTO del script y busca la declaracion `[switch]$UpdateInPlace` con [regex]::IsMatch. No compila nada, no toca reflexion y ninguna politica lo bloquea. Anclado a la declaracion y no a una mencion suelta, para que un comentario no de un falso positivo. - Tres estados en vez de dos. Solo un "no" CONFIRMADO bloquea; "desconocido" sigue adelante con el comportamiento anterior y deja asentado POR QUE no se pudo determinar. Un fallo de diagnostico no puede impedir el trabajo. - El estado se decide tambien con el codigo de salida y stderr, no solo con stdout: un execRemote que falla deja stdout vacio y eso se leia como respuesta. Auditado el mismo patron en las otras sondas de Windows, porque dos gobiernan fallos duros: probeWindowsAgentProcess (502 "no esta corriendo"), probeWindowsElevation (409 por privilegios) y probeWindowsTask leian "el comando no respondio" como "la respuesta es no". Ahora todas distinguen los dos casos. Verificado con PowerShell real, y esta vez tambien las rutas de FALLO —que es lo que falto la vez pasada y por lo que esto llego a produccion—: instalador nuevo -> si, instalador del zip 1.1.2 publicado -> no, archivo inexistente -> desconocido, y fallo de lectura -> desconocido. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>Pull request closed