mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Merge branch 'main' into autoapprovers
This commit is contained in:
		
						commit
						9810d84e2d
					
				
							
								
								
									
										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: v1.46.1
 | 
			
		||||
          version: v1.49.0
 | 
			
		||||
 | 
			
		||||
          # Only block PRs on new problems.
 | 
			
		||||
          # If this is not enabled, we will end up having PRs
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							@ -18,7 +18,7 @@ jobs:
 | 
			
		||||
      - name: Set up Go
 | 
			
		||||
        uses: actions/setup-go@v2
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: 1.18.0
 | 
			
		||||
          go-version: 1.19.0
 | 
			
		||||
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
---
 | 
			
		||||
before:
 | 
			
		||||
  hooks:
 | 
			
		||||
    - go mod tidy -compat=1.18
 | 
			
		||||
    - go mod tidy -compat=1.19
 | 
			
		||||
 | 
			
		||||
release:
 | 
			
		||||
  prerelease: auto
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,9 @@
 | 
			
		||||
 | 
			
		||||
- Added support for Tailscale TS2021 protocol [#738](https://github.com/juanfont/headscale/pull/738)
 | 
			
		||||
- Add ability to specify config location via env var `HEADSCALE_CONFIG` [#674](https://github.com/juanfont/headscale/issues/674)
 | 
			
		||||
- Target Go 1.19 for Headscale [#778](https://github.com/juanfont/headscale/pull/778)
 | 
			
		||||
- Target Tailscale v1.30.0 to build Headscale [#780](https://github.com/juanfont/headscale/pull/780)
 | 
			
		||||
- Give a warning when running Headscale with reverse proxy improperly configured for WebSockets [#788](https://github.com/juanfont/headscale/pull/788)
 | 
			
		||||
 | 
			
		||||
## 0.16.4 (2022-08-21)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
# Builder image
 | 
			
		||||
FROM docker.io/golang:1.18.0-bullseye AS build
 | 
			
		||||
FROM docker.io/golang:1.19.0-bullseye AS build
 | 
			
		||||
ARG VERSION=dev
 | 
			
		||||
ENV GOPATH /go
 | 
			
		||||
WORKDIR /go/src/headscale
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
# Builder image
 | 
			
		||||
FROM docker.io/golang:1.18.0-alpine AS build
 | 
			
		||||
FROM docker.io/golang:1.19.0-alpine AS build
 | 
			
		||||
ARG VERSION=dev
 | 
			
		||||
ENV GOPATH /go
 | 
			
		||||
WORKDIR /go/src/headscale
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
# Builder image
 | 
			
		||||
FROM docker.io/golang:1.18.0-bullseye AS build
 | 
			
		||||
FROM docker.io/golang:1.19.0-bullseye AS build
 | 
			
		||||
ARG VERSION=dev
 | 
			
		||||
ENV GOPATH /go
 | 
			
		||||
WORKDIR /go/src/headscale
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								acls.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								acls.go
									
									
									
									
									
								
							@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strconv"
 | 
			
		||||
@ -13,7 +14,6 @@ import (
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
	"github.com/tailscale/hujson"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -394,13 +394,13 @@ func expandAlias(
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if alias is an IP
 | 
			
		||||
	ip, err := netaddr.ParseIP(alias)
 | 
			
		||||
	ip, err := netip.ParseAddr(alias)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return []string{ip.String()}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if alias is an CIDR
 | 
			
		||||
	cidr, err := netaddr.ParseIPPrefix(alias)
 | 
			
		||||
	cidr, err := netip.ParsePrefix(alias)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return []string{cidr.String()}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										111
									
								
								acls_test.go
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								acls_test.go
									
									
									
									
									
								
							@ -2,11 +2,11 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -131,7 +131,7 @@ func (s *Suite) TestValidExpandTagOwnersInSources(c *check.C) {
 | 
			
		||||
		NodeKey:        "bar",
 | 
			
		||||
		DiscoKey:       "faa",
 | 
			
		||||
		Hostname:       "testmachine",
 | 
			
		||||
		IPAddresses:    MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		NamespaceID:    namespace.ID,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		AuthKeyID:      uint(pak.ID),
 | 
			
		||||
@ -181,7 +181,7 @@ func (s *Suite) TestValidExpandTagOwnersInDestinations(c *check.C) {
 | 
			
		||||
		NodeKey:        "bar",
 | 
			
		||||
		DiscoKey:       "faa",
 | 
			
		||||
		Hostname:       "testmachine",
 | 
			
		||||
		IPAddresses:    MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		NamespaceID:    namespace.ID,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		AuthKeyID:      uint(pak.ID),
 | 
			
		||||
@ -231,7 +231,7 @@ func (s *Suite) TestInvalidTagValidNamespace(c *check.C) {
 | 
			
		||||
		NodeKey:        "bar",
 | 
			
		||||
		DiscoKey:       "faa",
 | 
			
		||||
		Hostname:       "testmachine",
 | 
			
		||||
		IPAddresses:    MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		NamespaceID:    namespace.ID,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		AuthKeyID:      uint(pak.ID),
 | 
			
		||||
@ -280,7 +280,7 @@ func (s *Suite) TestValidTagInvalidNamespace(c *check.C) {
 | 
			
		||||
		NodeKey:        "bar",
 | 
			
		||||
		DiscoKey:       "faa",
 | 
			
		||||
		Hostname:       "webserver",
 | 
			
		||||
		IPAddresses:    MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		NamespaceID:    namespace.ID,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		AuthKeyID:      uint(pak.ID),
 | 
			
		||||
@ -299,7 +299,7 @@ func (s *Suite) TestValidTagInvalidNamespace(c *check.C) {
 | 
			
		||||
		NodeKey:        "bar2",
 | 
			
		||||
		DiscoKey:       "faab",
 | 
			
		||||
		Hostname:       "user",
 | 
			
		||||
		IPAddresses:    MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
		IPAddresses:    MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
		NamespaceID:    namespace.ID,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		AuthKeyID:      uint(pak.ID),
 | 
			
		||||
@ -825,7 +825,6 @@ func Test_listMachinesInNamespace(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// nolint
 | 
			
		||||
func Test_expandAlias(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
		machines         []Machine
 | 
			
		||||
@ -844,10 +843,10 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
			args: args{
 | 
			
		||||
				alias: "*",
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.1")}},
 | 
			
		||||
					{IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.1")}},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.78.84.227"),
 | 
			
		||||
							netip.MustParseAddr("100.78.84.227"),
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
@ -864,25 +863,25 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -902,25 +901,25 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -951,7 +950,7 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{},
 | 
			
		||||
				aclPolicy: ACLPolicy{
 | 
			
		||||
					Hosts: Hosts{
 | 
			
		||||
						"homeNetwork": netaddr.MustParseIPPrefix("192.168.1.0/24"),
 | 
			
		||||
						"homeNetwork": netip.MustParsePrefix("192.168.1.0/24"),
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				stripEmailDomain: true,
 | 
			
		||||
@ -988,7 +987,7 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -999,7 +998,7 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1010,13 +1009,13 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1036,25 +1035,25 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1077,27 +1076,27 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:hr-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:hr-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1115,14 +1114,14 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:hr-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1133,13 +1132,13 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1161,7 +1160,7 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
				machines: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1172,7 +1171,7 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1183,13 +1182,13 @@ func Test_expandAlias(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1245,7 +1244,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				nodes: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1256,7 +1255,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1267,7 +1266,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1277,7 +1276,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			want: []Machine{
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -1296,7 +1295,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				nodes: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1307,7 +1306,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1318,7 +1317,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1328,7 +1327,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			want: []Machine{
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -1342,7 +1341,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				nodes: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1353,14 +1352,14 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace:  Namespace{Name: "joe"},
 | 
			
		||||
						ForcedTags: []string{"tag:accountant-webserver"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1370,7 +1369,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			want: []Machine{
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -1384,7 +1383,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				nodes: []Machine{
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1395,7 +1394,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
						HostInfo: HostInfo{
 | 
			
		||||
@ -1406,7 +1405,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
@ -1417,7 +1416,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
			want: []Machine{
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
@ -1428,7 +1427,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					HostInfo: HostInfo{
 | 
			
		||||
@ -1439,7 +1438,7 @@ func Test_excludeCorrectlyTaggedNodes(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.4"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.4"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
 | 
			
		||||
@ -2,11 +2,11 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/tailscale/hujson"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ACLPolicy represents a Tailscale ACL Policy.
 | 
			
		||||
@ -31,7 +31,7 @@ type ACL struct {
 | 
			
		||||
type Groups map[string][]string
 | 
			
		||||
 | 
			
		||||
// Hosts are alias for IP addresses or subnets.
 | 
			
		||||
type Hosts map[string]netaddr.IPPrefix
 | 
			
		||||
type Hosts map[string]netip.Prefix
 | 
			
		||||
 | 
			
		||||
// TagOwners specify what users (namespaces?) are allow to use certain tags.
 | 
			
		||||
type TagOwners map[string][]string
 | 
			
		||||
@ -44,13 +44,13 @@ type ACLTest struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AutoApprovers specify which users (namespaces?), groups or tags have their advertised routes
 | 
			
		||||
// or exit node status automatically enabled
 | 
			
		||||
// or exit node status automatically enabled.
 | 
			
		||||
type AutoApprovers struct {
 | 
			
		||||
	Routes   map[string][]string `json:"routes"   yaml:"routes"`
 | 
			
		||||
	ExitNode []string            `json:"exitNode" yaml:"exitNode"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON allows to parse the Hosts directly into netaddr objects.
 | 
			
		||||
// UnmarshalJSON allows to parse the Hosts directly into netip objects.
 | 
			
		||||
func (hosts *Hosts) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	newHosts := Hosts{}
 | 
			
		||||
	hostIPPrefixMap := make(map[string]string)
 | 
			
		||||
@ -68,7 +68,7 @@ func (hosts *Hosts) UnmarshalJSON(data []byte) error {
 | 
			
		||||
		if !strings.Contains(prefixStr, "/") {
 | 
			
		||||
			prefixStr += "/32"
 | 
			
		||||
		}
 | 
			
		||||
		prefix, err := netaddr.ParseIPPrefix(prefixStr)
 | 
			
		||||
		prefix, err := netip.ParsePrefix(prefixStr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
@ -79,7 +79,7 @@ func (hosts *Hosts) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalYAML allows to parse the Hosts directly into netaddr objects.
 | 
			
		||||
// UnmarshalYAML allows to parse the Hosts directly into netip objects.
 | 
			
		||||
func (hosts *Hosts) UnmarshalYAML(data []byte) error {
 | 
			
		||||
	newHosts := Hosts{}
 | 
			
		||||
	hostIPPrefixMap := make(map[string]string)
 | 
			
		||||
@ -89,7 +89,7 @@ func (hosts *Hosts) UnmarshalYAML(data []byte) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for host, prefixStr := range hostIPPrefixMap {
 | 
			
		||||
		prefix, err := netaddr.ParseIPPrefix(prefixStr)
 | 
			
		||||
		prefix, err := netip.ParsePrefix(prefixStr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								api.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								api.go
									
									
									
									
									
								
							@ -52,7 +52,7 @@ func (h *Headscale) HealthHandler(
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := h.pingDB(); err != nil {
 | 
			
		||||
	if err := h.pingDB(req.Context()); err != nil {
 | 
			
		||||
		respond(err)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								app.go
									
									
									
									
									
								
							@ -18,7 +18,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/coreos/go-oidc/v3/oidc"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
 | 
			
		||||
	grpcMiddleware "github.com/grpc-ecosystem/go-grpc-middleware"
 | 
			
		||||
	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
 | 
			
		||||
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	"github.com/patrickmn/go-cache"
 | 
			
		||||
@ -601,7 +601,7 @@ func (h *Headscale) Serve() error {
 | 
			
		||||
 | 
			
		||||
		grpcOptions := []grpc.ServerOption{
 | 
			
		||||
			grpc.UnaryInterceptor(
 | 
			
		||||
				grpc_middleware.ChainUnaryServer(
 | 
			
		||||
				grpcMiddleware.ChainUnaryServer(
 | 
			
		||||
					h.grpcAuthenticationInterceptor,
 | 
			
		||||
					zerolog.NewUnaryServerInterceptor(),
 | 
			
		||||
				),
 | 
			
		||||
@ -820,10 +820,19 @@ func (h *Headscale) getTLSSettings() (*tls.Config, error) {
 | 
			
		||||
			// Configuration via autocert with HTTP-01. This requires listening on
 | 
			
		||||
			// port 80 for the certificate validation in addition to the headscale
 | 
			
		||||
			// service, which can be configured to run on any other port.
 | 
			
		||||
 | 
			
		||||
			server := &http.Server{
 | 
			
		||||
				Addr:        h.cfg.TLS.LetsEncrypt.Listen,
 | 
			
		||||
				Handler:     certManager.HTTPHandler(http.HandlerFunc(h.redirect)),
 | 
			
		||||
				ReadTimeout: HTTPReadTimeout,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err := server.ListenAndServe()
 | 
			
		||||
 | 
			
		||||
			go func() {
 | 
			
		||||
				log.Fatal().
 | 
			
		||||
					Caller().
 | 
			
		||||
					Err(http.ListenAndServe(h.cfg.TLS.LetsEncrypt.Listen, certManager.HTTPHandler(http.HandlerFunc(h.redirect)))).
 | 
			
		||||
					Err(err).
 | 
			
		||||
					Msg("failed to set up a HTTP server")
 | 
			
		||||
			}()
 | 
			
		||||
 | 
			
		||||
@ -860,20 +869,18 @@ func (h *Headscale) getTLSSettings() (*tls.Config, error) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) setLastStateChangeToNow(namespaces ...string) {
 | 
			
		||||
func (h *Headscale) setLastStateChangeToNow() {
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	now := time.Now().UTC()
 | 
			
		||||
 | 
			
		||||
	if len(namespaces) == 0 {
 | 
			
		||||
		namespaces, err = h.ListNamespacesStr()
 | 
			
		||||
	namespaces, err := h.ListNamespacesStr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().
 | 
			
		||||
			Caller().
 | 
			
		||||
			Err(err).
 | 
			
		||||
			Msg("failed to fetch all namespaces, failing to update last changed state.")
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, namespace := range namespaces {
 | 
			
		||||
		lastStateUpdate.WithLabelValues(namespace, "headscale").Set(float64(now.Unix()))
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Test(t *testing.T) {
 | 
			
		||||
@ -39,8 +39,8 @@ func (s *Suite) ResetDB(c *check.C) {
 | 
			
		||||
		c.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	cfg := Config{
 | 
			
		||||
		IPPrefixes: []netaddr.IPPrefix{
 | 
			
		||||
			netaddr.MustParseIPPrefix("10.27.0.0/23"),
 | 
			
		||||
		IPPrefixes: []netip.Prefix{
 | 
			
		||||
			netip.MustParsePrefix("10.27.0.0/23"),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,7 @@ package cli
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@ -13,7 +14,6 @@ import (
 | 
			
		||||
	"github.com/pterm/pterm"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"google.golang.org/grpc/status"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/types/key"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -557,7 +557,7 @@ func nodesToPtables(
 | 
			
		||||
		var IPV4Address string
 | 
			
		||||
		var IPV6Address string
 | 
			
		||||
		for _, addr := range machine.IpAddresses {
 | 
			
		||||
			if netaddr.MustParseIP(addr).Is4() {
 | 
			
		||||
			if netip.MustParseAddr(addr).Is4() {
 | 
			
		||||
				IPV4Address = addr
 | 
			
		||||
			} else {
 | 
			
		||||
				IPV6Address = addr
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								config.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								config.go
									
									
									
									
									
								
							@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/fs"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@ -13,7 +14,7 @@ import (
 | 
			
		||||
	"github.com/rs/zerolog"
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"go4.org/netipx"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/types/dnstype"
 | 
			
		||||
)
 | 
			
		||||
@ -32,7 +33,7 @@ type Config struct {
 | 
			
		||||
	GRPCAllowInsecure              bool
 | 
			
		||||
	EphemeralNodeInactivityTimeout time.Duration
 | 
			
		||||
	NodeUpdateCheckInterval        time.Duration
 | 
			
		||||
	IPPrefixes                     []netaddr.IPPrefix
 | 
			
		||||
	IPPrefixes                     []netip.Prefix
 | 
			
		||||
	PrivateKeyPath                 string
 | 
			
		||||
	NoisePrivateKeyPath            string
 | 
			
		||||
	BaseDomain                     string
 | 
			
		||||
@ -340,11 +341,11 @@ func GetDNSConfig() (*tailcfg.DNSConfig, string) {
 | 
			
		||||
		if viper.IsSet("dns_config.nameservers") {
 | 
			
		||||
			nameserversStr := viper.GetStringSlice("dns_config.nameservers")
 | 
			
		||||
 | 
			
		||||
			nameservers := make([]netaddr.IP, len(nameserversStr))
 | 
			
		||||
			nameservers := make([]netip.Addr, len(nameserversStr))
 | 
			
		||||
			resolvers := make([]*dnstype.Resolver, len(nameserversStr))
 | 
			
		||||
 | 
			
		||||
			for index, nameserverStr := range nameserversStr {
 | 
			
		||||
				nameserver, err := netaddr.ParseIP(nameserverStr)
 | 
			
		||||
				nameserver, err := netip.ParseAddr(nameserverStr)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.Error().
 | 
			
		||||
						Str("func", "getDNSConfig").
 | 
			
		||||
@ -374,7 +375,7 @@ func GetDNSConfig() (*tailcfg.DNSConfig, string) {
 | 
			
		||||
						len(restrictedNameservers),
 | 
			
		||||
					)
 | 
			
		||||
					for index, nameserverStr := range restrictedNameservers {
 | 
			
		||||
						nameserver, err := netaddr.ParseIP(nameserverStr)
 | 
			
		||||
						nameserver, err := netip.ParseAddr(nameserverStr)
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							log.Error().
 | 
			
		||||
								Str("func", "getDNSConfig").
 | 
			
		||||
@ -427,7 +428,7 @@ func GetHeadscaleConfig() (*Config, error) {
 | 
			
		||||
	randomizeClientPort := viper.GetBool("randomize_client_port")
 | 
			
		||||
 | 
			
		||||
	configuredPrefixes := viper.GetStringSlice("ip_prefixes")
 | 
			
		||||
	parsedPrefixes := make([]netaddr.IPPrefix, 0, len(configuredPrefixes)+1)
 | 
			
		||||
	parsedPrefixes := make([]netip.Prefix, 0, len(configuredPrefixes)+1)
 | 
			
		||||
 | 
			
		||||
	logLevelStr := viper.GetString("log_level")
 | 
			
		||||
	logLevel, err := zerolog.ParseLevel(logLevelStr)
 | 
			
		||||
@ -444,7 +445,7 @@ func GetHeadscaleConfig() (*Config, error) {
 | 
			
		||||
				"use of 'ip_prefix' for configuration is deprecated",
 | 
			
		||||
				"please see 'ip_prefixes' in the shipped example.",
 | 
			
		||||
			)
 | 
			
		||||
		legacyPrefix, err := netaddr.ParseIPPrefix(legacyPrefixField)
 | 
			
		||||
		legacyPrefix, err := netip.ParsePrefix(legacyPrefixField)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(fmt.Errorf("failed to parse ip_prefix: %w", err))
 | 
			
		||||
		}
 | 
			
		||||
@ -452,19 +453,19 @@ func GetHeadscaleConfig() (*Config, error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, prefixInConfig := range configuredPrefixes {
 | 
			
		||||
		prefix, err := netaddr.ParseIPPrefix(prefixInConfig)
 | 
			
		||||
		prefix, err := netip.ParsePrefix(prefixInConfig)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(fmt.Errorf("failed to parse ip_prefixes[%d]: %w", i, err))
 | 
			
		||||
		}
 | 
			
		||||
		parsedPrefixes = append(parsedPrefixes, prefix)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prefixes := make([]netaddr.IPPrefix, 0, len(parsedPrefixes))
 | 
			
		||||
	prefixes := make([]netip.Prefix, 0, len(parsedPrefixes))
 | 
			
		||||
	{
 | 
			
		||||
		// dedup
 | 
			
		||||
		normalizedPrefixes := make(map[string]int, len(parsedPrefixes))
 | 
			
		||||
		for i, p := range parsedPrefixes {
 | 
			
		||||
			normalized, _ := p.Range().Prefix()
 | 
			
		||||
			normalized, _ := netipx.RangeOfPrefix(p).Prefix()
 | 
			
		||||
			normalizedPrefixes[normalized.String()] = i
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -475,7 +476,7 @@ func GetHeadscaleConfig() (*Config, error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(prefixes) < 1 {
 | 
			
		||||
		prefixes = append(prefixes, netaddr.MustParseIPPrefix("100.64.0.0/10"))
 | 
			
		||||
		prefixes = append(prefixes, netip.MustParsePrefix("100.64.0.0/10"))
 | 
			
		||||
		log.Warn().
 | 
			
		||||
			Msgf("'ip_prefixes' not configured, falling back to default: %v", prefixes)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								db.go
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								db.go
									
									
									
									
									
								
							@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/glebarez/sqlite"
 | 
			
		||||
@ -13,7 +14,6 @@ import (
 | 
			
		||||
	"gorm.io/driver/postgres"
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
	"gorm.io/gorm/logger"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -221,8 +221,8 @@ func (h *Headscale) setValue(key string, value string) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) pingDB() error {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
 | 
			
		||||
func (h *Headscale) pingDB(ctx context.Context) error {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(ctx, time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	db, err := h.db.DB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -259,7 +259,7 @@ func (hi HostInfo) Value() (driver.Value, error) {
 | 
			
		||||
	return string(bytes), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type IPPrefixes []netaddr.IPPrefix
 | 
			
		||||
type IPPrefixes []netip.Prefix
 | 
			
		||||
 | 
			
		||||
func (i *IPPrefixes) Scan(destination interface{}) error {
 | 
			
		||||
	switch value := destination.(type) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								derp.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								derp.go
									
									
									
									
									
								
							@ -34,7 +34,7 @@ func loadDERPMapFromURL(addr url.URL) (*tailcfg.DERPMap, error) {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), HTTPReadTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequestWithContext(ctx, "GET", addr.String(), nil)
 | 
			
		||||
	req, err := http.NewRequestWithContext(ctx, http.MethodGet, addr.String(), nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -98,10 +99,13 @@ func (h *Headscale) DERPHandler(
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
) {
 | 
			
		||||
	log.Trace().Caller().Msgf("/derp request from %v", req.RemoteAddr)
 | 
			
		||||
	up := strings.ToLower(req.Header.Get("Upgrade"))
 | 
			
		||||
	if up != "websocket" && up != "derp" {
 | 
			
		||||
		if up != "" {
 | 
			
		||||
			log.Warn().Caller().Msgf("Weird websockets connection upgrade: %q", up)
 | 
			
		||||
	upgrade := strings.ToLower(req.Header.Get("Upgrade"))
 | 
			
		||||
 | 
			
		||||
	if upgrade != "websocket" && upgrade != "derp" {
 | 
			
		||||
		if upgrade != "" {
 | 
			
		||||
			log.Warn().
 | 
			
		||||
				Caller().
 | 
			
		||||
				Msg("No Upgrade header in DERP server request. If headscale is behind a reverse proxy, make sure it is configured to pass WebSockets through.")
 | 
			
		||||
		}
 | 
			
		||||
		writer.Header().Set("Content-Type", "text/plain")
 | 
			
		||||
		writer.WriteHeader(http.StatusUpgradeRequired)
 | 
			
		||||
@ -153,7 +157,7 @@ func (h *Headscale) DERPHandler(
 | 
			
		||||
 | 
			
		||||
	if !fastStart {
 | 
			
		||||
		pubKey := h.privateKey.Public()
 | 
			
		||||
		pubKeyStr := pubKey.UntypedHexString() // nolint
 | 
			
		||||
		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 +167,7 @@ func (h *Headscale) DERPHandler(
 | 
			
		||||
			pubKeyStr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h.DERPServer.tailscaleDERP.Accept(netConn, conn, netConn.RemoteAddr().String())
 | 
			
		||||
	h.DERPServer.tailscaleDERP.Accept(req.Context(), netConn, conn, netConn.RemoteAddr().String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DERPProbeHandler is the endpoint that js/wasm clients hit to measure
 | 
			
		||||
@ -173,7 +177,7 @@ func (h *Headscale) DERPProbeHandler(
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
) {
 | 
			
		||||
	switch req.Method {
 | 
			
		||||
	case "HEAD", "GET":
 | 
			
		||||
	case http.MethodHead, http.MethodGet:
 | 
			
		||||
		writer.Header().Set("Access-Control-Allow-Origin", "*")
 | 
			
		||||
		writer.WriteHeader(http.StatusOK)
 | 
			
		||||
	default:
 | 
			
		||||
@ -201,7 +205,7 @@ func (h *Headscale) DERPBootstrapDNSHandler(
 | 
			
		||||
) {
 | 
			
		||||
	dnsEntries := make(map[string][]net.IP)
 | 
			
		||||
 | 
			
		||||
	resolvCtx, cancel := context.WithTimeout(context.Background(), time.Minute)
 | 
			
		||||
	resolvCtx, cancel := context.WithTimeout(req.Context(), time.Minute)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	var resolver net.Resolver
 | 
			
		||||
	for _, region := range h.DERPMap.Regions {
 | 
			
		||||
@ -276,7 +280,8 @@ func serverSTUNListener(ctx context.Context, packetConn *net.UDPConn) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		res := stun.Response(txid, udpAddr.IP, uint16(udpAddr.Port))
 | 
			
		||||
		addr, _ := netip.AddrFromSlice(udpAddr.IP)
 | 
			
		||||
		res := stun.Response(txid, netip.AddrPortFrom(addr, uint16(udpAddr.Port)))
 | 
			
		||||
		_, err = packetConn.WriteTo(res, udpAddr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Trace().Caller().Err(err).Msgf("Issue writing to UDP")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								dns.go
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								dns.go
									
									
									
									
									
								
							@ -2,10 +2,11 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	mapset "github.com/deckarep/golang-set/v2"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"go4.org/netipx"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/util/dnsname"
 | 
			
		||||
)
 | 
			
		||||
@ -39,11 +40,11 @@ const (
 | 
			
		||||
 | 
			
		||||
// From the netmask we can find out the wildcard bits (the bits that are not set in the netmask).
 | 
			
		||||
// This allows us to then calculate the subnets included in the subsequent class block and generate the entries.
 | 
			
		||||
func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
func generateMagicDNSRootDomains(ipPrefixes []netip.Prefix) []dnsname.FQDN {
 | 
			
		||||
	fqdns := make([]dnsname.FQDN, 0, len(ipPrefixes))
 | 
			
		||||
	for _, ipPrefix := range ipPrefixes {
 | 
			
		||||
		var generateDNSRoot func(netaddr.IPPrefix) []dnsname.FQDN
 | 
			
		||||
		switch ipPrefix.IP().BitLen() {
 | 
			
		||||
		var generateDNSRoot func(netip.Prefix) []dnsname.FQDN
 | 
			
		||||
		switch ipPrefix.Addr().BitLen() {
 | 
			
		||||
		case ipv4AddressLength:
 | 
			
		||||
			generateDNSRoot = generateIPv4DNSRootDomain
 | 
			
		||||
 | 
			
		||||
@ -54,7 +55,7 @@ func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
			panic(
 | 
			
		||||
				fmt.Sprintf(
 | 
			
		||||
					"unsupported IP version with address length %d",
 | 
			
		||||
					ipPrefix.IP().BitLen(),
 | 
			
		||||
					ipPrefix.Addr().BitLen(),
 | 
			
		||||
				),
 | 
			
		||||
			)
 | 
			
		||||
		}
 | 
			
		||||
@ -65,9 +66,9 @@ func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
	return fqdns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func generateIPv4DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
func generateIPv4DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN {
 | 
			
		||||
	// Conversion to the std lib net.IPnet, a bit easier to operate
 | 
			
		||||
	netRange := ipPrefix.IPNet()
 | 
			
		||||
	netRange := netipx.PrefixIPNet(ipPrefix)
 | 
			
		||||
	maskBits, _ := netRange.Mask.Size()
 | 
			
		||||
 | 
			
		||||
	// lastOctet is the last IP byte covered by the mask
 | 
			
		||||
@ -101,11 +102,11 @@ func generateIPv4DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
	return fqdns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func generateIPv6DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
			
		||||
func generateIPv6DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN {
 | 
			
		||||
	const nibbleLen = 4
 | 
			
		||||
 | 
			
		||||
	maskBits, _ := ipPrefix.IPNet().Mask.Size()
 | 
			
		||||
	expanded := ipPrefix.IP().StringExpanded()
 | 
			
		||||
	maskBits, _ := netipx.PrefixIPNet(ipPrefix).Mask.Size()
 | 
			
		||||
	expanded := ipPrefix.Addr().StringExpanded()
 | 
			
		||||
	nibbleStr := strings.Map(func(r rune) rune {
 | 
			
		||||
		if r == ':' {
 | 
			
		||||
			return -1
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										34
									
								
								dns_test.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								dns_test.go
									
									
									
									
									
								
							@ -2,16 +2,16 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/types/dnstype"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestMagicDNSRootDomains100(c *check.C) {
 | 
			
		||||
	prefixes := []netaddr.IPPrefix{
 | 
			
		||||
		netaddr.MustParseIPPrefix("100.64.0.0/10"),
 | 
			
		||||
	prefixes := []netip.Prefix{
 | 
			
		||||
		netip.MustParsePrefix("100.64.0.0/10"),
 | 
			
		||||
	}
 | 
			
		||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
			
		||||
 | 
			
		||||
@ -47,8 +47,8 @@ func (s *Suite) TestMagicDNSRootDomains100(c *check.C) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestMagicDNSRootDomains172(c *check.C) {
 | 
			
		||||
	prefixes := []netaddr.IPPrefix{
 | 
			
		||||
		netaddr.MustParseIPPrefix("172.16.0.0/16"),
 | 
			
		||||
	prefixes := []netip.Prefix{
 | 
			
		||||
		netip.MustParsePrefix("172.16.0.0/16"),
 | 
			
		||||
	}
 | 
			
		||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
			
		||||
 | 
			
		||||
@ -75,8 +75,8 @@ func (s *Suite) TestMagicDNSRootDomains172(c *check.C) {
 | 
			
		||||
 | 
			
		||||
// Happens when netmask is a multiple of 4 bits (sounds likely).
 | 
			
		||||
func (s *Suite) TestMagicDNSRootDomainsIPv6Single(c *check.C) {
 | 
			
		||||
	prefixes := []netaddr.IPPrefix{
 | 
			
		||||
		netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/48"),
 | 
			
		||||
	prefixes := []netip.Prefix{
 | 
			
		||||
		netip.MustParsePrefix("fd7a:115c:a1e0::/48"),
 | 
			
		||||
	}
 | 
			
		||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
			
		||||
 | 
			
		||||
@ -89,8 +89,8 @@ func (s *Suite) TestMagicDNSRootDomainsIPv6Single(c *check.C) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestMagicDNSRootDomainsIPv6SingleMultiple(c *check.C) {
 | 
			
		||||
	prefixes := []netaddr.IPPrefix{
 | 
			
		||||
		netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/50"),
 | 
			
		||||
	prefixes := []netip.Prefix{
 | 
			
		||||
		netip.MustParsePrefix("fd7a:115c:a1e0::/50"),
 | 
			
		||||
	}
 | 
			
		||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
			
		||||
 | 
			
		||||
@ -165,7 +165,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared1)
 | 
			
		||||
@ -182,7 +182,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared2.ID,
 | 
			
		||||
		Namespace:      *namespaceShared2,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared2)
 | 
			
		||||
@ -199,7 +199,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared3.ID,
 | 
			
		||||
		Namespace:      *namespaceShared3,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared3)
 | 
			
		||||
@ -216,7 +216,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
		AuthKeyID:      uint(PreAuthKey2InShared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machine2InShared1)
 | 
			
		||||
@ -308,7 +308,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared1)
 | 
			
		||||
@ -325,7 +325,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared2.ID,
 | 
			
		||||
		Namespace:      *namespaceShared2,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared2)
 | 
			
		||||
@ -342,7 +342,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared3.ID,
 | 
			
		||||
		Namespace:      *namespaceShared3,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared3)
 | 
			
		||||
@ -359,7 +359,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKey2InShared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machine2InShared1)
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ describing how to make `headscale` run properly in a server environment.
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
# Install prerequistes
 | 
			
		||||
# 1. go v1.18+: headscale newer than 0.15 needs go 1.18+ to compile
 | 
			
		||||
# 1. go v1.19+: headscale newer than 0.17 needs go 1.19+ to compile
 | 
			
		||||
# 2. gmake: Makefile in the headscale repo is written in GNU make syntax
 | 
			
		||||
pkg_add -D snap go
 | 
			
		||||
pkg_add gmake
 | 
			
		||||
@ -46,7 +46,7 @@ cp headscale /usr/local/sbin
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
# Install prerequistes
 | 
			
		||||
# 1. go v1.18+: headscale newer than 0.15 needs go 1.18+ to compile
 | 
			
		||||
# 1. go v1.19+: headscale newer than 0.17 needs go 1.19+ to compile
 | 
			
		||||
# 2. gmake: Makefile in the headscale repo is written in GNU make syntax
 | 
			
		||||
 | 
			
		||||
git clone https://github.com/juanfont/headscale.git
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								flake.lock
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								flake.lock
									
									
									
									
									
								
							@ -2,11 +2,11 @@
 | 
			
		||||
  "nodes": {
 | 
			
		||||
    "flake-utils": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1653893745,
 | 
			
		||||
        "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=",
 | 
			
		||||
        "lastModified": 1659877975,
 | 
			
		||||
        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1",
 | 
			
		||||
        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@ -17,16 +17,16 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1654847188,
 | 
			
		||||
        "narHash": "sha256-MC+eP7XOGE1LAswOPqdcGoUqY9mEQ3ZaaxamVTbc0hM=",
 | 
			
		||||
        "lastModified": 1662019588,
 | 
			
		||||
        "narHash": "sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "8b66e3f2ebcc644b78cec9d6f152192f4e7d322f",
 | 
			
		||||
        "rev": "2da64a81275b68fdad38af669afeda43d401e94b",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "ref": "nixos-22.05",
 | 
			
		||||
        "ref": "nixos-unstable",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
  description = "headscale - Open Source Tailscale Control server";
 | 
			
		||||
 | 
			
		||||
  inputs = {
 | 
			
		||||
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.05";
 | 
			
		||||
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
 | 
			
		||||
    flake-utils.url = "github:numtide/flake-utils";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@ -17,14 +17,14 @@
 | 
			
		||||
        in
 | 
			
		||||
        rec {
 | 
			
		||||
          headscale =
 | 
			
		||||
            pkgs.buildGo118Module rec {
 | 
			
		||||
            pkgs.buildGo119Module rec {
 | 
			
		||||
              pname = "headscale";
 | 
			
		||||
              version = headscaleVersion;
 | 
			
		||||
              src = pkgs.lib.cleanSource self;
 | 
			
		||||
 | 
			
		||||
              # 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-paDdPsi5OfxsmgX7c5NSDSLYDipFqxxcxV3K4Tc77nQ=";
 | 
			
		||||
              vendorSha256 = "sha256-kc8EU+TkwRlsKM2+ljm/88aWe5h2QMgd/ZGPSgdd9QQ=";
 | 
			
		||||
 | 
			
		||||
              ldflags = [ "-s" "-w" "-X github.com/juanfont/headscale/cmd/headscale/cli.Version=v${version}" ];
 | 
			
		||||
            };
 | 
			
		||||
@ -95,7 +95,7 @@
 | 
			
		||||
            overlays = [ self.overlay ];
 | 
			
		||||
            inherit system;
 | 
			
		||||
          };
 | 
			
		||||
          buildDeps = with pkgs; [ git go_1_18 gnumake ];
 | 
			
		||||
          buildDeps = with pkgs; [ git go_1_19 gnumake ];
 | 
			
		||||
          devDeps = with pkgs;
 | 
			
		||||
            buildDeps ++ [
 | 
			
		||||
              golangci-lint
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								go.mod
									
									
									
									
									
								
							@ -1,51 +1,53 @@
 | 
			
		||||
module github.com/juanfont/headscale
 | 
			
		||||
 | 
			
		||||
go 1.18
 | 
			
		||||
go 1.19
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/AlecAivazis/survey/v2 v2.3.5
 | 
			
		||||
	github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029
 | 
			
		||||
	github.com/coreos/go-oidc/v3 v3.2.0
 | 
			
		||||
	github.com/coreos/go-oidc/v3 v3.3.0
 | 
			
		||||
	github.com/deckarep/golang-set/v2 v2.1.0
 | 
			
		||||
	github.com/efekarakus/termcolor v1.0.1
 | 
			
		||||
	github.com/glebarez/sqlite v1.4.6
 | 
			
		||||
	github.com/gofrs/uuid v4.2.0+incompatible
 | 
			
		||||
	github.com/gorilla/mux v1.8.0
 | 
			
		||||
	github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
 | 
			
		||||
	github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2
 | 
			
		||||
	github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3
 | 
			
		||||
	github.com/klauspost/compress v1.15.9
 | 
			
		||||
	github.com/oauth2-proxy/mockoidc v0.0.0-20220308204021-b9169deeb282
 | 
			
		||||
	github.com/ory/dockertest/v3 v3.9.1
 | 
			
		||||
	github.com/patrickmn/go-cache v2.1.0+incompatible
 | 
			
		||||
	github.com/philip-bui/grpc-zerolog v1.0.1
 | 
			
		||||
	github.com/prometheus/client_golang v1.13.0
 | 
			
		||||
	github.com/prometheus/common v0.37.0
 | 
			
		||||
	github.com/pterm/pterm v0.12.45
 | 
			
		||||
	github.com/puzpuzpuz/xsync v1.4.2
 | 
			
		||||
	github.com/rs/zerolog v1.27.0
 | 
			
		||||
	github.com/puzpuzpuz/xsync v1.4.3
 | 
			
		||||
	github.com/rs/zerolog v1.28.0
 | 
			
		||||
	github.com/spf13/cobra v1.5.0
 | 
			
		||||
	github.com/spf13/viper v1.12.0
 | 
			
		||||
	github.com/stretchr/testify v1.8.0
 | 
			
		||||
	github.com/tailscale/hujson v0.0.0-20220630195928-54599719472f
 | 
			
		||||
	github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa
 | 
			
		||||
	golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e
 | 
			
		||||
	golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7
 | 
			
		||||
	golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
 | 
			
		||||
	google.golang.org/genproto v0.0.0-20220808204814-fd01256a5276
 | 
			
		||||
	google.golang.org/grpc v1.48.0
 | 
			
		||||
	go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90
 | 
			
		||||
	golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b
 | 
			
		||||
	golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094
 | 
			
		||||
	golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde
 | 
			
		||||
	google.golang.org/genproto v0.0.0-20220902135211-223410557253
 | 
			
		||||
	google.golang.org/grpc v1.49.0
 | 
			
		||||
	google.golang.org/protobuf v1.28.1
 | 
			
		||||
	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1
 | 
			
		||||
	gorm.io/driver/postgres v1.3.8
 | 
			
		||||
	gorm.io/driver/postgres v1.3.9
 | 
			
		||||
	gorm.io/gorm v1.23.8
 | 
			
		||||
	inet.af/netaddr v0.0.0-20220617031823-097006376321
 | 
			
		||||
	tailscale.com v1.28.0
 | 
			
		||||
	tailscale.com v1.30.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	atomicgo.dev/cursor v0.1.1 // indirect
 | 
			
		||||
	atomicgo.dev/keyboard v0.2.8 // indirect
 | 
			
		||||
	filippo.io/edwards25519 v1.0.0-rc.1 // indirect
 | 
			
		||||
	github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
 | 
			
		||||
	github.com/Microsoft/go-winio v0.5.2 // indirect
 | 
			
		||||
	github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
 | 
			
		||||
@ -62,8 +64,10 @@ require (
 | 
			
		||||
	github.com/docker/go-connections v0.4.0 // indirect
 | 
			
		||||
	github.com/docker/go-units v0.4.0 // indirect
 | 
			
		||||
	github.com/fsnotify/fsnotify v1.5.4 // indirect
 | 
			
		||||
	github.com/fxamacker/cbor/v2 v2.4.0 // indirect
 | 
			
		||||
	github.com/glebarez/go-sqlite v1.17.3 // indirect
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2 // indirect
 | 
			
		||||
	github.com/golang-jwt/jwt v3.2.2+incompatible // 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.8 // indirect
 | 
			
		||||
@ -74,6 +78,7 @@ require (
 | 
			
		||||
	github.com/gookit/color v1.5.0 // indirect
 | 
			
		||||
	github.com/hashicorp/go-version v1.4.0 // indirect
 | 
			
		||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
			
		||||
	github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect
 | 
			
		||||
	github.com/imdario/mergo v0.3.12 // indirect
 | 
			
		||||
	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 | 
			
		||||
	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
 | 
			
		||||
@ -121,21 +126,20 @@ require (
 | 
			
		||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
			
		||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
			
		||||
	github.com/subosito/gotenv v1.3.0 // indirect
 | 
			
		||||
	github.com/x448/float16 v0.8.4 // indirect
 | 
			
		||||
	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
 | 
			
		||||
	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
 | 
			
		||||
	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-20220617031537-928513b29760 // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // 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
 | 
			
		||||
	google.golang.org/appengine v1.6.7 // indirect
 | 
			
		||||
	gopkg.in/ini.v1 v1.66.4 // indirect
 | 
			
		||||
	gopkg.in/square/go-jose.v2 v2.5.1 // indirect
 | 
			
		||||
	gopkg.in/square/go-jose.v2 v2.6.0 // indirect
 | 
			
		||||
	modernc.org/libc v1.16.8 // indirect
 | 
			
		||||
	modernc.org/mathutil v1.4.1 // indirect
 | 
			
		||||
	modernc.org/memory v1.1.1 // indirect
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										242
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										242
									
								
								go.sum
									
									
									
									
									
								
							@ -32,16 +32,28 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU
 | 
			
		||||
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
 | 
			
		||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
 | 
			
		||||
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
 | 
			
		||||
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
 | 
			
		||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
 | 
			
		||||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
 | 
			
		||||
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
 | 
			
		||||
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
 | 
			
		||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
			
		||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 | 
			
		||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 | 
			
		||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
 | 
			
		||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
 | 
			
		||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 | 
			
		||||
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
 | 
			
		||||
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
 | 
			
		||||
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
 | 
			
		||||
cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
 | 
			
		||||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
 | 
			
		||||
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
 | 
			
		||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
			
		||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 | 
			
		||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 | 
			
		||||
cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU=
 | 
			
		||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
 | 
			
		||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
			
		||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 | 
			
		||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 | 
			
		||||
@ -54,8 +66,13 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
 | 
			
		||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
			
		||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
			
		||||
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 | 
			
		||||
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
 | 
			
		||||
contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
 | 
			
		||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
			
		||||
filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU=
 | 
			
		||||
filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
 | 
			
		||||
filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=
 | 
			
		||||
filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
 | 
			
		||||
filippo.io/mkcert v1.4.3 h1:axpnmtrZMM8u5Hf4N3UXxboGemMOV+Tn+e+pkHM6E3o=
 | 
			
		||||
github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ=
 | 
			
		||||
github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
 | 
			
		||||
@ -63,6 +80,8 @@ github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCq
 | 
			
		||||
github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
 | 
			
		||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 | 
			
		||||
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
 | 
			
		||||
@ -135,6 +154,7 @@ github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029/go.mod h1:Rpr5
 | 
			
		||||
github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
 | 
			
		||||
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 | 
			
		||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 | 
			
		||||
@ -148,12 +168,15 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
 | 
			
		||||
github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
 | 
			
		||||
github.com/cilium/ebpf v0.8.1 h1:bLSSEbBLqGPXxls55pGr5qWZaTqcmfDJHhou7t254ao=
 | 
			
		||||
github.com/cilium/ebpf v0.8.1/go.mod h1:f5zLIM0FSNuAkSyLAN7X+Hy6yznlF1mNiWUMfxMtrgk=
 | 
			
		||||
github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4=
 | 
			
		||||
github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
 | 
			
		||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
			
		||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
			
		||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
			
		||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
			
		||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
			
		||||
@ -168,6 +191,8 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
 | 
			
		||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 | 
			
		||||
github.com/coreos/go-oidc/v3 v3.2.0 h1:2eR2MGR7thBXSQ2YbODlF0fcmgtliLCfr9iX6RW11fc=
 | 
			
		||||
github.com/coreos/go-oidc/v3 v3.2.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo=
 | 
			
		||||
github.com/coreos/go-oidc/v3 v3.3.0 h1:Y1LV3mP+QT3MEycATZpAiwfyN+uxZLqVbAHJUuOJEe4=
 | 
			
		||||
github.com/coreos/go-oidc/v3 v3.3.0/go.mod h1:eHUXhZtXPQLgEaDrOVTgwbgmz1xGOkJNye6h3zkD2Pw=
 | 
			
		||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
			
		||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
			
		||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
			
		||||
@ -199,15 +224,20 @@ github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCF
 | 
			
		||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
			
		||||
github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs=
 | 
			
		||||
github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 | 
			
		||||
github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M=
 | 
			
		||||
github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 | 
			
		||||
github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ=
 | 
			
		||||
github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
			
		||||
github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE=
 | 
			
		||||
github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
			
		||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 | 
			
		||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
			
		||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 | 
			
		||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
			
		||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 | 
			
		||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
			
		||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 | 
			
		||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 | 
			
		||||
github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
 | 
			
		||||
github.com/efekarakus/termcolor v1.0.1 h1:YAKFO3bnLrqZGTWyNLcYoSIAQFKVOmbqmDnwsU/znzg=
 | 
			
		||||
github.com/efekarakus/termcolor v1.0.1/go.mod h1:AitrZNrE4nPO538fRsqf+p0WgLdAsGN5pUNrHEPsEMM=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
@ -217,6 +247,7 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
 | 
			
		||||
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.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 | 
			
		||||
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.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
@ -236,6 +267,8 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5
 | 
			
		||||
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
 | 
			
		||||
github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
 | 
			
		||||
github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E=
 | 
			
		||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
			
		||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 | 
			
		||||
@ -244,6 +277,8 @@ github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
 | 
			
		||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
 | 
			
		||||
github.com/glebarez/go-sqlite v1.17.3 h1:Rji9ROVSTTfjuWD6j5B+8DtkNvPILoUC3xRhkQzGxvk=
 | 
			
		||||
github.com/glebarez/go-sqlite v1.17.3/go.mod h1:Hg+PQuhUy98XCxWEJEaWob8x7lhJzhNYF1nZbUiRGIY=
 | 
			
		||||
github.com/glebarez/go-sqlite v1.18.1 h1:w0xtxKWktqYsUsXg//SQK+l1IcpKb3rGOQHmMptvL2U=
 | 
			
		||||
github.com/glebarez/go-sqlite v1.18.1/go.mod h1:ydXIGq2M4OzF4YyNhH129SPp7jWoVvgkEgb6pldmS0s=
 | 
			
		||||
github.com/glebarez/sqlite v1.4.6 h1:D5uxD2f6UJ82cHnVtO2TZ9pqsLyto3fpDKHIk2OsR8A=
 | 
			
		||||
github.com/glebarez/sqlite v1.4.6/go.mod h1:WYEtEFjhADPaPJqL/PGlbQQGINBA3eUAfDNbKFJf/zA=
 | 
			
		||||
github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM=
 | 
			
		||||
@ -304,6 +339,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
 | 
			
		||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
 | 
			
		||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
@ -405,13 +442,21 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 | 
			
		||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 | 
			
		||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
 | 
			
		||||
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
 | 
			
		||||
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 | 
			
		||||
github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
 | 
			
		||||
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
 | 
			
		||||
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
 | 
			
		||||
github.com/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI=
 | 
			
		||||
github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg=
 | 
			
		||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
			
		||||
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
 | 
			
		||||
github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw=
 | 
			
		||||
@ -441,9 +486,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2 h1:BqHID5W5qnMkug0Z8UmL8tN0gAy4jQ+B4WFt8cCgluU=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2/go.mod h1:ZbS3MZTZq/apAfAEHGoB5HbsQQstoqP92SjAqtQ9zeg=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
 | 
			
		||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 | 
			
		||||
github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 | 
			
		||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 | 
			
		||||
@ -465,6 +513,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
 | 
			
		||||
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 | 
			
		||||
github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4=
 | 
			
		||||
github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 | 
			
		||||
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
 | 
			
		||||
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 | 
			
		||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
@ -478,6 +528,8 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
 | 
			
		||||
github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
 | 
			
		||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 | 
			
		||||
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
 | 
			
		||||
github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU=
 | 
			
		||||
github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE=
 | 
			
		||||
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
 | 
			
		||||
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
@ -489,8 +541,13 @@ github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
 | 
			
		||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
			
		||||
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 | 
			
		||||
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 | 
			
		||||
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
 | 
			
		||||
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 | 
			
		||||
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
 | 
			
		||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
 | 
			
		||||
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 | 
			
		||||
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
 | 
			
		||||
@ -503,6 +560,8 @@ github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8
 | 
			
		||||
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
 | 
			
		||||
github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8=
 | 
			
		||||
github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono=
 | 
			
		||||
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
 | 
			
		||||
github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
 | 
			
		||||
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
 | 
			
		||||
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
 | 
			
		||||
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
 | 
			
		||||
@ -511,6 +570,7 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W
 | 
			
		||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
 | 
			
		||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 | 
			
		||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
 | 
			
		||||
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
 | 
			
		||||
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
 | 
			
		||||
@ -520,6 +580,8 @@ github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwX
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 | 
			
		||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
 | 
			
		||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
 | 
			
		||||
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
 | 
			
		||||
@ -528,16 +590,21 @@ github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrU
 | 
			
		||||
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
 | 
			
		||||
github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs=
 | 
			
		||||
github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
 | 
			
		||||
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
 | 
			
		||||
github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
 | 
			
		||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
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/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
 | 
			
		||||
github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4=
 | 
			
		||||
github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c=
 | 
			
		||||
@ -545,6 +612,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
 | 
			
		||||
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=
 | 
			
		||||
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 | 
			
		||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 | 
			
		||||
@ -558,6 +627,8 @@ github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOv
 | 
			
		||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.1.2-0.20220408201609-d380b505068b h1:Yws7RV6kZr2O7PPdT+RkbSmmOponA8i/1DuGHe8BRsM=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.1.2-0.20220408201609-d380b505068b/go.mod h1:TzDCVOZKUa79z6iXbbXqhtAflVgUKaFkZ21M5tK5tzY=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.2.2 h1:Ok9vYMcpxfHyF/iRqNTYJPDLxVaVItvPamAhtzttDBY=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.2.2/go.mod h1:T3BJ2qI9ZJFkUYWLrzECdcXhCvaGRfnMFmoYF0X8w2A=
 | 
			
		||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
			
		||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
@ -644,6 +715,8 @@ github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope
 | 
			
		||||
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
			
		||||
@ -654,6 +727,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA
 | 
			
		||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
			
		||||
@ -662,6 +737,7 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 | 
			
		||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
			
		||||
@ -675,6 +751,8 @@ github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfp
 | 
			
		||||
github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0=
 | 
			
		||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
 | 
			
		||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 | 
			
		||||
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
 | 
			
		||||
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 | 
			
		||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
			
		||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 | 
			
		||||
github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
 | 
			
		||||
@ -701,6 +779,8 @@ github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx
 | 
			
		||||
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
 | 
			
		||||
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=
 | 
			
		||||
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
 | 
			
		||||
github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI=
 | 
			
		||||
github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
@ -725,6 +805,8 @@ github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62
 | 
			
		||||
github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE=
 | 
			
		||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 | 
			
		||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 | 
			
		||||
github.com/oauth2-proxy/mockoidc v0.0.0-20220308204021-b9169deeb282 h1:TQMyrpijtkFyXpNI3rY5hsZQZw+paiH+BfAlsb81HBY=
 | 
			
		||||
github.com/oauth2-proxy/mockoidc v0.0.0-20220308204021-b9169deeb282/go.mod h1:rW25Kyd08Wdn3UVn0YBsDTSvReu0jqpmJKzxITPSjks=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ=
 | 
			
		||||
@ -742,6 +824,8 @@ github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+cz
 | 
			
		||||
github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q=
 | 
			
		||||
github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw=
 | 
			
		||||
github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
 | 
			
		||||
github.com/opencontainers/runc v1.1.4 h1:nRCz/8sKg6K6jgYAFLDlXzPeITBZJyX28DBVhWD+5dg=
 | 
			
		||||
github.com/opencontainers/runc v1.1.4/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
 | 
			
		||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
			
		||||
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
 | 
			
		||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
			
		||||
@ -763,6 +847,8 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v
 | 
			
		||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
			
		||||
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
 | 
			
		||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
 | 
			
		||||
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
 | 
			
		||||
github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
 | 
			
		||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
			
		||||
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
 | 
			
		||||
github.com/philip-bui/grpc-zerolog v1.0.1 h1:EMacvLRUd2O1K0eWod27ZP5CY1iTNkhBDLSN+Q4JEvA=
 | 
			
		||||
@ -818,6 +904,8 @@ github.com/pterm/pterm v0.12.45 h1:5HATKLTDjl9D74b0x7yiHzFI7OADlSXK3yHrJNhRwZE=
 | 
			
		||||
github.com/pterm/pterm v0.12.45/go.mod h1:hJgLlBafm45w/Hr0dKXxY//POD7CgowhePaG1sdPNBg=
 | 
			
		||||
github.com/puzpuzpuz/xsync v1.4.2 h1:3SmMNFuNaSHy1xsGGR8edy3Rzv0Ix3dOirPWtAnXvKk=
 | 
			
		||||
github.com/puzpuzpuz/xsync v1.4.2/go.mod h1:K98BYhX3k1dQ2M63t1YNVDanbwUPmBCAhNmVrrxfiGg=
 | 
			
		||||
github.com/puzpuzpuz/xsync v1.4.3 h1:nS/Iqc4EnpJ8jm/MzJ+e3MUaP2Ys2mqXeEfoxoU0HaM=
 | 
			
		||||
github.com/puzpuzpuz/xsync v1.4.3/go.mod h1:K98BYhX3k1dQ2M63t1YNVDanbwUPmBCAhNmVrrxfiGg=
 | 
			
		||||
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
 | 
			
		||||
github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30=
 | 
			
		||||
github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ=
 | 
			
		||||
@ -830,6 +918,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6O
 | 
			
		||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 | 
			
		||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 | 
			
		||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 | 
			
		||||
github.com/rivo/uniseg v0.3.4 h1:3Z3Eu6FGHZWSfNKJTOUiPatWwfc7DzJRU04jFUqJODw=
 | 
			
		||||
github.com/rivo/uniseg v0.3.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 | 
			
		||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
			
		||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
@ -837,13 +927,18 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
 | 
			
		||||
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.8.1-0.20211023094830-115ce09fd6b4 h1:Ha8xCaq6ln1a+R91Km45Oq6lPXj2Mla6CRJYcuV2h1w=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.8.1-0.20211023094830-115ce09fd6b4/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 | 
			
		||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 | 
			
		||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
			
		||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
			
		||||
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
			
		||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 | 
			
		||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 | 
			
		||||
github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs=
 | 
			
		||||
github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U=
 | 
			
		||||
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
 | 
			
		||||
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
 | 
			
		||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
			
		||||
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
@ -856,6 +951,7 @@ github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dms
 | 
			
		||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
			
		||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
			
		||||
github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
 | 
			
		||||
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
 | 
			
		||||
github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc=
 | 
			
		||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 | 
			
		||||
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
 | 
			
		||||
@ -875,6 +971,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
 | 
			
		||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
			
		||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 | 
			
		||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
			
		||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
 | 
			
		||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 | 
			
		||||
github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0=
 | 
			
		||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
			
		||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
			
		||||
@ -886,6 +984,8 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 | 
			
		||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 | 
			
		||||
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
 | 
			
		||||
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
 | 
			
		||||
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
 | 
			
		||||
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
 | 
			
		||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
			
		||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
			
		||||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
			
		||||
@ -928,6 +1028,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 | 
			
		||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
			
		||||
github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
 | 
			
		||||
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
 | 
			
		||||
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
 | 
			
		||||
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
 | 
			
		||||
github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ=
 | 
			
		||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
			
		||||
github.com/tailscale/hujson v0.0.0-20220630195928-54599719472f h1:n4r/sJ92cBSBHK8n9lR1XLFr0OiTVeGfN5TR+9LaN7E=
 | 
			
		||||
@ -964,8 +1066,12 @@ github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7Fw
 | 
			
		||||
github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE=
 | 
			
		||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 | 
			
		||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
 | 
			
		||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 | 
			
		||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 | 
			
		||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
 | 
			
		||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
			
		||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
 | 
			
		||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
			
		||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 | 
			
		||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
			
		||||
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
 | 
			
		||||
@ -1016,12 +1122,15 @@ 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.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
 | 
			
		||||
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=
 | 
			
		||||
go4.org/mem v0.0.0-20210711025021-927187094b94/go.mod h1:reUoABIJ9ikfM5sgtSF3Wushcza7+WeD01VB9Lirh3g=
 | 
			
		||||
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
 | 
			
		||||
go4.org/mem v0.0.0-20220726221520-4f986261bf13 h1:CbZeCBZ0aZj8EfVgnqQcYZgf0lpZ3H9rmp5nkDTAst8=
 | 
			
		||||
go4.org/mem v0.0.0-20220726221520-4f986261bf13/go.mod h1:reUoABIJ9ikfM5sgtSF3Wushcza7+WeD01VB9Lirh3g=
 | 
			
		||||
go4.org/netipx v0.0.0-20220725152314-7e7bdc8411bf h1:IdwJUzqoIo5lkr2EOyKoe5qipUaEjbOKKY5+fzPBZ3A=
 | 
			
		||||
go4.org/netipx v0.0.0-20220725152314-7e7bdc8411bf/go.mod h1:+QXzaoURFd0rGDIjDNpyIkv+F9R7EmeKorvlKRnhqgA=
 | 
			
		||||
go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d h1:ggxwEf5eu0l8v+87VhX1czFh8zJul3hK16Gmruxn7hw=
 | 
			
		||||
go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc=
 | 
			
		||||
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4=
 | 
			
		||||
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
@ -1044,8 +1153,11 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 | 
			
		||||
@ -1056,8 +1168,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
 | 
			
		||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo=
 | 
			
		||||
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
 | 
			
		||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
 | 
			
		||||
golang.org/x/exp/typeparams v0.0.0-20220328175248-053ad81199eb h1:fP6C8Xutcp5AlakmT/SkQot0pMicROAsEX7OfNPuG10=
 | 
			
		||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 | 
			
		||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
			
		||||
@ -1140,10 +1252,17 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
 | 
			
		||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ=
 | 
			
		||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY=
 | 
			
		||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
@ -1160,9 +1279,15 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7 h1:dtndE8FcEta75/4kHF3AbpuWzV6f1LjnLrM4pe2SZrw=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
@ -1175,8 +1300,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
 | 
			
		||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
@ -1262,6 +1390,7 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc
 | 
			
		||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
@ -1269,15 +1398,30 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc
 | 
			
		||||
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d h1:Zu/JngovGLVi6t2J3nmAf3AoTDwuzw85YZ3b9o4yU7s=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
@ -1286,6 +1430,8 @@ golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuX
 | 
			
		||||
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/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc=
 | 
			
		||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/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=
 | 
			
		||||
@ -1296,6 +1442,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
 | 
			
		||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
			
		||||
golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2 h1:GLw7MR8AfAG2GmGcmVgObFOHXYypgGjnGno25RDwn3Y=
 | 
			
		||||
golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
 | 
			
		||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
@ -1303,6 +1451,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
 | 
			
		||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
 | 
			
		||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
@ -1417,9 +1567,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 | 
			
		||||
golang.zx2c4.com/wireguard v0.0.0-20210905140043-2ef39d47540c/go.mod h1:laHzsbfMhGSobUmruXWAyMKKHSqvIcrqZJMyHD+/3O8=
 | 
			
		||||
golang.zx2c4.com/wireguard/windows v0.4.10 h1:HmjzJnb+G4NCdX+sfjsQlsxGPuYaThxRbZUZFLyR0/s=
 | 
			
		||||
golang.zx2c4.com/wireguard/windows v0.4.10/go.mod h1:v7w/8FC48tTBm1IzScDVPEEb0/GjLta+T0ybpP9UWRg=
 | 
			
		||||
golang.zx2c4.com/wireguard/windows v0.5.3 h1:On6j2Rpn3OEMXqBq00QEDC7bWSZrPIHKIus8eIuExIE=
 | 
			
		||||
golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prrtqm+REGFifP60hI=
 | 
			
		||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
			
		||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 | 
			
		||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
			
		||||
@ -1448,7 +1603,19 @@ google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtuk
 | 
			
		||||
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
 | 
			
		||||
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
 | 
			
		||||
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
 | 
			
		||||
google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 | 
			
		||||
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 | 
			
		||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
 | 
			
		||||
google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
 | 
			
		||||
google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
 | 
			
		||||
google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
 | 
			
		||||
google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
 | 
			
		||||
google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
 | 
			
		||||
google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
 | 
			
		||||
google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
 | 
			
		||||
google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
 | 
			
		||||
google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
 | 
			
		||||
google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
 | 
			
		||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
@ -1505,6 +1672,7 @@ google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6D
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
			
		||||
@ -1518,8 +1686,35 @@ google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKr
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220808204814-fd01256a5276 h1:7PEE9xCtufpGJzrqweakEEnTh7YFELmnKm/ee+5jmfQ=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220808204814-fd01256a5276/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220902135211-223410557253 h1:vXJMM8Shg7TGaYxZsQ++A/FOSlbDmDtWhS/o+3w/hj4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20220902135211-223410557253/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
 | 
			
		||||
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 | 
			
		||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
			
		||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
			
		||||
@ -1549,8 +1744,16 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
 | 
			
		||||
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 | 
			
		||||
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 | 
			
		||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
 | 
			
		||||
google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
 | 
			
		||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
			
		||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
 | 
			
		||||
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
			
		||||
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
			
		||||
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
			
		||||
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
 | 
			
		||||
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
			
		||||
google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw=
 | 
			
		||||
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
			
		||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
@ -1565,6 +1768,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
 | 
			
		||||
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.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
 | 
			
		||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
			
		||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
			
		||||
@ -1584,9 +1788,12 @@ gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
 | 
			
		||||
gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 | 
			
		||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
			
		||||
gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
 | 
			
		||||
gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
 | 
			
		||||
gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
 | 
			
		||||
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
			
		||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
			
		||||
@ -1602,11 +1809,15 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gorm.io/driver/postgres v1.3.8 h1:8bEphSAB69t3odsCR4NDzt581iZEWQuRM27Cg6KgfPY=
 | 
			
		||||
gorm.io/driver/postgres v1.3.8/go.mod h1:qB98Aj6AhRO/oyu/jmZsi/YM9g6UzVCjMxO/6frFvcA=
 | 
			
		||||
gorm.io/driver/postgres v1.3.9 h1:lWGiVt5CijhQAg0PWB7Od1RNcBw/jS4d2cAScBcSDXg=
 | 
			
		||||
gorm.io/driver/postgres v1.3.9/go.mod h1:qw/FeqjxmYqW5dBcYNBsnhQULIApQdk7YuuDPktVi1U=
 | 
			
		||||
gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
 | 
			
		||||
gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
 | 
			
		||||
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
 | 
			
		||||
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
 | 
			
		||||
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
 | 
			
		||||
@ -1621,14 +1832,13 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 | 
			
		||||
honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
 | 
			
		||||
honnef.co/go/tools v0.4.0-0.dev.0.20220404092545-59d7a2877f83 h1:lZ9GIYaU+o5+X6ST702I/Ntyq9Y2oIMZ42rBQpem64A=
 | 
			
		||||
howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
 | 
			
		||||
inet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU=
 | 
			
		||||
inet.af/netaddr v0.0.0-20220617031823-097006376321/go.mod h1:OIezDfdzOgFhuw4HuWapWq2e9l0H9tK4F1j+ETRtF3k=
 | 
			
		||||
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
 | 
			
		||||
modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
 | 
			
		||||
modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
 | 
			
		||||
modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
 | 
			
		||||
modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
 | 
			
		||||
modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
 | 
			
		||||
modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
 | 
			
		||||
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
 | 
			
		||||
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
 | 
			
		||||
modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
 | 
			
		||||
@ -1637,14 +1847,24 @@ modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
 | 
			
		||||
modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
 | 
			
		||||
modernc.org/libc v1.16.8 h1:Ux98PaOMvolgoFX/YwusFOHBnanXdGRmWgI8ciI2z4o=
 | 
			
		||||
modernc.org/libc v1.16.8/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
 | 
			
		||||
modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
 | 
			
		||||
modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
 | 
			
		||||
modernc.org/libc v1.17.3 h1:MbsE18Y/xJMTxGGjq2Il6aZZf1YFUu6mnRZgQm/VUWQ=
 | 
			
		||||
modernc.org/libc v1.17.3/go.mod h1:9y68dPDczc/zwZupQ2yLX/HTAC4YY/u3grUCeD5fC9I=
 | 
			
		||||
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
 | 
			
		||||
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
 | 
			
		||||
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
 | 
			
		||||
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
 | 
			
		||||
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
 | 
			
		||||
modernc.org/memory v1.1.1 h1:bDOL0DIDLQv7bWhP3gMvIrnoFw+Eo6F7a2QK9HPDiFU=
 | 
			
		||||
modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
 | 
			
		||||
modernc.org/memory v1.2.1 h1:dkRh86wgmq/bJu2cAS2oqBCz/KsMZU7TUM4CibQ7eBs=
 | 
			
		||||
modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
 | 
			
		||||
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
 | 
			
		||||
modernc.org/sqlite v1.17.3 h1:iE+coC5g17LtByDYDWKpR6m2Z9022YrSh3bumwOnIrI=
 | 
			
		||||
modernc.org/sqlite v1.17.3/go.mod h1:10hPVYar9C0kfXuTWGz8s0XtB8uAGymUy51ZzStYe3k=
 | 
			
		||||
modernc.org/sqlite v1.18.1 h1:ko32eKt3jf7eqIkCgPAeHMBXw3riNSLhl2f3loEF7o8=
 | 
			
		||||
modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4=
 | 
			
		||||
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
 | 
			
		||||
modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
 | 
			
		||||
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
 | 
			
		||||
@ -1660,5 +1880,5 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 | 
			
		||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 | 
			
		||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 | 
			
		||||
software.sslmate.com/src/go-pkcs12 v0.0.0-20210415151418-c5206de65a78 h1:SqYE5+A2qvRhErbsXFfUEUmpWEKxxRSMgGLkvRAFOV4=
 | 
			
		||||
tailscale.com v1.28.0 h1:eW5bJMqw6eu7YUjBcgJY94uIcm5Zv+xpyTxxa7ztZOM=
 | 
			
		||||
tailscale.com v1.28.0/go.mod h1:T9uKhlkxVPdSu1Qvp882evcS/hQ1+TAyZ7sJ/VACGRI=
 | 
			
		||||
tailscale.com v1.30.0 h1:J8k19aVG5z2W7FhpjkJyZ53HKb0tiNR1icvWly36Pvg=
 | 
			
		||||
tailscale.com v1.30.0/go.mod h1:MO+tWkQp2YIF3KBnnej/mQvgYccRS5Xk/IrEpZ4Z3BU=
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -15,7 +16,6 @@ import (
 | 
			
		||||
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	"github.com/ory/dockertest/v3"
 | 
			
		||||
	"github.com/ory/dockertest/v3/docker"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@ -26,12 +26,13 @@ const (
 | 
			
		||||
var (
 | 
			
		||||
	errEnvVarEmpty = errors.New("getenv: environment variable empty")
 | 
			
		||||
 | 
			
		||||
	IpPrefix4 = netaddr.MustParseIPPrefix("100.64.0.0/10")
 | 
			
		||||
	IpPrefix6 = netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/48")
 | 
			
		||||
	IpPrefix4 = netip.MustParsePrefix("100.64.0.0/10")
 | 
			
		||||
	IpPrefix6 = netip.MustParsePrefix("fd7a:115c:a1e0::/48")
 | 
			
		||||
 | 
			
		||||
	tailscaleVersions = []string{
 | 
			
		||||
		// "head",
 | 
			
		||||
		// "unstable",
 | 
			
		||||
		"1.30.0",
 | 
			
		||||
		"1.28.0",
 | 
			
		||||
		"1.26.2",
 | 
			
		||||
		"1.24.2",
 | 
			
		||||
@ -194,8 +195,8 @@ func getDockerBuildOptions(version string) *dockertest.BuildOptions {
 | 
			
		||||
 | 
			
		||||
func getIPs(
 | 
			
		||||
	tailscales map[string]dockertest.Resource,
 | 
			
		||||
) (map[string][]netaddr.IP, error) {
 | 
			
		||||
	ips := make(map[string][]netaddr.IP)
 | 
			
		||||
) (map[string][]netip.Addr, error) {
 | 
			
		||||
	ips := make(map[string][]netip.Addr)
 | 
			
		||||
	for hostname, tailscale := range tailscales {
 | 
			
		||||
		command := []string{"tailscale", "ip"}
 | 
			
		||||
 | 
			
		||||
@ -213,7 +214,7 @@ func getIPs(
 | 
			
		||||
			if len(address) < 1 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			ip, err := netaddr.ParseIP(address)
 | 
			
		||||
			ip, err := netip.ParseAddr(address)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -22,7 +23,6 @@ import (
 | 
			
		||||
	"github.com/ory/dockertest/v3/docker"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/client/tailscale/apitype"
 | 
			
		||||
	"tailscale.com/ipn/ipnstate"
 | 
			
		||||
)
 | 
			
		||||
@ -477,8 +477,8 @@ func (s *IntegrationTestSuite) TestGetIpAddresses() {
 | 
			
		||||
//	}
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func getIPsfromIPNstate(status ipnstate.Status) []netaddr.IP {
 | 
			
		||||
	ips := make([]netaddr.IP, 0)
 | 
			
		||||
func getIPsfromIPNstate(status ipnstate.Status) []netip.Addr {
 | 
			
		||||
	ips := make([]netip.Addr, 0)
 | 
			
		||||
 | 
			
		||||
	for _, peer := range status.Peer {
 | 
			
		||||
		ips = append(ips, peer.TailscaleIPs...)
 | 
			
		||||
@ -563,14 +563,14 @@ func (s *IntegrationTestSuite) TestTailDrop() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				var ip4 netaddr.IP
 | 
			
		||||
				var ip4 netip.Addr
 | 
			
		||||
				for _, ip := range ips[peername] {
 | 
			
		||||
					if ip.Is4() {
 | 
			
		||||
						ip4 = ip
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if ip4.IsZero() {
 | 
			
		||||
				if ip4.IsUnspecified() {
 | 
			
		||||
					panic("no ipv4 address found")
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@ -748,8 +748,8 @@ func (s *IntegrationTestSuite) TestMagicDNS() {
 | 
			
		||||
 | 
			
		||||
func getAPIURLs(
 | 
			
		||||
	tailscales map[string]dockertest.Resource,
 | 
			
		||||
) (map[netaddr.IP]string, error) {
 | 
			
		||||
	fts := make(map[netaddr.IP]string)
 | 
			
		||||
) (map[netip.Addr]string, error) {
 | 
			
		||||
	fts := make(map[netip.Addr]string)
 | 
			
		||||
	for _, tailscale := range tailscales {
 | 
			
		||||
		command := []string{
 | 
			
		||||
			"curl",
 | 
			
		||||
@ -773,11 +773,11 @@ func getAPIURLs(
 | 
			
		||||
		for _, ft := range pft {
 | 
			
		||||
			n := ft.Node
 | 
			
		||||
			for _, a := range n.Addresses { // just add all the addresses
 | 
			
		||||
				if _, ok := fts[a.IP()]; !ok {
 | 
			
		||||
				if _, ok := fts[a.Addr()]; !ok {
 | 
			
		||||
					if ft.PeerAPIURL == "" {
 | 
			
		||||
						return nil, errors.New("api url is empty")
 | 
			
		||||
					}
 | 
			
		||||
					fts[a.IP()] = ft.PeerAPIURL
 | 
			
		||||
					fts[a.Addr()] = ft.PeerAPIURL
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								machine.go
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								machine.go
									
									
									
									
									
								
							@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"database/sql/driver"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -12,7 +13,6 @@ import (
 | 
			
		||||
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
	"google.golang.org/protobuf/types/known/timestamppb"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/types/key"
 | 
			
		||||
)
 | 
			
		||||
@ -83,7 +83,7 @@ type (
 | 
			
		||||
	MachinesP []*Machine
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MachineAddresses []netaddr.IP
 | 
			
		||||
type MachineAddresses []netip.Addr
 | 
			
		||||
 | 
			
		||||
func (ma MachineAddresses) ToStringSlice() []string {
 | 
			
		||||
	strSlice := make([]string, 0, len(ma))
 | 
			
		||||
@ -103,7 +103,7 @@ func (ma *MachineAddresses) Scan(destination interface{}) error {
 | 
			
		||||
			if len(addr) < 1 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			parsed, err := netaddr.ParseIP(addr)
 | 
			
		||||
			parsed, err := netip.ParseAddr(addr)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
@ -623,14 +623,14 @@ func (machine Machine) toNode(
 | 
			
		||||
		discoKey = key.DiscoPublic{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	addrs := []netaddr.IPPrefix{}
 | 
			
		||||
	addrs := []netip.Prefix{}
 | 
			
		||||
	for _, machineAddress := range machine.IPAddresses {
 | 
			
		||||
		ip := netaddr.IPPrefixFrom(machineAddress, machineAddress.BitLen())
 | 
			
		||||
		ip := netip.PrefixFrom(machineAddress, machineAddress.BitLen())
 | 
			
		||||
		addrs = append(addrs, ip)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	allowedIPs := append(
 | 
			
		||||
		[]netaddr.IPPrefix{},
 | 
			
		||||
		[]netip.Prefix{},
 | 
			
		||||
		addrs...) // we append the node own IP, as it is required by the clients
 | 
			
		||||
 | 
			
		||||
	// TODO(kradalby): Needs investigation, We probably dont need this condition
 | 
			
		||||
@ -873,16 +873,16 @@ func (h *Headscale) RegisterMachine(machine Machine,
 | 
			
		||||
	return &machine, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (machine *Machine) GetAdvertisedRoutes() []netaddr.IPPrefix {
 | 
			
		||||
func (machine *Machine) GetAdvertisedRoutes() []netip.Prefix {
 | 
			
		||||
	return machine.HostInfo.RoutableIPs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (machine *Machine) GetEnabledRoutes() []netaddr.IPPrefix {
 | 
			
		||||
func (machine *Machine) GetEnabledRoutes() []netip.Prefix {
 | 
			
		||||
	return machine.EnabledRoutes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (machine *Machine) IsRoutesEnabled(routeStr string) bool {
 | 
			
		||||
	route, err := netaddr.ParseIPPrefix(routeStr)
 | 
			
		||||
	route, err := netip.ParsePrefix(routeStr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
@ -901,9 +901,9 @@ func (machine *Machine) IsRoutesEnabled(routeStr string) bool {
 | 
			
		||||
// EnableNodeRoute enables new routes based on a list of new routes. It will _replace_ the
 | 
			
		||||
// previous list of routes.
 | 
			
		||||
func (h *Headscale) EnableRoutes(machine *Machine, routeStrs ...string) error {
 | 
			
		||||
	newRoutes := make([]netaddr.IPPrefix, len(routeStrs))
 | 
			
		||||
	newRoutes := make([]netip.Prefix, len(routeStrs))
 | 
			
		||||
	for index, routeStr := range routeStrs {
 | 
			
		||||
		route, err := netaddr.ParseIPPrefix(routeStr)
 | 
			
		||||
		route, err := netip.ParsePrefix(routeStr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
@ -9,7 +10,6 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/types/key"
 | 
			
		||||
)
 | 
			
		||||
@ -229,7 +229,7 @@ func (s *Suite) TestGetACLFilteredPeers(c *check.C) {
 | 
			
		||||
			NodeKey:    "bar" + strconv.Itoa(index),
 | 
			
		||||
			DiscoKey:   "faa" + strconv.Itoa(index),
 | 
			
		||||
			IPAddresses: MachineAddresses{
 | 
			
		||||
				netaddr.MustParseIP(fmt.Sprintf("100.64.0.%v", strconv.Itoa(index+1))),
 | 
			
		||||
				netip.MustParseAddr(fmt.Sprintf("100.64.0.%v", strconv.Itoa(index+1))),
 | 
			
		||||
			},
 | 
			
		||||
			Hostname:       "testmachine" + strconv.Itoa(index),
 | 
			
		||||
			NamespaceID:    stor[index%2].namespace.ID,
 | 
			
		||||
@ -243,7 +243,7 @@ func (s *Suite) TestGetACLFilteredPeers(c *check.C) {
 | 
			
		||||
		Groups: map[string][]string{
 | 
			
		||||
			"group:test": {"admin"},
 | 
			
		||||
		},
 | 
			
		||||
		Hosts:     map[string]netaddr.IPPrefix{},
 | 
			
		||||
		Hosts:     map[string]netip.Prefix{},
 | 
			
		||||
		TagOwners: map[string][]string{},
 | 
			
		||||
		ACLs: []ACL{
 | 
			
		||||
			{
 | 
			
		||||
@ -326,9 +326,9 @@ func (s *Suite) TestExpireMachine(c *check.C) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestSerdeAddressStrignSlice(c *check.C) {
 | 
			
		||||
	input := MachineAddresses([]netaddr.IP{
 | 
			
		||||
		netaddr.MustParseIP("192.0.2.1"),
 | 
			
		||||
		netaddr.MustParseIP("2001:db8::1"),
 | 
			
		||||
	input := MachineAddresses([]netip.Addr{
 | 
			
		||||
		netip.MustParseAddr("192.0.2.1"),
 | 
			
		||||
		netip.MustParseAddr("2001:db8::1"),
 | 
			
		||||
	})
 | 
			
		||||
	serialized, err := input.Value()
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
@ -540,7 +540,6 @@ func Test_getTags(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// nolint
 | 
			
		||||
func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
		machines []Machine
 | 
			
		||||
@ -559,21 +558,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -588,19 +587,19 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID:          1,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: Machines{
 | 
			
		||||
				{
 | 
			
		||||
					ID:          2,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
					Namespace:   Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					ID:          3,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
					Namespace:   Namespace{Name: "mickael"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -612,21 +611,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -641,14 +640,14 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID:          1,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
					Namespace:   Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: Machines{
 | 
			
		||||
				{
 | 
			
		||||
					ID:          2,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
					Namespace:   Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -660,21 +659,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -689,14 +688,14 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID:          2,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
					Namespace:   Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: Machines{
 | 
			
		||||
				{
 | 
			
		||||
					ID:          3,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
					Namespace:   Namespace{Name: "mickael"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -708,21 +707,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -738,7 +737,7 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID: 1,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
@ -747,7 +746,7 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				{
 | 
			
		||||
					ID: 2,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
@ -760,21 +759,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -790,7 +789,7 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID: 2,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
@ -799,14 +798,14 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				{
 | 
			
		||||
					ID: 1,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					ID: 3,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
				},
 | 
			
		||||
@ -819,21 +818,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -848,7 +847,7 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID:          2,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
					Namespace:   Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -856,13 +855,13 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				{
 | 
			
		||||
					ID: 1,
 | 
			
		||||
					IPAddresses: MachineAddresses{
 | 
			
		||||
						netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
						netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
					},
 | 
			
		||||
					Namespace: Namespace{Name: "joe"},
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					ID:          3,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
					Namespace:   Namespace{Name: "mickael"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@ -874,21 +873,21 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
					{
 | 
			
		||||
						ID: 1,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.1"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.1"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "joe"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 2,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.2"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.2"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "marc"},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						ID: 3,
 | 
			
		||||
						IPAddresses: MachineAddresses{
 | 
			
		||||
							netaddr.MustParseIP("100.64.0.3"),
 | 
			
		||||
							netip.MustParseAddr("100.64.0.3"),
 | 
			
		||||
						},
 | 
			
		||||
						Namespace: Namespace{Name: "mickael"},
 | 
			
		||||
					},
 | 
			
		||||
@ -897,7 +896,7 @@ func Test_getFilteredByACLPeers(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				machine: &Machine{ // current machine
 | 
			
		||||
					ID:          2,
 | 
			
		||||
					IPAddresses: MachineAddresses{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
					IPAddresses: MachineAddresses{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
					Namespace:   Namespace{Name: "marc"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestCreateAndDestroyNamespace(c *check.C) {
 | 
			
		||||
@ -146,7 +146,7 @@ func (s *Suite) TestGetMapResponseUserProfiles(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.1")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.1")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyShared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared1)
 | 
			
		||||
@ -163,7 +163,7 @@ func (s *Suite) TestGetMapResponseUserProfiles(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared2.ID,
 | 
			
		||||
		Namespace:      *namespaceShared2,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.2")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.2")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyShared2.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared2)
 | 
			
		||||
@ -180,7 +180,7 @@ func (s *Suite) TestGetMapResponseUserProfiles(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared3.ID,
 | 
			
		||||
		Namespace:      *namespaceShared3,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.3")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.3")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKeyShared3.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machineInShared3)
 | 
			
		||||
@ -197,7 +197,7 @@ func (s *Suite) TestGetMapResponseUserProfiles(c *check.C) {
 | 
			
		||||
		NamespaceID:    namespaceShared1.ID,
 | 
			
		||||
		Namespace:      *namespaceShared1,
 | 
			
		||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
			
		||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.4")},
 | 
			
		||||
		IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.4")},
 | 
			
		||||
		AuthKeyID:      uint(preAuthKey2Shared1.ID),
 | 
			
		||||
	}
 | 
			
		||||
	app.db.Save(machine2InShared1)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								noise.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								noise.go
									
									
									
									
									
								
							@ -23,6 +23,19 @@ func (h *Headscale) NoiseUpgradeHandler(
 | 
			
		||||
) {
 | 
			
		||||
	log.Trace().Caller().Msgf("Noise upgrade handler for client %s", req.RemoteAddr)
 | 
			
		||||
 | 
			
		||||
	upgrade := req.Header.Get("Upgrade")
 | 
			
		||||
	if upgrade == "" {
 | 
			
		||||
		// This probably means that the user is running Headscale behind an
 | 
			
		||||
		// improperly configured reverse proxy. TS2021 requires WebSockets to
 | 
			
		||||
		// be passed to Headscale. Let's give them a hint.
 | 
			
		||||
		log.Warn().
 | 
			
		||||
			Caller().
 | 
			
		||||
			Msg("No Upgrade header in TS2021 request. If headscale is behind a reverse proxy, make sure it is configured to pass WebSockets through.")
 | 
			
		||||
		http.Error(writer, "Internal error", http.StatusInternalServerError)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noiseConn, err := controlhttp.AcceptHTTP(req.Context(), writer, req, *h.noisePrivateKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().Err(err).Msg("noise upgrade failed")
 | 
			
		||||
@ -31,7 +44,9 @@ func (h *Headscale) NoiseUpgradeHandler(
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server := http.Server{}
 | 
			
		||||
	server := http.Server{
 | 
			
		||||
		ReadTimeout: HTTPReadTimeout,
 | 
			
		||||
	}
 | 
			
		||||
	server.Handler = h2c.NewHandler(h.noiseMux, &http2.Server{})
 | 
			
		||||
	err = server.Serve(netutil.NewOneConnListener(noiseConn, nil))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								oidc.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								oidc.go
									
									
									
									
									
								
							@ -148,12 +148,12 @@ func (h *Headscale) OIDCCallback(
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rawIDToken, err := h.getIDTokenForOIDCCallback(writer, code, state)
 | 
			
		||||
	rawIDToken, err := h.getIDTokenForOIDCCallback(req.Context(), writer, code, state)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	idToken, err := h.verifyIDTokenForOIDCCallback(writer, rawIDToken)
 | 
			
		||||
	idToken, err := h.verifyIDTokenForOIDCCallback(req.Context(), writer, rawIDToken)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@ -240,10 +240,11 @@ func validateOIDCCallbackParams(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getIDTokenForOIDCCallback(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	code, state string,
 | 
			
		||||
) (string, error) {
 | 
			
		||||
	oauth2Token, err := h.oauth2Config.Exchange(context.Background(), code)
 | 
			
		||||
	oauth2Token, err := h.oauth2Config.Exchange(ctx, code)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().
 | 
			
		||||
			Err(err).
 | 
			
		||||
@ -287,11 +288,12 @@ func (h *Headscale) getIDTokenForOIDCCallback(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) verifyIDTokenForOIDCCallback(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	rawIDToken string,
 | 
			
		||||
) (*oidc.IDToken, error) {
 | 
			
		||||
	verifier := h.oidcProvider.Verifier(&oidc.Config{ClientID: h.cfg.OIDC.ClientID})
 | 
			
		||||
	idToken, err := verifier.Verify(context.Background(), rawIDToken)
 | 
			
		||||
	idToken, err := verifier.Verify(ctx, rawIDToken)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().
 | 
			
		||||
			Err(err).
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
	if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
			
		||||
		// If the machine has AuthKey set, handle registration via PreAuthKeys
 | 
			
		||||
		if registerRequest.Auth.AuthKey != "" {
 | 
			
		||||
			h.handleAuthKeyCommon(writer, req, registerRequest, machineKey)
 | 
			
		||||
			h.handleAuthKeyCommon(writer, registerRequest, machineKey)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@ -134,7 +134,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
				case <-req.Context().Done():
 | 
			
		||||
					return
 | 
			
		||||
				case <-ticker.C:
 | 
			
		||||
					h.handleNewMachineCommon(writer, req, registerRequest, machineKey)
 | 
			
		||||
					h.handleNewMachineCommon(writer, registerRequest, machineKey)
 | 
			
		||||
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
@ -190,7 +190,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
			registerCacheExpiration,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		h.handleNewMachineCommon(writer, req, registerRequest, machineKey)
 | 
			
		||||
		h.handleNewMachineCommon(writer, registerRequest, machineKey)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@ -207,7 +207,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
			//   https://github.com/tailscale/tailscale/blob/main/tailcfg/tailcfg.go#L648
 | 
			
		||||
			if !registerRequest.Expiry.IsZero() &&
 | 
			
		||||
				registerRequest.Expiry.UTC().Before(now) {
 | 
			
		||||
				h.handleMachineLogOutCommon(writer, req, *machine, machineKey)
 | 
			
		||||
				h.handleMachineLogOutCommon(writer, *machine, machineKey)
 | 
			
		||||
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
@ -215,7 +215,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
			// If machine is not expired, and is register, we have a already accepted this machine,
 | 
			
		||||
			// let it proceed with a valid registration
 | 
			
		||||
			if !machine.isExpired() {
 | 
			
		||||
				h.handleMachineValidRegistrationCommon(writer, req, *machine, machineKey)
 | 
			
		||||
				h.handleMachineValidRegistrationCommon(writer, *machine, machineKey)
 | 
			
		||||
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
@ -226,7 +226,6 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
			!machine.isExpired() {
 | 
			
		||||
			h.handleMachineRefreshKeyCommon(
 | 
			
		||||
				writer,
 | 
			
		||||
				req,
 | 
			
		||||
				registerRequest,
 | 
			
		||||
				*machine,
 | 
			
		||||
				machineKey,
 | 
			
		||||
@ -236,7 +235,7 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The machine has expired
 | 
			
		||||
		h.handleMachineExpiredCommon(writer, req, registerRequest, *machine, machineKey)
 | 
			
		||||
		h.handleMachineExpiredCommon(writer, registerRequest, *machine, machineKey)
 | 
			
		||||
 | 
			
		||||
		machine.Expiry = &time.Time{}
 | 
			
		||||
		h.registrationCache.Set(
 | 
			
		||||
@ -256,7 +255,6 @@ func (h *Headscale) handleRegisterCommon(
 | 
			
		||||
// TODO: check if any locks are needed around IP allocation.
 | 
			
		||||
func (h *Headscale) handleAuthKeyCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	registerRequest tailcfg.RegisterRequest,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
) {
 | 
			
		||||
@ -455,7 +453,6 @@ func (h *Headscale) handleAuthKeyCommon(
 | 
			
		||||
// for authorizing the machine. This url is then showed to the user by the local Tailscale client.
 | 
			
		||||
func (h *Headscale) handleNewMachineCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	registerRequest tailcfg.RegisterRequest,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
) {
 | 
			
		||||
@ -511,7 +508,6 @@ func (h *Headscale) handleNewMachineCommon(
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) handleMachineLogOutCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	machine Machine,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
) {
 | 
			
		||||
@ -570,7 +566,6 @@ func (h *Headscale) handleMachineLogOutCommon(
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) handleMachineValidRegistrationCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	machine Machine,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
) {
 | 
			
		||||
@ -624,7 +619,6 @@ func (h *Headscale) handleMachineValidRegistrationCommon(
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) handleMachineRefreshKeyCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	registerRequest tailcfg.RegisterRequest,
 | 
			
		||||
	machine Machine,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
@ -684,7 +678,6 @@ func (h *Headscale) handleMachineRefreshKeyCommon(
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) handleMachineExpiredCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	registerRequest tailcfg.RegisterRequest,
 | 
			
		||||
	machine Machine,
 | 
			
		||||
	machineKey key.MachinePublic,
 | 
			
		||||
@ -699,7 +692,7 @@ func (h *Headscale) handleMachineExpiredCommon(
 | 
			
		||||
		Msg("Machine registration has expired. Sending a authurl to register")
 | 
			
		||||
 | 
			
		||||
	if registerRequest.Auth.AuthKey != "" {
 | 
			
		||||
		h.handleAuthKeyCommon(writer, req, registerRequest, machineKey)
 | 
			
		||||
		h.handleAuthKeyCommon(writer, registerRequest, machineKey)
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ const machineNameContextKey = contextKey("machineName")
 | 
			
		||||
// managed the poll loop.
 | 
			
		||||
func (h *Headscale) handlePollCommon(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	machine *Machine,
 | 
			
		||||
	mapRequest tailcfg.MapRequest,
 | 
			
		||||
	isNoise bool,
 | 
			
		||||
@ -205,7 +205,7 @@ func (h *Headscale) handlePollCommon(
 | 
			
		||||
 | 
			
		||||
	h.pollNetMapStream(
 | 
			
		||||
		writer,
 | 
			
		||||
		req,
 | 
			
		||||
		ctx,
 | 
			
		||||
		machine,
 | 
			
		||||
		mapRequest,
 | 
			
		||||
		pollDataChan,
 | 
			
		||||
@ -225,7 +225,7 @@ func (h *Headscale) handlePollCommon(
 | 
			
		||||
// ensuring we communicate updates and data to the connected clients.
 | 
			
		||||
func (h *Headscale) pollNetMapStream(
 | 
			
		||||
	writer http.ResponseWriter,
 | 
			
		||||
	req *http.Request,
 | 
			
		||||
	ctxReq context.Context,
 | 
			
		||||
	machine *Machine,
 | 
			
		||||
	mapRequest tailcfg.MapRequest,
 | 
			
		||||
	pollDataChan chan []byte,
 | 
			
		||||
@ -236,7 +236,7 @@ func (h *Headscale) pollNetMapStream(
 | 
			
		||||
	h.pollNetMapStreamWG.Add(1)
 | 
			
		||||
	defer h.pollNetMapStreamWG.Done()
 | 
			
		||||
 | 
			
		||||
	ctx := context.WithValue(req.Context(), machineNameContextKey, machine.Hostname)
 | 
			
		||||
	ctx := context.WithValue(ctxReq, machineNameContextKey, machine.Hostname)
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithCancel(ctx)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
@ -75,6 +75,8 @@ func (h *Headscale) marshalResponse(
 | 
			
		||||
			Caller().
 | 
			
		||||
			Err(err).
 | 
			
		||||
			Msg("Cannot marshal response")
 | 
			
		||||
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if machineKey.IsZero() { // if Noise
 | 
			
		||||
 | 
			
		||||
@ -90,5 +90,5 @@ func (h *Headscale) PollNetMapHandler(
 | 
			
		||||
		Str("machine", machine.Hostname).
 | 
			
		||||
		Msg("A machine is entering polling via the legacy protocol")
 | 
			
		||||
 | 
			
		||||
	h.handlePollCommon(writer, req, machine, mapRequest, false)
 | 
			
		||||
	h.handlePollCommon(writer, req.Context(), machine, mapRequest, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -63,5 +63,5 @@ func (h *Headscale) NoisePollNetMapHandler(
 | 
			
		||||
		Str("machine", machine.Hostname).
 | 
			
		||||
		Msg("A machine is entering polling via the Noise protocol")
 | 
			
		||||
 | 
			
		||||
	h.handlePollCommon(writer, req, machine, mapRequest, true)
 | 
			
		||||
	h.handlePollCommon(writer, req.Context(), machine, mapRequest, true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								routes.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								routes.go
									
									
									
									
									
								
							@ -2,8 +2,7 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@ -16,7 +15,7 @@ const (
 | 
			
		||||
func (h *Headscale) GetAdvertisedNodeRoutes(
 | 
			
		||||
	namespace string,
 | 
			
		||||
	nodeName string,
 | 
			
		||||
) (*[]netaddr.IPPrefix, error) {
 | 
			
		||||
) (*[]netip.Prefix, error) {
 | 
			
		||||
	machine, err := h.GetMachine(namespace, nodeName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@ -31,7 +30,7 @@ func (h *Headscale) GetAdvertisedNodeRoutes(
 | 
			
		||||
func (h *Headscale) GetEnabledNodeRoutes(
 | 
			
		||||
	namespace string,
 | 
			
		||||
	nodeName string,
 | 
			
		||||
) ([]netaddr.IPPrefix, error) {
 | 
			
		||||
) ([]netip.Prefix, error) {
 | 
			
		||||
	machine, err := h.GetMachine(namespace, nodeName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@ -47,7 +46,7 @@ func (h *Headscale) IsNodeRouteEnabled(
 | 
			
		||||
	nodeName string,
 | 
			
		||||
	routeStr string,
 | 
			
		||||
) bool {
 | 
			
		||||
	route, err := netaddr.ParseIPPrefix(routeStr)
 | 
			
		||||
	route, err := netip.ParsePrefix(routeStr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
@ -79,7 +78,7 @@ func (h *Headscale) EnableNodeRoute(
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	route, err := netaddr.ParseIPPrefix(routeStr)
 | 
			
		||||
	route, err := netip.ParsePrefix(routeStr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,9 @@
 | 
			
		||||
package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/netip"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -16,11 +17,11 @@ func (s *Suite) TestGetRoutes(c *check.C) {
 | 
			
		||||
	_, err = app.GetMachine("test", "test_get_route_machine")
 | 
			
		||||
	c.Assert(err, check.NotNil)
 | 
			
		||||
 | 
			
		||||
	route, err := netaddr.ParseIPPrefix("10.0.0.0/24")
 | 
			
		||||
	route, err := netip.ParsePrefix("10.0.0.0/24")
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	hostInfo := tailcfg.Hostinfo{
 | 
			
		||||
		RoutableIPs: []netaddr.IPPrefix{route},
 | 
			
		||||
		RoutableIPs: []netip.Prefix{route},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	machine := Machine{
 | 
			
		||||
@ -60,18 +61,18 @@ func (s *Suite) TestGetEnableRoutes(c *check.C) {
 | 
			
		||||
	_, err = app.GetMachine("test", "test_enable_route_machine")
 | 
			
		||||
	c.Assert(err, check.NotNil)
 | 
			
		||||
 | 
			
		||||
	route, err := netaddr.ParseIPPrefix(
 | 
			
		||||
	route, err := netip.ParsePrefix(
 | 
			
		||||
		"10.0.0.0/24",
 | 
			
		||||
	)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	route2, err := netaddr.ParseIPPrefix(
 | 
			
		||||
	route2, err := netip.ParsePrefix(
 | 
			
		||||
		"150.0.10.0/25",
 | 
			
		||||
	)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	hostInfo := tailcfg.Hostinfo{
 | 
			
		||||
		RoutableIPs: []netaddr.IPPrefix{route, route2},
 | 
			
		||||
		RoutableIPs: []netip.Prefix{route, route2},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	machine := Machine{
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										35
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								utils.go
									
									
									
									
									
								
							@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/fs"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"reflect"
 | 
			
		||||
@ -21,7 +22,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
	"go4.org/netipx"
 | 
			
		||||
	"tailscale.com/tailcfg"
 | 
			
		||||
	"tailscale.com/types/key"
 | 
			
		||||
)
 | 
			
		||||
@ -140,7 +141,7 @@ func (h *Headscale) getAvailableIPs() (MachineAddresses, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	ipPrefixes := h.cfg.IPPrefixes
 | 
			
		||||
	for _, ipPrefix := range ipPrefixes {
 | 
			
		||||
		var ip *netaddr.IP
 | 
			
		||||
		var ip *netip.Addr
 | 
			
		||||
		ip, err = h.getAvailableIP(ipPrefix)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ips, err
 | 
			
		||||
@ -151,16 +152,16 @@ func (h *Headscale) getAvailableIPs() (MachineAddresses, error) {
 | 
			
		||||
	return ips, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetIPPrefixEndpoints(na netaddr.IPPrefix) (netaddr.IP, netaddr.IP) {
 | 
			
		||||
	var network, broadcast netaddr.IP
 | 
			
		||||
	ipRange := na.Range()
 | 
			
		||||
func GetIPPrefixEndpoints(na netip.Prefix) (netip.Addr, netip.Addr) {
 | 
			
		||||
	var network, broadcast netip.Addr
 | 
			
		||||
	ipRange := netipx.RangeOfPrefix(na)
 | 
			
		||||
	network = ipRange.From()
 | 
			
		||||
	broadcast = ipRange.To()
 | 
			
		||||
 | 
			
		||||
	return network, broadcast
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, error) {
 | 
			
		||||
func (h *Headscale) getAvailableIP(ipPrefix netip.Prefix) (*netip.Addr, error) {
 | 
			
		||||
	usedIps, err := h.getUsedIPs()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@ -181,7 +182,7 @@ func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, erro
 | 
			
		||||
			fallthrough
 | 
			
		||||
		case usedIps.Contains(ip):
 | 
			
		||||
			fallthrough
 | 
			
		||||
		case ip.IsZero() || ip.IsLoopback():
 | 
			
		||||
		case ip == netip.Addr{} || ip.IsLoopback():
 | 
			
		||||
			ip = ip.Next()
 | 
			
		||||
 | 
			
		||||
			continue
 | 
			
		||||
@ -192,19 +193,19 @@ func (h *Headscale) getAvailableIP(ipPrefix netaddr.IPPrefix) (*netaddr.IP, erro
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getUsedIPs() (*netaddr.IPSet, error) {
 | 
			
		||||
func (h *Headscale) getUsedIPs() (*netipx.IPSet, error) {
 | 
			
		||||
	// FIXME: This really deserves a better data model,
 | 
			
		||||
	// but this was quick to get running and it should be enough
 | 
			
		||||
	// to begin experimenting with a dual stack tailnet.
 | 
			
		||||
	var addressesSlices []string
 | 
			
		||||
	h.db.Model(&Machine{}).Pluck("ip_addresses", &addressesSlices)
 | 
			
		||||
 | 
			
		||||
	var ips netaddr.IPSetBuilder
 | 
			
		||||
	var ips netipx.IPSetBuilder
 | 
			
		||||
	for _, slice := range addressesSlices {
 | 
			
		||||
		var machineAddresses MachineAddresses
 | 
			
		||||
		err := machineAddresses.Scan(slice)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return &netaddr.IPSet{}, fmt.Errorf(
 | 
			
		||||
			return &netipx.IPSet{}, fmt.Errorf(
 | 
			
		||||
				"failed to read ip from database: %w",
 | 
			
		||||
				err,
 | 
			
		||||
			)
 | 
			
		||||
@ -217,7 +218,7 @@ func (h *Headscale) getUsedIPs() (*netaddr.IPSet, error) {
 | 
			
		||||
 | 
			
		||||
	ipSet, err := ips.IPSet()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return &netaddr.IPSet{}, fmt.Errorf(
 | 
			
		||||
		return &netipx.IPSet{}, fmt.Errorf(
 | 
			
		||||
			"failed to build IP Set: %w",
 | 
			
		||||
			err,
 | 
			
		||||
		)
 | 
			
		||||
@ -250,7 +251,7 @@ func GrpcSocketDialer(ctx context.Context, addr string) (net.Conn, error) {
 | 
			
		||||
	return d.DialContext(ctx, "unix", addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ipPrefixToString(prefixes []netaddr.IPPrefix) []string {
 | 
			
		||||
func ipPrefixToString(prefixes []netip.Prefix) []string {
 | 
			
		||||
	result := make([]string, len(prefixes))
 | 
			
		||||
 | 
			
		||||
	for index, prefix := range prefixes {
 | 
			
		||||
@ -260,13 +261,13 @@ func ipPrefixToString(prefixes []netaddr.IPPrefix) []string {
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func stringToIPPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
 | 
			
		||||
	result := make([]netaddr.IPPrefix, len(prefixes))
 | 
			
		||||
func stringToIPPrefix(prefixes []string) ([]netip.Prefix, error) {
 | 
			
		||||
	result := make([]netip.Prefix, len(prefixes))
 | 
			
		||||
 | 
			
		||||
	for index, prefixStr := range prefixes {
 | 
			
		||||
		prefix, err := netaddr.ParseIPPrefix(prefixStr)
 | 
			
		||||
		prefix, err := netip.ParsePrefix(prefixStr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return []netaddr.IPPrefix{}, err
 | 
			
		||||
			return []netip.Prefix{}, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		result[index] = prefix
 | 
			
		||||
@ -275,7 +276,7 @@ func stringToIPPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func contains[T string | netaddr.IPPrefix](ts []T, t T) bool {
 | 
			
		||||
func contains[T string | netip.Prefix](ts []T, t T) bool {
 | 
			
		||||
	for _, v := range ts {
 | 
			
		||||
		if reflect.DeepEqual(v, t) {
 | 
			
		||||
			return true
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,10 @@
 | 
			
		||||
package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/netip"
 | 
			
		||||
 | 
			
		||||
	"go4.org/netipx"
 | 
			
		||||
	"gopkg.in/check.v1"
 | 
			
		||||
	"inet.af/netaddr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s *Suite) TestGetAvailableIp(c *check.C) {
 | 
			
		||||
@ -10,7 +12,7 @@ func (s *Suite) TestGetAvailableIp(c *check.C) {
 | 
			
		||||
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	expected := netaddr.MustParseIP("10.27.0.1")
 | 
			
		||||
	expected := netip.MustParseAddr("10.27.0.1")
 | 
			
		||||
 | 
			
		||||
	c.Assert(len(ips), check.Equals, 1)
 | 
			
		||||
	c.Assert(ips[0].String(), check.Equals, expected.String())
 | 
			
		||||
@ -46,8 +48,8 @@ func (s *Suite) TestGetUsedIps(c *check.C) {
 | 
			
		||||
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	expected := netaddr.MustParseIP("10.27.0.1")
 | 
			
		||||
	expectedIPSetBuilder := netaddr.IPSetBuilder{}
 | 
			
		||||
	expected := netip.MustParseAddr("10.27.0.1")
 | 
			
		||||
	expectedIPSetBuilder := netipx.IPSetBuilder{}
 | 
			
		||||
	expectedIPSetBuilder.Add(expected)
 | 
			
		||||
	expectedIPSet, _ := expectedIPSetBuilder.IPSet()
 | 
			
		||||
 | 
			
		||||
@ -96,11 +98,11 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
 | 
			
		||||
	usedIps, err := app.getUsedIPs()
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	expected0 := netaddr.MustParseIP("10.27.0.1")
 | 
			
		||||
	expected9 := netaddr.MustParseIP("10.27.0.10")
 | 
			
		||||
	expected300 := netaddr.MustParseIP("10.27.0.45")
 | 
			
		||||
	expected0 := netip.MustParseAddr("10.27.0.1")
 | 
			
		||||
	expected9 := netip.MustParseAddr("10.27.0.10")
 | 
			
		||||
	expected300 := netip.MustParseAddr("10.27.0.45")
 | 
			
		||||
 | 
			
		||||
	notExpectedIPSetBuilder := netaddr.IPSetBuilder{}
 | 
			
		||||
	notExpectedIPSetBuilder := netipx.IPSetBuilder{}
 | 
			
		||||
	notExpectedIPSetBuilder.Add(expected0)
 | 
			
		||||
	notExpectedIPSetBuilder.Add(expected9)
 | 
			
		||||
	notExpectedIPSetBuilder.Add(expected300)
 | 
			
		||||
@ -121,7 +123,7 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
 | 
			
		||||
	c.Assert(
 | 
			
		||||
		machine1.IPAddresses[0],
 | 
			
		||||
		check.Equals,
 | 
			
		||||
		netaddr.MustParseIP("10.27.0.1"),
 | 
			
		||||
		netip.MustParseAddr("10.27.0.1"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	machine50, err := app.GetMachineByID(50)
 | 
			
		||||
@ -130,10 +132,10 @@ func (s *Suite) TestGetMultiIp(c *check.C) {
 | 
			
		||||
	c.Assert(
 | 
			
		||||
		machine50.IPAddresses[0],
 | 
			
		||||
		check.Equals,
 | 
			
		||||
		netaddr.MustParseIP("10.27.0.50"),
 | 
			
		||||
		netip.MustParseAddr("10.27.0.50"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	expectedNextIP := netaddr.MustParseIP("10.27.1.95")
 | 
			
		||||
	expectedNextIP := netip.MustParseAddr("10.27.1.95")
 | 
			
		||||
	nextIP, err := app.getAvailableIPs()
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
@ -153,7 +155,7 @@ func (s *Suite) TestGetAvailableIpMachineWithoutIP(c *check.C) {
 | 
			
		||||
	ips, err := app.getAvailableIPs()
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
	expected := netaddr.MustParseIP("10.27.0.1")
 | 
			
		||||
	expected := netip.MustParseAddr("10.27.0.1")
 | 
			
		||||
 | 
			
		||||
	c.Assert(len(ips), check.Equals, 1)
 | 
			
		||||
	c.Assert(ips[0].String(), check.Equals, expected.String())
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user