f21664e052
Nuevas funciones infra para deploy sin Docker: generación de units systemd (pura), instalación/restart/status de servicios remotos via SSH, setup inicial de VPS (crear dirs, usuario, permisos), y pipelines de deploy completo (setup_vps_app, deploy_app_remote). Incluye tipo DeployConfig con la configuración de deploy por app.
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package infra
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// SystemdServiceStatus resultado de consultar el estado de un servicio systemd.
|
|
type SystemdServiceStatus struct {
|
|
Unit string
|
|
Active string // "active", "inactive", "failed"
|
|
SubState string // "running", "dead", "failed"
|
|
MainPID string
|
|
Logs string
|
|
}
|
|
|
|
// SystemdStatus consulta el estado de un servicio systemd en un host remoto.
|
|
func SystemdStatus(conn SSHConn, unitName string, logLines int) (SystemdServiceStatus, error) {
|
|
status := SystemdServiceStatus{Unit: unitName}
|
|
|
|
// Obtener propiedades del servicio
|
|
cmd := fmt.Sprintf("systemctl show %s --property=ActiveState,SubState,MainPID --no-pager", unitName)
|
|
stdout, stderr, code, err := SSHExec(conn, cmd)
|
|
if err != nil {
|
|
return status, fmt.Errorf("systemd_status: ssh exec: %w", err)
|
|
}
|
|
if code != 0 {
|
|
return status, fmt.Errorf("systemd_status: systemctl show: %s", stderr)
|
|
}
|
|
|
|
// Parsear propiedades key=value
|
|
for _, line := range strings.Split(stdout, "\n") {
|
|
parts := strings.SplitN(line, "=", 2)
|
|
if len(parts) != 2 {
|
|
continue
|
|
}
|
|
switch parts[0] {
|
|
case "ActiveState":
|
|
status.Active = parts[1]
|
|
case "SubState":
|
|
status.SubState = parts[1]
|
|
case "MainPID":
|
|
status.MainPID = parts[1]
|
|
}
|
|
}
|
|
|
|
// Obtener logs recientes
|
|
if logLines > 0 {
|
|
logCmd := fmt.Sprintf("journalctl -u %s -n %d --no-pager 2>/dev/null || true", unitName, logLines)
|
|
logOut, _, _, logErr := SSHExec(conn, logCmd)
|
|
if logErr == nil {
|
|
status.Logs = strings.TrimSpace(logOut)
|
|
}
|
|
}
|
|
|
|
return status, nil
|
|
}
|