Explorar el Código

fix #1643 : deal with null heartbeat (#1645)

Thibault "bui" Koechlin hace 3 años
padre
commit
920f3d2a7d
Se han modificado 1 ficheros con 21 adiciones y 7 borrados
  1. 21 7
      cmd/crowdsec-cli/machines.go

+ 21 - 7
cmd/crowdsec-cli/machines.go

@@ -14,6 +14,7 @@ import (
 	"github.com/AlecAivazis/survey/v2"
 	"github.com/crowdsecurity/crowdsec/pkg/csconfig"
 	"github.com/crowdsecurity/crowdsec/pkg/database"
+	"github.com/crowdsecurity/crowdsec/pkg/database/ent"
 	"github.com/crowdsecurity/crowdsec/pkg/types"
 	"github.com/crowdsecurity/machineid"
 	"github.com/enescakir/emoji"
@@ -90,6 +91,24 @@ func generateID(prefix string) (string, error) {
 	return prefix + suffix, nil
 }
 
+func displayLastHeartBeat(m *ent.Machine, fancy bool) string {
+	var hbDisplay string
+
+	if m.LastHeartbeat != nil {
+		lastHeartBeat := time.Now().UTC().Sub(*m.LastHeartbeat)
+		hbDisplay = lastHeartBeat.Truncate(time.Second).String()
+		if fancy && lastHeartBeat > 2*time.Minute {
+			hbDisplay = fmt.Sprintf("%s %s", emoji.Warning.String(), lastHeartBeat.Truncate(time.Second).String())
+		}
+	} else {
+		hbDisplay = "-"
+		if fancy {
+			hbDisplay = emoji.Warning.String() + " -"
+		}
+	}
+	return hbDisplay
+}
+
 func NewMachinesCmd() *cobra.Command {
 	/* ---- DECISIONS COMMAND */
 	var cmdMachines = &cobra.Command{
@@ -149,12 +168,7 @@ Note: This command requires database direct access, so is intended to be run on
 					} else {
 						validated = emoji.Prohibited.String()
 					}
-					lastHeartBeat := time.Now().UTC().Sub(*w.LastHeartbeat)
-					hbDisplay := lastHeartBeat.Truncate(time.Second).String()
-					if lastHeartBeat > 2*time.Minute {
-						hbDisplay = fmt.Sprintf("%s %s", emoji.Warning.String(), lastHeartBeat.Truncate(time.Second).String())
-					}
-					table.Append([]string{w.MachineId, w.IpAddress, w.UpdatedAt.Format(time.RFC3339), validated, w.Version, w.AuthType, hbDisplay})
+					table.Append([]string{w.MachineId, w.IpAddress, w.UpdatedAt.Format(time.RFC3339), validated, w.Version, w.AuthType, displayLastHeartBeat(w, true)})
 				}
 				table.Render()
 			} else if csConfig.Cscli.Output == "json" {
@@ -176,7 +190,7 @@ Note: This command requires database direct access, so is intended to be run on
 					} else {
 						validated = "false"
 					}
-					err := csvwriter.Write([]string{w.MachineId, w.IpAddress, w.UpdatedAt.Format(time.RFC3339), validated, w.Version, w.AuthType, time.Now().UTC().Sub(*w.LastHeartbeat).Truncate(time.Second).String()})
+					err := csvwriter.Write([]string{w.MachineId, w.IpAddress, w.UpdatedAt.Format(time.RFC3339), validated, w.Version, w.AuthType, displayLastHeartBeat(w, false)})
 					if err != nil {
 						log.Fatalf("failed to write raw output : %s", err)
 					}