fix/instalacion-desatendida #23
Reference in New Issue
Block a user
No description provided.
Delete Branch "fix/instalacion-desatendida"
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?
El instalador exigía root o `sudo -n` (NOPASSWD), así que una cuenta con sudo CON contraseña —el caso de los servidores Linux— no podía actualizarse desde el panel. La contraseña guardada no ayudaba: se usa para autenticar SSH y a sudo nunca se le entrega, por decisión de diseño contra el antipatrón de AServers (`echo '{password}' | sudo -S`, que expone el secreto en argv). En vez de rodear esa decisión, se quita la necesidad de privilegios. El agente no necesita root para funcionar: su unit corre como el usuario que instala, y las rutas de data_folder las escribe SQL Server, no él. install.sh solo pedía privilegios por dos razones circunstanciales — el PREFIX por omisión en /opt y el unit en /etc/systemd/system. Modo nuevo `--user-service`: instala bajo el home y registra un unit de systemd de usuario. Para sobrevivir al cierre de sesión intenta lingering y, si el destino no lo permite, cae a @reboot en el crontab del usuario más un vigilante cada 5 min que sustituye al Restart=always. Con eso, al panel le bastan el usuario y la contraseña que ya tiene registrados. Además, la sonda de elevación pasa a ser compartida entre instalar y verificar (antes eran copias paralelas que ya diferían en la etiqueta) y distingue casos que se reportaban idénticos: - `requiretty` en el sudoers ya no se confunde con "sin privilegios": el remedio es el opuesto, porque agregar NOPASSWD no lo arregla. - Una regla NOPASSWD acotada a otros comandos se reporta como tal, con la lista. - Verificar informa si la ruta es escribible y si la instalación sin privilegios es viable en ese servidor, en vez de solo decir que faltan permisos. Dos bugs encontrados al probarlo, ambos con prueba: - `pgrep -f <ruta>` hacía match consigo mismo, porque la propia línea de cron del vigilante contiene esa ruta. Sin el ancla `^`, el vigilante creía que el agente corría y no lo rearrancaba nunca. - `expectedStepCount` comparaba solo con 'service', así que la barra de una instalación en modo usuario habría llegado al 100 % con un paso pendiente. `resolveLinuxPrivilege` no tenía ninguna prueba; se agregan seis. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>Instalar y Actualizar delegaban en el operador en cuanto algo no era ideal. Linux: probeLinuxElevation solo probaba `sudo -n`. Si sudo pedía contraseña, el panel declaraba "sin privilegios" y abortaba, aunque tuviera esa contraseña guardada y la estuviera usando para abrir la sesión SSH. La política que lo prohibía era más estricta de lo que su propio motivo exige: lo que hace inseguro el `echo '{pw}' | sudo -S` de AServers es que la contraseña acaba en el argv del `sh -c`, legible con `ps` por cualquier usuario del destino. Por el stdin del canal `exec` no pasa por ningún argv, ningún historial ni ningún proceso intermedio, y al no concatenarse a un comando tampoco permite inyección. Es la misma credencial con la que ya se autenticó la sesión, y no llega a install.sh: la consume el sudo que lo invoca. La cadena queda root -> sudo -n -> sudo -S -> actualización en sitio -> user-service. Windows: el sello config\.version se leía UNA sola vez. Como el bootstrap está acotado a 20s y desempacar un onefile de ~270 MB con Defender escaneando se pasa de largo, el sello conservaba la versión anterior y una actualización correcta fallaba con 502. En instalación nueva no se notaba (no hay sello previo), así que rompía solo las actualizaciones. Ahora reintenta, como ya hacía Linux. Y la verificación daba por buena cualquier tarea con un State no vacío. `Ready` es una tarea registrada que NO está corriendo: justo lo que se ve cuando el agente arrancó y murió. Ahora se comprueba el proceso vivo, y en todos los modos — antes se salía antes de mirar nada si el arranque no era 'service'. Las actualizaciones pasan por install.ps1 -UpdateInPlace, y su código 75 se traduce al 409 amable que ya tenía Linux. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>