diff --git a/cmd/headscale/cli/nodes.go b/cmd/headscale/cli/nodes.go index b9e97a33..8ffc85f6 100644 --- a/cmd/headscale/cli/nodes.go +++ b/cmd/headscale/cli/nodes.go @@ -39,33 +39,33 @@ func init() { err := registerNodeCmd.MarkFlagRequired("user") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } registerNodeCmd.Flags().StringP("key", "k", "", "Key") err = registerNodeCmd.MarkFlagRequired("key") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } nodeCmd.AddCommand(registerNodeCmd) expireNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") err = expireNodeCmd.MarkFlagRequired("identifier") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } nodeCmd.AddCommand(expireNodeCmd) renameNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") err = renameNodeCmd.MarkFlagRequired("identifier") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } nodeCmd.AddCommand(renameNodeCmd) deleteNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") err = deleteNodeCmd.MarkFlagRequired("identifier") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } nodeCmd.AddCommand(deleteNodeCmd) @@ -73,7 +73,7 @@ func init() { err = moveNodeCmd.MarkFlagRequired("identifier") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } moveNodeCmd.Flags().StringP("user", "u", "", "New user") @@ -85,7 +85,7 @@ func init() { err = moveNodeCmd.MarkFlagRequired("user") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } nodeCmd.AddCommand(moveNodeCmd) @@ -93,7 +93,7 @@ func init() { err = tagCmd.MarkFlagRequired("identifier") if err != nil { - log.Fatalf(err.Error()) + log.Fatal(err.Error()) } tagCmd.Flags(). StringSliceP("tags", "t", []string{}, "List of tags to add to the node") diff --git a/hscontrol/grpcv1.go b/hscontrol/grpcv1.go index 607ebdc7..02fcd3db 100644 --- a/hscontrol/grpcv1.go +++ b/hscontrol/grpcv1.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/puzpuzpuz/xsync/v3" "github.com/rs/zerolog/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -21,6 +22,7 @@ import ( v1 "github.com/juanfont/headscale/gen/go/headscale/v1" "github.com/juanfont/headscale/hscontrol/db" + "github.com/juanfont/headscale/hscontrol/policy" "github.com/juanfont/headscale/hscontrol/types" "github.com/juanfont/headscale/hscontrol/util" ) @@ -457,19 +459,7 @@ func (api headscaleV1APIServer) ListNodes( return nil, err } - response := make([]*v1.Node, len(nodes)) - for index, node := range nodes { - resp := node.Proto() - - // Populate the online field based on - // currently connected nodes. - if val, ok := isLikelyConnected.Load(node.ID); ok && val { - resp.Online = true - } - - response[index] = resp - } - + response := nodesToProto(api.h.polMan, isLikelyConnected, nodes) return &v1.ListNodesResponse{Nodes: response}, nil } @@ -482,6 +472,11 @@ func (api headscaleV1APIServer) ListNodes( return nodes[i].ID < nodes[j].ID }) + response := nodesToProto(api.h.polMan, isLikelyConnected, nodes) + return &v1.ListNodesResponse{Nodes: response}, nil +} + +func nodesToProto(polMan policy.PolicyManager, isLikelyConnected *xsync.MapOf[types.NodeID, bool], nodes types.Nodes) []*v1.Node { response := make([]*v1.Node, len(nodes)) for index, node := range nodes { resp := node.Proto() @@ -492,12 +487,12 @@ func (api headscaleV1APIServer) ListNodes( resp.Online = true } - validTags := api.h.polMan.Tags(node) + validTags := polMan.Tags(node) resp.ValidTags = validTags response[index] = resp } - return &v1.ListNodesResponse{Nodes: response}, nil + return response } func (api headscaleV1APIServer) MoveNode(