mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Merge pull request #558 from restanrm/feat-list-tags-of-machines
This commit is contained in:
		
						commit
						747d64cdae
					
				
							
								
								
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							@ -26,7 +26,7 @@ jobs:
 | 
			
		||||
        if: steps.changed-files.outputs.any_changed == 'true'
 | 
			
		||||
        uses: golangci/golangci-lint-action@v2
 | 
			
		||||
        with:
 | 
			
		||||
          version: latest
 | 
			
		||||
          version: v1.46.1
 | 
			
		||||
 | 
			
		||||
          # Only block PRs on new problems.
 | 
			
		||||
          # If this is not enabled, we will end up having PRs
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,8 @@ linters:
 | 
			
		||||
    - tagliatelle
 | 
			
		||||
    - godox
 | 
			
		||||
    - ireturn
 | 
			
		||||
    - execinquery
 | 
			
		||||
    - exhaustruct
 | 
			
		||||
 | 
			
		||||
    # We should strive to enable these:
 | 
			
		||||
    - wrapcheck
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,8 @@
 | 
			
		||||
- Fixed spurious calls to setLastStateChangeToNow from ephemeral nodes [#566](https://github.com/juanfont/headscale/pull/566)
 | 
			
		||||
- Add command for moving nodes between namespaces [#362](https://github.com/juanfont/headscale/issues/362)
 | 
			
		||||
- Added more configuration parameters for OpenID Connect (scopes, free-form paramters, domain and user allowlist)
 | 
			
		||||
- Add command to set tags on a node [#525](https://github.com/juanfont/headscale/issues/525)
 | 
			
		||||
- Add command to view tags of nodes [#356](https://github.com/juanfont/headscale/issues/356)
 | 
			
		||||
- Add --all (-a) flag to enable routes command [#360](https://github.com/juanfont/headscale/issues/360)
 | 
			
		||||
 | 
			
		||||
## 0.15.0 (2022-03-20)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								acls.go
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								acls.go
									
									
									
									
									
								
							@ -2,6 +2,7 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
@ -251,7 +252,26 @@ func expandAlias(
 | 
			
		||||
	if strings.HasPrefix(alias, "tag:") {
 | 
			
		||||
		owners, err := expandTagOwners(aclPolicy, alias, stripEmailDomain)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ips, err
 | 
			
		||||
			if errors.Is(err, errInvalidTag) {
 | 
			
		||||
				for _, machine := range machines {
 | 
			
		||||
					for _, t := range machine.ForcedTags {
 | 
			
		||||
						if alias == t {
 | 
			
		||||
							ips = append(ips, machine.IPAddresses.ToStringSlice()...)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if len(ips) == 0 {
 | 
			
		||||
					return ips, fmt.Errorf(
 | 
			
		||||
						"%w. %v isn't owned by a TagOwner and no forced tags are defined",
 | 
			
		||||
						errInvalidTag,
 | 
			
		||||
						alias,
 | 
			
		||||
					)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				return ips, nil
 | 
			
		||||
			} else {
 | 
			
		||||
				return ips, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		for _, namespace := range owners {
 | 
			
		||||
			machines := filterMachinesByNamespace(machines, namespace)
 | 
			
		||||
@ -312,7 +332,7 @@ func excludeCorrectlyTaggedNodes(
 | 
			
		||||
	out := []Machine{}
 | 
			
		||||
	tags := []string{}
 | 
			
		||||
	for tag, ns := range aclPolicy.TagOwners {
 | 
			
		||||
		if containsString(ns, namespace) {
 | 
			
		||||
		if contains(ns, namespace) {
 | 
			
		||||
			tags = append(tags, tag)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -322,12 +342,15 @@ func excludeCorrectlyTaggedNodes(
 | 
			
		||||
 | 
			
		||||
		found := false
 | 
			
		||||
		for _, t := range hi.RequestTags {
 | 
			
		||||
			if containsString(tags, t) {
 | 
			
		||||
			if contains(tags, t) {
 | 
			
		||||
				found = true
 | 
			
		||||
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if len(machine.ForcedTags) > 0 {
 | 
			
		||||
			found = true
 | 
			
		||||
		}
 | 
			
		||||
		if !found {
 | 
			
		||||
			out = append(out, machine)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										79
									
								
								acls_test.go
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								acls_test.go
									
									
									
									
									
								
							@ -1017,6 +1017,44 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
			want:    []string{},
 | 
			
		||||
			wantErr: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "Forced tag defined",
 | 
			
		||||
			args: args{
 | 
			
		||||
				alias: "tag:hr-webserver",
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:hr-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:hr-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				aclPolicy:        ACLPolicy{},
 | 
			
		||||
				stripEmailDomain: true,
 | 
			
		||||
			},
 | 
			
		||||
			want:    []string{"100.64.0.1", "100.64.0.2"},
 | 
			
		||||
			wantErr: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "list host in namespace without correctly tagged servers",
 | 
			
		||||
			args: args{
 | 
			
		||||
@ -1143,6 +1181,47 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "exclude nodes with valid tags and with forced tags",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: ACLPolicy{
 | 
			
		||||
					TagOwners: TagOwners{"tag:accountant-webserver": []string{"joe"}},
 | 
			
		||||
				},
 | 
			
		||||
				nodes: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
							OS:          "centos",
 | 
			
		||||
							Hostname:    "foo",
 | 
			
		||||
							RequestTags: []string{"tag:accountant-webserver"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:accountant-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				namespace: "joe",
 | 
			
		||||
			},
 | 
			
		||||
			want: []Machine{
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "all nodes have invalid tags, don't exclude them",
 | 
			
		||||
			args: args{
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ import (
 | 
			
		||||
func init() {
 | 
			
		||||
	rootCmd.AddCommand(nodeCmd)
 | 
			
		||||
	listNodesCmd.Flags().StringP("namespace", "n", "", "Filter by namespace")
 | 
			
		||||
	listNodesCmd.Flags().BoolP("tags", "t", false, "Show tags")
 | 
			
		||||
	nodeCmd.AddCommand(listNodesCmd)
 | 
			
		||||
 | 
			
		||||
	registerNodeCmd.Flags().StringP("namespace", "n", "", "Namespace")
 | 
			
		||||
@ -62,6 +63,16 @@ func init() {
 | 
			
		||||
		log.Fatalf(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	nodeCmd.AddCommand(moveNodeCmd)
 | 
			
		||||
 | 
			
		||||
	tagCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)")
 | 
			
		||||
 | 
			
		||||
	err = tagCmd.MarkFlagRequired("identifier")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalf(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	tagCmd.Flags().
 | 
			
		||||
		StringSliceP("tags", "t", []string{}, "List of tags to add to the node")
 | 
			
		||||
	nodeCmd.AddCommand(tagCmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodeCmd = &cobra.Command{
 | 
			
		||||
@ -132,6 +143,12 @@ var listNodesCmd = &cobra.Command{
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		showTags, err := cmd.Flags().GetBool("tags")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ErrorOutput(err, fmt.Sprintf("Error getting tags flag: %s", err), output)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx, client, conn, cancel := getHeadscaleCLIClient()
 | 
			
		||||
		defer cancel()
 | 
			
		||||
@ -158,7 +175,7 @@ var listNodesCmd = &cobra.Command{
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tableData, err := nodesToPtables(namespace, response.Machines)
 | 
			
		||||
		tableData, err := nodesToPtables(namespace, showTags, response.Machines)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ErrorOutput(err, fmt.Sprintf("Error converting to table: %s", err), output)
 | 
			
		||||
 | 
			
		||||
@ -388,21 +405,28 @@ var moveNodeCmd = &cobra.Command{
 | 
			
		||||
 | 
			
		||||
func nodesToPtables(
 | 
			
		||||
	currentNamespace string,
 | 
			
		||||
	showTags bool,
 | 
			
		||||
	machines []*v1.Machine,
 | 
			
		||||
) (pterm.TableData, error) {
 | 
			
		||||
	tableData := pterm.TableData{
 | 
			
		||||
		{
 | 
			
		||||
			"ID",
 | 
			
		||||
			"Name",
 | 
			
		||||
			"NodeKey",
 | 
			
		||||
			"Namespace",
 | 
			
		||||
			"IP addresses",
 | 
			
		||||
			"Ephemeral",
 | 
			
		||||
			"Last seen",
 | 
			
		||||
			"Online",
 | 
			
		||||
			"Expired",
 | 
			
		||||
		},
 | 
			
		||||
	tableHeader := []string{
 | 
			
		||||
		"ID",
 | 
			
		||||
		"Name",
 | 
			
		||||
		"NodeKey",
 | 
			
		||||
		"Namespace",
 | 
			
		||||
		"IP addresses",
 | 
			
		||||
		"Ephemeral",
 | 
			
		||||
		"Last seen",
 | 
			
		||||
		"Online",
 | 
			
		||||
		"Expired",
 | 
			
		||||
	}
 | 
			
		||||
	if showTags {
 | 
			
		||||
		tableHeader = append(tableHeader, []string{
 | 
			
		||||
			"ForcedTags",
 | 
			
		||||
			"InvalidTags",
 | 
			
		||||
			"ValidTags",
 | 
			
		||||
		}...)
 | 
			
		||||
	}
 | 
			
		||||
	tableData := pterm.TableData{tableHeader}
 | 
			
		||||
 | 
			
		||||
	for _, machine := range machines {
 | 
			
		||||
		var ephemeral bool
 | 
			
		||||
@ -446,6 +470,26 @@ func nodesToPtables(
 | 
			
		||||
			expired = pterm.LightRed("yes")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var forcedTags string
 | 
			
		||||
		for _, tag := range machine.ForcedTags {
 | 
			
		||||
			forcedTags += "," + tag
 | 
			
		||||
		}
 | 
			
		||||
		forcedTags = strings.TrimLeft(forcedTags, ",")
 | 
			
		||||
		var invalidTags string
 | 
			
		||||
		for _, tag := range machine.InvalidTags {
 | 
			
		||||
			if !contains(machine.ForcedTags, tag) {
 | 
			
		||||
				invalidTags += "," + pterm.LightRed(tag)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		invalidTags = strings.TrimLeft(invalidTags, ",")
 | 
			
		||||
		var validTags string
 | 
			
		||||
		for _, tag := range machine.ValidTags {
 | 
			
		||||
			if !contains(machine.ForcedTags, tag) {
 | 
			
		||||
				validTags += "," + pterm.LightGreen(tag)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		validTags = strings.TrimLeft(validTags, ",")
 | 
			
		||||
 | 
			
		||||
		var namespace string
 | 
			
		||||
		if currentNamespace == "" || (currentNamespace == machine.Namespace.Name) {
 | 
			
		||||
			namespace = pterm.LightMagenta(machine.Namespace.Name)
 | 
			
		||||
@ -454,31 +498,93 @@ func nodesToPtables(
 | 
			
		||||
			namespace = pterm.LightYellow(machine.Namespace.Name)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var IpV4Address string
 | 
			
		||||
		var IpV6Address string
 | 
			
		||||
		var IPV4Address string
 | 
			
		||||
		var IPV6Address string
 | 
			
		||||
		for _, addr := range machine.IpAddresses {
 | 
			
		||||
			if netaddr.MustParseIP(addr).Is4() {
 | 
			
		||||
				IpV4Address = addr
 | 
			
		||||
				IPV4Address = addr
 | 
			
		||||
			} else {
 | 
			
		||||
				IpV6Address = addr
 | 
			
		||||
				IPV6Address = addr
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		nodeData := []string{
 | 
			
		||||
			strconv.FormatUint(machine.Id, headscale.Base10),
 | 
			
		||||
			machine.Name,
 | 
			
		||||
			nodeKey.ShortString(),
 | 
			
		||||
			namespace,
 | 
			
		||||
			strings.Join([]string{IPV4Address, IPV6Address}, ", "),
 | 
			
		||||
			strconv.FormatBool(ephemeral),
 | 
			
		||||
			lastSeenTime,
 | 
			
		||||
			online,
 | 
			
		||||
			expired,
 | 
			
		||||
		}
 | 
			
		||||
		if showTags {
 | 
			
		||||
			nodeData = append(nodeData, []string{forcedTags, invalidTags, validTags}...)
 | 
			
		||||
		}
 | 
			
		||||
		tableData = append(
 | 
			
		||||
			tableData,
 | 
			
		||||
			[]string{
 | 
			
		||||
				strconv.FormatUint(machine.Id, headscale.Base10),
 | 
			
		||||
				machine.Name,
 | 
			
		||||
				nodeKey.ShortString(),
 | 
			
		||||
				namespace,
 | 
			
		||||
				strings.Join([]string{IpV4Address, IpV6Address}, ", "),
 | 
			
		||||
				strconv.FormatBool(ephemeral),
 | 
			
		||||
				lastSeenTime,
 | 
			
		||||
				online,
 | 
			
		||||
				expired,
 | 
			
		||||
			},
 | 
			
		||||
			nodeData,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return tableData, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var tagCmd = &cobra.Command{
 | 
			
		||||
	Use:     "tag",
 | 
			
		||||
	Short:   "Manage the tags of a node",
 | 
			
		||||
	Aliases: []string{"tags", "t"},
 | 
			
		||||
	Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
		output, _ := cmd.Flags().GetString("output")
 | 
			
		||||
		ctx, client, conn, cancel := getHeadscaleCLIClient()
 | 
			
		||||
		defer cancel()
 | 
			
		||||
		defer conn.Close()
 | 
			
		||||
 | 
			
		||||
		// retrieve flags from CLI
 | 
			
		||||
		identifier, err := cmd.Flags().GetUint64("identifier")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ErrorOutput(
 | 
			
		||||
				err,
 | 
			
		||||
				fmt.Sprintf("Error converting ID to integer: %s", err),
 | 
			
		||||
				output,
 | 
			
		||||
			)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		tagsToSet, err := cmd.Flags().GetStringSlice("tags")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ErrorOutput(
 | 
			
		||||
				err,
 | 
			
		||||
				fmt.Sprintf("Error retrieving list of tags to add to machine, %v", err),
 | 
			
		||||
				output,
 | 
			
		||||
			)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Sending tags to machine
 | 
			
		||||
		request := &v1.SetTagsRequest{
 | 
			
		||||
			MachineId: identifier,
 | 
			
		||||
			Tags:      tagsToSet,
 | 
			
		||||
		}
 | 
			
		||||
		resp, err := client.SetTags(ctx, request)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ErrorOutput(
 | 
			
		||||
				err,
 | 
			
		||||
				fmt.Sprintf("Error while sending tags to headscale: %s", err),
 | 
			
		||||
				output,
 | 
			
		||||
			)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if resp != nil {
 | 
			
		||||
			SuccessOutput(
 | 
			
		||||
				resp.GetMachine(),
 | 
			
		||||
				"Machine updated",
 | 
			
		||||
				output,
 | 
			
		||||
			)
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@ -129,7 +130,8 @@ func GetDERPConfig() headscale.DERPConfig {
 | 
			
		||||
	stunAddr := viper.GetString("derp.server.stun_listen_addr")
 | 
			
		||||
 | 
			
		||||
	if serverEnabled && stunAddr == "" {
 | 
			
		||||
		log.Fatal().Msg("derp.server.stun_listen_addr must be set if derp.server.enabled is true")
 | 
			
		||||
		log.Fatal().
 | 
			
		||||
			Msg("derp.server.stun_listen_addr must be set if derp.server.enabled is true")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	urlStrs := viper.GetStringSlice("derp.urls")
 | 
			
		||||
@ -569,3 +571,13 @@ func GetFileMode(key string) fs.FileMode {
 | 
			
		||||
 | 
			
		||||
	return fs.FileMode(mode)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func contains[T string](ts []T, t T) bool {
 | 
			
		||||
	for _, v := range ts {
 | 
			
		||||
		if reflect.DeepEqual(v, t) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -107,7 +107,10 @@ func (h *Headscale) DERPHandler(ctx *gin.Context) {
 | 
			
		||||
	hijacker, ok := ctx.Writer.(http.Hijacker)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		log.Error().Caller().Msg("DERP requires Hijacker interface from Gin")
 | 
			
		||||
		ctx.String(http.StatusInternalServerError, "HTTP does not support general TCP support")
 | 
			
		||||
		ctx.String(
 | 
			
		||||
			http.StatusInternalServerError,
 | 
			
		||||
			"HTTP does not support general TCP support",
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@ -115,14 +118,17 @@ func (h *Headscale) DERPHandler(ctx *gin.Context) {
 | 
			
		||||
	netConn, conn, err := hijacker.Hijack()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().Caller().Err(err).Msgf("Hijack failed")
 | 
			
		||||
		ctx.String(http.StatusInternalServerError, "HTTP does not support general TCP support")
 | 
			
		||||
		ctx.String(
 | 
			
		||||
			http.StatusInternalServerError,
 | 
			
		||||
			"HTTP does not support general TCP support",
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !fastStart {
 | 
			
		||||
		pubKey := h.privateKey.Public()
 | 
			
		||||
		pubKeyStr := pubKey.UntypedHexString()
 | 
			
		||||
		pubKeyStr := pubKey.UntypedHexString() // nolint
 | 
			
		||||
		fmt.Fprintf(conn, "HTTP/1.1 101 Switching Protocols\r\n"+
 | 
			
		||||
			"Upgrade: DERP\r\n"+
 | 
			
		||||
			"Connection: Upgrade\r\n"+
 | 
			
		||||
@ -163,7 +169,10 @@ func (h *Headscale) DERPBootstrapDNSHandler(ctx *gin.Context) {
 | 
			
		||||
		for _, node := range region.Nodes { // we don't care if we override some nodes
 | 
			
		||||
			addrs, err := r.LookupIP(resolvCtx, "ip", node.HostName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Trace().Caller().Err(err).Msgf("bootstrap DNS lookup failed %q", node.HostName)
 | 
			
		||||
				log.Trace().
 | 
			
		||||
					Caller().
 | 
			
		||||
					Err(err).
 | 
			
		||||
					Msgf("bootstrap DNS lookup failed %q", node.HostName)
 | 
			
		||||
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@
 | 
			
		||||
 | 
			
		||||
              # When updating go.mod or go.sum, a new sha will need to be calculated,
 | 
			
		||||
              # update this if you have a mismatch after doing a change to thos files.
 | 
			
		||||
              vendorSha256 = "sha256-VsMhgAP0YY6oo/iW7UXg6jc/rv5oZLSkluQ12TKsXXs=";
 | 
			
		||||
              vendorSha256 = "sha256-bYEN0Rz7D1oJIIUjAHxdPB0CkVlb91f1lIQbucLnirg=";
 | 
			
		||||
 | 
			
		||||
              ldflags = [ "-s" "-w" "-X github.com/juanfont/headscale/cmd/headscale/cli.Version=v${version}" ];
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{
 | 
			
		||||
	0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76,
 | 
			
		||||
	0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69,
 | 
			
		||||
	0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xa8, 0x14, 0x0a, 0x10, 0x48, 0x65,
 | 
			
		||||
	0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x9e, 0x15, 0x0a, 0x10, 0x48, 0x65,
 | 
			
		||||
	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77,
 | 
			
		||||
	0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21,
 | 
			
		||||
	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65,
 | 
			
		||||
@ -119,90 +119,97 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{
 | 
			
		||||
	0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
 | 
			
		||||
	0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31,
 | 
			
		||||
	0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
 | 
			
		||||
	0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
 | 
			
		||||
	0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 | 
			
		||||
	0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52,
 | 
			
		||||
	0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73,
 | 
			
		||||
	0x12, 0x1c, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
 | 
			
		||||
	0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
 | 
			
		||||
	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65,
 | 
			
		||||
	0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82,
 | 
			
		||||
	0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f,
 | 
			
		||||
	0x69, 0x64, 0x7d, 0x2f, 0x74, 0x61, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x80, 0x01, 0x0a, 0x0f,
 | 
			
		||||
	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12,
 | 
			
		||||
	0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52,
 | 
			
		||||
	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x18,
 | 
			
		||||
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f,
 | 
			
		||||
	0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65,
 | 
			
		||||
	0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c,
 | 
			
		||||
	0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
			
		||||
	0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x61, 0x70, 0x69,
 | 
			
		||||
	0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x45, 0x78, 0x70,
 | 
			
		||||
	0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x22, 0x2e, 0x68, 0x65, 0x61,
 | 
			
		||||
	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65,
 | 
			
		||||
	0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23,
 | 
			
		||||
	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78,
 | 
			
		||||
	0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
 | 
			
		||||
	0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f, 0x61, 0x70,
 | 
			
		||||
	0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,
 | 
			
		||||
	0x12, 0x6e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73,
 | 
			
		||||
	0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
 | 
			
		||||
	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
 | 
			
		||||
	0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52,
 | 
			
		||||
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12,
 | 
			
		||||
	0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x12, 0x82, 0x01, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
 | 
			
		||||
	0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
			
		||||
	0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
 | 
			
		||||
	0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73,
 | 
			
		||||
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x26, 0x2f,
 | 
			
		||||
	0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b,
 | 
			
		||||
	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 | 
			
		||||
	0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47,
 | 
			
		||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
 | 
			
		||||
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3,
 | 
			
		||||
	0xe4, 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x7e,
 | 
			
		||||
	0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12,
 | 
			
		||||
	0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44,
 | 
			
		||||
	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
 | 
			
		||||
	0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e,
 | 
			
		||||
	0x2a, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x85,
 | 
			
		||||
	0x01, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x12, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
 | 
			
		||||
	0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71,
 | 
			
		||||
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
 | 
			
		||||
	0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
 | 
			
		||||
	0x25, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
 | 
			
		||||
	0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x12, 0x6e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
 | 
			
		||||
	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82,
 | 
			
		||||
	0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x4d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
 | 
			
		||||
	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73,
 | 
			
		||||
	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4,
 | 
			
		||||
	0x93, 0x02, 0x28, 0x22, 0x26, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64,
 | 
			
		||||
	0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x0f,
 | 
			
		||||
	0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12,
 | 
			
		||||
	0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47,
 | 
			
		||||
	0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23,
 | 
			
		||||
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f,
 | 
			
		||||
	0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75,
 | 
			
		||||
	0x74, 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x68, 0x65,
 | 
			
		||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
 | 
			
		||||
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52,
 | 
			
		||||
	0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3,
 | 
			
		||||
	0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69,
 | 
			
		||||
	0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x45, 0x6e,
 | 
			
		||||
	0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65,
 | 
			
		||||
	0x73, 0x12, 0x28, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31,
 | 
			
		||||
	0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f,
 | 
			
		||||
	0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, 0x65,
 | 
			
		||||
	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c,
 | 
			
		||||
	0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65,
 | 
			
		||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
 | 
			
		||||
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 | 
			
		||||
	0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
 | 
			
		||||
	0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x70, 0x0a,
 | 
			
		||||
	0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,
 | 
			
		||||
	0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
			
		||||
	0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
 | 
			
		||||
	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70,
 | 
			
		||||
	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61,
 | 
			
		||||
	0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x3a, 0x01, 0x2a, 0x12,
 | 
			
		||||
	0x77, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12,
 | 
			
		||||
	0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45,
 | 
			
		||||
	0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
			
		||||
	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
 | 
			
		||||
	0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15,
 | 
			
		||||
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x2f, 0x65,
 | 
			
		||||
	0x78, 0x70, 0x69, 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74,
 | 
			
		||||
	0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
 | 
			
		||||
	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65,
 | 
			
		||||
	0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69,
 | 
			
		||||
	0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3,
 | 
			
		||||
	0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70,
 | 
			
		||||
	0x69, 0x6b, 0x65, 0x79, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
 | 
			
		||||
	0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62,
 | 
			
		||||
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23,
 | 
			
		||||
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f,
 | 
			
		||||
	0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75,
 | 
			
		||||
	0x74, 0x65, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69,
 | 
			
		||||
	0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
 | 
			
		||||
	0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52,
 | 
			
		||||
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
 | 
			
		||||
	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b,
 | 
			
		||||
	0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93,
 | 
			
		||||
	0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b,
 | 
			
		||||
	0x65, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x77, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41,
 | 
			
		||||
	0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
 | 
			
		||||
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65,
 | 
			
		||||
	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73,
 | 
			
		||||
	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70,
 | 
			
		||||
	0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3,
 | 
			
		||||
	0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70,
 | 
			
		||||
	0x69, 0x6b, 0x65, 0x79, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6a,
 | 
			
		||||
	0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x20, 0x2e,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73,
 | 
			
		||||
	0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 | 
			
		||||
	0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c,
 | 
			
		||||
	0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
			
		||||
	0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69,
 | 
			
		||||
	0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69,
 | 
			
		||||
	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e,
 | 
			
		||||
	0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f,
 | 
			
		||||
	0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var file_headscale_v1_headscale_proto_goTypes = []interface{}{
 | 
			
		||||
@ -216,36 +223,38 @@ var file_headscale_v1_headscale_proto_goTypes = []interface{}{
 | 
			
		||||
	(*ListPreAuthKeysRequest)(nil),      // 7: headscale.v1.ListPreAuthKeysRequest
 | 
			
		||||
	(*DebugCreateMachineRequest)(nil),   // 8: headscale.v1.DebugCreateMachineRequest
 | 
			
		||||
	(*GetMachineRequest)(nil),           // 9: headscale.v1.GetMachineRequest
 | 
			
		||||
	(*RegisterMachineRequest)(nil),      // 10: headscale.v1.RegisterMachineRequest
 | 
			
		||||
	(*DeleteMachineRequest)(nil),        // 11: headscale.v1.DeleteMachineRequest
 | 
			
		||||
	(*ExpireMachineRequest)(nil),        // 12: headscale.v1.ExpireMachineRequest
 | 
			
		||||
	(*ListMachinesRequest)(nil),         // 13: headscale.v1.ListMachinesRequest
 | 
			
		||||
	(*MoveMachineRequest)(nil),          // 14: headscale.v1.MoveMachineRequest
 | 
			
		||||
	(*GetMachineRouteRequest)(nil),      // 15: headscale.v1.GetMachineRouteRequest
 | 
			
		||||
	(*EnableMachineRoutesRequest)(nil),  // 16: headscale.v1.EnableMachineRoutesRequest
 | 
			
		||||
	(*CreateApiKeyRequest)(nil),         // 17: headscale.v1.CreateApiKeyRequest
 | 
			
		||||
	(*ExpireApiKeyRequest)(nil),         // 18: headscale.v1.ExpireApiKeyRequest
 | 
			
		||||
	(*ListApiKeysRequest)(nil),          // 19: headscale.v1.ListApiKeysRequest
 | 
			
		||||
	(*GetNamespaceResponse)(nil),        // 20: headscale.v1.GetNamespaceResponse
 | 
			
		||||
	(*CreateNamespaceResponse)(nil),     // 21: headscale.v1.CreateNamespaceResponse
 | 
			
		||||
	(*RenameNamespaceResponse)(nil),     // 22: headscale.v1.RenameNamespaceResponse
 | 
			
		||||
	(*DeleteNamespaceResponse)(nil),     // 23: headscale.v1.DeleteNamespaceResponse
 | 
			
		||||
	(*ListNamespacesResponse)(nil),      // 24: headscale.v1.ListNamespacesResponse
 | 
			
		||||
	(*CreatePreAuthKeyResponse)(nil),    // 25: headscale.v1.CreatePreAuthKeyResponse
 | 
			
		||||
	(*ExpirePreAuthKeyResponse)(nil),    // 26: headscale.v1.ExpirePreAuthKeyResponse
 | 
			
		||||
	(*ListPreAuthKeysResponse)(nil),     // 27: headscale.v1.ListPreAuthKeysResponse
 | 
			
		||||
	(*DebugCreateMachineResponse)(nil),  // 28: headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	(*GetMachineResponse)(nil),          // 29: headscale.v1.GetMachineResponse
 | 
			
		||||
	(*RegisterMachineResponse)(nil),     // 30: headscale.v1.RegisterMachineResponse
 | 
			
		||||
	(*DeleteMachineResponse)(nil),       // 31: headscale.v1.DeleteMachineResponse
 | 
			
		||||
	(*ExpireMachineResponse)(nil),       // 32: headscale.v1.ExpireMachineResponse
 | 
			
		||||
	(*ListMachinesResponse)(nil),        // 33: headscale.v1.ListMachinesResponse
 | 
			
		||||
	(*MoveMachineResponse)(nil),         // 34: headscale.v1.MoveMachineResponse
 | 
			
		||||
	(*GetMachineRouteResponse)(nil),     // 35: headscale.v1.GetMachineRouteResponse
 | 
			
		||||
	(*EnableMachineRoutesResponse)(nil), // 36: headscale.v1.EnableMachineRoutesResponse
 | 
			
		||||
	(*CreateApiKeyResponse)(nil),        // 37: headscale.v1.CreateApiKeyResponse
 | 
			
		||||
	(*ExpireApiKeyResponse)(nil),        // 38: headscale.v1.ExpireApiKeyResponse
 | 
			
		||||
	(*ListApiKeysResponse)(nil),         // 39: headscale.v1.ListApiKeysResponse
 | 
			
		||||
	(*SetTagsRequest)(nil),              // 10: headscale.v1.SetTagsRequest
 | 
			
		||||
	(*RegisterMachineRequest)(nil),      // 11: headscale.v1.RegisterMachineRequest
 | 
			
		||||
	(*DeleteMachineRequest)(nil),        // 12: headscale.v1.DeleteMachineRequest
 | 
			
		||||
	(*ExpireMachineRequest)(nil),        // 13: headscale.v1.ExpireMachineRequest
 | 
			
		||||
	(*ListMachinesRequest)(nil),         // 14: headscale.v1.ListMachinesRequest
 | 
			
		||||
	(*MoveMachineRequest)(nil),          // 15: headscale.v1.MoveMachineRequest
 | 
			
		||||
	(*GetMachineRouteRequest)(nil),      // 16: headscale.v1.GetMachineRouteRequest
 | 
			
		||||
	(*EnableMachineRoutesRequest)(nil),  // 17: headscale.v1.EnableMachineRoutesRequest
 | 
			
		||||
	(*CreateApiKeyRequest)(nil),         // 18: headscale.v1.CreateApiKeyRequest
 | 
			
		||||
	(*ExpireApiKeyRequest)(nil),         // 19: headscale.v1.ExpireApiKeyRequest
 | 
			
		||||
	(*ListApiKeysRequest)(nil),          // 20: headscale.v1.ListApiKeysRequest
 | 
			
		||||
	(*GetNamespaceResponse)(nil),        // 21: headscale.v1.GetNamespaceResponse
 | 
			
		||||
	(*CreateNamespaceResponse)(nil),     // 22: headscale.v1.CreateNamespaceResponse
 | 
			
		||||
	(*RenameNamespaceResponse)(nil),     // 23: headscale.v1.RenameNamespaceResponse
 | 
			
		||||
	(*DeleteNamespaceResponse)(nil),     // 24: headscale.v1.DeleteNamespaceResponse
 | 
			
		||||
	(*ListNamespacesResponse)(nil),      // 25: headscale.v1.ListNamespacesResponse
 | 
			
		||||
	(*CreatePreAuthKeyResponse)(nil),    // 26: headscale.v1.CreatePreAuthKeyResponse
 | 
			
		||||
	(*ExpirePreAuthKeyResponse)(nil),    // 27: headscale.v1.ExpirePreAuthKeyResponse
 | 
			
		||||
	(*ListPreAuthKeysResponse)(nil),     // 28: headscale.v1.ListPreAuthKeysResponse
 | 
			
		||||
	(*DebugCreateMachineResponse)(nil),  // 29: headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	(*GetMachineResponse)(nil),          // 30: headscale.v1.GetMachineResponse
 | 
			
		||||
	(*SetTagsResponse)(nil),             // 31: headscale.v1.SetTagsResponse
 | 
			
		||||
	(*RegisterMachineResponse)(nil),     // 32: headscale.v1.RegisterMachineResponse
 | 
			
		||||
	(*DeleteMachineResponse)(nil),       // 33: headscale.v1.DeleteMachineResponse
 | 
			
		||||
	(*ExpireMachineResponse)(nil),       // 34: headscale.v1.ExpireMachineResponse
 | 
			
		||||
	(*ListMachinesResponse)(nil),        // 35: headscale.v1.ListMachinesResponse
 | 
			
		||||
	(*MoveMachineResponse)(nil),         // 36: headscale.v1.MoveMachineResponse
 | 
			
		||||
	(*GetMachineRouteResponse)(nil),     // 37: headscale.v1.GetMachineRouteResponse
 | 
			
		||||
	(*EnableMachineRoutesResponse)(nil), // 38: headscale.v1.EnableMachineRoutesResponse
 | 
			
		||||
	(*CreateApiKeyResponse)(nil),        // 39: headscale.v1.CreateApiKeyResponse
 | 
			
		||||
	(*ExpireApiKeyResponse)(nil),        // 40: headscale.v1.ExpireApiKeyResponse
 | 
			
		||||
	(*ListApiKeysResponse)(nil),         // 41: headscale.v1.ListApiKeysResponse
 | 
			
		||||
}
 | 
			
		||||
var file_headscale_v1_headscale_proto_depIdxs = []int32{
 | 
			
		||||
	0,  // 0: headscale.v1.HeadscaleService.GetNamespace:input_type -> headscale.v1.GetNamespaceRequest
 | 
			
		||||
@ -258,38 +267,40 @@ var file_headscale_v1_headscale_proto_depIdxs = []int32{
 | 
			
		||||
	7,  // 7: headscale.v1.HeadscaleService.ListPreAuthKeys:input_type -> headscale.v1.ListPreAuthKeysRequest
 | 
			
		||||
	8,  // 8: headscale.v1.HeadscaleService.DebugCreateMachine:input_type -> headscale.v1.DebugCreateMachineRequest
 | 
			
		||||
	9,  // 9: headscale.v1.HeadscaleService.GetMachine:input_type -> headscale.v1.GetMachineRequest
 | 
			
		||||
	10, // 10: headscale.v1.HeadscaleService.RegisterMachine:input_type -> headscale.v1.RegisterMachineRequest
 | 
			
		||||
	11, // 11: headscale.v1.HeadscaleService.DeleteMachine:input_type -> headscale.v1.DeleteMachineRequest
 | 
			
		||||
	12, // 12: headscale.v1.HeadscaleService.ExpireMachine:input_type -> headscale.v1.ExpireMachineRequest
 | 
			
		||||
	13, // 13: headscale.v1.HeadscaleService.ListMachines:input_type -> headscale.v1.ListMachinesRequest
 | 
			
		||||
	14, // 14: headscale.v1.HeadscaleService.MoveMachine:input_type -> headscale.v1.MoveMachineRequest
 | 
			
		||||
	15, // 15: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest
 | 
			
		||||
	16, // 16: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest
 | 
			
		||||
	17, // 17: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest
 | 
			
		||||
	18, // 18: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest
 | 
			
		||||
	19, // 19: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest
 | 
			
		||||
	20, // 20: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse
 | 
			
		||||
	21, // 21: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
 | 
			
		||||
	22, // 22: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse
 | 
			
		||||
	23, // 23: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
 | 
			
		||||
	24, // 24: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
 | 
			
		||||
	25, // 25: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | 
			
		||||
	26, // 26: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | 
			
		||||
	27, // 27: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | 
			
		||||
	28, // 28: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	29, // 29: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
 | 
			
		||||
	30, // 30: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse
 | 
			
		||||
	31, // 31: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse
 | 
			
		||||
	32, // 32: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse
 | 
			
		||||
	33, // 33: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse
 | 
			
		||||
	34, // 34: headscale.v1.HeadscaleService.MoveMachine:output_type -> headscale.v1.MoveMachineResponse
 | 
			
		||||
	35, // 35: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse
 | 
			
		||||
	36, // 36: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse
 | 
			
		||||
	37, // 37: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | 
			
		||||
	38, // 38: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | 
			
		||||
	39, // 39: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | 
			
		||||
	20, // [20:40] is the sub-list for method output_type
 | 
			
		||||
	0,  // [0:20] is the sub-list for method input_type
 | 
			
		||||
	10, // 10: headscale.v1.HeadscaleService.SetTags:input_type -> headscale.v1.SetTagsRequest
 | 
			
		||||
	11, // 11: headscale.v1.HeadscaleService.RegisterMachine:input_type -> headscale.v1.RegisterMachineRequest
 | 
			
		||||
	12, // 12: headscale.v1.HeadscaleService.DeleteMachine:input_type -> headscale.v1.DeleteMachineRequest
 | 
			
		||||
	13, // 13: headscale.v1.HeadscaleService.ExpireMachine:input_type -> headscale.v1.ExpireMachineRequest
 | 
			
		||||
	14, // 14: headscale.v1.HeadscaleService.ListMachines:input_type -> headscale.v1.ListMachinesRequest
 | 
			
		||||
	15, // 15: headscale.v1.HeadscaleService.MoveMachine:input_type -> headscale.v1.MoveMachineRequest
 | 
			
		||||
	16, // 16: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest
 | 
			
		||||
	17, // 17: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest
 | 
			
		||||
	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.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse
 | 
			
		||||
	22, // 22: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
 | 
			
		||||
	23, // 23: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse
 | 
			
		||||
	24, // 24: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
 | 
			
		||||
	25, // 25: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
 | 
			
		||||
	26, // 26: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | 
			
		||||
	27, // 27: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | 
			
		||||
	28, // 28: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | 
			
		||||
	29, // 29: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	30, // 30: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
 | 
			
		||||
	31, // 31: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
 | 
			
		||||
	32, // 32: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse
 | 
			
		||||
	33, // 33: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse
 | 
			
		||||
	34, // 34: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse
 | 
			
		||||
	35, // 35: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse
 | 
			
		||||
	36, // 36: headscale.v1.HeadscaleService.MoveMachine:output_type -> headscale.v1.MoveMachineResponse
 | 
			
		||||
	37, // 37: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse
 | 
			
		||||
	38, // 38: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse
 | 
			
		||||
	39, // 39: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | 
			
		||||
	40, // 40: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | 
			
		||||
	41, // 41: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | 
			
		||||
	21, // [21:42] is the sub-list for method output_type
 | 
			
		||||
	0,  // [0:21] 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
 | 
			
		||||
 | 
			
		||||
@ -449,6 +449,74 @@ func local_request_HeadscaleService_GetMachine_0(ctx context.Context, marshaler
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func request_HeadscaleService_SetTags_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 | 
			
		||||
	var protoReq SetTagsRequest
 | 
			
		||||
	var metadata runtime.ServerMetadata
 | 
			
		||||
 | 
			
		||||
	newReader, berr := utilities.IOReaderFactory(req.Body)
 | 
			
		||||
	if berr != nil {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
 | 
			
		||||
	}
 | 
			
		||||
	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		val string
 | 
			
		||||
		ok  bool
 | 
			
		||||
		err error
 | 
			
		||||
		_   = err
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	val, ok = pathParams["machine_id"]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protoReq.MachineId, err = runtime.Uint64(val)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	msg, err := client.SetTags(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
 | 
			
		||||
	return msg, metadata, err
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func local_request_HeadscaleService_SetTags_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 | 
			
		||||
	var protoReq SetTagsRequest
 | 
			
		||||
	var metadata runtime.ServerMetadata
 | 
			
		||||
 | 
			
		||||
	newReader, berr := utilities.IOReaderFactory(req.Body)
 | 
			
		||||
	if berr != nil {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
 | 
			
		||||
	}
 | 
			
		||||
	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		val string
 | 
			
		||||
		ok  bool
 | 
			
		||||
		err error
 | 
			
		||||
		_   = err
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	val, ok = pathParams["machine_id"]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protoReq.MachineId, err = runtime.Uint64(val)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	msg, err := server.SetTags(ctx, &protoReq)
 | 
			
		||||
	return msg, metadata, err
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	filter_HeadscaleService_RegisterMachine_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
 | 
			
		||||
)
 | 
			
		||||
@ -1139,6 +1207,29 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser
 | 
			
		||||
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	mux.Handle("POST", pattern_HeadscaleService_SetTags_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)
 | 
			
		||||
		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/SetTags", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/tags"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		resp, md, err := local_request_HeadscaleService_SetTags_0(rctx, inboundMarshaler, server, req, pathParams)
 | 
			
		||||
		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
 | 
			
		||||
		ctx = runtime.NewServerMetadataContext(ctx, md)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		forward_HeadscaleService_SetTags_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 | 
			
		||||
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	mux.Handle("POST", pattern_HeadscaleService_RegisterMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 | 
			
		||||
		ctx, cancel := context.WithCancel(req.Context())
 | 
			
		||||
		defer cancel()
 | 
			
		||||
@ -1610,6 +1701,26 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser
 | 
			
		||||
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	mux.Handle("POST", pattern_HeadscaleService_SetTags_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)
 | 
			
		||||
		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/SetTags", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/tags"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		resp, md, err := request_HeadscaleService_SetTags_0(rctx, inboundMarshaler, client, req, pathParams)
 | 
			
		||||
		ctx = runtime.NewServerMetadataContext(ctx, md)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		forward_HeadscaleService_SetTags_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
 | 
			
		||||
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	mux.Handle("POST", pattern_HeadscaleService_RegisterMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 | 
			
		||||
		ctx, cancel := context.WithCancel(req.Context())
 | 
			
		||||
		defer cancel()
 | 
			
		||||
@ -1834,6 +1945,8 @@ var (
 | 
			
		||||
 | 
			
		||||
	pattern_HeadscaleService_GetMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "machine", "machine_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", "machine", "machine_id", "tags"}, ""))
 | 
			
		||||
 | 
			
		||||
	pattern_HeadscaleService_RegisterMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "machine", "register"}, ""))
 | 
			
		||||
 | 
			
		||||
	pattern_HeadscaleService_DeleteMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "machine", "machine_id"}, ""))
 | 
			
		||||
@ -1876,6 +1989,8 @@ var (
 | 
			
		||||
 | 
			
		||||
	forward_HeadscaleService_GetMachine_0 = runtime.ForwardResponseMessage
 | 
			
		||||
 | 
			
		||||
	forward_HeadscaleService_SetTags_0 = runtime.ForwardResponseMessage
 | 
			
		||||
 | 
			
		||||
	forward_HeadscaleService_RegisterMachine_0 = runtime.ForwardResponseMessage
 | 
			
		||||
 | 
			
		||||
	forward_HeadscaleService_DeleteMachine_0 = runtime.ForwardResponseMessage
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,8 @@
 | 
			
		||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
			
		||||
// versions:
 | 
			
		||||
// - protoc-gen-go-grpc v1.2.0
 | 
			
		||||
// - protoc             (unknown)
 | 
			
		||||
// source: headscale/v1/headscale.proto
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
@ -31,6 +35,7 @@ type HeadscaleServiceClient interface {
 | 
			
		||||
	// --- Machine start ---
 | 
			
		||||
	DebugCreateMachine(ctx context.Context, in *DebugCreateMachineRequest, opts ...grpc.CallOption) (*DebugCreateMachineResponse, error)
 | 
			
		||||
	GetMachine(ctx context.Context, in *GetMachineRequest, opts ...grpc.CallOption) (*GetMachineResponse, error)
 | 
			
		||||
	SetTags(ctx context.Context, in *SetTagsRequest, opts ...grpc.CallOption) (*SetTagsResponse, error)
 | 
			
		||||
	RegisterMachine(ctx context.Context, in *RegisterMachineRequest, opts ...grpc.CallOption) (*RegisterMachineResponse, error)
 | 
			
		||||
	DeleteMachine(ctx context.Context, in *DeleteMachineRequest, opts ...grpc.CallOption) (*DeleteMachineResponse, error)
 | 
			
		||||
	ExpireMachine(ctx context.Context, in *ExpireMachineRequest, opts ...grpc.CallOption) (*ExpireMachineResponse, error)
 | 
			
		||||
@ -143,6 +148,15 @@ func (c *headscaleServiceClient) GetMachine(ctx context.Context, in *GetMachineR
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *headscaleServiceClient) SetTags(ctx context.Context, in *SetTagsRequest, opts ...grpc.CallOption) (*SetTagsResponse, error) {
 | 
			
		||||
	out := new(SetTagsResponse)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/SetTags", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *headscaleServiceClient) RegisterMachine(ctx context.Context, in *RegisterMachineRequest, opts ...grpc.CallOption) (*RegisterMachineResponse, error) {
 | 
			
		||||
	out := new(RegisterMachineResponse)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RegisterMachine", in, out, opts...)
 | 
			
		||||
@ -250,6 +264,7 @@ type HeadscaleServiceServer interface {
 | 
			
		||||
	// --- Machine start ---
 | 
			
		||||
	DebugCreateMachine(context.Context, *DebugCreateMachineRequest) (*DebugCreateMachineResponse, error)
 | 
			
		||||
	GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error)
 | 
			
		||||
	SetTags(context.Context, *SetTagsRequest) (*SetTagsResponse, error)
 | 
			
		||||
	RegisterMachine(context.Context, *RegisterMachineRequest) (*RegisterMachineResponse, error)
 | 
			
		||||
	DeleteMachine(context.Context, *DeleteMachineRequest) (*DeleteMachineResponse, error)
 | 
			
		||||
	ExpireMachine(context.Context, *ExpireMachineRequest) (*ExpireMachineResponse, error)
 | 
			
		||||
@ -299,6 +314,9 @@ func (UnimplementedHeadscaleServiceServer) DebugCreateMachine(context.Context, *
 | 
			
		||||
func (UnimplementedHeadscaleServiceServer) GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method GetMachine not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (UnimplementedHeadscaleServiceServer) SetTags(context.Context, *SetTagsRequest) (*SetTagsResponse, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method SetTags not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (UnimplementedHeadscaleServiceServer) RegisterMachine(context.Context, *RegisterMachineRequest) (*RegisterMachineResponse, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method RegisterMachine not implemented")
 | 
			
		||||
}
 | 
			
		||||
@ -522,6 +540,24 @@ func _HeadscaleService_GetMachine_Handler(srv interface{}, ctx context.Context,
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _HeadscaleService_SetTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(SetTagsRequest)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(HeadscaleServiceServer).SetTags(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/headscale.v1.HeadscaleService/SetTags",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(HeadscaleServiceServer).SetTags(ctx, req.(*SetTagsRequest))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _HeadscaleService_RegisterMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(RegisterMachineRequest)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
@ -749,6 +785,10 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{
 | 
			
		||||
			MethodName: "GetMachine",
 | 
			
		||||
			Handler:    _HeadscaleService_GetMachine_Handler,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "SetTags",
 | 
			
		||||
			Handler:    _HeadscaleService_SetTags_Handler,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "RegisterMachine",
 | 
			
		||||
			Handler:    _HeadscaleService_RegisterMachine_Handler,
 | 
			
		||||
 | 
			
		||||
@ -91,6 +91,9 @@ type Machine struct {
 | 
			
		||||
	PreAuthKey           *PreAuthKey            `protobuf:"bytes,11,opt,name=pre_auth_key,json=preAuthKey,proto3" json:"pre_auth_key,omitempty"`
 | 
			
		||||
	CreatedAt            *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
 | 
			
		||||
	RegisterMethod       RegisterMethod         `protobuf:"varint,13,opt,name=register_method,json=registerMethod,proto3,enum=headscale.v1.RegisterMethod" json:"register_method,omitempty"`
 | 
			
		||||
	ForcedTags           []string               `protobuf:"bytes,18,rep,name=forced_tags,json=forcedTags,proto3" json:"forced_tags,omitempty"`
 | 
			
		||||
	InvalidTags          []string               `protobuf:"bytes,19,rep,name=invalid_tags,json=invalidTags,proto3" json:"invalid_tags,omitempty"`
 | 
			
		||||
	ValidTags            []string               `protobuf:"bytes,20,rep,name=valid_tags,json=validTags,proto3" json:"valid_tags,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Machine) Reset() {
 | 
			
		||||
@ -216,6 +219,27 @@ func (x *Machine) GetRegisterMethod() RegisterMethod {
 | 
			
		||||
	return RegisterMethod_REGISTER_METHOD_UNSPECIFIED
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Machine) GetForcedTags() []string {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.ForcedTags
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Machine) GetInvalidTags() []string {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.InvalidTags
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Machine) GetValidTags() []string {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.ValidTags
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RegisterMachineRequest struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
@ -412,6 +436,108 @@ func (x *GetMachineResponse) GetMachine() *Machine {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SetTagsRequest struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	MachineId uint64   `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
 | 
			
		||||
	Tags      []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsRequest) Reset() {
 | 
			
		||||
	*x = SetTagsRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[5]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsRequest) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*SetTagsRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[5]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use SetTagsRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*SetTagsRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{5}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsRequest) GetMachineId() uint64 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.MachineId
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsRequest) GetTags() []string {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Tags
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SetTagsResponse struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsResponse) Reset() {
 | 
			
		||||
	*x = SetTagsResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[6]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsResponse) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*SetTagsResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[6]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use SetTagsResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*SetTagsResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{6}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SetTagsResponse) GetMachine() *Machine {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Machine
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DeleteMachineRequest struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
@ -423,7 +549,7 @@ type DeleteMachineRequest struct {
 | 
			
		||||
func (x *DeleteMachineRequest) Reset() {
 | 
			
		||||
	*x = DeleteMachineRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[5]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[7]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -436,7 +562,7 @@ func (x *DeleteMachineRequest) String() string {
 | 
			
		||||
func (*DeleteMachineRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *DeleteMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[5]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[7]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -449,7 +575,7 @@ func (x *DeleteMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use DeleteMachineRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*DeleteMachineRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{5}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{7}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DeleteMachineRequest) GetMachineId() uint64 {
 | 
			
		||||
@ -468,7 +594,7 @@ type DeleteMachineResponse struct {
 | 
			
		||||
func (x *DeleteMachineResponse) Reset() {
 | 
			
		||||
	*x = DeleteMachineResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[6]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[8]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -481,7 +607,7 @@ func (x *DeleteMachineResponse) String() string {
 | 
			
		||||
func (*DeleteMachineResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *DeleteMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[6]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[8]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -494,7 +620,7 @@ func (x *DeleteMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use DeleteMachineResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*DeleteMachineResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{6}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{8}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ExpireMachineRequest struct {
 | 
			
		||||
@ -508,7 +634,7 @@ type ExpireMachineRequest struct {
 | 
			
		||||
func (x *ExpireMachineRequest) Reset() {
 | 
			
		||||
	*x = ExpireMachineRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[7]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[9]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -521,7 +647,7 @@ func (x *ExpireMachineRequest) String() string {
 | 
			
		||||
func (*ExpireMachineRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *ExpireMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[7]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[9]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -534,7 +660,7 @@ func (x *ExpireMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use ExpireMachineRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*ExpireMachineRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{7}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{9}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ExpireMachineRequest) GetMachineId() uint64 {
 | 
			
		||||
@ -555,7 +681,7 @@ type ExpireMachineResponse struct {
 | 
			
		||||
func (x *ExpireMachineResponse) Reset() {
 | 
			
		||||
	*x = ExpireMachineResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[8]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[10]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -568,7 +694,7 @@ func (x *ExpireMachineResponse) String() string {
 | 
			
		||||
func (*ExpireMachineResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *ExpireMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[8]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[10]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -581,7 +707,7 @@ func (x *ExpireMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use ExpireMachineResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*ExpireMachineResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{8}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{10}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ExpireMachineResponse) GetMachine() *Machine {
 | 
			
		||||
@ -602,7 +728,7 @@ type ListMachinesRequest struct {
 | 
			
		||||
func (x *ListMachinesRequest) Reset() {
 | 
			
		||||
	*x = ListMachinesRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[9]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[11]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -615,7 +741,7 @@ func (x *ListMachinesRequest) String() string {
 | 
			
		||||
func (*ListMachinesRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *ListMachinesRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[9]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[11]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -628,7 +754,7 @@ func (x *ListMachinesRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use ListMachinesRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*ListMachinesRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{9}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{11}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ListMachinesRequest) GetNamespace() string {
 | 
			
		||||
@ -649,7 +775,7 @@ type ListMachinesResponse struct {
 | 
			
		||||
func (x *ListMachinesResponse) Reset() {
 | 
			
		||||
	*x = ListMachinesResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[10]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[12]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -662,7 +788,7 @@ func (x *ListMachinesResponse) String() string {
 | 
			
		||||
func (*ListMachinesResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *ListMachinesResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[10]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[12]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -675,7 +801,7 @@ func (x *ListMachinesResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use ListMachinesResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*ListMachinesResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{10}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{12}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *ListMachinesResponse) GetMachines() []*Machine {
 | 
			
		||||
@ -697,7 +823,7 @@ type MoveMachineRequest struct {
 | 
			
		||||
func (x *MoveMachineRequest) Reset() {
 | 
			
		||||
	*x = MoveMachineRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[11]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[13]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -710,7 +836,7 @@ func (x *MoveMachineRequest) String() string {
 | 
			
		||||
func (*MoveMachineRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *MoveMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[11]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[13]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -723,7 +849,7 @@ func (x *MoveMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use MoveMachineRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*MoveMachineRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{11}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *MoveMachineRequest) GetMachineId() uint64 {
 | 
			
		||||
@ -751,7 +877,7 @@ type MoveMachineResponse struct {
 | 
			
		||||
func (x *MoveMachineResponse) Reset() {
 | 
			
		||||
	*x = MoveMachineResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[12]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[14]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -764,7 +890,7 @@ func (x *MoveMachineResponse) String() string {
 | 
			
		||||
func (*MoveMachineResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *MoveMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[12]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[14]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -777,7 +903,7 @@ func (x *MoveMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use MoveMachineResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*MoveMachineResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{12}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *MoveMachineResponse) GetMachine() *Machine {
 | 
			
		||||
@ -801,7 +927,7 @@ type DebugCreateMachineRequest struct {
 | 
			
		||||
func (x *DebugCreateMachineRequest) Reset() {
 | 
			
		||||
	*x = DebugCreateMachineRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[13]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[15]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -814,7 +940,7 @@ func (x *DebugCreateMachineRequest) String() string {
 | 
			
		||||
func (*DebugCreateMachineRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[13]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[15]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -827,7 +953,7 @@ func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use DebugCreateMachineRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*DebugCreateMachineRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{15}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DebugCreateMachineRequest) GetNamespace() string {
 | 
			
		||||
@ -869,7 +995,7 @@ type DebugCreateMachineResponse struct {
 | 
			
		||||
func (x *DebugCreateMachineResponse) Reset() {
 | 
			
		||||
	*x = DebugCreateMachineResponse{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[14]
 | 
			
		||||
		mi := &file_headscale_v1_machine_proto_msgTypes[16]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
@ -882,7 +1008,7 @@ func (x *DebugCreateMachineResponse) String() string {
 | 
			
		||||
func (*DebugCreateMachineResponse) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[14]
 | 
			
		||||
	mi := &file_headscale_v1_machine_proto_msgTypes[16]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
@ -895,7 +1021,7 @@ func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message {
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use DebugCreateMachineResponse.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*DebugCreateMachineResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14}
 | 
			
		||||
	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{16}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *DebugCreateMachineResponse) GetMachine() *Machine {
 | 
			
		||||
@ -916,7 +1042,7 @@ var file_headscale_v1_machine_proto_rawDesc = []byte{
 | 
			
		||||
	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
 | 
			
		||||
	0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73,
 | 
			
		||||
	0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b,
 | 
			
		||||
	0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x05, 0x0a, 0x07, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
 | 
			
		||||
	0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f,
 | 
			
		||||
	0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
@ -954,79 +1080,94 @@ var file_headscale_v1_machine_proto_rawDesc = []byte{
 | 
			
		||||
	0x74, 0x68, 0x6f, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x68, 0x65, 0x61,
 | 
			
		||||
	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
 | 
			
		||||
	0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
 | 
			
		||||
	0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x48, 0x0a, 0x16, 0x52, 0x65, 0x67, 0x69,
 | 
			
		||||
	0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
			
		||||
	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
 | 
			
		||||
	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
 | 
			
		||||
	0x65, 0x79, 0x22, 0x4a, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a,
 | 
			
		||||
	0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
 | 
			
		||||
	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x32,
 | 
			
		||||
	0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x63,
 | 
			
		||||
	0x65, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x66,
 | 
			
		||||
	0x6f, 0x72, 0x63, 0x65, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x76,
 | 
			
		||||
	0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52,
 | 
			
		||||
	0x0b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a,
 | 
			
		||||
	0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09,
 | 
			
		||||
	0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x61, 0x67, 0x73, 0x4a, 0x04, 0x08, 0x0e, 0x10,
 | 
			
		||||
	0x12, 0x22, 0x48, 0x0a, 0x16, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e,
 | 
			
		||||
	0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
 | 
			
		||||
	0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
 | 
			
		||||
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x4a, 0x0a, 0x17, 0x52,
 | 
			
		||||
	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
 | 
			
		||||
	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07,
 | 
			
		||||
	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x32, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
 | 
			
		||||
	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
 | 
			
		||||
	0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x12, 0x47,
 | 
			
		||||
	0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
			
		||||
	0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
 | 
			
		||||
	0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x22, 0x43, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71,
 | 
			
		||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f,
 | 
			
		||||
	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
 | 
			
		||||
	0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x42, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x54, 0x61,
 | 
			
		||||
	0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65,
 | 
			
		||||
	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x35, 0x0a, 0x14, 0x44,
 | 
			
		||||
	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69,
 | 
			
		||||
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x49, 0x64, 0x22, 0x45, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x35, 0x0a, 0x14, 0x44, 0x65, 0x6c,
 | 
			
		||||
	0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
			
		||||
	0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64,
 | 
			
		||||
	0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x0a, 0x14, 0x45, 0x78, 0x70,
 | 
			
		||||
	0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
			
		||||
	0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64,
 | 
			
		||||
	0x22, 0x48, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61,
 | 
			
		||||
	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x33, 0x0a, 0x13, 0x4c, 0x69,
 | 
			
		||||
	0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
			
		||||
	0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01,
 | 
			
		||||
	0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x0a, 0x14, 0x45,
 | 
			
		||||
	0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69,
 | 
			
		||||
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x49, 0x64, 0x22, 0x48, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68,
 | 
			
		||||
	0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68,
 | 
			
		||||
	0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x33, 0x0a, 0x13,
 | 
			
		||||
	0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
 | 
			
		||||
	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
 | 
			
		||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
 | 
			
		||||
	0x65, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65,
 | 
			
		||||
	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x12,
 | 
			
		||||
	0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
			
		||||
	0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64,
 | 
			
		||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49,
 | 
			
		||||
	0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22,
 | 
			
		||||
	0x49, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52,
 | 
			
		||||
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69,
 | 
			
		||||
	0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
 | 
			
		||||
	0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x12, 0x4d, 0x6f,
 | 
			
		||||
	0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
			
		||||
	0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12,
 | 
			
		||||
	0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a,
 | 
			
		||||
	0x13, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70,
 | 
			
		||||
	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
 | 
			
		||||
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61,
 | 
			
		||||
	0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x77, 0x0a, 0x19, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72,
 | 
			
		||||
	0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
			
		||||
	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18,
 | 
			
		||||
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
 | 
			
		||||
	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
 | 
			
		||||
	0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
 | 
			
		||||
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73,
 | 
			
		||||
	0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x4d,
 | 
			
		||||
	0x0a, 0x1a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07,
 | 
			
		||||
	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63,
 | 
			
		||||
	0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2a, 0x82, 0x01,
 | 
			
		||||
	0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,
 | 
			
		||||
	0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54,
 | 
			
		||||
	0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
 | 
			
		||||
	0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45,
 | 
			
		||||
	0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12,
 | 
			
		||||
	0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48,
 | 
			
		||||
	0x4f, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x47, 0x49,
 | 
			
		||||
	0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4f, 0x49, 0x44, 0x43,
 | 
			
		||||
	0x10, 0x03, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
 | 
			
		||||
	0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
 | 
			
		||||
	0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
 | 
			
		||||
	0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
	0x46, 0x0a, 0x13, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65,
 | 
			
		||||
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
 | 
			
		||||
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
 | 
			
		||||
	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07,
 | 
			
		||||
	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x77, 0x0a, 0x19, 0x44, 0x65, 0x62, 0x75, 0x67,
 | 
			
		||||
	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71,
 | 
			
		||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
 | 
			
		||||
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
 | 
			
		||||
	0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
			
		||||
	0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74,
 | 
			
		||||
	0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73,
 | 
			
		||||
	0x22, 0x4d, 0x0a, 0x1a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f,
 | 
			
		||||
	0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
 | 
			
		||||
	0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
 | 
			
		||||
	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2a,
 | 
			
		||||
	0x82, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68,
 | 
			
		||||
	0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d,
 | 
			
		||||
	0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
 | 
			
		||||
	0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f,
 | 
			
		||||
	0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4b, 0x45, 0x59, 0x10,
 | 
			
		||||
	0x01, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45,
 | 
			
		||||
	0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45,
 | 
			
		||||
	0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4f, 0x49,
 | 
			
		||||
	0x44, 0x43, 0x10, 0x03, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
 | 
			
		||||
	0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64,
 | 
			
		||||
	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62,
 | 
			
		||||
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@ -1042,7 +1183,7 @@ func file_headscale_v1_machine_proto_rawDescGZIP() []byte {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var file_headscale_v1_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
 | 
			
		||||
var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
 | 
			
		||||
var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
 | 
			
		||||
var file_headscale_v1_machine_proto_goTypes = []interface{}{
 | 
			
		||||
	(RegisterMethod)(0),                // 0: headscale.v1.RegisterMethod
 | 
			
		||||
	(*Machine)(nil),                    // 1: headscale.v1.Machine
 | 
			
		||||
@ -1050,39 +1191,42 @@ var file_headscale_v1_machine_proto_goTypes = []interface{}{
 | 
			
		||||
	(*RegisterMachineResponse)(nil),    // 3: headscale.v1.RegisterMachineResponse
 | 
			
		||||
	(*GetMachineRequest)(nil),          // 4: headscale.v1.GetMachineRequest
 | 
			
		||||
	(*GetMachineResponse)(nil),         // 5: headscale.v1.GetMachineResponse
 | 
			
		||||
	(*DeleteMachineRequest)(nil),       // 6: headscale.v1.DeleteMachineRequest
 | 
			
		||||
	(*DeleteMachineResponse)(nil),      // 7: headscale.v1.DeleteMachineResponse
 | 
			
		||||
	(*ExpireMachineRequest)(nil),       // 8: headscale.v1.ExpireMachineRequest
 | 
			
		||||
	(*ExpireMachineResponse)(nil),      // 9: headscale.v1.ExpireMachineResponse
 | 
			
		||||
	(*ListMachinesRequest)(nil),        // 10: headscale.v1.ListMachinesRequest
 | 
			
		||||
	(*ListMachinesResponse)(nil),       // 11: headscale.v1.ListMachinesResponse
 | 
			
		||||
	(*MoveMachineRequest)(nil),         // 12: headscale.v1.MoveMachineRequest
 | 
			
		||||
	(*MoveMachineResponse)(nil),        // 13: headscale.v1.MoveMachineResponse
 | 
			
		||||
	(*DebugCreateMachineRequest)(nil),  // 14: headscale.v1.DebugCreateMachineRequest
 | 
			
		||||
	(*DebugCreateMachineResponse)(nil), // 15: headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	(*Namespace)(nil),                  // 16: headscale.v1.Namespace
 | 
			
		||||
	(*timestamppb.Timestamp)(nil),      // 17: google.protobuf.Timestamp
 | 
			
		||||
	(*PreAuthKey)(nil),                 // 18: headscale.v1.PreAuthKey
 | 
			
		||||
	(*SetTagsRequest)(nil),             // 6: headscale.v1.SetTagsRequest
 | 
			
		||||
	(*SetTagsResponse)(nil),            // 7: headscale.v1.SetTagsResponse
 | 
			
		||||
	(*DeleteMachineRequest)(nil),       // 8: headscale.v1.DeleteMachineRequest
 | 
			
		||||
	(*DeleteMachineResponse)(nil),      // 9: headscale.v1.DeleteMachineResponse
 | 
			
		||||
	(*ExpireMachineRequest)(nil),       // 10: headscale.v1.ExpireMachineRequest
 | 
			
		||||
	(*ExpireMachineResponse)(nil),      // 11: headscale.v1.ExpireMachineResponse
 | 
			
		||||
	(*ListMachinesRequest)(nil),        // 12: headscale.v1.ListMachinesRequest
 | 
			
		||||
	(*ListMachinesResponse)(nil),       // 13: headscale.v1.ListMachinesResponse
 | 
			
		||||
	(*MoveMachineRequest)(nil),         // 14: headscale.v1.MoveMachineRequest
 | 
			
		||||
	(*MoveMachineResponse)(nil),        // 15: headscale.v1.MoveMachineResponse
 | 
			
		||||
	(*DebugCreateMachineRequest)(nil),  // 16: headscale.v1.DebugCreateMachineRequest
 | 
			
		||||
	(*DebugCreateMachineResponse)(nil), // 17: headscale.v1.DebugCreateMachineResponse
 | 
			
		||||
	(*Namespace)(nil),                  // 18: headscale.v1.Namespace
 | 
			
		||||
	(*timestamppb.Timestamp)(nil),      // 19: google.protobuf.Timestamp
 | 
			
		||||
	(*PreAuthKey)(nil),                 // 20: headscale.v1.PreAuthKey
 | 
			
		||||
}
 | 
			
		||||
var file_headscale_v1_machine_proto_depIdxs = []int32{
 | 
			
		||||
	16, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace
 | 
			
		||||
	17, // 1: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	17, // 2: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	17, // 3: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	18, // 4: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey
 | 
			
		||||
	17, // 5: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	18, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace
 | 
			
		||||
	19, // 1: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	19, // 2: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	19, // 3: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	20, // 4: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey
 | 
			
		||||
	19, // 5: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp
 | 
			
		||||
	0,  // 6: headscale.v1.Machine.register_method:type_name -> headscale.v1.RegisterMethod
 | 
			
		||||
	1,  // 7: headscale.v1.RegisterMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 8: headscale.v1.GetMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 9: headscale.v1.ExpireMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 10: headscale.v1.ListMachinesResponse.machines:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 11: headscale.v1.MoveMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 12: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	13, // [13:13] is the sub-list for method output_type
 | 
			
		||||
	13, // [13:13] is the sub-list for method input_type
 | 
			
		||||
	13, // [13:13] is the sub-list for extension type_name
 | 
			
		||||
	13, // [13:13] is the sub-list for extension extendee
 | 
			
		||||
	0,  // [0:13] is the sub-list for field type_name
 | 
			
		||||
	1,  // 9: headscale.v1.SetTagsResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 10: headscale.v1.ExpireMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 11: headscale.v1.ListMachinesResponse.machines:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 12: headscale.v1.MoveMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	1,  // 13: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine
 | 
			
		||||
	14, // [14:14] is the sub-list for method output_type
 | 
			
		||||
	14, // [14:14] is the sub-list for method input_type
 | 
			
		||||
	14, // [14:14] is the sub-list for extension type_name
 | 
			
		||||
	14, // [14:14] is the sub-list for extension extendee
 | 
			
		||||
	0,  // [0:14] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { file_headscale_v1_machine_proto_init() }
 | 
			
		||||
@ -1154,7 +1298,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*DeleteMachineRequest); i {
 | 
			
		||||
			switch v := v.(*SetTagsRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1166,7 +1310,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*DeleteMachineResponse); i {
 | 
			
		||||
			switch v := v.(*SetTagsResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1178,7 +1322,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*ExpireMachineRequest); i {
 | 
			
		||||
			switch v := v.(*DeleteMachineRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1190,7 +1334,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*ExpireMachineResponse); i {
 | 
			
		||||
			switch v := v.(*DeleteMachineResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1202,7 +1346,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*ListMachinesRequest); i {
 | 
			
		||||
			switch v := v.(*ExpireMachineRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1214,7 +1358,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*ListMachinesResponse); i {
 | 
			
		||||
			switch v := v.(*ExpireMachineResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1226,7 +1370,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*MoveMachineRequest); i {
 | 
			
		||||
			switch v := v.(*ListMachinesRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1238,7 +1382,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*MoveMachineResponse); i {
 | 
			
		||||
			switch v := v.(*ListMachinesResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1250,7 +1394,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*DebugCreateMachineRequest); i {
 | 
			
		||||
			switch v := v.(*MoveMachineRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
@ -1262,6 +1406,30 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*MoveMachineResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*DebugCreateMachineRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_headscale_v1_machine_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*DebugCreateMachineResponse); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
@ -1280,7 +1448,7 @@ func file_headscale_v1_machine_proto_init() {
 | 
			
		||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
			
		||||
			RawDescriptor: file_headscale_v1_machine_proto_rawDesc,
 | 
			
		||||
			NumEnums:      1,
 | 
			
		||||
			NumMessages:   15,
 | 
			
		||||
			NumMessages:   17,
 | 
			
		||||
			NumExtensions: 0,
 | 
			
		||||
			NumServices:   0,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@ -399,6 +399,53 @@
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "/api/v1/machine/{machineId}/tags": {
 | 
			
		||||
      "post": {
 | 
			
		||||
        "operationId": "HeadscaleService_SetTags",
 | 
			
		||||
        "responses": {
 | 
			
		||||
          "200": {
 | 
			
		||||
            "description": "A successful response.",
 | 
			
		||||
            "schema": {
 | 
			
		||||
              "$ref": "#/definitions/v1SetTagsResponse"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          "default": {
 | 
			
		||||
            "description": "An unexpected error response.",
 | 
			
		||||
            "schema": {
 | 
			
		||||
              "$ref": "#/definitions/rpcStatus"
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "parameters": [
 | 
			
		||||
          {
 | 
			
		||||
            "name": "machineId",
 | 
			
		||||
            "in": "path",
 | 
			
		||||
            "required": true,
 | 
			
		||||
            "type": "string",
 | 
			
		||||
            "format": "uint64"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "name": "body",
 | 
			
		||||
            "in": "body",
 | 
			
		||||
            "required": true,
 | 
			
		||||
            "schema": {
 | 
			
		||||
              "type": "object",
 | 
			
		||||
              "properties": {
 | 
			
		||||
                "tags": {
 | 
			
		||||
                  "type": "array",
 | 
			
		||||
                  "items": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "tags": [
 | 
			
		||||
          "HeadscaleService"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "/api/v1/namespace": {
 | 
			
		||||
      "get": {
 | 
			
		||||
        "operationId": "HeadscaleService_ListNamespaces",
 | 
			
		||||
@ -943,6 +990,24 @@
 | 
			
		||||
        },
 | 
			
		||||
        "registerMethod": {
 | 
			
		||||
          "$ref": "#/definitions/v1RegisterMethod"
 | 
			
		||||
        },
 | 
			
		||||
        "forcedTags": {
 | 
			
		||||
          "type": "array",
 | 
			
		||||
          "items": {
 | 
			
		||||
            "type": "string"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "invalidTags": {
 | 
			
		||||
          "type": "array",
 | 
			
		||||
          "items": {
 | 
			
		||||
            "type": "string"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "validTags": {
 | 
			
		||||
          "type": "array",
 | 
			
		||||
          "items": {
 | 
			
		||||
            "type": "string"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@ -1042,6 +1107,14 @@
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "v1SetTagsResponse": {
 | 
			
		||||
      "type": "object",
 | 
			
		||||
      "properties": {
 | 
			
		||||
        "machine": {
 | 
			
		||||
          "$ref": "#/definitions/v1Machine"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								go.mod
									
									
									
									
									
								
							@ -49,9 +49,11 @@ require (
 | 
			
		||||
	github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 // indirect
 | 
			
		||||
	github.com/atomicgo/cursor v0.0.1 // indirect
 | 
			
		||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
			
		||||
	github.com/bufbuild/buf v1.4.0 // indirect
 | 
			
		||||
	github.com/cenkalti/backoff/v4 v4.1.2 // indirect
 | 
			
		||||
	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 | 
			
		||||
	github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 // indirect
 | 
			
		||||
	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.1 // indirect
 | 
			
		||||
	github.com/docker/cli v20.10.11+incompatible // indirect
 | 
			
		||||
	github.com/docker/docker v20.10.7+incompatible // indirect
 | 
			
		||||
@ -63,7 +65,9 @@ require (
 | 
			
		||||
	github.com/go-playground/locales v0.13.0 // indirect
 | 
			
		||||
	github.com/go-playground/universal-translator v0.17.0 // indirect
 | 
			
		||||
	github.com/go-playground/validator/v10 v10.4.1 // indirect
 | 
			
		||||
	github.com/gofrs/flock v0.8.1 // indirect
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2 // indirect
 | 
			
		||||
	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
			
		||||
	github.com/golang/protobuf v1.5.2 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.5.7 // indirect
 | 
			
		||||
	github.com/google/go-github v17.0.0+incompatible // indirect
 | 
			
		||||
@ -83,12 +87,16 @@ require (
 | 
			
		||||
	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
 | 
			
		||||
	github.com/jackc/pgtype v1.11.0 // indirect
 | 
			
		||||
	github.com/jackc/pgx/v4 v4.16.0 // indirect
 | 
			
		||||
	github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a // indirect
 | 
			
		||||
	github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f // indirect
 | 
			
		||||
	github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 // indirect
 | 
			
		||||
	github.com/jinzhu/inflection v1.0.0 // indirect
 | 
			
		||||
	github.com/jinzhu/now v1.1.4 // indirect
 | 
			
		||||
	github.com/josharian/native v1.0.0 // indirect
 | 
			
		||||
	github.com/jsimonetti/rtnetlink v1.1.2-0.20220408201609-d380b505068b // indirect
 | 
			
		||||
	github.com/json-iterator/go v1.1.12 // indirect
 | 
			
		||||
	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
 | 
			
		||||
	github.com/klauspost/pgzip v1.2.5 // indirect
 | 
			
		||||
	github.com/kr/pretty v0.3.0 // indirect
 | 
			
		||||
	github.com/kr/text v0.2.0 // indirect
 | 
			
		||||
	github.com/leodido/go-urn v1.2.0 // indirect
 | 
			
		||||
@ -110,7 +118,9 @@ require (
 | 
			
		||||
	github.com/opencontainers/runc v1.0.2 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml v1.9.4 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect
 | 
			
		||||
	github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
 | 
			
		||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
			
		||||
	github.com/pkg/profile v1.6.0 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/prometheus/client_model v0.2.0 // indirect
 | 
			
		||||
	github.com/prometheus/common v0.32.1 // indirect
 | 
			
		||||
@ -118,6 +128,7 @@ require (
 | 
			
		||||
	github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
 | 
			
		||||
	github.com/rivo/uniseg v0.2.0 // indirect
 | 
			
		||||
	github.com/rogpeppe/go-internal v1.8.1-0.20211023094830-115ce09fd6b4 // indirect
 | 
			
		||||
	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 | 
			
		||||
	github.com/sirupsen/logrus v1.8.1 // indirect
 | 
			
		||||
	github.com/spf13/afero v1.8.2 // indirect
 | 
			
		||||
	github.com/spf13/cast v1.4.1 // indirect
 | 
			
		||||
@ -129,12 +140,16 @@ require (
 | 
			
		||||
	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
 | 
			
		||||
	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
 | 
			
		||||
	github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
 | 
			
		||||
	go.opencensus.io v0.23.0 // indirect
 | 
			
		||||
	go.uber.org/atomic v1.9.0 // indirect
 | 
			
		||||
	go.uber.org/multierr v1.8.0 // indirect
 | 
			
		||||
	go.uber.org/zap v1.21.0 // indirect
 | 
			
		||||
	go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect
 | 
			
		||||
	go4.org/mem v0.0.0-20210711025021-927187094b94 // indirect
 | 
			
		||||
	go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 // indirect
 | 
			
		||||
	golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
 | 
			
		||||
	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 | 
			
		||||
	golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect
 | 
			
		||||
	golang.org/x/text v0.3.7 // indirect
 | 
			
		||||
	golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
 | 
			
		||||
	golang.zx2c4.com/wireguard/windows v0.4.10 // indirect
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								go.sum
									
									
									
									
									
								
							@ -71,11 +71,14 @@ github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1L
 | 
			
		||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
			
		||||
github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU=
 | 
			
		||||
github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
			
		||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
			
		||||
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 | 
			
		||||
github.com/bufbuild/buf v1.4.0 h1:GqE3a8CMmcFvWPzuY3Mahf9Kf3S9XgZ/ORpfYFzO+90=
 | 
			
		||||
github.com/bufbuild/buf v1.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI=
 | 
			
		||||
github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029 h1:POmUHfxXdeyM8Aomg4tKDcwATCFuW+cYLkj6pwsw9pc=
 | 
			
		||||
github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029/go.mod h1:Rpr5n9cGHYdM3S3IK8ROSUUUYjQOu+MSUCZDcJbYWi8=
 | 
			
		||||
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
 | 
			
		||||
@ -111,6 +114,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
 | 
			
		||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
			
		||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
@ -138,6 +142,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
@ -176,6 +181,8 @@ github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7a
 | 
			
		||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
 | 
			
		||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
			
		||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
			
		||||
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
 | 
			
		||||
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
			
		||||
@ -187,6 +194,8 @@ github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 | 
			
		||||
@ -323,6 +332,16 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f
 | 
			
		||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a h1:d4+I1YEKVmWZrgkt6jpXBnLgV2ZjO0YxEtLDdfIZfH4=
 | 
			
		||||
github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw=
 | 
			
		||||
github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI=
 | 
			
		||||
github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI=
 | 
			
		||||
github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ=
 | 
			
		||||
github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f h1:BNuUg9k2EiJmlMwjoef3e8vZLHplbVw6DrjGFjLL+Yo=
 | 
			
		||||
github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q=
 | 
			
		||||
github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E=
 | 
			
		||||
github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 h1:uFlcJKZPLQd7rmOY/RrvBuUaYmAFnlFHKLivhO6cOy8=
 | 
			
		||||
github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 | 
			
		||||
github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=
 | 
			
		||||
@ -352,6 +371,8 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 | 
			
		||||
github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
 | 
			
		||||
github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE=
 | 
			
		||||
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
 | 
			
		||||
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
 | 
			
		||||
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
@ -420,6 +441,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
 | 
			
		||||
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 | 
			
		||||
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
 | 
			
		||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
			
		||||
github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
 | 
			
		||||
@ -439,11 +461,15 @@ github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDS
 | 
			
		||||
github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
 | 
			
		||||
github.com/philip-bui/grpc-zerolog v1.0.1 h1:EMacvLRUd2O1K0eWod27ZP5CY1iTNkhBDLSN+Q4JEvA=
 | 
			
		||||
github.com/philip-bui/grpc-zerolog v1.0.1/go.mod h1:qXbiq/2X4ZUMMshsqlWyTHOcw7ns+GZmlqZZN05ZHcQ=
 | 
			
		||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
 | 
			
		||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
 | 
			
		||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 | 
			
		||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/profile v1.6.0 h1:hUDfIISABYI59DyeB3OTay/HxSRwTQ8rB/H83k6r5dM=
 | 
			
		||||
github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
 | 
			
		||||
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
@ -494,6 +520,7 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC
 | 
			
		||||
github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc=
 | 
			
		||||
github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
			
		||||
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
 | 
			
		||||
@ -560,6 +587,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 | 
			
		||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 | 
			
		||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 | 
			
		||||
github.com/zsais/go-gin-prometheus v0.1.0 h1:bkLv1XCdzqVgQ36ScgRi09MA2UC1t3tAB6nsfErsGO4=
 | 
			
		||||
@ -570,18 +598,29 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 | 
			
		||||
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
 | 
			
		||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 | 
			
		||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 | 
			
		||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 | 
			
		||||
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 | 
			
		||||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 | 
			
		||||
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 | 
			
		||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 | 
			
		||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 | 
			
		||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 | 
			
		||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 | 
			
		||||
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
 | 
			
		||||
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 | 
			
		||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 | 
			
		||||
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
 | 
			
		||||
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
 | 
			
		||||
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE=
 | 
			
		||||
go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA=
 | 
			
		||||
go4.org/mem v0.0.0-20210711025021-927187094b94 h1:OAAkygi2Js191AJP1Ds42MhJRgeofeKGjuoUqNp1QC4=
 | 
			
		||||
@ -673,6 +712,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R
 | 
			
		||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
@ -768,6 +808,7 @@ golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
@ -789,6 +830,8 @@ golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4
 | 
			
		||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8=
 | 
			
		||||
golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@ -860,6 +903,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 | 
			
		||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
@ -956,6 +1000,7 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
 | 
			
		||||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
 | 
			
		||||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 | 
			
		||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 | 
			
		||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 | 
			
		||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
 | 
			
		||||
google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8=
 | 
			
		||||
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
			
		||||
@ -971,6 +1016,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 | 
			
		||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 | 
			
		||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
@ -978,6 +1024,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										50
									
								
								grpcv1.go
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								grpcv1.go
									
									
									
									
									
								
							@ -3,10 +3,13 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	"google.golang.org/grpc/status"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -182,6 +185,41 @@ func (api headscaleV1APIServer) GetMachine(
 | 
			
		||||
	return &v1.GetMachineResponse{Machine: machine.toProto()}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (api headscaleV1APIServer) SetTags(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	request *v1.SetTagsRequest,
 | 
			
		||||
) (*v1.SetTagsResponse, error) {
 | 
			
		||||
	machine, err := api.h.GetMachineByID(request.GetMachineId())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tag := range request.GetTags() {
 | 
			
		||||
		if strings.Index(tag, "tag:") != 0 {
 | 
			
		||||
			return &v1.SetTagsResponse{
 | 
			
		||||
					Machine: nil,
 | 
			
		||||
				}, status.Error(
 | 
			
		||||
					codes.InvalidArgument,
 | 
			
		||||
					"Invalid tag detected. Each tag must start with the string 'tag:'",
 | 
			
		||||
				)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = api.h.SetTags(machine, request.GetTags())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return &v1.SetTagsResponse{
 | 
			
		||||
			Machine: nil,
 | 
			
		||||
		}, status.Error(codes.Internal, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Trace().
 | 
			
		||||
		Str("machine", machine.Name).
 | 
			
		||||
		Strs("tags", request.GetTags()).
 | 
			
		||||
		Msg("Changing tags of machine")
 | 
			
		||||
 | 
			
		||||
	return &v1.SetTagsResponse{Machine: machine.toProto()}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (api headscaleV1APIServer) DeleteMachine(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	request *v1.DeleteMachineRequest,
 | 
			
		||||
@ -247,7 +285,15 @@ func (api headscaleV1APIServer) ListMachines(
 | 
			
		||||
 | 
			
		||||
	response := make([]*v1.Machine, len(machines))
 | 
			
		||||
	for index, machine := range machines {
 | 
			
		||||
		response[index] = machine.toProto()
 | 
			
		||||
		m := machine.toProto()
 | 
			
		||||
		validTags, invalidTags := getTags(
 | 
			
		||||
			api.h.aclPolicy,
 | 
			
		||||
			machine,
 | 
			
		||||
			api.h.cfg.OIDC.StripEmaildomain,
 | 
			
		||||
		)
 | 
			
		||||
		m.InvalidTags = invalidTags
 | 
			
		||||
		m.ValidTags = validTags
 | 
			
		||||
		response[index] = m
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &v1.ListMachinesResponse{Machines: response}, nil
 | 
			
		||||
 | 
			
		||||
@ -525,6 +525,135 @@ func (s *IntegrationCLITestSuite) TestPreAuthKeyCommandReusableEphemeral() {
 | 
			
		||||
	assert.Len(s.T(), listedPreAuthKeys, 2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *IntegrationCLITestSuite) TestNodeTagCommand() {
 | 
			
		||||
	namespace, err := s.createNamespace("machine-namespace")
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
	machineKeys := []string{
 | 
			
		||||
		"9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
 | 
			
		||||
		"6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
 | 
			
		||||
	}
 | 
			
		||||
	machines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range machineKeys {
 | 
			
		||||
		_, err := ExecuteCommand(
 | 
			
		||||
			&s.headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("machine-%d", index+1),
 | 
			
		||||
				"--namespace",
 | 
			
		||||
				namespace.Name,
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			[]string{},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
		machineResult, err := ExecuteCommand(
 | 
			
		||||
			&s.headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--namespace",
 | 
			
		||||
				namespace.Name,
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			[]string{},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = json.Unmarshal([]byte(machineResult), &machine)
 | 
			
		||||
		assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
		machines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
	assert.Len(s.T(), machines, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	addTagResult, err := ExecuteCommand(
 | 
			
		||||
		&s.headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"tag",
 | 
			
		||||
			"-i", "1",
 | 
			
		||||
			"-t", "tag:test",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		[]string{},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
	var machine v1.Machine
 | 
			
		||||
	err = json.Unmarshal([]byte(addTagResult), &machine)
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
	assert.Equal(s.T(), []string{"tag:test"}, machine.ForcedTags)
 | 
			
		||||
 | 
			
		||||
	// try to set a wrong tag and retrieve the error
 | 
			
		||||
	wrongTagResult, err := ExecuteCommand(
 | 
			
		||||
		&s.headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"tag",
 | 
			
		||||
			"-i", "2",
 | 
			
		||||
			"-t", "wrong-tag",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		[]string{},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
	type errOutput struct {
 | 
			
		||||
		Error string `json:"error"`
 | 
			
		||||
	}
 | 
			
		||||
	var errorOutput errOutput
 | 
			
		||||
	err = json.Unmarshal([]byte(wrongTagResult), &errorOutput)
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
	assert.Contains(s.T(), errorOutput.Error, "Invalid tag detected")
 | 
			
		||||
 | 
			
		||||
	// Test list all nodes after added seconds
 | 
			
		||||
	listAllResult, err := ExecuteCommand(
 | 
			
		||||
		&s.headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		[]string{},
 | 
			
		||||
	)
 | 
			
		||||
	resultMachines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
	json.Unmarshal([]byte(listAllResult), &resultMachines)
 | 
			
		||||
	found := false
 | 
			
		||||
	for _, machine := range resultMachines {
 | 
			
		||||
		if machine.ForcedTags != nil {
 | 
			
		||||
			for _, tag := range machine.ForcedTags {
 | 
			
		||||
				if tag == "tag:test" {
 | 
			
		||||
					found = true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	assert.Equal(
 | 
			
		||||
		s.T(),
 | 
			
		||||
		true,
 | 
			
		||||
		found,
 | 
			
		||||
		"should find a machine with the tag 'tag:test' in the list of machines",
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *IntegrationCLITestSuite) TestNodeCommand() {
 | 
			
		||||
	namespace, err := s.createNamespace("machine-namespace")
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
 | 
			
		||||
@ -107,7 +107,10 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 | 
			
		||||
	headscaleOptions := &dockertest.RunOptions{
 | 
			
		||||
		Name: headscaleHostname,
 | 
			
		||||
		Mounts: []string{
 | 
			
		||||
			fmt.Sprintf("%s/integration_test/etc_embedded_derp:/etc/headscale", currentPath),
 | 
			
		||||
			fmt.Sprintf(
 | 
			
		||||
				"%s/integration_test/etc_embedded_derp:/etc/headscale",
 | 
			
		||||
				currentPath,
 | 
			
		||||
			),
 | 
			
		||||
		},
 | 
			
		||||
		Cmd:          []string{"headscale", "serve"},
 | 
			
		||||
		ExposedPorts: []string{"8443/tcp", "3478/udp"},
 | 
			
		||||
@ -197,7 +200,10 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 | 
			
		||||
	assert.Nil(s.T(), err)
 | 
			
		||||
	assert.True(s.T(), preAuthKey.Reusable)
 | 
			
		||||
 | 
			
		||||
	headscaleEndpoint := fmt.Sprintf("https://headscale:%s", s.headscale.GetPort("8443/tcp"))
 | 
			
		||||
	headscaleEndpoint := fmt.Sprintf(
 | 
			
		||||
		"https://headscale:%s",
 | 
			
		||||
		s.headscale.GetPort("8443/tcp"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	log.Printf(
 | 
			
		||||
		"Joining tailscale containers to headscale at %s\n",
 | 
			
		||||
@ -243,7 +249,9 @@ func (s *IntegrationDERPTestSuite) Join(
 | 
			
		||||
	log.Printf("%s joined\n", hostname)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *IntegrationDERPTestSuite) tailscaleContainer(identifier, version string, network dockertest.Network,
 | 
			
		||||
func (s *IntegrationDERPTestSuite) tailscaleContainer(
 | 
			
		||||
	identifier, version string,
 | 
			
		||||
	network dockertest.Network,
 | 
			
		||||
) (string, *dockertest.Resource) {
 | 
			
		||||
	tailscaleBuildOptions := getDockerBuildOptions(version)
 | 
			
		||||
 | 
			
		||||
@ -260,7 +268,10 @@ func (s *IntegrationDERPTestSuite) tailscaleContainer(identifier, version string
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// expose the host IP address, so we can access it from inside the container
 | 
			
		||||
		ExtraHosts: []string{"host.docker.internal:host-gateway", "headscale:host-gateway"},
 | 
			
		||||
		ExtraHosts: []string{
 | 
			
		||||
			"host.docker.internal:host-gateway",
 | 
			
		||||
			"headscale:host-gateway",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pts, err := s.pool.BuildAndRunWithBuildOptions(
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										64
									
								
								machine.go
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								machine.go
									
									
									
									
									
								
							@ -2,6 +2,7 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql/driver"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
@ -45,6 +46,8 @@ type Machine struct {
 | 
			
		||||
 | 
			
		||||
	RegisterMethod string
 | 
			
		||||
 | 
			
		||||
	ForcedTags StringList
 | 
			
		||||
 | 
			
		||||
	// TODO(kradalby): This seems like irrelevant information?
 | 
			
		||||
	AuthKeyID uint
 | 
			
		||||
	AuthKey   *PreAuthKey
 | 
			
		||||
@ -122,7 +125,7 @@ func (machine Machine) isExpired() bool {
 | 
			
		||||
 | 
			
		||||
func containsAddresses(inputs []string, addrs []string) bool {
 | 
			
		||||
	for _, addr := range addrs {
 | 
			
		||||
		if containsString(inputs, addr) {
 | 
			
		||||
		if contains(inputs, addr) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -357,6 +360,18 @@ func (h *Headscale) UpdateMachine(machine *Machine) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetTags takes a Machine struct pointer and update the forced tags.
 | 
			
		||||
func (h *Headscale) SetTags(machine *Machine, tags []string) error {
 | 
			
		||||
	machine.ForcedTags = tags
 | 
			
		||||
	if err := h.UpdateACLRules(); err != nil && !errors.Is(err, errEmptyPolicy) {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	h.setLastStateChangeToNow(machine.Namespace.Name)
 | 
			
		||||
	h.db.Save(machine)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExpireMachine takes a Machine struct and sets the expire field to now.
 | 
			
		||||
func (h *Headscale) ExpireMachine(machine *Machine) {
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
@ -613,6 +628,7 @@ func (machine *Machine) toProto() *v1.Machine {
 | 
			
		||||
		IpAddresses: machine.IPAddresses.ToStringSlice(),
 | 
			
		||||
		Name:        machine.Name,
 | 
			
		||||
		Namespace:   machine.Namespace.toProto(),
 | 
			
		||||
		ForcedTags:  machine.ForcedTags,
 | 
			
		||||
 | 
			
		||||
		// TODO(kradalby): Implement register method enum converter
 | 
			
		||||
		// RegisterMethod: ,
 | 
			
		||||
@ -641,6 +657,50 @@ func (machine *Machine) toProto() *v1.Machine {
 | 
			
		||||
	return machineProto
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getTags will return the tags of the current machine.
 | 
			
		||||
// Invalid tags are tags added by a user on a node, and that user doesn't have authority to add this tag.
 | 
			
		||||
// Valid tags are tags added by a user that is allowed in the ACL policy to add this tag.
 | 
			
		||||
func getTags(
 | 
			
		||||
	aclPolicy *ACLPolicy,
 | 
			
		||||
	machine Machine,
 | 
			
		||||
	stripEmailDomain bool,
 | 
			
		||||
) ([]string, []string) {
 | 
			
		||||
	validTags := make([]string, 0)
 | 
			
		||||
	invalidTags := make([]string, 0)
 | 
			
		||||
	if aclPolicy == nil {
 | 
			
		||||
		return validTags, invalidTags
 | 
			
		||||
	}
 | 
			
		||||
	validTagMap := make(map[string]bool)
 | 
			
		||||
	invalidTagMap := make(map[string]bool)
 | 
			
		||||
	for _, tag := range machine.HostInfo.RequestTags {
 | 
			
		||||
		owners, err := expandTagOwners(*aclPolicy, tag, stripEmailDomain)
 | 
			
		||||
		if errors.Is(err, errInvalidTag) {
 | 
			
		||||
			invalidTagMap[tag] = true
 | 
			
		||||
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		var found bool
 | 
			
		||||
		for _, owner := range owners {
 | 
			
		||||
			if machine.Namespace.Name == owner {
 | 
			
		||||
				found = true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if found {
 | 
			
		||||
			validTagMap[tag] = true
 | 
			
		||||
		} else {
 | 
			
		||||
			invalidTagMap[tag] = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for tag := range invalidTagMap {
 | 
			
		||||
		invalidTags = append(invalidTags, tag)
 | 
			
		||||
	}
 | 
			
		||||
	for tag := range validTagMap {
 | 
			
		||||
		validTags = append(validTags, tag)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return validTags, invalidTags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) RegisterMachineFromAuthCallback(
 | 
			
		||||
	machineKeyStr string,
 | 
			
		||||
	namespaceName string,
 | 
			
		||||
@ -751,7 +811,7 @@ func (h *Headscale) EnableRoutes(machine *Machine, routeStrs ...string) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, newRoute := range newRoutes {
 | 
			
		||||
		if !containsIPPrefix(machine.GetAdvertisedRoutes(), newRoute) {
 | 
			
		||||
		if !contains(machine.GetAdvertisedRoutes(), newRoute) {
 | 
			
		||||
			return fmt.Errorf(
 | 
			
		||||
				"route (%s) is not available on node %s: %w",
 | 
			
		||||
				machine.Name,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										151
									
								
								machine_test.go
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								machine_test.go
									
									
									
									
									
								
							@ -277,6 +277,157 @@ func (s *Suite) TestSerdeAddressStrignSlice(c *check.C) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Test_getTags(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
		aclPolicy        *ACLPolicy
 | 
			
		||||
		machine          Machine
 | 
			
		||||
		stripEmailDomain bool
 | 
			
		||||
	}
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name        string
 | 
			
		||||
		args        args
 | 
			
		||||
		wantInvalid []string
 | 
			
		||||
		wantValid   []string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "valid tag one machine",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: &ACLPolicy{
 | 
			
		||||
					TagOwners: TagOwners{
 | 
			
		||||
						"tag:valid": []string{"joe"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				machine: Machine{
 | 
			
		||||
					Namespace: Namespace{
 | 
			
		||||
						Name: "joe",
 | 
			
		||||
					},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
						RequestTags: []string{"tag:valid"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantValid:   []string{"tag:valid"},
 | 
			
		||||
			wantInvalid: nil,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid tag and valid tag one machine",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: &ACLPolicy{
 | 
			
		||||
					TagOwners: TagOwners{
 | 
			
		||||
						"tag:valid": []string{"joe"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				machine: Machine{
 | 
			
		||||
					Namespace: Namespace{
 | 
			
		||||
						Name: "joe",
 | 
			
		||||
					},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
						RequestTags: []string{"tag:valid", "tag:invalid"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantValid:   []string{"tag:valid"},
 | 
			
		||||
			wantInvalid: []string{"tag:invalid"},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "multiple invalid and identical tags, should return only one invalid tag",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: &ACLPolicy{
 | 
			
		||||
					TagOwners: TagOwners{
 | 
			
		||||
						"tag:valid": []string{"joe"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				machine: Machine{
 | 
			
		||||
					Namespace: Namespace{
 | 
			
		||||
						Name: "joe",
 | 
			
		||||
					},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
						RequestTags: []string{
 | 
			
		||||
							"tag:invalid",
 | 
			
		||||
							"tag:valid",
 | 
			
		||||
							"tag:invalid",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantValid:   []string{"tag:valid"},
 | 
			
		||||
			wantInvalid: []string{"tag:invalid"},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "only invalid tags",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: &ACLPolicy{
 | 
			
		||||
					TagOwners: TagOwners{
 | 
			
		||||
						"tag:valid": []string{"joe"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				machine: Machine{
 | 
			
		||||
					Namespace: Namespace{
 | 
			
		||||
						Name: "joe",
 | 
			
		||||
					},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
						RequestTags: []string{"tag:invalid", "very-invalid"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantValid:   nil,
 | 
			
		||||
			wantInvalid: []string{"tag:invalid", "very-invalid"},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "empty ACLPolicy should return empty tags and should not panic",
 | 
			
		||||
			args: args{
 | 
			
		||||
				aclPolicy: nil,
 | 
			
		||||
				machine: Machine{
 | 
			
		||||
					Namespace: Namespace{
 | 
			
		||||
						Name: "joe",
 | 
			
		||||
					},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
						RequestTags: []string{"tag:invalid", "very-invalid"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantValid:   nil,
 | 
			
		||||
			wantInvalid: nil,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		t.Run(test.name, func(t *testing.T) {
 | 
			
		||||
			gotValid, gotInvalid := getTags(
 | 
			
		||||
				test.args.aclPolicy,
 | 
			
		||||
				test.args.machine,
 | 
			
		||||
				test.args.stripEmailDomain,
 | 
			
		||||
			)
 | 
			
		||||
			for _, valid := range gotValid {
 | 
			
		||||
				if !contains(test.wantValid, valid) {
 | 
			
		||||
					t.Errorf(
 | 
			
		||||
						"valids: getTags() = %v, want %v",
 | 
			
		||||
						gotValid,
 | 
			
		||||
						test.wantValid,
 | 
			
		||||
					)
 | 
			
		||||
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			for _, invalid := range gotInvalid {
 | 
			
		||||
				if !contains(test.wantInvalid, invalid) {
 | 
			
		||||
					t.Errorf(
 | 
			
		||||
						"invalids: getTags() = %v, want %v",
 | 
			
		||||
						gotInvalid,
 | 
			
		||||
						test.wantInvalid,
 | 
			
		||||
					)
 | 
			
		||||
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// nolint
 | 
			
		||||
func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								poll.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								poll.go
									
									
									
									
									
								
							@ -20,6 +20,10 @@ const (
 | 
			
		||||
	updateCheckInterval = 10 * time.Second
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type contextKey string
 | 
			
		||||
 | 
			
		||||
const machineNameContextKey = contextKey("machineName")
 | 
			
		||||
 | 
			
		||||
// PollNetMapHandler takes care of /machine/:id/map
 | 
			
		||||
//
 | 
			
		||||
// This is the busiest endpoint, as it keeps the HTTP long poll that updates
 | 
			
		||||
@ -272,7 +276,7 @@ func (h *Headscale) PollNetMapStream(
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx := context.WithValue(ctx.Request.Context(), "machineName", machine.Name)
 | 
			
		||||
		ctx := context.WithValue(ctx.Request.Context(), machineNameContextKey, machine.Name)
 | 
			
		||||
 | 
			
		||||
		ctx, cancel := context.WithCancel(ctx)
 | 
			
		||||
		defer cancel()
 | 
			
		||||
@ -576,12 +580,12 @@ func (h *Headscale) scheduledPollWorker(
 | 
			
		||||
 | 
			
		||||
	defer closeChanWithLog(
 | 
			
		||||
		updateChan,
 | 
			
		||||
		fmt.Sprint(ctx.Value("machineName")),
 | 
			
		||||
		fmt.Sprint(ctx.Value(machineNameContextKey)),
 | 
			
		||||
		"updateChan",
 | 
			
		||||
	)
 | 
			
		||||
	defer closeChanWithLog(
 | 
			
		||||
		keepAliveChan,
 | 
			
		||||
		fmt.Sprint(ctx.Value("machineName")),
 | 
			
		||||
		fmt.Sprint(ctx.Value(machineNameContextKey)),
 | 
			
		||||
		"updateChan",
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -81,6 +81,13 @@ service HeadscaleService {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rpc SetTags(SetTagsRequest) returns (SetTagsResponse) {
 | 
			
		||||
        option (google.api.http) = {
 | 
			
		||||
            post: "/api/v1/machine/{machine_id}/tags"
 | 
			
		||||
            body: "*"
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rpc RegisterMachine(RegisterMachineRequest) returns (RegisterMachineResponse) {
 | 
			
		||||
        option (google.api.http) = {
 | 
			
		||||
            post: "/api/v1/machine/register"
 | 
			
		||||
 | 
			
		||||
@ -31,12 +31,18 @@ message Machine {
 | 
			
		||||
    google.protobuf.Timestamp created_at = 12;
 | 
			
		||||
 | 
			
		||||
    RegisterMethod register_method = 13;
 | 
			
		||||
 | 
			
		||||
    reserved 14 to 17;
 | 
			
		||||
    // google.protobuf.Timestamp updated_at = 14;
 | 
			
		||||
    // google.protobuf.Timestamp deleted_at = 15;
 | 
			
		||||
 | 
			
		||||
    // bytes host_info      = 15;
 | 
			
		||||
    // bytes endpoints      = 16;
 | 
			
		||||
    // bytes enabled_routes = 17;
 | 
			
		||||
 | 
			
		||||
    repeated string forced_tags  = 18;
 | 
			
		||||
    repeated string invalid_tags = 19;
 | 
			
		||||
    repeated string valid_tags   = 20;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message RegisterMachineRequest {
 | 
			
		||||
@ -56,6 +62,15 @@ message GetMachineResponse {
 | 
			
		||||
    Machine machine = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message SetTagsRequest {
 | 
			
		||||
    uint64          machine_id = 1;
 | 
			
		||||
    repeated string tags       = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message SetTagsResponse {
 | 
			
		||||
    Machine machine = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message DeleteMachineRequest {
 | 
			
		||||
    uint64 machine_id = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								utils.go
									
									
									
									
									
								
							@ -12,6 +12,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
@ -135,26 +136,29 @@ func encode(
 | 
			
		||||
	return privKey.SealTo(*pubKey, b), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getAvailableIPs() (ips MachineAddresses, err error) {
 | 
			
		||||
func (h *Headscale) getAvailableIPs() (MachineAddresses, error) {
 | 
			
		||||
	var ips MachineAddresses
 | 
			
		||||
	var err error
 | 
			
		||||
	ipPrefixes := h.cfg.IPPrefixes
 | 
			
		||||
	for _, ipPrefix := range ipPrefixes {
 | 
			
		||||
		var ip *netaddr.IP
 | 
			
		||||
		ip, err = h.getAvailableIP(ipPrefix)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
			return ips, err
 | 
			
		||||
		}
 | 
			
		||||
		ips = append(ips, *ip)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
	return ips, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetIPPrefixEndpoints(na netaddr.IPPrefix) (network, broadcast netaddr.IP) {
 | 
			
		||||
func GetIPPrefixEndpoints(na netaddr.IPPrefix) (netaddr.IP, netaddr.IP) {
 | 
			
		||||
	var network, broadcast netaddr.IP
 | 
			
		||||
	ipRange := na.Range()
 | 
			
		||||
	network = ipRange.From()
 | 
			
		||||
	broadcast = ipRange.To()
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
	return network, broadcast
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, error) {
 | 
			
		||||
@ -223,16 +227,6 @@ func (h *Headscale) getUsedIPs() (*netaddr.IPSet, error) {
 | 
			
		||||
	return ipSet, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func containsString(ss []string, s string) bool {
 | 
			
		||||
	for _, v := range ss {
 | 
			
		||||
		if v == s {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tailNodesToString(nodes []*tailcfg.Node) string {
 | 
			
		||||
	temp := make([]string, len(nodes))
 | 
			
		||||
 | 
			
		||||
@ -282,9 +276,9 @@ func stringToIPPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func containsIPPrefix(prefixes []netaddr.IPPrefix, prefix netaddr.IPPrefix) bool {
 | 
			
		||||
	for _, p := range prefixes {
 | 
			
		||||
		if prefix == p {
 | 
			
		||||
func contains[T string | netaddr.IPPrefix](ts []T, t T) bool {
 | 
			
		||||
	for _, v := range ts {
 | 
			
		||||
		if reflect.DeepEqual(v, t) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user