Files
fn_registry/functions/infra/systemd_status.go
T
egutierrez f21664e052 feat: funciones Go de deploy — systemd, VPS setup, deploy remoto
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.
2026-04-12 17:29:52 +02:00

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
}