diff --git a/cmd/headscale/cli/nodes.go b/cmd/headscale/cli/nodes.go index caac986c..5874fd9f 100644 --- a/cmd/headscale/cli/nodes.go +++ b/cmd/headscale/cli/nodes.go @@ -16,6 +16,7 @@ import ( "github.com/samber/lo" "github.com/spf13/cobra" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" "tailscale.com/types/key" ) @@ -58,6 +59,18 @@ func init() { } nodeCmd.AddCommand(expireNodeCmd) + extendNodeExpirationCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") + err = extendNodeExpirationCmd.MarkFlagRequired("identifier") + if err != nil { + log.Fatal(err.Error()) + } + extendNodeExpirationCmd.Flags().StringP("new-expiry", "e", "", "New expiration time in RFC3339 format, e.g., 2024-01-01T15:04:05Z") + err = extendNodeExpirationCmd.MarkFlagRequired("new-expiry") + if err != nil { + log.Fatal(err.Error()) + } + nodeCmd.AddCommand(extendNodeExpirationCmd) + renameNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") err = renameNodeCmd.MarkFlagRequired("identifier") if err != nil { @@ -320,6 +333,55 @@ var expireNodeCmd = &cobra.Command{ }, } +var extendNodeExpirationCmd = &cobra.Command{ + Use: "extend-expiration", + Short: "Extends the expiration of a node by setting a new expiration time", + Run: func(cmd *cobra.Command, args []string) { + output, _ := cmd.Flags().GetString("output") + nodeID, err := cmd.Flags().GetUint64("identifier") + if err != nil { + ErrorOutput(err, fmt.Sprintf("Error getting identifier from flag: %s", err), output) + } + + newExpiryStr, err := cmd.Flags().GetString("new-expiry") + if err != nil { + ErrorOutput(err, fmt.Sprintf("Error getting new-expiry from flag: %s", err), output) + } + + // Parse the new-expiry timestamp from string to time.Time + newExpiry, err := time.Parse(time.RFC3339, newExpiryStr) + if err != nil { + ErrorOutput(err, fmt.Sprintf("Invalid expiration time format: must be in RFC3339 format, %s", err), output) + } + + // Set up context and gRPC client + ctx, client, conn, cancel := newHeadscaleCLIWithConfig() + defer cancel() + defer conn.Close() + + // Build the gRPC request + request := &v1.ExtendNodeExpirationRequest{ + NodeId: nodeID, + NewExpiration: timestamppb.New(newExpiry), // convert time.Time to protobuf timestamp + } + + // Make the gRPC call + response, err := client.ExtendNodeExpiration(ctx, request) + if err != nil { + st, ok := status.FromError(err) + if ok { + ErrorOutput(st.Err(), st.Message(), output) + } else { + ErrorOutput(err, "Unexpected error during ExtendNodeExpiration RPC call", output) + } + return + } + + // Print the result + SuccessOutput(response, "Node expiration extended successfully", output) + }, +} + var renameNodeCmd = &cobra.Command{ Use: "rename NEW_NAME", Short: "Renames a node in your network", diff --git a/gen/go/headscale/v1/headscale.pb.go b/gen/go/headscale/v1/headscale.pb.go index aa3380c6..f2ff80ae 100644 --- a/gen/go/headscale/v1/headscale.pb.go +++ b/gen/go/headscale/v1/headscale.pb.go @@ -25,7 +25,7 @@ var File_headscale_v1_headscale_proto protoreflect.FileDescriptor const file_headscale_v1_headscale_proto_rawDesc = "" + "\n" + - "\x1cheadscale/v1/headscale.proto\x12\fheadscale.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17headscale/v1/user.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/node.proto\x1a\x19headscale/v1/apikey.proto\x1a\x19headscale/v1/policy.proto2\xa3\x16\n" + + "\x1cheadscale/v1/headscale.proto\x12\fheadscale.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17headscale/v1/user.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/node.proto\x1a\x19headscale/v1/apikey.proto\x1a\x19headscale/v1/policy.proto2\xc8\x17\n" + "\x10HeadscaleService\x12h\n" + "\n" + "CreateUser\x12\x1f.headscale.v1.CreateUserRequest\x1a .headscale.v1.CreateUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/api/v1/user\x12\x80\x01\n" + @@ -45,7 +45,8 @@ const file_headscale_v1_headscale_proto_rawDesc = "" + "\n" + "DeleteNode\x12\x1f.headscale.v1.DeleteNodeRequest\x1a .headscale.v1.DeleteNodeResponse\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/api/v1/node/{node_id}\x12v\n" + "\n" + - "ExpireNode\x12\x1f.headscale.v1.ExpireNodeRequest\x1a .headscale.v1.ExpireNodeResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/api/v1/node/{node_id}/expire\x12\x81\x01\n" + + "ExpireNode\x12\x1f.headscale.v1.ExpireNodeRequest\x1a .headscale.v1.ExpireNodeResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/api/v1/node/{node_id}/expire\x12\xa2\x01\n" + + "\x14ExtendNodeExpiration\x12).headscale.v1.ExtendNodeExpirationRequest\x1a*.headscale.v1.ExtendNodeExpirationResponse\"3\x82\xd3\xe4\x93\x02-:\x01*\"(/api/v1/node/{node_id}/extend_expiration\x12\x81\x01\n" + "\n" + "RenameNode\x12\x1f.headscale.v1.RenameNodeRequest\x1a .headscale.v1.RenameNodeResponse\"0\x82\xd3\xe4\x93\x02*\"(/api/v1/node/{node_id}/rename/{new_name}\x12b\n" + "\tListNodes\x12\x1e.headscale.v1.ListNodesRequest\x1a\x1f.headscale.v1.ListNodesResponse\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/api/v1/node\x12q\n" + @@ -59,54 +60,56 @@ const file_headscale_v1_headscale_proto_rawDesc = "" + "\tSetPolicy\x12\x1e.headscale.v1.SetPolicyRequest\x1a\x1f.headscale.v1.SetPolicyResponse\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\x1a\x0e/api/v1/policyB)Z'github.com/juanfont/headscale/gen/go/v1b\x06proto3" var file_headscale_v1_headscale_proto_goTypes = []any{ - (*CreateUserRequest)(nil), // 0: headscale.v1.CreateUserRequest - (*RenameUserRequest)(nil), // 1: headscale.v1.RenameUserRequest - (*DeleteUserRequest)(nil), // 2: headscale.v1.DeleteUserRequest - (*ListUsersRequest)(nil), // 3: headscale.v1.ListUsersRequest - (*CreatePreAuthKeyRequest)(nil), // 4: headscale.v1.CreatePreAuthKeyRequest - (*ExpirePreAuthKeyRequest)(nil), // 5: headscale.v1.ExpirePreAuthKeyRequest - (*ListPreAuthKeysRequest)(nil), // 6: headscale.v1.ListPreAuthKeysRequest - (*DebugCreateNodeRequest)(nil), // 7: headscale.v1.DebugCreateNodeRequest - (*GetNodeRequest)(nil), // 8: headscale.v1.GetNodeRequest - (*SetTagsRequest)(nil), // 9: headscale.v1.SetTagsRequest - (*SetApprovedRoutesRequest)(nil), // 10: headscale.v1.SetApprovedRoutesRequest - (*RegisterNodeRequest)(nil), // 11: headscale.v1.RegisterNodeRequest - (*DeleteNodeRequest)(nil), // 12: headscale.v1.DeleteNodeRequest - (*ExpireNodeRequest)(nil), // 13: headscale.v1.ExpireNodeRequest - (*RenameNodeRequest)(nil), // 14: headscale.v1.RenameNodeRequest - (*ListNodesRequest)(nil), // 15: headscale.v1.ListNodesRequest - (*MoveNodeRequest)(nil), // 16: headscale.v1.MoveNodeRequest - (*BackfillNodeIPsRequest)(nil), // 17: headscale.v1.BackfillNodeIPsRequest - (*CreateApiKeyRequest)(nil), // 18: headscale.v1.CreateApiKeyRequest - (*ExpireApiKeyRequest)(nil), // 19: headscale.v1.ExpireApiKeyRequest - (*ListApiKeysRequest)(nil), // 20: headscale.v1.ListApiKeysRequest - (*DeleteApiKeyRequest)(nil), // 21: headscale.v1.DeleteApiKeyRequest - (*GetPolicyRequest)(nil), // 22: headscale.v1.GetPolicyRequest - (*SetPolicyRequest)(nil), // 23: headscale.v1.SetPolicyRequest - (*CreateUserResponse)(nil), // 24: headscale.v1.CreateUserResponse - (*RenameUserResponse)(nil), // 25: headscale.v1.RenameUserResponse - (*DeleteUserResponse)(nil), // 26: headscale.v1.DeleteUserResponse - (*ListUsersResponse)(nil), // 27: headscale.v1.ListUsersResponse - (*CreatePreAuthKeyResponse)(nil), // 28: headscale.v1.CreatePreAuthKeyResponse - (*ExpirePreAuthKeyResponse)(nil), // 29: headscale.v1.ExpirePreAuthKeyResponse - (*ListPreAuthKeysResponse)(nil), // 30: headscale.v1.ListPreAuthKeysResponse - (*DebugCreateNodeResponse)(nil), // 31: headscale.v1.DebugCreateNodeResponse - (*GetNodeResponse)(nil), // 32: headscale.v1.GetNodeResponse - (*SetTagsResponse)(nil), // 33: headscale.v1.SetTagsResponse - (*SetApprovedRoutesResponse)(nil), // 34: headscale.v1.SetApprovedRoutesResponse - (*RegisterNodeResponse)(nil), // 35: headscale.v1.RegisterNodeResponse - (*DeleteNodeResponse)(nil), // 36: headscale.v1.DeleteNodeResponse - (*ExpireNodeResponse)(nil), // 37: headscale.v1.ExpireNodeResponse - (*RenameNodeResponse)(nil), // 38: headscale.v1.RenameNodeResponse - (*ListNodesResponse)(nil), // 39: headscale.v1.ListNodesResponse - (*MoveNodeResponse)(nil), // 40: headscale.v1.MoveNodeResponse - (*BackfillNodeIPsResponse)(nil), // 41: headscale.v1.BackfillNodeIPsResponse - (*CreateApiKeyResponse)(nil), // 42: headscale.v1.CreateApiKeyResponse - (*ExpireApiKeyResponse)(nil), // 43: headscale.v1.ExpireApiKeyResponse - (*ListApiKeysResponse)(nil), // 44: headscale.v1.ListApiKeysResponse - (*DeleteApiKeyResponse)(nil), // 45: headscale.v1.DeleteApiKeyResponse - (*GetPolicyResponse)(nil), // 46: headscale.v1.GetPolicyResponse - (*SetPolicyResponse)(nil), // 47: headscale.v1.SetPolicyResponse + (*CreateUserRequest)(nil), // 0: headscale.v1.CreateUserRequest + (*RenameUserRequest)(nil), // 1: headscale.v1.RenameUserRequest + (*DeleteUserRequest)(nil), // 2: headscale.v1.DeleteUserRequest + (*ListUsersRequest)(nil), // 3: headscale.v1.ListUsersRequest + (*CreatePreAuthKeyRequest)(nil), // 4: headscale.v1.CreatePreAuthKeyRequest + (*ExpirePreAuthKeyRequest)(nil), // 5: headscale.v1.ExpirePreAuthKeyRequest + (*ListPreAuthKeysRequest)(nil), // 6: headscale.v1.ListPreAuthKeysRequest + (*DebugCreateNodeRequest)(nil), // 7: headscale.v1.DebugCreateNodeRequest + (*GetNodeRequest)(nil), // 8: headscale.v1.GetNodeRequest + (*SetTagsRequest)(nil), // 9: headscale.v1.SetTagsRequest + (*SetApprovedRoutesRequest)(nil), // 10: headscale.v1.SetApprovedRoutesRequest + (*RegisterNodeRequest)(nil), // 11: headscale.v1.RegisterNodeRequest + (*DeleteNodeRequest)(nil), // 12: headscale.v1.DeleteNodeRequest + (*ExpireNodeRequest)(nil), // 13: headscale.v1.ExpireNodeRequest + (*ExtendNodeExpirationRequest)(nil), // 14: headscale.v1.ExtendNodeExpirationRequest + (*RenameNodeRequest)(nil), // 15: headscale.v1.RenameNodeRequest + (*ListNodesRequest)(nil), // 16: headscale.v1.ListNodesRequest + (*MoveNodeRequest)(nil), // 17: headscale.v1.MoveNodeRequest + (*BackfillNodeIPsRequest)(nil), // 18: headscale.v1.BackfillNodeIPsRequest + (*CreateApiKeyRequest)(nil), // 19: headscale.v1.CreateApiKeyRequest + (*ExpireApiKeyRequest)(nil), // 20: headscale.v1.ExpireApiKeyRequest + (*ListApiKeysRequest)(nil), // 21: headscale.v1.ListApiKeysRequest + (*DeleteApiKeyRequest)(nil), // 22: headscale.v1.DeleteApiKeyRequest + (*GetPolicyRequest)(nil), // 23: headscale.v1.GetPolicyRequest + (*SetPolicyRequest)(nil), // 24: headscale.v1.SetPolicyRequest + (*CreateUserResponse)(nil), // 25: headscale.v1.CreateUserResponse + (*RenameUserResponse)(nil), // 26: headscale.v1.RenameUserResponse + (*DeleteUserResponse)(nil), // 27: headscale.v1.DeleteUserResponse + (*ListUsersResponse)(nil), // 28: headscale.v1.ListUsersResponse + (*CreatePreAuthKeyResponse)(nil), // 29: headscale.v1.CreatePreAuthKeyResponse + (*ExpirePreAuthKeyResponse)(nil), // 30: headscale.v1.ExpirePreAuthKeyResponse + (*ListPreAuthKeysResponse)(nil), // 31: headscale.v1.ListPreAuthKeysResponse + (*DebugCreateNodeResponse)(nil), // 32: headscale.v1.DebugCreateNodeResponse + (*GetNodeResponse)(nil), // 33: headscale.v1.GetNodeResponse + (*SetTagsResponse)(nil), // 34: headscale.v1.SetTagsResponse + (*SetApprovedRoutesResponse)(nil), // 35: headscale.v1.SetApprovedRoutesResponse + (*RegisterNodeResponse)(nil), // 36: headscale.v1.RegisterNodeResponse + (*DeleteNodeResponse)(nil), // 37: headscale.v1.DeleteNodeResponse + (*ExpireNodeResponse)(nil), // 38: headscale.v1.ExpireNodeResponse + (*ExtendNodeExpirationResponse)(nil), // 39: headscale.v1.ExtendNodeExpirationResponse + (*RenameNodeResponse)(nil), // 40: headscale.v1.RenameNodeResponse + (*ListNodesResponse)(nil), // 41: headscale.v1.ListNodesResponse + (*MoveNodeResponse)(nil), // 42: headscale.v1.MoveNodeResponse + (*BackfillNodeIPsResponse)(nil), // 43: headscale.v1.BackfillNodeIPsResponse + (*CreateApiKeyResponse)(nil), // 44: headscale.v1.CreateApiKeyResponse + (*ExpireApiKeyResponse)(nil), // 45: headscale.v1.ExpireApiKeyResponse + (*ListApiKeysResponse)(nil), // 46: headscale.v1.ListApiKeysResponse + (*DeleteApiKeyResponse)(nil), // 47: headscale.v1.DeleteApiKeyResponse + (*GetPolicyResponse)(nil), // 48: headscale.v1.GetPolicyResponse + (*SetPolicyResponse)(nil), // 49: headscale.v1.SetPolicyResponse } var file_headscale_v1_headscale_proto_depIdxs = []int32{ 0, // 0: headscale.v1.HeadscaleService.CreateUser:input_type -> headscale.v1.CreateUserRequest @@ -123,42 +126,44 @@ var file_headscale_v1_headscale_proto_depIdxs = []int32{ 11, // 11: headscale.v1.HeadscaleService.RegisterNode:input_type -> headscale.v1.RegisterNodeRequest 12, // 12: headscale.v1.HeadscaleService.DeleteNode:input_type -> headscale.v1.DeleteNodeRequest 13, // 13: headscale.v1.HeadscaleService.ExpireNode:input_type -> headscale.v1.ExpireNodeRequest - 14, // 14: headscale.v1.HeadscaleService.RenameNode:input_type -> headscale.v1.RenameNodeRequest - 15, // 15: headscale.v1.HeadscaleService.ListNodes:input_type -> headscale.v1.ListNodesRequest - 16, // 16: headscale.v1.HeadscaleService.MoveNode:input_type -> headscale.v1.MoveNodeRequest - 17, // 17: headscale.v1.HeadscaleService.BackfillNodeIPs:input_type -> headscale.v1.BackfillNodeIPsRequest - 18, // 18: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest - 19, // 19: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest - 20, // 20: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest - 21, // 21: headscale.v1.HeadscaleService.DeleteApiKey:input_type -> headscale.v1.DeleteApiKeyRequest - 22, // 22: headscale.v1.HeadscaleService.GetPolicy:input_type -> headscale.v1.GetPolicyRequest - 23, // 23: headscale.v1.HeadscaleService.SetPolicy:input_type -> headscale.v1.SetPolicyRequest - 24, // 24: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse - 25, // 25: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse - 26, // 26: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse - 27, // 27: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse - 28, // 28: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse - 29, // 29: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse - 30, // 30: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse - 31, // 31: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse - 32, // 32: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse - 33, // 33: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse - 34, // 34: headscale.v1.HeadscaleService.SetApprovedRoutes:output_type -> headscale.v1.SetApprovedRoutesResponse - 35, // 35: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse - 36, // 36: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse - 37, // 37: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse - 38, // 38: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse - 39, // 39: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse - 40, // 40: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse - 41, // 41: headscale.v1.HeadscaleService.BackfillNodeIPs:output_type -> headscale.v1.BackfillNodeIPsResponse - 42, // 42: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse - 43, // 43: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse - 44, // 44: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse - 45, // 45: headscale.v1.HeadscaleService.DeleteApiKey:output_type -> headscale.v1.DeleteApiKeyResponse - 46, // 46: headscale.v1.HeadscaleService.GetPolicy:output_type -> headscale.v1.GetPolicyResponse - 47, // 47: headscale.v1.HeadscaleService.SetPolicy:output_type -> headscale.v1.SetPolicyResponse - 24, // [24:48] is the sub-list for method output_type - 0, // [0:24] is the sub-list for method input_type + 14, // 14: headscale.v1.HeadscaleService.ExtendNodeExpiration:input_type -> headscale.v1.ExtendNodeExpirationRequest + 15, // 15: headscale.v1.HeadscaleService.RenameNode:input_type -> headscale.v1.RenameNodeRequest + 16, // 16: headscale.v1.HeadscaleService.ListNodes:input_type -> headscale.v1.ListNodesRequest + 17, // 17: headscale.v1.HeadscaleService.MoveNode:input_type -> headscale.v1.MoveNodeRequest + 18, // 18: headscale.v1.HeadscaleService.BackfillNodeIPs:input_type -> headscale.v1.BackfillNodeIPsRequest + 19, // 19: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest + 20, // 20: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest + 21, // 21: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest + 22, // 22: headscale.v1.HeadscaleService.DeleteApiKey:input_type -> headscale.v1.DeleteApiKeyRequest + 23, // 23: headscale.v1.HeadscaleService.GetPolicy:input_type -> headscale.v1.GetPolicyRequest + 24, // 24: headscale.v1.HeadscaleService.SetPolicy:input_type -> headscale.v1.SetPolicyRequest + 25, // 25: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse + 26, // 26: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse + 27, // 27: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse + 28, // 28: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse + 29, // 29: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse + 30, // 30: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse + 31, // 31: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse + 32, // 32: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse + 33, // 33: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse + 34, // 34: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse + 35, // 35: headscale.v1.HeadscaleService.SetApprovedRoutes:output_type -> headscale.v1.SetApprovedRoutesResponse + 36, // 36: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse + 37, // 37: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse + 38, // 38: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse + 39, // 39: headscale.v1.HeadscaleService.ExtendNodeExpiration:output_type -> headscale.v1.ExtendNodeExpirationResponse + 40, // 40: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse + 41, // 41: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse + 42, // 42: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse + 43, // 43: headscale.v1.HeadscaleService.BackfillNodeIPs:output_type -> headscale.v1.BackfillNodeIPsResponse + 44, // 44: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse + 45, // 45: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse + 46, // 46: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse + 47, // 47: headscale.v1.HeadscaleService.DeleteApiKey:output_type -> headscale.v1.DeleteApiKeyResponse + 48, // 48: headscale.v1.HeadscaleService.GetPolicy:output_type -> headscale.v1.GetPolicyResponse + 49, // 49: headscale.v1.HeadscaleService.SetPolicy:output_type -> headscale.v1.SetPolicyResponse + 25, // [25:50] is the sub-list for method output_type + 0, // [0:25] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/gen/go/headscale/v1/headscale.pb.gw.go b/gen/go/headscale/v1/headscale.pb.gw.go index 2e1cc480..3580360b 100644 --- a/gen/go/headscale/v1/headscale.pb.gw.go +++ b/gen/go/headscale/v1/headscale.pb.gw.go @@ -43,6 +43,9 @@ func request_HeadscaleService_CreateUser_0(ctx context.Context, marshaler runtim if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -65,6 +68,9 @@ func request_HeadscaleService_RenameUser_0(ctx context.Context, marshaler runtim metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["old_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "old_id") @@ -117,6 +123,9 @@ func request_HeadscaleService_DeleteUser_0(ctx context.Context, marshaler runtim metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") @@ -154,6 +163,9 @@ func request_HeadscaleService_ListUsers_0(ctx context.Context, marshaler runtime protoReq ListUsersRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -187,6 +199,9 @@ func request_HeadscaleService_CreatePreAuthKey_0(ctx context.Context, marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreatePreAuthKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -211,6 +226,9 @@ func request_HeadscaleService_ExpirePreAuthKey_0(ctx context.Context, marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ExpirePreAuthKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -234,6 +252,9 @@ func request_HeadscaleService_ListPreAuthKeys_0(ctx context.Context, marshaler r protoReq ListPreAuthKeysRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -267,6 +288,9 @@ func request_HeadscaleService_DebugCreateNode_0(ctx context.Context, marshaler r if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.DebugCreateNode(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -289,6 +313,9 @@ func request_HeadscaleService_GetNode_0(ctx context.Context, marshaler runtime.M metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -328,6 +355,9 @@ func request_HeadscaleService_SetTags_0(ctx context.Context, marshaler runtime.M if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -370,6 +400,9 @@ func request_HeadscaleService_SetApprovedRoutes_0(ctx context.Context, marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -410,6 +443,9 @@ func request_HeadscaleService_RegisterNode_0(ctx context.Context, marshaler runt protoReq RegisterNodeRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -441,6 +477,9 @@ func request_HeadscaleService_DeleteNode_0(ctx context.Context, marshaler runtim metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -477,6 +516,9 @@ func request_HeadscaleService_ExpireNode_0(ctx context.Context, marshaler runtim metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -507,12 +549,63 @@ func local_request_HeadscaleService_ExpireNode_0(ctx context.Context, marshaler return msg, metadata, err } +func request_HeadscaleService_ExtendNodeExpiration_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ExtendNodeExpirationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["node_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") + } + protoReq.NodeId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "node_id", err) + } + msg, err := client.ExtendNodeExpiration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_HeadscaleService_ExtendNodeExpiration_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq ExtendNodeExpirationRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + val, ok := pathParams["node_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") + } + protoReq.NodeId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "node_id", err) + } + msg, err := server.ExtendNodeExpiration(ctx, &protoReq) + return msg, metadata, err +} + func request_HeadscaleService_RenameNode_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq RenameNodeRequest metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -566,6 +659,9 @@ func request_HeadscaleService_ListNodes_0(ctx context.Context, marshaler runtime protoReq ListNodesRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -600,6 +696,9 @@ func request_HeadscaleService_MoveNode_0(ctx context.Context, marshaler runtime. if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["node_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "node_id") @@ -640,6 +739,9 @@ func request_HeadscaleService_BackfillNodeIPs_0(ctx context.Context, marshaler r protoReq BackfillNodeIPsRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -673,6 +775,9 @@ func request_HeadscaleService_CreateApiKey_0(ctx context.Context, marshaler runt if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateApiKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -697,6 +802,9 @@ func request_HeadscaleService_ExpireApiKey_0(ctx context.Context, marshaler runt if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ExpireApiKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -718,6 +826,9 @@ func request_HeadscaleService_ListApiKeys_0(ctx context.Context, marshaler runti protoReq ListApiKeysRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ListApiKeys(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -737,6 +848,9 @@ func request_HeadscaleService_DeleteApiKey_0(ctx context.Context, marshaler runt metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["prefix"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "prefix") @@ -772,6 +886,9 @@ func request_HeadscaleService_GetPolicy_0(ctx context.Context, marshaler runtime protoReq GetPolicyRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -793,6 +910,9 @@ func request_HeadscaleService_SetPolicy_0(ctx context.Context, marshaler runtime if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.SetPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -1095,6 +1215,26 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser } forward_HeadscaleService_ExpireNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_HeadscaleService_ExtendNodeExpiration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ExtendNodeExpiration", runtime.WithHTTPPathPattern("/api/v1/node/{node_id}/extend_expiration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_HeadscaleService_ExtendNodeExpiration_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_HeadscaleService_ExtendNodeExpiration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_HeadscaleService_RenameNode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1573,6 +1713,23 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser } forward_HeadscaleService_ExpireNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPost, pattern_HeadscaleService_ExtendNodeExpiration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ExtendNodeExpiration", runtime.WithHTTPPathPattern("/api/v1/node/{node_id}/extend_expiration")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_HeadscaleService_ExtendNodeExpiration_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_HeadscaleService_ExtendNodeExpiration_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_HeadscaleService_RenameNode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1747,55 +1904,57 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser } var ( - pattern_HeadscaleService_CreateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) - pattern_HeadscaleService_RenameUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "user", "old_id", "rename", "new_name"}, "")) - pattern_HeadscaleService_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "user", "id"}, "")) - pattern_HeadscaleService_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) - pattern_HeadscaleService_CreatePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, "")) - pattern_HeadscaleService_ExpirePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "preauthkey", "expire"}, "")) - pattern_HeadscaleService_ListPreAuthKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, "")) - pattern_HeadscaleService_DebugCreateNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "debug", "node"}, "")) - pattern_HeadscaleService_GetNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "node", "node_id"}, "")) - pattern_HeadscaleService_SetTags_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "tags"}, "")) - pattern_HeadscaleService_SetApprovedRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "approve_routes"}, "")) - pattern_HeadscaleService_RegisterNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "node", "register"}, "")) - pattern_HeadscaleService_DeleteNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "node", "node_id"}, "")) - pattern_HeadscaleService_ExpireNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "expire"}, "")) - pattern_HeadscaleService_RenameNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "node", "node_id", "rename", "new_name"}, "")) - pattern_HeadscaleService_ListNodes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "node"}, "")) - pattern_HeadscaleService_MoveNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "user"}, "")) - pattern_HeadscaleService_BackfillNodeIPs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "node", "backfillips"}, "")) - pattern_HeadscaleService_CreateApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "apikey"}, "")) - pattern_HeadscaleService_ExpireApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "apikey", "expire"}, "")) - pattern_HeadscaleService_ListApiKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "apikey"}, "")) - pattern_HeadscaleService_DeleteApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "apikey", "prefix"}, "")) - pattern_HeadscaleService_GetPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "policy"}, "")) - pattern_HeadscaleService_SetPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "policy"}, "")) + pattern_HeadscaleService_CreateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) + pattern_HeadscaleService_RenameUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "user", "old_id", "rename", "new_name"}, "")) + pattern_HeadscaleService_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "user", "id"}, "")) + pattern_HeadscaleService_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "user"}, "")) + pattern_HeadscaleService_CreatePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, "")) + pattern_HeadscaleService_ExpirePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "preauthkey", "expire"}, "")) + pattern_HeadscaleService_ListPreAuthKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, "")) + pattern_HeadscaleService_DebugCreateNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "debug", "node"}, "")) + pattern_HeadscaleService_GetNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "node", "node_id"}, "")) + pattern_HeadscaleService_SetTags_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "tags"}, "")) + pattern_HeadscaleService_SetApprovedRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "approve_routes"}, "")) + pattern_HeadscaleService_RegisterNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "node", "register"}, "")) + pattern_HeadscaleService_DeleteNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "node", "node_id"}, "")) + pattern_HeadscaleService_ExpireNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "expire"}, "")) + pattern_HeadscaleService_ExtendNodeExpiration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "extend_expiration"}, "")) + pattern_HeadscaleService_RenameNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "node", "node_id", "rename", "new_name"}, "")) + pattern_HeadscaleService_ListNodes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "node"}, "")) + pattern_HeadscaleService_MoveNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "node", "node_id", "user"}, "")) + pattern_HeadscaleService_BackfillNodeIPs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "node", "backfillips"}, "")) + pattern_HeadscaleService_CreateApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "apikey"}, "")) + pattern_HeadscaleService_ExpireApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "apikey", "expire"}, "")) + pattern_HeadscaleService_ListApiKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "apikey"}, "")) + pattern_HeadscaleService_DeleteApiKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "apikey", "prefix"}, "")) + pattern_HeadscaleService_GetPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "policy"}, "")) + pattern_HeadscaleService_SetPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "policy"}, "")) ) var ( - forward_HeadscaleService_CreateUser_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_RenameUser_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_DeleteUser_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ListUsers_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_CreatePreAuthKey_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ExpirePreAuthKey_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ListPreAuthKeys_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_DebugCreateNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_GetNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_SetTags_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_SetApprovedRoutes_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_RegisterNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_DeleteNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ExpireNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_RenameNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ListNodes_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_MoveNode_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_BackfillNodeIPs_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_CreateApiKey_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ExpireApiKey_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_ListApiKeys_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_DeleteApiKey_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_GetPolicy_0 = runtime.ForwardResponseMessage - forward_HeadscaleService_SetPolicy_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_CreateUser_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_RenameUser_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_DeleteUser_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ListUsers_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_CreatePreAuthKey_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ExpirePreAuthKey_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ListPreAuthKeys_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_DebugCreateNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_GetNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_SetTags_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_SetApprovedRoutes_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_RegisterNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_DeleteNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ExpireNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ExtendNodeExpiration_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_RenameNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ListNodes_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_MoveNode_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_BackfillNodeIPs_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_CreateApiKey_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ExpireApiKey_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_ListApiKeys_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_DeleteApiKey_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_GetPolicy_0 = runtime.ForwardResponseMessage + forward_HeadscaleService_SetPolicy_0 = runtime.ForwardResponseMessage ) diff --git a/gen/go/headscale/v1/headscale_grpc.pb.go b/gen/go/headscale/v1/headscale_grpc.pb.go index f6d6687a..c9f0b42a 100644 --- a/gen/go/headscale/v1/headscale_grpc.pb.go +++ b/gen/go/headscale/v1/headscale_grpc.pb.go @@ -19,30 +19,31 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - HeadscaleService_CreateUser_FullMethodName = "/headscale.v1.HeadscaleService/CreateUser" - HeadscaleService_RenameUser_FullMethodName = "/headscale.v1.HeadscaleService/RenameUser" - HeadscaleService_DeleteUser_FullMethodName = "/headscale.v1.HeadscaleService/DeleteUser" - HeadscaleService_ListUsers_FullMethodName = "/headscale.v1.HeadscaleService/ListUsers" - HeadscaleService_CreatePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/CreatePreAuthKey" - HeadscaleService_ExpirePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/ExpirePreAuthKey" - HeadscaleService_ListPreAuthKeys_FullMethodName = "/headscale.v1.HeadscaleService/ListPreAuthKeys" - HeadscaleService_DebugCreateNode_FullMethodName = "/headscale.v1.HeadscaleService/DebugCreateNode" - HeadscaleService_GetNode_FullMethodName = "/headscale.v1.HeadscaleService/GetNode" - HeadscaleService_SetTags_FullMethodName = "/headscale.v1.HeadscaleService/SetTags" - HeadscaleService_SetApprovedRoutes_FullMethodName = "/headscale.v1.HeadscaleService/SetApprovedRoutes" - HeadscaleService_RegisterNode_FullMethodName = "/headscale.v1.HeadscaleService/RegisterNode" - HeadscaleService_DeleteNode_FullMethodName = "/headscale.v1.HeadscaleService/DeleteNode" - HeadscaleService_ExpireNode_FullMethodName = "/headscale.v1.HeadscaleService/ExpireNode" - HeadscaleService_RenameNode_FullMethodName = "/headscale.v1.HeadscaleService/RenameNode" - HeadscaleService_ListNodes_FullMethodName = "/headscale.v1.HeadscaleService/ListNodes" - HeadscaleService_MoveNode_FullMethodName = "/headscale.v1.HeadscaleService/MoveNode" - HeadscaleService_BackfillNodeIPs_FullMethodName = "/headscale.v1.HeadscaleService/BackfillNodeIPs" - HeadscaleService_CreateApiKey_FullMethodName = "/headscale.v1.HeadscaleService/CreateApiKey" - HeadscaleService_ExpireApiKey_FullMethodName = "/headscale.v1.HeadscaleService/ExpireApiKey" - HeadscaleService_ListApiKeys_FullMethodName = "/headscale.v1.HeadscaleService/ListApiKeys" - HeadscaleService_DeleteApiKey_FullMethodName = "/headscale.v1.HeadscaleService/DeleteApiKey" - HeadscaleService_GetPolicy_FullMethodName = "/headscale.v1.HeadscaleService/GetPolicy" - HeadscaleService_SetPolicy_FullMethodName = "/headscale.v1.HeadscaleService/SetPolicy" + HeadscaleService_CreateUser_FullMethodName = "/headscale.v1.HeadscaleService/CreateUser" + HeadscaleService_RenameUser_FullMethodName = "/headscale.v1.HeadscaleService/RenameUser" + HeadscaleService_DeleteUser_FullMethodName = "/headscale.v1.HeadscaleService/DeleteUser" + HeadscaleService_ListUsers_FullMethodName = "/headscale.v1.HeadscaleService/ListUsers" + HeadscaleService_CreatePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/CreatePreAuthKey" + HeadscaleService_ExpirePreAuthKey_FullMethodName = "/headscale.v1.HeadscaleService/ExpirePreAuthKey" + HeadscaleService_ListPreAuthKeys_FullMethodName = "/headscale.v1.HeadscaleService/ListPreAuthKeys" + HeadscaleService_DebugCreateNode_FullMethodName = "/headscale.v1.HeadscaleService/DebugCreateNode" + HeadscaleService_GetNode_FullMethodName = "/headscale.v1.HeadscaleService/GetNode" + HeadscaleService_SetTags_FullMethodName = "/headscale.v1.HeadscaleService/SetTags" + HeadscaleService_SetApprovedRoutes_FullMethodName = "/headscale.v1.HeadscaleService/SetApprovedRoutes" + HeadscaleService_RegisterNode_FullMethodName = "/headscale.v1.HeadscaleService/RegisterNode" + HeadscaleService_DeleteNode_FullMethodName = "/headscale.v1.HeadscaleService/DeleteNode" + HeadscaleService_ExpireNode_FullMethodName = "/headscale.v1.HeadscaleService/ExpireNode" + HeadscaleService_ExtendNodeExpiration_FullMethodName = "/headscale.v1.HeadscaleService/ExtendNodeExpiration" + HeadscaleService_RenameNode_FullMethodName = "/headscale.v1.HeadscaleService/RenameNode" + HeadscaleService_ListNodes_FullMethodName = "/headscale.v1.HeadscaleService/ListNodes" + HeadscaleService_MoveNode_FullMethodName = "/headscale.v1.HeadscaleService/MoveNode" + HeadscaleService_BackfillNodeIPs_FullMethodName = "/headscale.v1.HeadscaleService/BackfillNodeIPs" + HeadscaleService_CreateApiKey_FullMethodName = "/headscale.v1.HeadscaleService/CreateApiKey" + HeadscaleService_ExpireApiKey_FullMethodName = "/headscale.v1.HeadscaleService/ExpireApiKey" + HeadscaleService_ListApiKeys_FullMethodName = "/headscale.v1.HeadscaleService/ListApiKeys" + HeadscaleService_DeleteApiKey_FullMethodName = "/headscale.v1.HeadscaleService/DeleteApiKey" + HeadscaleService_GetPolicy_FullMethodName = "/headscale.v1.HeadscaleService/GetPolicy" + HeadscaleService_SetPolicy_FullMethodName = "/headscale.v1.HeadscaleService/SetPolicy" ) // HeadscaleServiceClient is the client API for HeadscaleService service. @@ -66,6 +67,7 @@ type HeadscaleServiceClient interface { RegisterNode(ctx context.Context, in *RegisterNodeRequest, opts ...grpc.CallOption) (*RegisterNodeResponse, error) DeleteNode(ctx context.Context, in *DeleteNodeRequest, opts ...grpc.CallOption) (*DeleteNodeResponse, error) ExpireNode(ctx context.Context, in *ExpireNodeRequest, opts ...grpc.CallOption) (*ExpireNodeResponse, error) + ExtendNodeExpiration(ctx context.Context, in *ExtendNodeExpirationRequest, opts ...grpc.CallOption) (*ExtendNodeExpirationResponse, error) RenameNode(ctx context.Context, in *RenameNodeRequest, opts ...grpc.CallOption) (*RenameNodeResponse, error) ListNodes(ctx context.Context, in *ListNodesRequest, opts ...grpc.CallOption) (*ListNodesResponse, error) MoveNode(ctx context.Context, in *MoveNodeRequest, opts ...grpc.CallOption) (*MoveNodeResponse, error) @@ -228,6 +230,16 @@ func (c *headscaleServiceClient) ExpireNode(ctx context.Context, in *ExpireNodeR return out, nil } +func (c *headscaleServiceClient) ExtendNodeExpiration(ctx context.Context, in *ExtendNodeExpirationRequest, opts ...grpc.CallOption) (*ExtendNodeExpirationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExtendNodeExpirationResponse) + err := c.cc.Invoke(ctx, HeadscaleService_ExtendNodeExpiration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *headscaleServiceClient) RenameNode(ctx context.Context, in *RenameNodeRequest, opts ...grpc.CallOption) (*RenameNodeResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RenameNodeResponse) @@ -349,6 +361,7 @@ type HeadscaleServiceServer interface { RegisterNode(context.Context, *RegisterNodeRequest) (*RegisterNodeResponse, error) DeleteNode(context.Context, *DeleteNodeRequest) (*DeleteNodeResponse, error) ExpireNode(context.Context, *ExpireNodeRequest) (*ExpireNodeResponse, error) + ExtendNodeExpiration(context.Context, *ExtendNodeExpirationRequest) (*ExtendNodeExpirationResponse, error) RenameNode(context.Context, *RenameNodeRequest) (*RenameNodeResponse, error) ListNodes(context.Context, *ListNodesRequest) (*ListNodesResponse, error) MoveNode(context.Context, *MoveNodeRequest) (*MoveNodeResponse, error) @@ -413,6 +426,9 @@ func (UnimplementedHeadscaleServiceServer) DeleteNode(context.Context, *DeleteNo func (UnimplementedHeadscaleServiceServer) ExpireNode(context.Context, *ExpireNodeRequest) (*ExpireNodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ExpireNode not implemented") } +func (UnimplementedHeadscaleServiceServer) ExtendNodeExpiration(context.Context, *ExtendNodeExpirationRequest) (*ExtendNodeExpirationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExtendNodeExpiration not implemented") +} func (UnimplementedHeadscaleServiceServer) RenameNode(context.Context, *RenameNodeRequest) (*RenameNodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RenameNode not implemented") } @@ -716,6 +732,24 @@ func _HeadscaleService_ExpireNode_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _HeadscaleService_ExtendNodeExpiration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExtendNodeExpirationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HeadscaleServiceServer).ExtendNodeExpiration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: HeadscaleService_ExtendNodeExpiration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HeadscaleServiceServer).ExtendNodeExpiration(ctx, req.(*ExtendNodeExpirationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _HeadscaleService_RenameNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RenameNodeRequest) if err := dec(in); err != nil { @@ -959,6 +993,10 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ExpireNode", Handler: _HeadscaleService_ExpireNode_Handler, }, + { + MethodName: "ExtendNodeExpiration", + Handler: _HeadscaleService_ExtendNodeExpiration_Handler, + }, { MethodName: "RenameNode", Handler: _HeadscaleService_RenameNode_Handler, diff --git a/gen/go/headscale/v1/node.pb.go b/gen/go/headscale/v1/node.pb.go index db2817fc..d4c1055b 100644 --- a/gen/go/headscale/v1/node.pb.go +++ b/gen/go/headscale/v1/node.pb.go @@ -814,6 +814,102 @@ func (x *ExpireNodeResponse) GetNode() *Node { return nil } +type ExtendNodeExpirationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + NodeId uint64 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + NewExpiration *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=new_expiration,json=newExpiration,proto3" json:"new_expiration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExtendNodeExpirationRequest) Reset() { + *x = ExtendNodeExpirationRequest{} + mi := &file_headscale_v1_node_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExtendNodeExpirationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtendNodeExpirationRequest) ProtoMessage() {} + +func (x *ExtendNodeExpirationRequest) ProtoReflect() protoreflect.Message { + mi := &file_headscale_v1_node_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtendNodeExpirationRequest.ProtoReflect.Descriptor instead. +func (*ExtendNodeExpirationRequest) Descriptor() ([]byte, []int) { + return file_headscale_v1_node_proto_rawDescGZIP(), []int{13} +} + +func (x *ExtendNodeExpirationRequest) GetNodeId() uint64 { + if x != nil { + return x.NodeId + } + return 0 +} + +func (x *ExtendNodeExpirationRequest) GetNewExpiration() *timestamppb.Timestamp { + if x != nil { + return x.NewExpiration + } + return nil +} + +type ExtendNodeExpirationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExtendNodeExpirationResponse) Reset() { + *x = ExtendNodeExpirationResponse{} + mi := &file_headscale_v1_node_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExtendNodeExpirationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtendNodeExpirationResponse) ProtoMessage() {} + +func (x *ExtendNodeExpirationResponse) ProtoReflect() protoreflect.Message { + mi := &file_headscale_v1_node_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtendNodeExpirationResponse.ProtoReflect.Descriptor instead. +func (*ExtendNodeExpirationResponse) Descriptor() ([]byte, []int) { + return file_headscale_v1_node_proto_rawDescGZIP(), []int{14} +} + +func (x *ExtendNodeExpirationResponse) GetNode() *Node { + if x != nil { + return x.Node + } + return nil +} + type RenameNodeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` NodeId uint64 `protobuf:"varint,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` @@ -824,7 +920,7 @@ type RenameNodeRequest struct { func (x *RenameNodeRequest) Reset() { *x = RenameNodeRequest{} - mi := &file_headscale_v1_node_proto_msgTypes[13] + mi := &file_headscale_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -836,7 +932,7 @@ func (x *RenameNodeRequest) String() string { func (*RenameNodeRequest) ProtoMessage() {} func (x *RenameNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[13] + mi := &file_headscale_v1_node_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -849,7 +945,7 @@ func (x *RenameNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameNodeRequest.ProtoReflect.Descriptor instead. func (*RenameNodeRequest) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{13} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{15} } func (x *RenameNodeRequest) GetNodeId() uint64 { @@ -875,7 +971,7 @@ type RenameNodeResponse struct { func (x *RenameNodeResponse) Reset() { *x = RenameNodeResponse{} - mi := &file_headscale_v1_node_proto_msgTypes[14] + mi := &file_headscale_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -887,7 +983,7 @@ func (x *RenameNodeResponse) String() string { func (*RenameNodeResponse) ProtoMessage() {} func (x *RenameNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[14] + mi := &file_headscale_v1_node_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -900,7 +996,7 @@ func (x *RenameNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameNodeResponse.ProtoReflect.Descriptor instead. func (*RenameNodeResponse) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{14} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{16} } func (x *RenameNodeResponse) GetNode() *Node { @@ -919,7 +1015,7 @@ type ListNodesRequest struct { func (x *ListNodesRequest) Reset() { *x = ListNodesRequest{} - mi := &file_headscale_v1_node_proto_msgTypes[15] + mi := &file_headscale_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -931,7 +1027,7 @@ func (x *ListNodesRequest) String() string { func (*ListNodesRequest) ProtoMessage() {} func (x *ListNodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[15] + mi := &file_headscale_v1_node_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -944,7 +1040,7 @@ func (x *ListNodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodesRequest.ProtoReflect.Descriptor instead. func (*ListNodesRequest) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{15} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{17} } func (x *ListNodesRequest) GetUser() string { @@ -963,7 +1059,7 @@ type ListNodesResponse struct { func (x *ListNodesResponse) Reset() { *x = ListNodesResponse{} - mi := &file_headscale_v1_node_proto_msgTypes[16] + mi := &file_headscale_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -975,7 +1071,7 @@ func (x *ListNodesResponse) String() string { func (*ListNodesResponse) ProtoMessage() {} func (x *ListNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[16] + mi := &file_headscale_v1_node_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -988,7 +1084,7 @@ func (x *ListNodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodesResponse.ProtoReflect.Descriptor instead. func (*ListNodesResponse) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{16} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{18} } func (x *ListNodesResponse) GetNodes() []*Node { @@ -1008,7 +1104,7 @@ type MoveNodeRequest struct { func (x *MoveNodeRequest) Reset() { *x = MoveNodeRequest{} - mi := &file_headscale_v1_node_proto_msgTypes[17] + mi := &file_headscale_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1020,7 +1116,7 @@ func (x *MoveNodeRequest) String() string { func (*MoveNodeRequest) ProtoMessage() {} func (x *MoveNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[17] + mi := &file_headscale_v1_node_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1033,7 +1129,7 @@ func (x *MoveNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveNodeRequest.ProtoReflect.Descriptor instead. func (*MoveNodeRequest) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{17} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{19} } func (x *MoveNodeRequest) GetNodeId() uint64 { @@ -1059,7 +1155,7 @@ type MoveNodeResponse struct { func (x *MoveNodeResponse) Reset() { *x = MoveNodeResponse{} - mi := &file_headscale_v1_node_proto_msgTypes[18] + mi := &file_headscale_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1071,7 +1167,7 @@ func (x *MoveNodeResponse) String() string { func (*MoveNodeResponse) ProtoMessage() {} func (x *MoveNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[18] + mi := &file_headscale_v1_node_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1084,7 +1180,7 @@ func (x *MoveNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveNodeResponse.ProtoReflect.Descriptor instead. func (*MoveNodeResponse) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{18} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{20} } func (x *MoveNodeResponse) GetNode() *Node { @@ -1106,7 +1202,7 @@ type DebugCreateNodeRequest struct { func (x *DebugCreateNodeRequest) Reset() { *x = DebugCreateNodeRequest{} - mi := &file_headscale_v1_node_proto_msgTypes[19] + mi := &file_headscale_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1118,7 +1214,7 @@ func (x *DebugCreateNodeRequest) String() string { func (*DebugCreateNodeRequest) ProtoMessage() {} func (x *DebugCreateNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[19] + mi := &file_headscale_v1_node_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1131,7 +1227,7 @@ func (x *DebugCreateNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugCreateNodeRequest.ProtoReflect.Descriptor instead. func (*DebugCreateNodeRequest) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{19} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{21} } func (x *DebugCreateNodeRequest) GetUser() string { @@ -1171,7 +1267,7 @@ type DebugCreateNodeResponse struct { func (x *DebugCreateNodeResponse) Reset() { *x = DebugCreateNodeResponse{} - mi := &file_headscale_v1_node_proto_msgTypes[20] + mi := &file_headscale_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1183,7 +1279,7 @@ func (x *DebugCreateNodeResponse) String() string { func (*DebugCreateNodeResponse) ProtoMessage() {} func (x *DebugCreateNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[20] + mi := &file_headscale_v1_node_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1196,7 +1292,7 @@ func (x *DebugCreateNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugCreateNodeResponse.ProtoReflect.Descriptor instead. func (*DebugCreateNodeResponse) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{20} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{22} } func (x *DebugCreateNodeResponse) GetNode() *Node { @@ -1215,7 +1311,7 @@ type BackfillNodeIPsRequest struct { func (x *BackfillNodeIPsRequest) Reset() { *x = BackfillNodeIPsRequest{} - mi := &file_headscale_v1_node_proto_msgTypes[21] + mi := &file_headscale_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1323,7 @@ func (x *BackfillNodeIPsRequest) String() string { func (*BackfillNodeIPsRequest) ProtoMessage() {} func (x *BackfillNodeIPsRequest) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[21] + mi := &file_headscale_v1_node_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1336,7 @@ func (x *BackfillNodeIPsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BackfillNodeIPsRequest.ProtoReflect.Descriptor instead. func (*BackfillNodeIPsRequest) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{21} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{23} } func (x *BackfillNodeIPsRequest) GetConfirmed() bool { @@ -1259,7 +1355,7 @@ type BackfillNodeIPsResponse struct { func (x *BackfillNodeIPsResponse) Reset() { *x = BackfillNodeIPsResponse{} - mi := &file_headscale_v1_node_proto_msgTypes[22] + mi := &file_headscale_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1271,7 +1367,7 @@ func (x *BackfillNodeIPsResponse) String() string { func (*BackfillNodeIPsResponse) ProtoMessage() {} func (x *BackfillNodeIPsResponse) ProtoReflect() protoreflect.Message { - mi := &file_headscale_v1_node_proto_msgTypes[22] + mi := &file_headscale_v1_node_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1284,7 +1380,7 @@ func (x *BackfillNodeIPsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BackfillNodeIPsResponse.ProtoReflect.Descriptor instead. func (*BackfillNodeIPsResponse) Descriptor() ([]byte, []int) { - return file_headscale_v1_node_proto_rawDescGZIP(), []int{22} + return file_headscale_v1_node_proto_rawDescGZIP(), []int{24} } func (x *BackfillNodeIPsResponse) GetChanges() []string { @@ -1353,6 +1449,11 @@ const file_headscale_v1_node_proto_rawDesc = "" + "\x11ExpireNodeRequest\x12\x17\n" + "\anode_id\x18\x01 \x01(\x04R\x06nodeId\"<\n" + "\x12ExpireNodeResponse\x12&\n" + + "\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"y\n" + + "\x1bExtendNodeExpirationRequest\x12\x17\n" + + "\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12A\n" + + "\x0enew_expiration\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\rnewExpiration\"F\n" + + "\x1cExtendNodeExpirationResponse\x12&\n" + "\x04node\x18\x01 \x01(\v2\x12.headscale.v1.NodeR\x04node\"G\n" + "\x11RenameNodeRequest\x12\x17\n" + "\anode_id\x18\x01 \x01(\x04R\x06nodeId\x12\x19\n" + @@ -1398,57 +1499,61 @@ func file_headscale_v1_node_proto_rawDescGZIP() []byte { } var file_headscale_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_headscale_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_headscale_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_headscale_v1_node_proto_goTypes = []any{ - (RegisterMethod)(0), // 0: headscale.v1.RegisterMethod - (*Node)(nil), // 1: headscale.v1.Node - (*RegisterNodeRequest)(nil), // 2: headscale.v1.RegisterNodeRequest - (*RegisterNodeResponse)(nil), // 3: headscale.v1.RegisterNodeResponse - (*GetNodeRequest)(nil), // 4: headscale.v1.GetNodeRequest - (*GetNodeResponse)(nil), // 5: headscale.v1.GetNodeResponse - (*SetTagsRequest)(nil), // 6: headscale.v1.SetTagsRequest - (*SetTagsResponse)(nil), // 7: headscale.v1.SetTagsResponse - (*SetApprovedRoutesRequest)(nil), // 8: headscale.v1.SetApprovedRoutesRequest - (*SetApprovedRoutesResponse)(nil), // 9: headscale.v1.SetApprovedRoutesResponse - (*DeleteNodeRequest)(nil), // 10: headscale.v1.DeleteNodeRequest - (*DeleteNodeResponse)(nil), // 11: headscale.v1.DeleteNodeResponse - (*ExpireNodeRequest)(nil), // 12: headscale.v1.ExpireNodeRequest - (*ExpireNodeResponse)(nil), // 13: headscale.v1.ExpireNodeResponse - (*RenameNodeRequest)(nil), // 14: headscale.v1.RenameNodeRequest - (*RenameNodeResponse)(nil), // 15: headscale.v1.RenameNodeResponse - (*ListNodesRequest)(nil), // 16: headscale.v1.ListNodesRequest - (*ListNodesResponse)(nil), // 17: headscale.v1.ListNodesResponse - (*MoveNodeRequest)(nil), // 18: headscale.v1.MoveNodeRequest - (*MoveNodeResponse)(nil), // 19: headscale.v1.MoveNodeResponse - (*DebugCreateNodeRequest)(nil), // 20: headscale.v1.DebugCreateNodeRequest - (*DebugCreateNodeResponse)(nil), // 21: headscale.v1.DebugCreateNodeResponse - (*BackfillNodeIPsRequest)(nil), // 22: headscale.v1.BackfillNodeIPsRequest - (*BackfillNodeIPsResponse)(nil), // 23: headscale.v1.BackfillNodeIPsResponse - (*User)(nil), // 24: headscale.v1.User - (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp - (*PreAuthKey)(nil), // 26: headscale.v1.PreAuthKey + (RegisterMethod)(0), // 0: headscale.v1.RegisterMethod + (*Node)(nil), // 1: headscale.v1.Node + (*RegisterNodeRequest)(nil), // 2: headscale.v1.RegisterNodeRequest + (*RegisterNodeResponse)(nil), // 3: headscale.v1.RegisterNodeResponse + (*GetNodeRequest)(nil), // 4: headscale.v1.GetNodeRequest + (*GetNodeResponse)(nil), // 5: headscale.v1.GetNodeResponse + (*SetTagsRequest)(nil), // 6: headscale.v1.SetTagsRequest + (*SetTagsResponse)(nil), // 7: headscale.v1.SetTagsResponse + (*SetApprovedRoutesRequest)(nil), // 8: headscale.v1.SetApprovedRoutesRequest + (*SetApprovedRoutesResponse)(nil), // 9: headscale.v1.SetApprovedRoutesResponse + (*DeleteNodeRequest)(nil), // 10: headscale.v1.DeleteNodeRequest + (*DeleteNodeResponse)(nil), // 11: headscale.v1.DeleteNodeResponse + (*ExpireNodeRequest)(nil), // 12: headscale.v1.ExpireNodeRequest + (*ExpireNodeResponse)(nil), // 13: headscale.v1.ExpireNodeResponse + (*ExtendNodeExpirationRequest)(nil), // 14: headscale.v1.ExtendNodeExpirationRequest + (*ExtendNodeExpirationResponse)(nil), // 15: headscale.v1.ExtendNodeExpirationResponse + (*RenameNodeRequest)(nil), // 16: headscale.v1.RenameNodeRequest + (*RenameNodeResponse)(nil), // 17: headscale.v1.RenameNodeResponse + (*ListNodesRequest)(nil), // 18: headscale.v1.ListNodesRequest + (*ListNodesResponse)(nil), // 19: headscale.v1.ListNodesResponse + (*MoveNodeRequest)(nil), // 20: headscale.v1.MoveNodeRequest + (*MoveNodeResponse)(nil), // 21: headscale.v1.MoveNodeResponse + (*DebugCreateNodeRequest)(nil), // 22: headscale.v1.DebugCreateNodeRequest + (*DebugCreateNodeResponse)(nil), // 23: headscale.v1.DebugCreateNodeResponse + (*BackfillNodeIPsRequest)(nil), // 24: headscale.v1.BackfillNodeIPsRequest + (*BackfillNodeIPsResponse)(nil), // 25: headscale.v1.BackfillNodeIPsResponse + (*User)(nil), // 26: headscale.v1.User + (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp + (*PreAuthKey)(nil), // 28: headscale.v1.PreAuthKey } var file_headscale_v1_node_proto_depIdxs = []int32{ - 24, // 0: headscale.v1.Node.user:type_name -> headscale.v1.User - 25, // 1: headscale.v1.Node.last_seen:type_name -> google.protobuf.Timestamp - 25, // 2: headscale.v1.Node.expiry:type_name -> google.protobuf.Timestamp - 26, // 3: headscale.v1.Node.pre_auth_key:type_name -> headscale.v1.PreAuthKey - 25, // 4: headscale.v1.Node.created_at:type_name -> google.protobuf.Timestamp + 26, // 0: headscale.v1.Node.user:type_name -> headscale.v1.User + 27, // 1: headscale.v1.Node.last_seen:type_name -> google.protobuf.Timestamp + 27, // 2: headscale.v1.Node.expiry:type_name -> google.protobuf.Timestamp + 28, // 3: headscale.v1.Node.pre_auth_key:type_name -> headscale.v1.PreAuthKey + 27, // 4: headscale.v1.Node.created_at:type_name -> google.protobuf.Timestamp 0, // 5: headscale.v1.Node.register_method:type_name -> headscale.v1.RegisterMethod 1, // 6: headscale.v1.RegisterNodeResponse.node:type_name -> headscale.v1.Node 1, // 7: headscale.v1.GetNodeResponse.node:type_name -> headscale.v1.Node 1, // 8: headscale.v1.SetTagsResponse.node:type_name -> headscale.v1.Node 1, // 9: headscale.v1.SetApprovedRoutesResponse.node:type_name -> headscale.v1.Node 1, // 10: headscale.v1.ExpireNodeResponse.node:type_name -> headscale.v1.Node - 1, // 11: headscale.v1.RenameNodeResponse.node:type_name -> headscale.v1.Node - 1, // 12: headscale.v1.ListNodesResponse.nodes:type_name -> headscale.v1.Node - 1, // 13: headscale.v1.MoveNodeResponse.node:type_name -> headscale.v1.Node - 1, // 14: headscale.v1.DebugCreateNodeResponse.node:type_name -> headscale.v1.Node - 15, // [15:15] is the sub-list for method output_type - 15, // [15:15] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 27, // 11: headscale.v1.ExtendNodeExpirationRequest.new_expiration:type_name -> google.protobuf.Timestamp + 1, // 12: headscale.v1.ExtendNodeExpirationResponse.node:type_name -> headscale.v1.Node + 1, // 13: headscale.v1.RenameNodeResponse.node:type_name -> headscale.v1.Node + 1, // 14: headscale.v1.ListNodesResponse.nodes:type_name -> headscale.v1.Node + 1, // 15: headscale.v1.MoveNodeResponse.node:type_name -> headscale.v1.Node + 1, // 16: headscale.v1.DebugCreateNodeResponse.node:type_name -> headscale.v1.Node + 17, // [17:17] is the sub-list for method output_type + 17, // [17:17] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_headscale_v1_node_proto_init() } @@ -1464,7 +1569,7 @@ func file_headscale_v1_node_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_headscale_v1_node_proto_rawDesc), len(file_headscale_v1_node_proto_rawDesc)), NumEnums: 1, - NumMessages: 23, + NumMessages: 25, NumExtensions: 0, NumServices: 0, }, diff --git a/gen/openapiv2/headscale/v1/headscale.swagger.json b/gen/openapiv2/headscale/v1/headscale.swagger.json index c55dc077..2bf8c6af 100644 --- a/gen/openapiv2/headscale/v1/headscale.swagger.json +++ b/gen/openapiv2/headscale/v1/headscale.swagger.json @@ -390,6 +390,45 @@ ] } }, + "/api/v1/node/{nodeId}/extend_expiration": { + "post": { + "operationId": "HeadscaleService_ExtendNodeExpiration", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ExtendNodeExpirationResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "nodeId", + "in": "path", + "required": true, + "type": "string", + "format": "uint64" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/HeadscaleServiceExtendNodeExpirationBody" + } + } + ], + "tags": [ + "HeadscaleService" + ] + } + }, "/api/v1/node/{nodeId}/rename/{newName}": { "post": { "operationId": "HeadscaleService_RenameNode", @@ -796,6 +835,15 @@ } }, "definitions": { + "HeadscaleServiceExtendNodeExpirationBody": { + "type": "object", + "properties": { + "newExpiration": { + "type": "string", + "format": "date-time" + } + } + }, "HeadscaleServiceMoveNodeBody": { "type": "object", "properties": { @@ -1036,6 +1084,14 @@ "v1ExpirePreAuthKeyResponse": { "type": "object" }, + "v1ExtendNodeExpirationResponse": { + "type": "object", + "properties": { + "node": { + "$ref": "#/definitions/v1Node" + } + } + }, "v1GetNodeResponse": { "type": "object", "properties": { diff --git a/hscontrol/grpcv1.go b/hscontrol/grpcv1.go index 722f8421..601a2a93 100644 --- a/hscontrol/grpcv1.go +++ b/hscontrol/grpcv1.go @@ -405,6 +405,59 @@ func (api headscaleV1APIServer) DeleteNode( return &v1.DeleteNodeResponse{}, nil } +func (api headscaleV1APIServer) ExtendNodeExpiration( + ctx context.Context, + request *v1.ExtendNodeExpirationRequest, +) (*v1.ExtendNodeExpirationResponse, error) { + // Extract the new_expiration field as a Go time.Time value + newExpiry := request.GetNewExpiration().AsTime() + + // Validate the provided expiration timestamp + now := time.Now() + if newExpiry.Before(now) { + return nil, status.Error(codes.InvalidArgument, "new expiration time must be in the future") + } + + // Prevent setting extremely distant expiration dates (max 2 years from now) + maxExpiry := now.AddDate(2, 0, 0) + if newExpiry.After(maxExpiry) { + return nil, status.Error(codes.InvalidArgument, "new expiration time cannot be more than 2 years in the future") + } + + // Update the node's expiration timestamp + node, policyChanged, err := api.h.state.SetNodeExpiry(types.NodeID(request.GetNodeId()), newExpiry) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + // Send policy update notifications if needed + if policyChanged { + ctx := types.NotifyCtx(context.Background(), "grpc-node-expiry-extended", node.Hostname) + api.h.nodeNotifier.NotifyAll(ctx, types.UpdateFull()) + } + + // Notify self about the update + ctx = types.NotifyCtx(ctx, "cli-extendnodeexpiration-self", node.Hostname) + api.h.nodeNotifier.NotifyByNodeID( + ctx, + types.UpdateSelf(node.ID), + node.ID, + ) + + // Notify other peers about the updated expiration + ctx = types.NotifyCtx(ctx, "cli-extendnodeexpiration-peers", node.Hostname) + api.h.nodeNotifier.NotifyWithIgnore(ctx, types.UpdateExpire(node.ID, newExpiry), node.ID) + + // Log the updated expiration + log.Trace(). + Str("node", node.Hostname). + Time("new_expiry", newExpiry). + Msg("node expiration updated successfully") + + // Return the updated node in the response + return &v1.ExtendNodeExpirationResponse{Node: node.Proto()}, nil +} + func (api headscaleV1APIServer) ExpireNode( ctx context.Context, request *v1.ExpireNodeRequest, diff --git a/proto/headscale/v1/headscale.proto b/proto/headscale/v1/headscale.proto index 7e0672bb..bb8144ae 100644 --- a/proto/headscale/v1/headscale.proto +++ b/proto/headscale/v1/headscale.proto @@ -111,6 +111,13 @@ service HeadscaleService { }; } + rpc ExtendNodeExpiration(ExtendNodeExpirationRequest) returns (ExtendNodeExpirationResponse) { + option (google.api.http) = { + post : "/api/v1/node/{node_id}/extend_expiration" + body : "*" + }; + } + rpc RenameNode(RenameNodeRequest) returns (RenameNodeResponse) { option (google.api.http) = { post : "/api/v1/node/{node_id}/rename/{new_name}" diff --git a/proto/headscale/v1/node.proto b/proto/headscale/v1/node.proto index 89d2c347..32018819 100644 --- a/proto/headscale/v1/node.proto +++ b/proto/headscale/v1/node.proto @@ -86,6 +86,15 @@ message ExpireNodeRequest { uint64 node_id = 1; } message ExpireNodeResponse { Node node = 1; } +message ExtendNodeExpirationRequest { + uint64 node_id = 1; + google.protobuf.Timestamp new_expiration = 2; +} + +message ExtendNodeExpirationResponse { + Node node = 1; +} + message RenameNodeRequest { uint64 node_id = 1; string new_name = 2;