diff --git a/acls.go b/acls.go
index fea72a7f..cb02e044 100644
--- a/acls.go
+++ b/acls.go
@@ -15,13 +15,15 @@ import (
"tailscale.com/tailcfg"
)
-const errorEmptyPolicy = Error("empty policy")
-const errorInvalidAction = Error("invalid action")
-const errorInvalidUserSection = Error("invalid user section")
-const errorInvalidGroup = Error("invalid group")
-const errorInvalidTag = Error("invalid tag")
-const errorInvalidNamespace = Error("invalid namespace")
-const errorInvalidPortFormat = Error("invalid port format")
+const (
+ errorEmptyPolicy = Error("empty policy")
+ errorInvalidAction = Error("invalid action")
+ errorInvalidUserSection = Error("invalid user section")
+ errorInvalidGroup = Error("invalid group")
+ errorInvalidTag = Error("invalid tag")
+ errorInvalidNamespace = Error("invalid namespace")
+ errorInvalidPortFormat = Error("invalid port format")
+)
// LoadACLPolicy loads the ACL policy from the specify path, and generates the ACL rules
func (h *Headscale) LoadACLPolicy(path string) error {
@@ -36,7 +38,14 @@ func (h *Headscale) LoadACLPolicy(path string) error {
if err != nil {
return err
}
- err = hujson.Unmarshal(b, &policy)
+
+ ast, err := hujson.Parse(b)
+ if err != nil {
+ return err
+ }
+ ast.Standardize()
+ b = ast.Pack()
+ err = json.Unmarshal(b, &policy)
if err != nil {
return err
}
@@ -53,7 +62,7 @@ func (h *Headscale) LoadACLPolicy(path string) error {
return nil
}
-func (h *Headscale) generateACLRules() (*[]tailcfg.FilterRule, error) {
+func (h *Headscale) generateACLRules() ([]tailcfg.FilterRule, error) {
rules := []tailcfg.FilterRule{}
for i, a := range h.aclPolicy.ACLs {
@@ -71,7 +80,7 @@ func (h *Headscale) generateACLRules() (*[]tailcfg.FilterRule, error) {
Msgf("Error parsing ACL %d, User %d", i, j)
return nil, err
}
- srcIPs = append(srcIPs, *srcs...)
+ srcIPs = append(srcIPs, srcs...)
}
r.SrcIPs = srcIPs
@@ -83,7 +92,7 @@ func (h *Headscale) generateACLRules() (*[]tailcfg.FilterRule, error) {
Msgf("Error parsing ACL %d, Port %d", i, j)
return nil, err
}
- destPorts = append(destPorts, *dests...)
+ destPorts = append(destPorts, dests...)
}
rules = append(rules, tailcfg.FilterRule{
@@ -92,14 +101,14 @@ func (h *Headscale) generateACLRules() (*[]tailcfg.FilterRule, error) {
})
}
- return &rules, nil
+ return rules, nil
}
-func (h *Headscale) generateACLPolicySrcIP(u string) (*[]string, error) {
+func (h *Headscale) generateACLPolicySrcIP(u string) ([]string, error) {
return h.expandAlias(u)
}
-func (h *Headscale) generateACLPolicyDestPorts(d string) (*[]tailcfg.NetPortRange, error) {
+func (h *Headscale) generateACLPolicyDestPorts(d string) ([]tailcfg.NetPortRange, error) {
tokens := strings.Split(d, ":")
if len(tokens) < 2 || len(tokens) > 3 {
return nil, errorInvalidPortFormat
@@ -128,7 +137,7 @@ func (h *Headscale) generateACLPolicyDestPorts(d string) (*[]tailcfg.NetPortRang
}
dests := []tailcfg.NetPortRange{}
- for _, d := range *expanded {
+ for _, d := range expanded {
for _, p := range *ports {
pr := tailcfg.NetPortRange{
IP: d,
@@ -137,12 +146,12 @@ func (h *Headscale) generateACLPolicyDestPorts(d string) (*[]tailcfg.NetPortRang
dests = append(dests, pr)
}
}
- return &dests, nil
+ return dests, nil
}
-func (h *Headscale) expandAlias(s string) (*[]string, error) {
+func (h *Headscale) expandAlias(s string) ([]string, error) {
if s == "*" {
- return &[]string{"*"}, nil
+ return []string{"*"}, nil
}
if strings.HasPrefix(s, "group:") {
@@ -155,11 +164,11 @@ func (h *Headscale) expandAlias(s string) (*[]string, error) {
if err != nil {
return nil, errorInvalidNamespace
}
- for _, node := range *nodes {
+ for _, node := range nodes {
ips = append(ips, node.IPAddress)
}
}
- return &ips, nil
+ return ips, nil
}
if strings.HasPrefix(s, "tag:") {
@@ -195,7 +204,7 @@ func (h *Headscale) expandAlias(s string) (*[]string, error) {
}
}
}
- return &ips, nil
+ return ips, nil
}
n, err := h.GetNamespace(s)
@@ -205,24 +214,24 @@ func (h *Headscale) expandAlias(s string) (*[]string, error) {
return nil, err
}
ips := []string{}
- for _, n := range *nodes {
+ for _, n := range nodes {
ips = append(ips, n.IPAddress)
}
- return &ips, nil
+ return ips, nil
}
if h, ok := h.aclPolicy.Hosts[s]; ok {
- return &[]string{h.String()}, nil
+ return []string{h.String()}, nil
}
ip, err := netaddr.ParseIP(s)
if err == nil {
- return &[]string{ip.String()}, nil
+ return []string{ip.String()}, nil
}
cidr, err := netaddr.ParseIPPrefix(s)
if err == nil {
- return &[]string{cidr.String()}, nil
+ return []string{cidr.String()}, nil
}
return nil, errorInvalidUserSection
diff --git a/acls_test.go b/acls_test.go
index dc5b4b31..da7f3ecc 100644
--- a/acls_test.go
+++ b/acls_test.go
@@ -12,7 +12,6 @@ func (s *Suite) TestWrongPath(c *check.C) {
func (s *Suite) TestBrokenHuJson(c *check.C) {
err := h.LoadACLPolicy("./tests/acls/broken.hujson")
c.Assert(err, check.NotNil)
-
}
func (s *Suite) TestInvalidPolicyHuson(c *check.C) {
@@ -57,10 +56,10 @@ func (s *Suite) TestPortRange(c *check.C) {
c.Assert(err, check.IsNil)
c.Assert(rules, check.NotNil)
- c.Assert(*rules, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(5400))
- c.Assert((*rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(5500))
+ c.Assert(rules, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(5400))
+ c.Assert((rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(5500))
}
func (s *Suite) TestPortWildcard(c *check.C) {
@@ -71,12 +70,12 @@ func (s *Suite) TestPortWildcard(c *check.C) {
c.Assert(err, check.IsNil)
c.Assert(rules, check.NotNil)
- c.Assert(*rules, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
- c.Assert((*rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
- c.Assert((*rules)[0].SrcIPs, check.HasLen, 1)
- c.Assert((*rules)[0].SrcIPs[0], check.Equals, "*")
+ c.Assert(rules, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
+ c.Assert((rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
+ c.Assert((rules)[0].SrcIPs, check.HasLen, 1)
+ c.Assert((rules)[0].SrcIPs[0], check.Equals, "*")
}
func (s *Suite) TestPortNamespace(c *check.C) {
@@ -110,13 +109,13 @@ func (s *Suite) TestPortNamespace(c *check.C) {
c.Assert(err, check.IsNil)
c.Assert(rules, check.NotNil)
- c.Assert(*rules, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
- c.Assert((*rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
- c.Assert((*rules)[0].SrcIPs, check.HasLen, 1)
- c.Assert((*rules)[0].SrcIPs[0], check.Not(check.Equals), "not an ip")
- c.Assert((*rules)[0].SrcIPs[0], check.Equals, ip.String())
+ c.Assert(rules, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
+ c.Assert((rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
+ c.Assert((rules)[0].SrcIPs, check.HasLen, 1)
+ c.Assert((rules)[0].SrcIPs[0], check.Not(check.Equals), "not an ip")
+ c.Assert((rules)[0].SrcIPs[0], check.Equals, ip.String())
}
func (s *Suite) TestPortGroup(c *check.C) {
@@ -150,11 +149,11 @@ func (s *Suite) TestPortGroup(c *check.C) {
c.Assert(err, check.IsNil)
c.Assert(rules, check.NotNil)
- c.Assert(*rules, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts, check.HasLen, 1)
- c.Assert((*rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
- c.Assert((*rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
- c.Assert((*rules)[0].SrcIPs, check.HasLen, 1)
- c.Assert((*rules)[0].SrcIPs[0], check.Not(check.Equals), "not an ip")
- c.Assert((*rules)[0].SrcIPs[0], check.Equals, ip.String())
+ c.Assert(rules, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts, check.HasLen, 1)
+ c.Assert((rules)[0].DstPorts[0].Ports.First, check.Equals, uint16(0))
+ c.Assert((rules)[0].DstPorts[0].Ports.Last, check.Equals, uint16(65535))
+ c.Assert((rules)[0].SrcIPs, check.HasLen, 1)
+ c.Assert((rules)[0].SrcIPs[0], check.Not(check.Equals), "not an ip")
+ c.Assert((rules)[0].SrcIPs[0], check.Equals, ip.String())
}
diff --git a/acls_types.go b/acls_types.go
index 01e42d50..67b74e73 100644
--- a/acls_types.go
+++ b/acls_types.go
@@ -1,6 +1,7 @@
package headscale
import (
+ "encoding/json"
"strings"
"github.com/tailscale/hujson"
@@ -43,7 +44,13 @@ type ACLTest struct {
func (h *Hosts) UnmarshalJSON(data []byte) error {
hosts := Hosts{}
hs := make(map[string]string)
- err := hujson.Unmarshal(data, &hs)
+ ast, err := hujson.Parse(data)
+ if err != nil {
+ return err
+ }
+ ast.Standardize()
+ data = ast.Pack()
+ err = json.Unmarshal(data, &hs)
if err != nil {
return err
}
diff --git a/api.go b/api.go
index ad87a7e9..490ce258 100644
--- a/api.go
+++ b/api.go
@@ -44,7 +44,7 @@ func (h *Headscale) RegisterWebAPI(c *gin.Context) {
- headscale -n NAMESPACE nodes register -k %s
+ headscale -n NAMESPACE nodes register --key %s
@@ -306,7 +306,7 @@ func (h *Headscale) getMapResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Ma
Peers: nodePeers,
DNSConfig: dnsConfig,
Domain: h.cfg.BaseDomain,
- PacketFilter: *h.aclRules,
+ PacketFilter: h.aclRules,
DERPMap: h.DERPMap,
UserProfiles: profiles,
}
diff --git a/app.go b/app.go
index 1f456665..c2260627 100644
--- a/app.go
+++ b/app.go
@@ -22,8 +22,11 @@ import (
"golang.org/x/oauth2"
"github.com/gin-gonic/gin"
+ "github.com/grpc-ecosystem/go-grpc-middleware"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
- apiV1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ "github.com/philip-bui/grpc-zerolog"
+ zl "github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/soheilhy/cmux"
ginprometheus "github.com/zsais/go-gin-prometheus"
@@ -84,6 +87,8 @@ type Config struct {
OIDC OIDCConfig
+ CLI CLIConfig
+
MaxMachineRegistrationDuration time.Duration
DefaultMachineRegistrationDuration time.Duration
}
@@ -102,6 +107,13 @@ type DERPConfig struct {
UpdateFrequency time.Duration
}
+type CLIConfig struct {
+ Address string
+ APIKey string
+ Insecure bool
+ Timeout time.Duration
+}
+
// Headscale represents the base app of the service.
type Headscale struct {
cfg Config
@@ -115,7 +127,7 @@ type Headscale struct {
DERPMap *tailcfg.DERPMap
aclPolicy *ACLPolicy
- aclRules *[]tailcfg.FilterRule
+ aclRules []tailcfg.FilterRule
lastStateChange sync.Map
@@ -154,7 +166,7 @@ func NewHeadscale(cfg Config) (*Headscale, error) {
dbString: dbString,
privateKey: privKey,
publicKey: &pubKey,
- aclRules: &tailcfg.FilterAllowAll, // default allowall
+ aclRules: tailcfg.FilterAllowAll, // default allowall
}
err = h.initDB()
@@ -209,7 +221,7 @@ func (h *Headscale) expireEphemeralNodesWorker() {
return
}
- for _, ns := range *namespaces {
+ for _, ns := range namespaces {
machines, err := h.ListMachinesInNamespace(ns.Name)
if err != nil {
log.Error().Err(err).Str("namespace", ns.Name).Msg("Error listing machines in namespace")
@@ -217,7 +229,7 @@ func (h *Headscale) expireEphemeralNodesWorker() {
return
}
- for _, m := range *machines {
+ for _, m := range machines {
if m.AuthKey != nil && m.LastSeen != nil && m.AuthKey.Ephemeral &&
time.Now().After(m.LastSeen.Add(h.cfg.EphemeralNodeInactivityTimeout)) {
log.Info().Str("machine", m.Name).Msg("Ephemeral client removed from database")
@@ -340,6 +352,16 @@ func (h *Headscale) httpAuthenticationMiddleware(c *gin.Context) {
// c.Next()
}
+// ensureUnixSocketIsAbsent will check if the given path for headscales unix socket is clear
+// and will remove it if it is not.
+func (h *Headscale) ensureUnixSocketIsAbsent() error {
+ // File does not exist, all fine
+ if _, err := os.Stat(h.cfg.UnixSocket); errors.Is(err, os.ErrNotExist) {
+ return nil
+ }
+ return os.Remove(h.cfg.UnixSocket)
+}
+
// Serve launches a GIN server with the Headscale API.
func (h *Headscale) Serve() error {
var err error
@@ -349,6 +371,11 @@ func (h *Headscale) Serve() error {
defer cancel()
+ err = h.ensureUnixSocketIsAbsent()
+ if err != nil {
+ panic(err)
+ }
+
socketListener, err := net.Listen("unix", h.cfg.UnixSocket)
if err != nil {
panic(err)
@@ -399,7 +426,7 @@ func (h *Headscale) Serve() error {
// Connect to the gRPC server over localhost to skip
// the authentication.
- err = apiV1.RegisterHeadscaleServiceHandler(ctx, grpcGatewayMux, grpcGatewayConn)
+ err = v1.RegisterHeadscaleServiceHandler(ctx, grpcGatewayMux, grpcGatewayConn)
if err != nil {
return err
}
@@ -454,9 +481,18 @@ func (h *Headscale) Serve() error {
WriteTimeout: 0,
}
+ if zl.GlobalLevel() == zl.TraceLevel {
+ zerolog.RespLog = true
+ } else {
+ zerolog.RespLog = false
+ }
+
grpcOptions := []grpc.ServerOption{
grpc.UnaryInterceptor(
- h.grpcAuthenticationInterceptor,
+ grpc_middleware.ChainUnaryServer(
+ h.grpcAuthenticationInterceptor,
+ zerolog.NewUnaryServerInterceptor(),
+ ),
),
}
@@ -476,10 +512,10 @@ func (h *Headscale) Serve() error {
grpcServer := grpc.NewServer(grpcOptions...)
// Start the local gRPC server without TLS and without authentication
- grpcSocket := grpc.NewServer()
+ grpcSocket := grpc.NewServer(zerolog.UnaryInterceptor())
- apiV1.RegisterHeadscaleServiceServer(grpcServer, newHeadscaleV1APIServer(h))
- apiV1.RegisterHeadscaleServiceServer(grpcSocket, newHeadscaleV1APIServer(h))
+ v1.RegisterHeadscaleServiceServer(grpcServer, newHeadscaleV1APIServer(h))
+ v1.RegisterHeadscaleServiceServer(grpcSocket, newHeadscaleV1APIServer(h))
reflection.Register(grpcServer)
reflection.Register(grpcSocket)
diff --git a/cli.go b/cli.go
deleted file mode 100644
index 8610b334..00000000
--- a/cli.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package headscale
-
-import (
- "errors"
-
- "gorm.io/gorm"
- "tailscale.com/types/wgkey"
-)
-
-// RegisterMachine is executed from the CLI to register a new Machine using its MachineKey
-func (h *Headscale) RegisterMachine(key string, namespace string) (*Machine, error) {
- ns, err := h.GetNamespace(namespace)
- if err != nil {
- return nil, err
- }
- mKey, err := wgkey.ParseHex(key)
- if err != nil {
- return nil, err
- }
-
- m := Machine{}
- if result := h.db.First(&m, "machine_key = ?", mKey.HexString()); errors.Is(result.Error, gorm.ErrRecordNotFound) {
- return nil, errors.New("Machine not found")
- }
-
- h.updateMachineExpiry(&m) // update the machine's expiry before bailing if its already registered
-
- if m.isAlreadyRegistered() {
- return nil, errors.New("Machine already registered")
- }
-
- ip, err := h.getAvailableIP()
- if err != nil {
- return nil, err
- }
- m.IPAddress = ip.String()
- m.NamespaceID = ns.ID
- m.Registered = true
- m.RegisterMethod = "cli"
- h.db.Save(&m)
-
- return &m, nil
-}
diff --git a/cmd/headscale/cli/debug.go b/cmd/headscale/cli/debug.go
new file mode 100644
index 00000000..e140156b
--- /dev/null
+++ b/cmd/headscale/cli/debug.go
@@ -0,0 +1,90 @@
+package cli
+
+import (
+ "fmt"
+
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ "github.com/rs/zerolog/log"
+ "github.com/spf13/cobra"
+ "google.golang.org/grpc/status"
+)
+
+func init() {
+ rootCmd.AddCommand(debugCmd)
+
+ createNodeCmd.Flags().StringP("name", "", "", "Name")
+ err := createNodeCmd.MarkFlagRequired("name")
+ if err != nil {
+ log.Fatal().Err(err).Msg("")
+ }
+ createNodeCmd.Flags().StringP("namespace", "n", "", "Namespace")
+ err = createNodeCmd.MarkFlagRequired("namespace")
+ if err != nil {
+ log.Fatal().Err(err).Msg("")
+ }
+ createNodeCmd.Flags().StringP("key", "k", "", "Key")
+ err = createNodeCmd.MarkFlagRequired("key")
+ if err != nil {
+ log.Fatal().Err(err).Msg("")
+ }
+ createNodeCmd.Flags().StringSliceP("route", "r", []string{}, "List (or repeated flags) of routes to advertise")
+
+ debugCmd.AddCommand(createNodeCmd)
+}
+
+var debugCmd = &cobra.Command{
+ Use: "debug",
+ Short: "debug and testing commands",
+ Long: "debug contains extra commands used for debugging and testing headscale",
+}
+
+var createNodeCmd = &cobra.Command{
+ Use: "create-node",
+ Short: "Create a node (machine) that can be registered with `nodes register <>` command",
+ Run: func(cmd *cobra.Command, args []string) {
+ output, _ := cmd.Flags().GetString("output")
+
+ namespace, err := cmd.Flags().GetString("namespace")
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
+ return
+ }
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ name, err := cmd.Flags().GetString("name")
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting node from flag: %s", err), output)
+ return
+ }
+
+ machineKey, err := cmd.Flags().GetString("key")
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting key from flag: %s", err), output)
+ return
+ }
+
+ routes, err := cmd.Flags().GetStringSlice("route")
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting routes from flag: %s", err), output)
+ return
+ }
+
+ request := &v1.DebugCreateMachineRequest{
+ Key: machineKey,
+ Name: name,
+ Namespace: namespace,
+ Routes: routes,
+ }
+
+ response, err := client.DebugCreateMachine(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Cannot create machine: %s", status.Convert(err).Message()), output)
+ return
+ }
+
+ SuccessOutput(response.Machine, "Machine created", output)
+ },
+}
diff --git a/cmd/headscale/cli/namespaces.go b/cmd/headscale/cli/namespaces.go
index 1c4e3762..752638a7 100644
--- a/cmd/headscale/cli/namespaces.go
+++ b/cmd/headscale/cli/namespaces.go
@@ -1,16 +1,13 @@
package cli
import (
- "context"
"fmt"
- "strconv"
- "strings"
- "time"
- apiV1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/pterm/pterm"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
+ "google.golang.org/grpc/status"
)
func init() {
@@ -36,29 +33,26 @@ var createNamespaceCmd = &cobra.Command{
return nil
},
Run: func(cmd *cobra.Command, args []string) {
- o, _ := cmd.Flags().GetString("output")
+ output, _ := cmd.Flags().GetString("output")
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ namespaceName := args[0]
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
defer cancel()
-
- client, conn := getHeadscaleGRPCClient(ctx)
defer conn.Close()
log.Trace().Interface("client", client).Msg("Obtained gRPC client")
- request := &apiV1.CreateNamespaceRequest{Name: args[0]}
+ request := &v1.CreateNamespaceRequest{Name: namespaceName}
log.Trace().Interface("request", request).Msg("Sending CreateNamespace request")
response, err := client.CreateNamespace(ctx, request)
- if strings.HasPrefix(o, "json") {
- JsonOutput(response.Name, err, o)
- return
- }
if err != nil {
- fmt.Printf("Error creating namespace: %s\n", err)
+ ErrorOutput(err, fmt.Sprintf("Cannot create namespace: %s", status.Convert(err).Message()), output)
return
}
- fmt.Printf("Namespace created\n")
+
+ SuccessOutput(response.Namespace, "Namespace created", output)
},
}
@@ -72,21 +66,23 @@ var destroyNamespaceCmd = &cobra.Command{
return nil
},
Run: func(cmd *cobra.Command, args []string) {
- o, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
+ output, _ := cmd.Flags().GetString("output")
+
+ namespaceName := args[0]
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.DeleteNamespaceRequest{Name: namespaceName}
+
+ response, err := client.DeleteNamespace(ctx, request)
if err != nil {
- log.Fatal().Err(err).Msgf("Error initializing: %s", err)
- }
- err = h.DestroyNamespace(args[0])
- if strings.HasPrefix(o, "json") {
- JsonOutput(map[string]string{"Result": "Namespace destroyed"}, err, o)
+ ErrorOutput(err, fmt.Sprintf("Cannot destroy namespace: %s", status.Convert(err).Message()), output)
return
}
- if err != nil {
- fmt.Printf("Error destroying namespace: %s\n", err)
- return
- }
- fmt.Printf("Namespace destroyed\n")
+
+ SuccessOutput(response, "Namespace destroyed", output)
},
}
@@ -94,31 +90,40 @@ var listNamespacesCmd = &cobra.Command{
Use: "list",
Short: "List all the namespaces",
Run: func(cmd *cobra.Command, args []string) {
- o, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
+ output, _ := cmd.Flags().GetString("output")
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.ListNamespacesRequest{}
+
+ response, err := client.ListNamespaces(ctx, request)
if err != nil {
- log.Fatal().Err(err).Msgf("Error initializing: %s", err)
- }
- namespaces, err := h.ListNamespaces()
- if strings.HasPrefix(o, "json") {
- JsonOutput(namespaces, err, o)
+ ErrorOutput(err, fmt.Sprintf("Cannot get namespaces: %s", status.Convert(err).Message()), output)
return
}
- if err != nil {
- fmt.Println(err)
+
+ if output != "" {
+ SuccessOutput(response.Namespaces, "", output)
return
}
d := pterm.TableData{{"ID", "Name", "Created"}}
- for _, n := range *namespaces {
+ for _, namespace := range response.GetNamespaces() {
d = append(
d,
- []string{strconv.FormatUint(uint64(n.ID), 10), n.Name, n.CreatedAt.Format("2006-01-02 15:04:05")},
+ []string{
+ namespace.GetId(),
+ namespace.GetName(),
+ namespace.GetCreatedAt().AsTime().Format("2006-01-02 15:04:05"),
+ },
)
}
err = pterm.DefaultTable.WithHasHeader().WithData(d).Render()
if err != nil {
- log.Fatal().Err(err).Msg("")
+ ErrorOutput(err, fmt.Sprintf("Failed to render pterm table: %s", err), output)
+ return
}
},
}
@@ -133,20 +138,23 @@ var renameNamespaceCmd = &cobra.Command{
return nil
},
Run: func(cmd *cobra.Command, args []string) {
- o, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatal().Err(err).Msgf("Error initializing: %s", err)
+ output, _ := cmd.Flags().GetString("output")
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.RenameNamespaceRequest{
+ OldName: args[0],
+ NewName: args[1],
}
- err = h.RenameNamespace(args[0], args[1])
- if strings.HasPrefix(o, "json") {
- JsonOutput(map[string]string{"Result": "Namespace renamed"}, err, o)
+
+ response, err := client.RenameNamespace(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Cannot rename namespace: %s", status.Convert(err).Message()), output)
return
}
- if err != nil {
- fmt.Printf("Error renaming namespace: %s\n", err)
- return
- }
- fmt.Printf("Namespace renamed\n")
+
+ SuccessOutput(response.Namespace, "Namespace renamed", output)
},
}
diff --git a/cmd/headscale/cli/nodes.go b/cmd/headscale/cli/nodes.go
index cdf37efb..9b3f4243 100644
--- a/cmd/headscale/cli/nodes.go
+++ b/cmd/headscale/cli/nodes.go
@@ -4,13 +4,13 @@ import (
"fmt"
"log"
"strconv"
- "strings"
"time"
survey "github.com/AlecAivazis/survey/v2"
- "github.com/juanfont/headscale"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
+ "google.golang.org/grpc/status"
"tailscale.com/tailcfg"
"tailscale.com/types/wgkey"
)
@@ -73,30 +73,35 @@ var registerNodeCmd = &cobra.Command{
Use: "register",
Short: "Registers a machine to your network",
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
+ output, _ := cmd.Flags().GetString("output")
+ namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
+ return
}
- o, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ machineKey, err := cmd.Flags().GetString("key")
if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
- machineIDStr, err := cmd.Flags().GetString("key")
- if err != nil {
- log.Fatalf("Error getting machine ID: %s", err)
- }
- m, err := h.RegisterMachine(machineIDStr, n)
- if strings.HasPrefix(o, "json") {
- JsonOutput(m, err, o)
+ ErrorOutput(err, fmt.Sprintf("Error getting machine key from flag: %s", err), output)
return
}
+
+ request := &v1.RegisterMachineRequest{
+ Key: machineKey,
+ Namespace: namespace,
+ }
+
+ response, err := client.RegisterMachine(ctx, request)
if err != nil {
- fmt.Printf("Cannot register machine: %s\n", err)
+ ErrorOutput(err, fmt.Sprintf("Cannot register machine: %s\n", status.Convert(err).Message()), output)
return
}
- fmt.Printf("Machine registered\n")
+
+ SuccessOutput(response.Machine, "Machine register", output)
},
}
@@ -104,72 +109,42 @@ var listNodesCmd = &cobra.Command{
Use: "list",
Short: "List nodes",
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
+ output, _ := cmd.Flags().GetString("output")
+ namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
- o, _ := cmd.Flags().GetString("output")
-
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
-
- var namespaces []headscale.Namespace
- var namespace *headscale.Namespace
- var sharedMachines *[]headscale.Machine
- if len(n) == 0 {
- // no namespace provided, list all
- tmp, err := h.ListNamespaces()
- if err != nil {
- log.Fatalf("Error fetching namespace: %s", err)
- }
- namespaces = *tmp
- } else {
- namespace, err = h.GetNamespace(n)
- if err != nil {
- log.Fatalf("Error fetching namespace: %s", err)
- }
- namespaces = append(namespaces, *namespace)
-
- sharedMachines, err = h.ListSharedMachinesInNamespace(n)
- if err != nil {
- log.Fatalf("Error fetching shared machines: %s", err)
- }
- }
-
- var allMachines []headscale.Machine
- for _, namespace := range namespaces {
- machines, err := h.ListMachinesInNamespace(namespace.Name)
- if err != nil {
- log.Fatalf("Error fetching machines: %s", err)
- }
- allMachines = append(allMachines, *machines...)
- }
-
- // listing sharedMachines is only relevant when a particular namespace is
- // requested
- if sharedMachines != nil {
- allMachines = append(allMachines, *sharedMachines...)
- }
-
- if strings.HasPrefix(o, "json") {
- JsonOutput(allMachines, err, o)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
return
}
- if err != nil {
- log.Fatalf("Error getting nodes: %s", err)
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.ListMachinesRequest{
+ Namespace: namespace,
}
- d, err := nodesToPtables(namespace, allMachines)
+ response, err := client.ListMachines(ctx, request)
if err != nil {
- log.Fatalf("Error converting to table: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Cannot get nodes: %s", status.Convert(err).Message()), output)
+ return
+ }
+
+ if output != "" {
+ SuccessOutput(response.Machines, "", output)
+ return
+ }
+
+ d, err := nodesToPtables(namespace, response.Machines)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error converting to table: %s", err), output)
+ return
}
err = pterm.DefaultTable.WithHasHeader().WithData(d).Render()
if err != nil {
- log.Fatal(err)
+ ErrorOutput(err, fmt.Sprintf("Failed to render pterm table: %s", err), output)
+ return
}
},
}
@@ -179,24 +154,36 @@ var deleteNodeCmd = &cobra.Command{
Short: "Delete a node",
Run: func(cmd *cobra.Command, args []string) {
output, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
+
id, err := cmd.Flags().GetInt("identifier")
if err != nil {
- log.Fatalf("Error converting ID to integer: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error converting ID to integer: %s", err), output)
+ return
}
- m, err := h.GetMachineByID(uint64(id))
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ getRequest := &v1.GetMachineRequest{
+ MachineId: uint64(id),
+ }
+
+ getResponse, err := client.GetMachine(ctx, getRequest)
if err != nil {
- log.Fatalf("Error getting node: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting node node: %s", status.Convert(err).Message()), output)
+ return
+ }
+
+ deleteRequest := &v1.DeleteMachineRequest{
+ MachineId: uint64(id),
}
confirm := false
force, _ := cmd.Flags().GetBool("force")
if !force {
prompt := &survey.Confirm{
- Message: fmt.Sprintf("Do you want to remove the node %s?", m.Name),
+ Message: fmt.Sprintf("Do you want to remove the node %s?", getResponse.GetMachine().Name),
}
err = survey.AskOne(prompt, &confirm)
if err != nil {
@@ -205,71 +192,92 @@ var deleteNodeCmd = &cobra.Command{
}
if confirm || force {
- err = h.DeleteMachine(m)
- if strings.HasPrefix(output, "json") {
- JsonOutput(map[string]string{"Result": "Node deleted"}, err, output)
+ response, err := client.DeleteMachine(ctx, deleteRequest)
+ if output != "" {
+ SuccessOutput(response, "", output)
return
}
if err != nil {
- log.Fatalf("Error deleting node: %s", err)
- }
- fmt.Printf("Node deleted\n")
- } else {
- if strings.HasPrefix(output, "json") {
- JsonOutput(map[string]string{"Result": "Node not deleted"}, err, output)
+ ErrorOutput(err, fmt.Sprintf("Error deleting node: %s", status.Convert(err).Message()), output)
return
}
- fmt.Printf("Node not deleted\n")
+ SuccessOutput(map[string]string{"Result": "Node deleted"}, "Node deleted", output)
+ } else {
+ SuccessOutput(map[string]string{"Result": "Node not deleted"}, "Node not deleted", output)
}
},
}
-func sharingWorker(cmd *cobra.Command, args []string) (*headscale.Headscale, string, *headscale.Machine, *headscale.Namespace) {
+func sharingWorker(
+ cmd *cobra.Command,
+ args []string,
+) (string, *v1.Machine, *v1.Namespace, error) {
+ output, _ := cmd.Flags().GetString("output")
namespaceStr, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
+ return "", nil, nil, err
}
- output, _ := cmd.Flags().GetString("output")
-
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
-
- namespace, err := h.GetNamespace(namespaceStr)
- if err != nil {
- log.Fatalf("Error fetching namespace %s: %s", namespaceStr, err)
- }
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
id, err := cmd.Flags().GetInt("identifier")
if err != nil {
- log.Fatalf("Error converting ID to integer: %s", err)
- }
- machine, err := h.GetMachineByID(uint64(id))
- if err != nil {
- log.Fatalf("Error getting node: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error converting ID to integer: %s", err), output)
+ return "", nil, nil, err
}
- return h, output, machine, namespace
+ machineRequest := &v1.GetMachineRequest{
+ MachineId: uint64(id),
+ }
+
+ machineResponse, err := client.GetMachine(ctx, machineRequest)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting node node: %s", status.Convert(err).Message()), output)
+ return "", nil, nil, err
+ }
+
+ namespaceRequest := &v1.GetNamespaceRequest{
+ Name: namespaceStr,
+ }
+
+ namespaceResponse, err := client.GetNamespace(ctx, namespaceRequest)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error getting node node: %s", status.Convert(err).Message()), output)
+ return "", nil, nil, err
+ }
+
+ return output, machineResponse.GetMachine(), namespaceResponse.GetNamespace(), nil
}
var shareMachineCmd = &cobra.Command{
Use: "share",
Short: "Shares a node from the current namespace to the specified one",
Run: func(cmd *cobra.Command, args []string) {
- h, output, machine, namespace := sharingWorker(cmd, args)
- err := h.AddSharedMachineToNamespace(machine, namespace)
- if strings.HasPrefix(output, "json") {
- JsonOutput(map[string]string{"Result": "Node shared"}, err, output)
- return
- }
+ output, machine, namespace, err := sharingWorker(cmd, args)
if err != nil {
- fmt.Printf("Error sharing node: %s\n", err)
+ ErrorOutput(err, fmt.Sprintf("Failed to fetch namespace or machine: %s", err), output)
return
}
- fmt.Println("Node shared!")
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.ShareMachineRequest{
+ MachineId: machine.Id,
+ Namespace: namespace.Name,
+ }
+
+ response, err := client.ShareMachine(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error sharing node: %s", status.Convert(err).Message()), output)
+ return
+ }
+
+ SuccessOutput(response.Machine, "Node shared", output)
},
}
@@ -277,33 +285,43 @@ var unshareMachineCmd = &cobra.Command{
Use: "unshare",
Short: "Unshares a node from the specified namespace",
Run: func(cmd *cobra.Command, args []string) {
- h, output, machine, namespace := sharingWorker(cmd, args)
- err := h.RemoveSharedMachineFromNamespace(machine, namespace)
- if strings.HasPrefix(output, "json") {
- JsonOutput(map[string]string{"Result": "Node unshared"}, err, output)
- return
- }
+ output, machine, namespace, err := sharingWorker(cmd, args)
if err != nil {
- fmt.Printf("Error unsharing node: %s\n", err)
+ ErrorOutput(err, fmt.Sprintf("Failed to fetch namespace or machine: %s", err), output)
return
}
- fmt.Println("Node unshared!")
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.UnshareMachineRequest{
+ MachineId: machine.Id,
+ Namespace: namespace.Name,
+ }
+
+ response, err := client.UnshareMachine(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error unsharing node: %s", status.Convert(err).Message()), output)
+ return
+ }
+
+ SuccessOutput(response.Machine, "Node unshared", output)
},
}
-func nodesToPtables(currentNamespace *headscale.Namespace, machines []headscale.Machine) (pterm.TableData, error) {
+func nodesToPtables(currentNamespace string, machines []*v1.Machine) (pterm.TableData, error) {
d := pterm.TableData{{"ID", "Name", "NodeKey", "Namespace", "IP address", "Ephemeral", "Last seen", "Online"}}
for _, machine := range machines {
var ephemeral bool
- if machine.AuthKey != nil && machine.AuthKey.Ephemeral {
+ if machine.PreAuthKey != nil && machine.PreAuthKey.Ephemeral {
ephemeral = true
}
var lastSeen time.Time
var lastSeenTime string
if machine.LastSeen != nil {
- lastSeen = *machine.LastSeen
+ lastSeen = machine.LastSeen.AsTime()
lastSeenTime = lastSeen.Format("2006-01-02 15:04:05")
}
nKey, err := wgkey.ParseHex(machine.NodeKey)
@@ -320,13 +338,25 @@ func nodesToPtables(currentNamespace *headscale.Namespace, machines []headscale.
}
var namespace string
- if (currentNamespace == nil) || (currentNamespace.ID == machine.NamespaceID) {
+ if currentNamespace == "" || (currentNamespace == machine.Namespace.Name) {
namespace = pterm.LightMagenta(machine.Namespace.Name)
} else {
// Shared into this namespace
namespace = pterm.LightYellow(machine.Namespace.Name)
}
- d = append(d, []string{strconv.FormatUint(machine.ID, 10), machine.Name, nodeKey.ShortString(), namespace, machine.IPAddress, strconv.FormatBool(ephemeral), lastSeenTime, online})
+ d = append(
+ d,
+ []string{
+ strconv.FormatUint(machine.Id, 10),
+ machine.Name,
+ nodeKey.ShortString(),
+ namespace,
+ machine.IpAddress,
+ strconv.FormatBool(ephemeral),
+ lastSeenTime,
+ online,
+ },
+ )
}
return d, nil
}
diff --git a/cmd/headscale/cli/preauthkeys.go b/cmd/headscale/cli/preauthkeys.go
index d7cebec1..a07e9610 100644
--- a/cmd/headscale/cli/preauthkeys.go
+++ b/cmd/headscale/cli/preauthkeys.go
@@ -2,14 +2,14 @@ package cli
import (
"fmt"
- "log"
"strconv"
- "strings"
"time"
- "github.com/hako/durafmt"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/pterm/pterm"
+ "github.com/rs/zerolog/log"
"github.com/spf13/cobra"
+ "google.golang.org/protobuf/types/known/timestamppb"
)
func init() {
@@ -17,14 +17,15 @@ func init() {
preauthkeysCmd.PersistentFlags().StringP("namespace", "n", "", "Namespace")
err := preauthkeysCmd.MarkPersistentFlagRequired("namespace")
if err != nil {
- log.Fatalf(err.Error())
+ log.Fatal().Err(err).Msg("")
}
preauthkeysCmd.AddCommand(listPreAuthKeys)
preauthkeysCmd.AddCommand(createPreAuthKeyCmd)
preauthkeysCmd.AddCommand(expirePreAuthKeyCmd)
createPreAuthKeyCmd.PersistentFlags().Bool("reusable", false, "Make the preauthkey reusable")
createPreAuthKeyCmd.PersistentFlags().Bool("ephemeral", false, "Preauthkey for ephemeral nodes")
- createPreAuthKeyCmd.Flags().StringP("expiration", "e", "", "Human-readable expiration of the key (30m, 24h, 365d...)")
+ createPreAuthKeyCmd.Flags().
+ DurationP("expiration", "e", 24*time.Hour, "Human-readable expiration of the key (30m, 24h, 365d...)")
}
var preauthkeysCmd = &cobra.Command{
@@ -36,55 +37,62 @@ var listPreAuthKeys = &cobra.Command{
Use: "list",
Short: "List the preauthkeys for this namespace",
Run: func(cmd *cobra.Command, args []string) {
+ output, _ := cmd.Flags().GetString("output")
+
n, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
- o, _ := cmd.Flags().GetString("output")
-
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
- keys, err := h.GetPreAuthKeys(n)
- if strings.HasPrefix(o, "json") {
- JsonOutput(keys, err, o)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
return
}
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.ListPreAuthKeysRequest{
+ Namespace: n,
+ }
+
+ response, err := client.ListPreAuthKeys(ctx, request)
if err != nil {
- fmt.Printf("Error getting the list of keys: %s\n", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting the list of keys: %s", err), output)
+ return
+ }
+
+ if output != "" {
+ SuccessOutput(response.PreAuthKeys, "", output)
return
}
d := pterm.TableData{{"ID", "Key", "Reusable", "Ephemeral", "Used", "Expiration", "Created"}}
- for _, k := range *keys {
+ for _, k := range response.PreAuthKeys {
expiration := "-"
- if k.Expiration != nil {
- expiration = k.Expiration.Format("2006-01-02 15:04:05")
+ if k.GetExpiration() != nil {
+ expiration = k.Expiration.AsTime().Format("2006-01-02 15:04:05")
}
var reusable string
- if k.Ephemeral {
+ if k.GetEphemeral() {
reusable = "N/A"
} else {
- reusable = fmt.Sprintf("%v", k.Reusable)
+ reusable = fmt.Sprintf("%v", k.GetReusable())
}
d = append(d, []string{
- strconv.FormatUint(k.ID, 10),
- k.Key,
+ k.GetId(),
+ k.GetKey(),
reusable,
- strconv.FormatBool(k.Ephemeral),
- fmt.Sprintf("%v", k.Used),
+ strconv.FormatBool(k.GetEphemeral()),
+ strconv.FormatBool(k.GetUsed()),
expiration,
- k.CreatedAt.Format("2006-01-02 15:04:05"),
+ k.GetCreatedAt().AsTime().Format("2006-01-02 15:04:05"),
})
}
err = pterm.DefaultTable.WithHasHeader().WithData(d).Render()
if err != nil {
- log.Fatal(err)
+ ErrorOutput(err, fmt.Sprintf("Failed to render pterm table: %s", err), output)
+ return
}
},
}
@@ -93,40 +101,49 @@ var createPreAuthKeyCmd = &cobra.Command{
Use: "create",
Short: "Creates a new preauthkey in the specified namespace",
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
- if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
- o, _ := cmd.Flags().GetString("output")
+ output, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
+ namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error initializing: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
+ return
}
+
reusable, _ := cmd.Flags().GetBool("reusable")
ephemeral, _ := cmd.Flags().GetBool("ephemeral")
- e, _ := cmd.Flags().GetString("expiration")
- var expiration *time.Time
- if e != "" {
- duration, err := durafmt.ParseStringShort(e)
- if err != nil {
- log.Fatalf("Error parsing expiration: %s", err)
- }
- exp := time.Now().UTC().Add(duration.Duration())
- expiration = &exp
+ log.Trace().
+ Bool("reusable", reusable).
+ Bool("ephemeral", ephemeral).
+ Str("namespace", namespace).
+ Msg("Preparing to create preauthkey")
+
+ request := &v1.CreatePreAuthKeyRequest{
+ Namespace: namespace,
+ Reusable: reusable,
+ Ephemeral: ephemeral,
}
- k, err := h.CreatePreAuthKey(n, reusable, ephemeral, expiration)
- if strings.HasPrefix(o, "json") {
- JsonOutput(k, err, o)
- return
+ if cmd.Flags().Changed("expiration") {
+ duration, _ := cmd.Flags().GetDuration("expiration")
+ expiration := time.Now().UTC().Add(duration)
+
+ log.Trace().Dur("expiration", duration).Msg("expiration has been set")
+
+ request.Expiration = timestamppb.New(expiration)
}
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ response, err := client.CreatePreAuthKey(ctx, request)
if err != nil {
- fmt.Println(err)
+ ErrorOutput(err, fmt.Sprintf("Cannot create Pre Auth Key: %s\n", err), output)
return
}
- fmt.Printf("%s\n", k.Key)
+
+ SuccessOutput(response.PreAuthKey, response.PreAuthKey.Key, output)
},
}
@@ -140,35 +157,28 @@ var expirePreAuthKeyCmd = &cobra.Command{
return nil
},
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
+ output, _ := cmd.Flags().GetString("output")
+ namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
- o, _ := cmd.Flags().GetString("output")
-
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
-
- k, err := h.GetPreAuthKey(n, args[0])
- if err != nil {
- if strings.HasPrefix(o, "json") {
- JsonOutput(k, err, o)
- return
- }
- log.Fatalf("Error getting the key: %s", err)
- }
-
- err = h.MarkExpirePreAuthKey(k)
- if strings.HasPrefix(o, "json") {
- JsonOutput(k, err, o)
+ ErrorOutput(err, fmt.Sprintf("Error getting namespace: %s", err), output)
return
}
+
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.ExpirePreAuthKeyRequest{
+ Namespace: namespace,
+ Key: args[0],
+ }
+
+ response, err := client.ExpirePreAuthKey(ctx, request)
if err != nil {
- fmt.Println(err)
+ ErrorOutput(err, fmt.Sprintf("Cannot expire Pre Auth Key: %s\n", err), output)
return
}
- fmt.Println("Expired")
+
+ SuccessOutput(response, "Key expired", output)
},
}
diff --git a/cmd/headscale/cli/root.go b/cmd/headscale/cli/root.go
index 794cd0d0..e5115f3d 100644
--- a/cmd/headscale/cli/root.go
+++ b/cmd/headscale/cli/root.go
@@ -8,7 +8,8 @@ import (
)
func init() {
- rootCmd.PersistentFlags().StringP("output", "o", "", "Output format. Empty for human-readable, 'json' or 'json-line'")
+ rootCmd.PersistentFlags().
+ StringP("output", "o", "", "Output format. Empty for human-readable, 'json', 'json-line' or 'yaml'")
rootCmd.PersistentFlags().Bool("force", false, "Disable prompts and forces the execution")
}
diff --git a/cmd/headscale/cli/routes.go b/cmd/headscale/cli/routes.go
index 72010864..9f2e4e24 100644
--- a/cmd/headscale/cli/routes.go
+++ b/cmd/headscale/cli/routes.go
@@ -3,24 +3,34 @@ package cli
import (
"fmt"
"log"
- "strings"
+ "strconv"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
+ "google.golang.org/grpc/status"
)
func init() {
rootCmd.AddCommand(routesCmd)
- routesCmd.PersistentFlags().StringP("namespace", "n", "", "Namespace")
- err := routesCmd.MarkPersistentFlagRequired("namespace")
+
+ listRoutesCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)")
+ err := listRoutesCmd.MarkFlagRequired("identifier")
+ if err != nil {
+ log.Fatalf(err.Error())
+ }
+ routesCmd.AddCommand(listRoutesCmd)
+
+ enableRouteCmd.Flags().StringSliceP("route", "r", []string{}, "List (or repeated flags) of routes to enable")
+ enableRouteCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)")
+ err = enableRouteCmd.MarkFlagRequired("identifier")
if err != nil {
log.Fatalf(err.Error())
}
- enableRouteCmd.Flags().BoolP("all", "a", false, "Enable all routes advertised by the node")
-
- routesCmd.AddCommand(listRoutesCmd)
routesCmd.AddCommand(enableRouteCmd)
+
+ nodeCmd.AddCommand(routesCmd)
}
var routesCmd = &cobra.Command{
@@ -29,119 +39,124 @@ var routesCmd = &cobra.Command{
}
var listRoutesCmd = &cobra.Command{
- Use: "list NODE",
- Short: "List the routes exposed by this node",
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 1 {
- return fmt.Errorf("Missing parameters")
- }
- return nil
- },
+ Use: "list",
+ Short: "List routes advertised and enabled by a given node",
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
- if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
- o, _ := cmd.Flags().GetString("output")
+ output, _ := cmd.Flags().GetString("output")
- h, err := getHeadscaleApp()
+ machineId, err := cmd.Flags().GetUint64("identifier")
if err != nil {
- log.Fatalf("Error initializing: %s", err)
- }
-
- availableRoutes, err := h.GetAdvertisedNodeRoutes(n, args[0])
- if err != nil {
- fmt.Println(err)
+ ErrorOutput(err, fmt.Sprintf("Error getting machine id from flag: %s", err), output)
return
}
- if strings.HasPrefix(o, "json") {
- // TODO: Add enable/disabled information to this interface
- JsonOutput(availableRoutes, err, o)
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.GetMachineRouteRequest{
+ MachineId: machineId,
+ }
+
+ response, err := client.GetMachineRoute(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Cannot get nodes: %s", status.Convert(err).Message()), output)
return
}
- d := h.RoutesToPtables(n, args[0], *availableRoutes)
+ if output != "" {
+ SuccessOutput(response.Routes, "", output)
+ return
+ }
+
+ d := routesToPtables(response.Routes)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error converting to table: %s", err), output)
+ return
+ }
err = pterm.DefaultTable.WithHasHeader().WithData(d).Render()
if err != nil {
- log.Fatal(err)
+ ErrorOutput(err, fmt.Sprintf("Failed to render pterm table: %s", err), output)
+ return
}
},
}
var enableRouteCmd = &cobra.Command{
- Use: "enable node-name route",
- Short: "Allows exposing a route declared by this node to the rest of the nodes",
- Args: func(cmd *cobra.Command, args []string) error {
- all, err := cmd.Flags().GetBool("all")
- if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
- }
-
- if all {
- if len(args) < 1 {
- return fmt.Errorf("Missing parameters")
- }
- return nil
- } else {
- if len(args) < 2 {
- return fmt.Errorf("Missing parameters")
- }
- return nil
- }
- },
+ Use: "enable",
+ Short: "Set the enabled routes for a given node",
+ Long: `This command will take a list of routes that will _replace_
+the current set of routes on a given node.
+If you would like to disable a route, simply run the command again, but
+omit the route you do not want to enable.
+ `,
Run: func(cmd *cobra.Command, args []string) {
- n, err := cmd.Flags().GetString("namespace")
+ output, _ := cmd.Flags().GetString("output")
+ machineId, err := cmd.Flags().GetUint64("identifier")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting machine id from flag: %s", err), output)
+ return
}
- o, _ := cmd.Flags().GetString("output")
-
- all, err := cmd.Flags().GetBool("all")
+ routes, err := cmd.Flags().GetStringSlice("route")
if err != nil {
- log.Fatalf("Error getting namespace: %s", err)
+ ErrorOutput(err, fmt.Sprintf("Error getting routes from flag: %s", err), output)
+ return
}
- h, err := getHeadscaleApp()
- if err != nil {
- log.Fatalf("Error initializing: %s", err)
+ ctx, client, conn, cancel := getHeadscaleCLIClient()
+ defer cancel()
+ defer conn.Close()
+
+ request := &v1.EnableMachineRoutesRequest{
+ MachineId: machineId,
+ Routes: routes,
}
- if all {
- availableRoutes, err := h.GetAdvertisedNodeRoutes(n, args[0])
- if err != nil {
- fmt.Println(err)
- return
- }
+ response, err := client.EnableMachineRoutes(ctx, request)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Cannot register machine: %s\n", status.Convert(err).Message()), output)
+ return
+ }
- for _, availableRoute := range *availableRoutes {
- err = h.EnableNodeRoute(n, args[0], availableRoute.String())
- if err != nil {
- fmt.Println(err)
- return
- }
+ if output != "" {
+ SuccessOutput(response.Routes, "", output)
+ return
+ }
- if strings.HasPrefix(o, "json") {
- JsonOutput(availableRoute, err, o)
- } else {
- fmt.Printf("Enabled route %s\n", availableRoute)
- }
- }
- } else {
- err = h.EnableNodeRoute(n, args[0], args[1])
+ d := routesToPtables(response.Routes)
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Error converting to table: %s", err), output)
+ return
+ }
- if strings.HasPrefix(o, "json") {
- JsonOutput(args[1], err, o)
- return
- }
-
- if err != nil {
- fmt.Println(err)
- return
- }
- fmt.Printf("Enabled route %s\n", args[1])
+ err = pterm.DefaultTable.WithHasHeader().WithData(d).Render()
+ if err != nil {
+ ErrorOutput(err, fmt.Sprintf("Failed to render pterm table: %s", err), output)
+ return
}
},
}
+
+// routesToPtables converts the list of routes to a nice table
+func routesToPtables(routes *v1.Routes) pterm.TableData {
+ d := pterm.TableData{{"Route", "Enabled"}}
+
+ for _, route := range routes.GetAdvertisedRoutes() {
+ enabled := isStringInSlice(routes.EnabledRoutes, route)
+
+ d = append(d, []string{route, strconv.FormatBool(enabled)})
+ }
+ return d
+}
+
+func isStringInSlice(strs []string, s string) bool {
+ for _, s2 := range strs {
+ if s == s2 {
+ return true
+ }
+ }
+
+ return false
+}
diff --git a/cmd/headscale/cli/utils.go b/cmd/headscale/cli/utils.go
index cd467697..30f1a789 100644
--- a/cmd/headscale/cli/utils.go
+++ b/cmd/headscale/cli/utils.go
@@ -9,24 +9,20 @@ import (
"os"
"path/filepath"
"regexp"
- "strconv"
"strings"
"time"
"github.com/juanfont/headscale"
- apiV1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
"google.golang.org/grpc"
+ "gopkg.in/yaml.v2"
"inet.af/netaddr"
"tailscale.com/tailcfg"
"tailscale.com/types/dnstype"
)
-type ErrorOutput struct {
- Error string
-}
-
func LoadConfig(path string) error {
viper.SetConfigName("config")
if path == "" {
@@ -37,6 +33,9 @@ func LoadConfig(path string) error {
// For testing
viper.AddConfigPath(path)
}
+
+ viper.SetEnvPrefix("headscale")
+ viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv()
viper.SetDefault("tls_letsencrypt_cache_dir", "/var/www/.cache")
@@ -50,6 +49,9 @@ func LoadConfig(path string) error {
viper.SetDefault("unix_socket", "/var/run/headscale.sock")
+ viper.SetDefault("cli.insecure", false)
+ viper.SetDefault("cli.timeout", "5s")
+
err := viper.ReadInConfig()
if err != nil {
return fmt.Errorf("Fatal error reading config file: %s \n", err)
@@ -273,6 +275,13 @@ func getHeadscaleConfig() headscale.Config {
ClientSecret: viper.GetString("oidc.client_secret"),
},
+ CLI: headscale.CLIConfig{
+ Address: viper.GetString("cli.address"),
+ APIKey: viper.GetString("cli.api_key"),
+ Insecure: viper.GetBool("cli.insecure"),
+ Timeout: viper.GetDuration("cli.timeout"),
+ },
+
MaxMachineRegistrationDuration: maxMachineRegistrationDuration,
DefaultMachineRegistrationDuration: defaultMachineRegistrationDuration,
}
@@ -316,21 +325,27 @@ func getHeadscaleApp() (*headscale.Headscale, error) {
return h, nil
}
-func getHeadscaleGRPCClient(ctx context.Context) (apiV1.HeadscaleServiceClient, *grpc.ClientConn) {
+func getHeadscaleCLIClient() (context.Context, v1.HeadscaleServiceClient, *grpc.ClientConn, context.CancelFunc) {
+ cfg := getHeadscaleConfig()
+
+ log.Debug().
+ Dur("timeout", cfg.CLI.Timeout).
+ Msgf("Setting timeout")
+
+ ctx, cancel := context.WithTimeout(context.Background(), cfg.CLI.Timeout)
+
grpcOptions := []grpc.DialOption{
grpc.WithBlock(),
}
- address := os.Getenv("HEADSCALE_ADDRESS")
+ address := cfg.CLI.Address
// If the address is not set, we assume that we are on the server hosting headscale.
if address == "" {
- cfg := getHeadscaleConfig()
-
log.Debug().
Str("socket", cfg.UnixSocket).
- Msgf("HEADSCALE_ADDRESS environment is not set, connecting to unix socket.")
+ Msgf("HEADSCALE_CLI_ADDRESS environment is not set, connecting to unix socket.")
address = cfg.UnixSocket
@@ -341,9 +356,9 @@ func getHeadscaleGRPCClient(ctx context.Context) (apiV1.HeadscaleServiceClient,
)
} else {
// If we are not connecting to a local server, require an API key for authentication
- apiKey := os.Getenv("HEADSCALE_API_KEY")
+ apiKey := cfg.CLI.APIKey
if apiKey == "" {
- log.Fatal().Msgf("HEADSCALE_API_KEY environment variable needs to be set.")
+ log.Fatal().Msgf("HEADSCALE_CLI_API_KEY environment variable needs to be set.")
}
grpcOptions = append(grpcOptions,
grpc.WithPerRPCCredentials(tokenAuth{
@@ -351,16 +366,8 @@ func getHeadscaleGRPCClient(ctx context.Context) (apiV1.HeadscaleServiceClient,
}),
)
- insecureStr := os.Getenv("HEADSCALE_INSECURE")
- if insecureStr != "" {
- insecure, err := strconv.ParseBool(insecureStr)
- if err != nil {
- log.Fatal().Err(err).Msgf("Failed to parse HEADSCALE_INSECURE: %v", err)
- }
-
- if insecure {
- grpcOptions = append(grpcOptions, grpc.WithInsecure())
- }
+ if cfg.CLI.Insecure {
+ grpcOptions = append(grpcOptions, grpc.WithInsecure())
}
}
@@ -370,46 +377,49 @@ func getHeadscaleGRPCClient(ctx context.Context) (apiV1.HeadscaleServiceClient,
log.Fatal().Err(err).Msgf("Could not connect: %v", err)
}
- client := apiV1.NewHeadscaleServiceClient(conn)
+ client := v1.NewHeadscaleServiceClient(conn)
- return client, conn
+ return ctx, client, conn, cancel
}
-func JsonOutput(result interface{}, errResult error, outputFormat string) {
+func SuccessOutput(result interface{}, override string, outputFormat string) {
var j []byte
var err error
switch outputFormat {
case "json":
- if errResult != nil {
- j, err = json.MarshalIndent(ErrorOutput{errResult.Error()}, "", "\t")
- if err != nil {
- log.Fatal().Err(err)
- }
- } else {
- j, err = json.MarshalIndent(result, "", "\t")
- if err != nil {
- log.Fatal().Err(err)
- }
+ j, err = json.MarshalIndent(result, "", "\t")
+ if err != nil {
+ log.Fatal().Err(err)
}
case "json-line":
- if errResult != nil {
- j, err = json.Marshal(ErrorOutput{errResult.Error()})
- if err != nil {
- log.Fatal().Err(err)
- }
- } else {
- j, err = json.Marshal(result)
- if err != nil {
- log.Fatal().Err(err)
- }
+ j, err = json.Marshal(result)
+ if err != nil {
+ log.Fatal().Err(err)
}
+ case "yaml":
+ j, err = yaml.Marshal(result)
+ if err != nil {
+ log.Fatal().Err(err)
+ }
+ default:
+ fmt.Println(override)
+ return
}
+
fmt.Println(string(j))
}
-func HasJsonOutputFlag() bool {
+func ErrorOutput(errResult error, override string, outputFormat string) {
+ type errOutput struct {
+ Error string `json:"error"`
+ }
+
+ SuccessOutput(errOutput{errResult.Error()}, override, outputFormat)
+}
+
+func HasMachineOutputFlag() bool {
for _, arg := range os.Args {
- if arg == "json" || arg == "json-line" {
+ if arg == "json" || arg == "json-line" || arg == "yaml" {
return true
}
}
diff --git a/cmd/headscale/cli/version.go b/cmd/headscale/cli/version.go
index c018b142..2b440af3 100644
--- a/cmd/headscale/cli/version.go
+++ b/cmd/headscale/cli/version.go
@@ -1,9 +1,6 @@
package cli
import (
- "fmt"
- "strings"
-
"github.com/spf13/cobra"
)
@@ -18,11 +15,7 @@ var versionCmd = &cobra.Command{
Short: "Print the version.",
Long: "The version of headscale.",
Run: func(cmd *cobra.Command, args []string) {
- o, _ := cmd.Flags().GetString("output")
- if strings.HasPrefix(o, "json") {
- JsonOutput(map[string]string{"version": Version}, nil, o)
- return
- }
- fmt.Println(Version)
+ output, _ := cmd.Flags().GetString("output")
+ SuccessOutput(map[string]string{"version": Version}, Version, output)
},
}
diff --git a/cmd/headscale/headscale.go b/cmd/headscale/headscale.go
index 6b1a8437..ed4644f3 100644
--- a/cmd/headscale/headscale.go
+++ b/cmd/headscale/headscale.go
@@ -46,24 +46,23 @@ func main() {
log.Fatal().Err(err)
}
+ machineOutput := cli.HasMachineOutputFlag()
+
logLevel := viper.GetString("log_level")
- switch logLevel {
- case "trace":
- zerolog.SetGlobalLevel(zerolog.TraceLevel)
- case "debug":
- zerolog.SetGlobalLevel(zerolog.DebugLevel)
- case "info":
- zerolog.SetGlobalLevel(zerolog.InfoLevel)
- case "warn":
- zerolog.SetGlobalLevel(zerolog.WarnLevel)
- case "error":
- zerolog.SetGlobalLevel(zerolog.ErrorLevel)
- default:
+ level, err := zerolog.ParseLevel(logLevel)
+ if err != nil {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
+ } else {
+ zerolog.SetGlobalLevel(level)
}
- jsonOutput := cli.HasJsonOutputFlag()
- if !viper.GetBool("disable_check_updates") && !jsonOutput {
+ // If the user has requested a "machine" readable format,
+ // then disable login so the output remains valid.
+ if machineOutput {
+ zerolog.SetGlobalLevel(zerolog.Disabled)
+ }
+
+ if !viper.GetBool("disable_check_updates") && !machineOutput {
if (runtime.GOOS == "linux" || runtime.GOOS == "darwin") && cli.Version != "dev" {
githubTag := &latest.GithubTag{
Owner: "juanfont",
@@ -71,8 +70,11 @@ func main() {
}
res, err := latest.Check(githubTag, cli.Version)
if err == nil && res.Outdated {
- fmt.Printf("An updated version of Headscale has been found (%s vs. your current %s). Check it out https://github.com/juanfont/headscale/releases\n",
- res.Current, cli.Version)
+ fmt.Printf(
+ "An updated version of Headscale has been found (%s vs. your current %s). Check it out https://github.com/juanfont/headscale/releases\n",
+ res.Current,
+ cli.Version,
+ )
}
}
}
diff --git a/derp.go b/derp.go
index 39e63210..7f65832c 100644
--- a/derp.go
+++ b/derp.go
@@ -144,7 +144,7 @@ func (h *Headscale) scheduledDERPMapUpdateWorker(cancelChan <-chan struct{}) {
Msg("Failed to fetch namespaces")
}
- for _, namespace := range *namespaces {
+ for _, namespace := range namespaces {
h.setLastStateChangeToNow(namespace.Name)
}
}
diff --git a/gen/go/headscale/v1/device.pb.go b/gen/go/headscale/v1/device.pb.go
new file mode 100644
index 00000000..302c2653
--- /dev/null
+++ b/gen/go/headscale/v1/device.pb.go
@@ -0,0 +1,1115 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.18.1
+// source: headscale/v1/device.proto
+
+package v1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Latency struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ LatencyMs float32 `protobuf:"fixed32,1,opt,name=latency_ms,json=latencyMs,proto3" json:"latency_ms,omitempty"`
+ Preferred bool `protobuf:"varint,2,opt,name=preferred,proto3" json:"preferred,omitempty"`
+}
+
+func (x *Latency) Reset() {
+ *x = Latency{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Latency) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Latency) ProtoMessage() {}
+
+func (x *Latency) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Latency.ProtoReflect.Descriptor instead.
+func (*Latency) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Latency) GetLatencyMs() float32 {
+ if x != nil {
+ return x.LatencyMs
+ }
+ return 0
+}
+
+func (x *Latency) GetPreferred() bool {
+ if x != nil {
+ return x.Preferred
+ }
+ return false
+}
+
+type ClientSupports struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ HairPinning bool `protobuf:"varint,1,opt,name=hair_pinning,json=hairPinning,proto3" json:"hair_pinning,omitempty"`
+ Ipv6 bool `protobuf:"varint,2,opt,name=ipv6,proto3" json:"ipv6,omitempty"`
+ Pcp bool `protobuf:"varint,3,opt,name=pcp,proto3" json:"pcp,omitempty"`
+ Pmp bool `protobuf:"varint,4,opt,name=pmp,proto3" json:"pmp,omitempty"`
+ Udp bool `protobuf:"varint,5,opt,name=udp,proto3" json:"udp,omitempty"`
+ Upnp bool `protobuf:"varint,6,opt,name=upnp,proto3" json:"upnp,omitempty"`
+}
+
+func (x *ClientSupports) Reset() {
+ *x = ClientSupports{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ClientSupports) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientSupports) ProtoMessage() {}
+
+func (x *ClientSupports) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClientSupports.ProtoReflect.Descriptor instead.
+func (*ClientSupports) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ClientSupports) GetHairPinning() bool {
+ if x != nil {
+ return x.HairPinning
+ }
+ return false
+}
+
+func (x *ClientSupports) GetIpv6() bool {
+ if x != nil {
+ return x.Ipv6
+ }
+ return false
+}
+
+func (x *ClientSupports) GetPcp() bool {
+ if x != nil {
+ return x.Pcp
+ }
+ return false
+}
+
+func (x *ClientSupports) GetPmp() bool {
+ if x != nil {
+ return x.Pmp
+ }
+ return false
+}
+
+func (x *ClientSupports) GetUdp() bool {
+ if x != nil {
+ return x.Udp
+ }
+ return false
+}
+
+func (x *ClientSupports) GetUpnp() bool {
+ if x != nil {
+ return x.Upnp
+ }
+ return false
+}
+
+type ClientConnectivity struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Endpoints []string `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
+ Derp string `protobuf:"bytes,2,opt,name=derp,proto3" json:"derp,omitempty"`
+ MappingVariesByDestIp bool `protobuf:"varint,3,opt,name=mapping_varies_by_dest_ip,json=mappingVariesByDestIp,proto3" json:"mapping_varies_by_dest_ip,omitempty"`
+ Latency map[string]*Latency `protobuf:"bytes,4,rep,name=latency,proto3" json:"latency,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ ClientSupports *ClientSupports `protobuf:"bytes,5,opt,name=client_supports,json=clientSupports,proto3" json:"client_supports,omitempty"`
+}
+
+func (x *ClientConnectivity) Reset() {
+ *x = ClientConnectivity{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ClientConnectivity) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClientConnectivity) ProtoMessage() {}
+
+func (x *ClientConnectivity) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClientConnectivity.ProtoReflect.Descriptor instead.
+func (*ClientConnectivity) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ClientConnectivity) GetEndpoints() []string {
+ if x != nil {
+ return x.Endpoints
+ }
+ return nil
+}
+
+func (x *ClientConnectivity) GetDerp() string {
+ if x != nil {
+ return x.Derp
+ }
+ return ""
+}
+
+func (x *ClientConnectivity) GetMappingVariesByDestIp() bool {
+ if x != nil {
+ return x.MappingVariesByDestIp
+ }
+ return false
+}
+
+func (x *ClientConnectivity) GetLatency() map[string]*Latency {
+ if x != nil {
+ return x.Latency
+ }
+ return nil
+}
+
+func (x *ClientConnectivity) GetClientSupports() *ClientSupports {
+ if x != nil {
+ return x.ClientSupports
+ }
+ return nil
+}
+
+type GetDeviceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+}
+
+func (x *GetDeviceRequest) Reset() {
+ *x = GetDeviceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetDeviceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDeviceRequest) ProtoMessage() {}
+
+func (x *GetDeviceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetDeviceRequest.ProtoReflect.Descriptor instead.
+func (*GetDeviceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetDeviceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+type GetDeviceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"`
+ Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+ User string `protobuf:"bytes,3,opt,name=user,proto3" json:"user,omitempty"`
+ Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+ Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"`
+ ClientVersion string `protobuf:"bytes,6,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"`
+ UpdateAvailable bool `protobuf:"varint,7,opt,name=update_available,json=updateAvailable,proto3" json:"update_available,omitempty"`
+ Os string `protobuf:"bytes,8,opt,name=os,proto3" json:"os,omitempty"`
+ Created *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=created,proto3" json:"created,omitempty"`
+ LastSeen *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"`
+ KeyExpiryDisabled bool `protobuf:"varint,11,opt,name=key_expiry_disabled,json=keyExpiryDisabled,proto3" json:"key_expiry_disabled,omitempty"`
+ Expires *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=expires,proto3" json:"expires,omitempty"`
+ Authorized bool `protobuf:"varint,13,opt,name=authorized,proto3" json:"authorized,omitempty"`
+ IsExternal bool `protobuf:"varint,14,opt,name=is_external,json=isExternal,proto3" json:"is_external,omitempty"`
+ MachineKey string `protobuf:"bytes,15,opt,name=machine_key,json=machineKey,proto3" json:"machine_key,omitempty"`
+ NodeKey string `protobuf:"bytes,16,opt,name=node_key,json=nodeKey,proto3" json:"node_key,omitempty"`
+ BlocksIncomingConnections bool `protobuf:"varint,17,opt,name=blocks_incoming_connections,json=blocksIncomingConnections,proto3" json:"blocks_incoming_connections,omitempty"`
+ EnabledRoutes []string `protobuf:"bytes,18,rep,name=enabled_routes,json=enabledRoutes,proto3" json:"enabled_routes,omitempty"`
+ AdvertisedRoutes []string `protobuf:"bytes,19,rep,name=advertised_routes,json=advertisedRoutes,proto3" json:"advertised_routes,omitempty"`
+ ClientConnectivity *ClientConnectivity `protobuf:"bytes,20,opt,name=client_connectivity,json=clientConnectivity,proto3" json:"client_connectivity,omitempty"`
+}
+
+func (x *GetDeviceResponse) Reset() {
+ *x = GetDeviceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetDeviceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDeviceResponse) ProtoMessage() {}
+
+func (x *GetDeviceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetDeviceResponse.ProtoReflect.Descriptor instead.
+func (*GetDeviceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetDeviceResponse) GetAddresses() []string {
+ if x != nil {
+ return x.Addresses
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetUser() string {
+ if x != nil {
+ return x.User
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetHostname() string {
+ if x != nil {
+ return x.Hostname
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetClientVersion() string {
+ if x != nil {
+ return x.ClientVersion
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetUpdateAvailable() bool {
+ if x != nil {
+ return x.UpdateAvailable
+ }
+ return false
+}
+
+func (x *GetDeviceResponse) GetOs() string {
+ if x != nil {
+ return x.Os
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetCreated() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Created
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetLastSeen() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSeen
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetKeyExpiryDisabled() bool {
+ if x != nil {
+ return x.KeyExpiryDisabled
+ }
+ return false
+}
+
+func (x *GetDeviceResponse) GetExpires() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Expires
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetAuthorized() bool {
+ if x != nil {
+ return x.Authorized
+ }
+ return false
+}
+
+func (x *GetDeviceResponse) GetIsExternal() bool {
+ if x != nil {
+ return x.IsExternal
+ }
+ return false
+}
+
+func (x *GetDeviceResponse) GetMachineKey() string {
+ if x != nil {
+ return x.MachineKey
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetNodeKey() string {
+ if x != nil {
+ return x.NodeKey
+ }
+ return ""
+}
+
+func (x *GetDeviceResponse) GetBlocksIncomingConnections() bool {
+ if x != nil {
+ return x.BlocksIncomingConnections
+ }
+ return false
+}
+
+func (x *GetDeviceResponse) GetEnabledRoutes() []string {
+ if x != nil {
+ return x.EnabledRoutes
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetAdvertisedRoutes() []string {
+ if x != nil {
+ return x.AdvertisedRoutes
+ }
+ return nil
+}
+
+func (x *GetDeviceResponse) GetClientConnectivity() *ClientConnectivity {
+ if x != nil {
+ return x.ClientConnectivity
+ }
+ return nil
+}
+
+type DeleteDeviceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+}
+
+func (x *DeleteDeviceRequest) Reset() {
+ *x = DeleteDeviceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteDeviceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteDeviceRequest) ProtoMessage() {}
+
+func (x *DeleteDeviceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteDeviceRequest.ProtoReflect.Descriptor instead.
+func (*DeleteDeviceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *DeleteDeviceRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+type DeleteDeviceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteDeviceResponse) Reset() {
+ *x = DeleteDeviceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteDeviceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteDeviceResponse) ProtoMessage() {}
+
+func (x *DeleteDeviceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteDeviceResponse.ProtoReflect.Descriptor instead.
+func (*DeleteDeviceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{6}
+}
+
+type GetDeviceRoutesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+}
+
+func (x *GetDeviceRoutesRequest) Reset() {
+ *x = GetDeviceRoutesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetDeviceRoutesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDeviceRoutesRequest) ProtoMessage() {}
+
+func (x *GetDeviceRoutesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetDeviceRoutesRequest.ProtoReflect.Descriptor instead.
+func (*GetDeviceRoutesRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *GetDeviceRoutesRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+type GetDeviceRoutesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ EnabledRoutes []string `protobuf:"bytes,1,rep,name=enabled_routes,json=enabledRoutes,proto3" json:"enabled_routes,omitempty"`
+ AdvertisedRoutes []string `protobuf:"bytes,2,rep,name=advertised_routes,json=advertisedRoutes,proto3" json:"advertised_routes,omitempty"`
+}
+
+func (x *GetDeviceRoutesResponse) Reset() {
+ *x = GetDeviceRoutesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetDeviceRoutesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDeviceRoutesResponse) ProtoMessage() {}
+
+func (x *GetDeviceRoutesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetDeviceRoutesResponse.ProtoReflect.Descriptor instead.
+func (*GetDeviceRoutesResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *GetDeviceRoutesResponse) GetEnabledRoutes() []string {
+ if x != nil {
+ return x.EnabledRoutes
+ }
+ return nil
+}
+
+func (x *GetDeviceRoutesResponse) GetAdvertisedRoutes() []string {
+ if x != nil {
+ return x.AdvertisedRoutes
+ }
+ return nil
+}
+
+type EnableDeviceRoutesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ Routes []string `protobuf:"bytes,2,rep,name=routes,proto3" json:"routes,omitempty"`
+}
+
+func (x *EnableDeviceRoutesRequest) Reset() {
+ *x = EnableDeviceRoutesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnableDeviceRoutesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnableDeviceRoutesRequest) ProtoMessage() {}
+
+func (x *EnableDeviceRoutesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnableDeviceRoutesRequest.ProtoReflect.Descriptor instead.
+func (*EnableDeviceRoutesRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *EnableDeviceRoutesRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *EnableDeviceRoutesRequest) GetRoutes() []string {
+ if x != nil {
+ return x.Routes
+ }
+ return nil
+}
+
+type EnableDeviceRoutesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ EnabledRoutes []string `protobuf:"bytes,1,rep,name=enabled_routes,json=enabledRoutes,proto3" json:"enabled_routes,omitempty"`
+ AdvertisedRoutes []string `protobuf:"bytes,2,rep,name=advertised_routes,json=advertisedRoutes,proto3" json:"advertised_routes,omitempty"`
+}
+
+func (x *EnableDeviceRoutesResponse) Reset() {
+ *x = EnableDeviceRoutesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_device_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnableDeviceRoutesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnableDeviceRoutesResponse) ProtoMessage() {}
+
+func (x *EnableDeviceRoutesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_device_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnableDeviceRoutesResponse.ProtoReflect.Descriptor instead.
+func (*EnableDeviceRoutesResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_device_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *EnableDeviceRoutesResponse) GetEnabledRoutes() []string {
+ if x != nil {
+ return x.EnabledRoutes
+ }
+ return nil
+}
+
+func (x *EnableDeviceRoutesResponse) GetAdvertisedRoutes() []string {
+ if x != nil {
+ return x.AdvertisedRoutes
+ }
+ return nil
+}
+
+var File_headscale_v1_device_proto protoreflect.FileDescriptor
+
+var file_headscale_v1_device_proto_rawDesc = []byte{
+ 0x0a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64,
+ 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x46, 0x0a, 0x07, 0x4c, 0x61,
+ 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79,
+ 0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x61, 0x74, 0x65, 0x6e,
+ 0x63, 0x79, 0x4d, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72,
+ 0x65, 0x64, 0x22, 0x91, 0x01, 0x0a, 0x0e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x70,
+ 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x70, 0x69,
+ 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x69,
+ 0x72, 0x50, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x12, 0x10, 0x0a, 0x03,
+ 0x70, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x63, 0x70, 0x12, 0x10,
+ 0x0a, 0x03, 0x70, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x6d, 0x70,
+ 0x12, 0x10, 0x0a, 0x03, 0x75, 0x64, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x75,
+ 0x64, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x70, 0x6e, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08,
+ 0x52, 0x04, 0x75, 0x70, 0x6e, 0x70, 0x22, 0xe3, 0x02, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e,
+ 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a,
+ 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64,
+ 0x65, 0x72, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x72, 0x70, 0x12,
+ 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x65,
+ 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x08, 0x52, 0x15, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x72, 0x69, 0x65,
+ 0x73, 0x42, 0x79, 0x44, 0x65, 0x73, 0x74, 0x49, 0x70, 0x12, 0x47, 0x0a, 0x07, 0x6c, 0x61, 0x74,
+ 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+ 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x61, 0x74,
+ 0x65, 0x6e, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e,
+ 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x70,
+ 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e,
+ 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
+ 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0c, 0x4c, 0x61, 0x74,
+ 0x65, 0x6e, 0x63, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63,
+ 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x22, 0x0a, 0x10,
+ 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
+ 0x22, 0xa0, 0x06, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,
+ 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+ 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65,
+ 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+ 0x29, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
+ 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+ 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x6b, 0x65, 0x79,
+ 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
+ 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6b, 0x65, 0x79, 0x45, 0x78, 0x70, 0x69, 0x72,
+ 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x70,
+ 0x69, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12,
+ 0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0d, 0x20,
+ 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x12,
+ 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x0e,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18,
+ 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65,
+ 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x10, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x1b,
+ 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f,
+ 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x19, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e,
+ 0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e,
+ 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x12,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x75,
+ 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65,
+ 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10,
+ 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x12, 0x51, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+ 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69,
+ 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52,
+ 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76,
+ 0x69, 0x74, 0x79, 0x22, 0x25, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76,
+ 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x28, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
+ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6d, 0x0a, 0x17,
+ 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
+ 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2b,
+ 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75,
+ 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72,
+ 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x19, 0x45,
+ 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65,
+ 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74,
+ 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x22, 0x70, 0x0a, 0x1a, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25,
+ 0x0a, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52,
+ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69,
+ 0x73, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+ 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74,
+ 0x65, 0x73, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_headscale_v1_device_proto_rawDescOnce sync.Once
+ file_headscale_v1_device_proto_rawDescData = file_headscale_v1_device_proto_rawDesc
+)
+
+func file_headscale_v1_device_proto_rawDescGZIP() []byte {
+ file_headscale_v1_device_proto_rawDescOnce.Do(func() {
+ file_headscale_v1_device_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_device_proto_rawDescData)
+ })
+ return file_headscale_v1_device_proto_rawDescData
+}
+
+var file_headscale_v1_device_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
+var file_headscale_v1_device_proto_goTypes = []interface{}{
+ (*Latency)(nil), // 0: headscale.v1.Latency
+ (*ClientSupports)(nil), // 1: headscale.v1.ClientSupports
+ (*ClientConnectivity)(nil), // 2: headscale.v1.ClientConnectivity
+ (*GetDeviceRequest)(nil), // 3: headscale.v1.GetDeviceRequest
+ (*GetDeviceResponse)(nil), // 4: headscale.v1.GetDeviceResponse
+ (*DeleteDeviceRequest)(nil), // 5: headscale.v1.DeleteDeviceRequest
+ (*DeleteDeviceResponse)(nil), // 6: headscale.v1.DeleteDeviceResponse
+ (*GetDeviceRoutesRequest)(nil), // 7: headscale.v1.GetDeviceRoutesRequest
+ (*GetDeviceRoutesResponse)(nil), // 8: headscale.v1.GetDeviceRoutesResponse
+ (*EnableDeviceRoutesRequest)(nil), // 9: headscale.v1.EnableDeviceRoutesRequest
+ (*EnableDeviceRoutesResponse)(nil), // 10: headscale.v1.EnableDeviceRoutesResponse
+ nil, // 11: headscale.v1.ClientConnectivity.LatencyEntry
+ (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
+}
+var file_headscale_v1_device_proto_depIdxs = []int32{
+ 11, // 0: headscale.v1.ClientConnectivity.latency:type_name -> headscale.v1.ClientConnectivity.LatencyEntry
+ 1, // 1: headscale.v1.ClientConnectivity.client_supports:type_name -> headscale.v1.ClientSupports
+ 12, // 2: headscale.v1.GetDeviceResponse.created:type_name -> google.protobuf.Timestamp
+ 12, // 3: headscale.v1.GetDeviceResponse.last_seen:type_name -> google.protobuf.Timestamp
+ 12, // 4: headscale.v1.GetDeviceResponse.expires:type_name -> google.protobuf.Timestamp
+ 2, // 5: headscale.v1.GetDeviceResponse.client_connectivity:type_name -> headscale.v1.ClientConnectivity
+ 0, // 6: headscale.v1.ClientConnectivity.LatencyEntry.value:type_name -> headscale.v1.Latency
+ 7, // [7:7] is the sub-list for method output_type
+ 7, // [7:7] is the sub-list for method input_type
+ 7, // [7:7] is the sub-list for extension type_name
+ 7, // [7:7] is the sub-list for extension extendee
+ 0, // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_headscale_v1_device_proto_init() }
+func file_headscale_v1_device_proto_init() {
+ if File_headscale_v1_device_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_headscale_v1_device_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Latency); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ClientSupports); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ClientConnectivity); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetDeviceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetDeviceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteDeviceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteDeviceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetDeviceRoutesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetDeviceRoutesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnableDeviceRoutesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_device_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnableDeviceRoutesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_headscale_v1_device_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 12,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_headscale_v1_device_proto_goTypes,
+ DependencyIndexes: file_headscale_v1_device_proto_depIdxs,
+ MessageInfos: file_headscale_v1_device_proto_msgTypes,
+ }.Build()
+ File_headscale_v1_device_proto = out.File
+ file_headscale_v1_device_proto_rawDesc = nil
+ file_headscale_v1_device_proto_goTypes = nil
+ file_headscale_v1_device_proto_depIdxs = nil
+}
diff --git a/gen/go/headscale/v1/headscale.pb.go b/gen/go/headscale/v1/headscale.pb.go
index e050e931..56911b6b 100644
--- a/gen/go/headscale/v1/headscale.pb.go
+++ b/gen/go/headscale/v1/headscale.pb.go
@@ -10,9 +10,7 @@ import (
_ "google.golang.org/genproto/googleapis/api/annotations"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
- sync "sync"
)
const (
@@ -22,664 +20,245 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
-type RegisterMethod int32
-
-const (
- RegisterMethod_REGISTER_METHOD_UNSPECIFIED RegisterMethod = 0
- RegisterMethod_REGISTER_METHOD_AUTH_KEY RegisterMethod = 1
- RegisterMethod_REGISTER_METHOD_CLI RegisterMethod = 2
- RegisterMethod_REGISTER_METHOD_OIDC RegisterMethod = 3
-)
-
-// Enum value maps for RegisterMethod.
-var (
- RegisterMethod_name = map[int32]string{
- 0: "REGISTER_METHOD_UNSPECIFIED",
- 1: "REGISTER_METHOD_AUTH_KEY",
- 2: "REGISTER_METHOD_CLI",
- 3: "REGISTER_METHOD_OIDC",
- }
- RegisterMethod_value = map[string]int32{
- "REGISTER_METHOD_UNSPECIFIED": 0,
- "REGISTER_METHOD_AUTH_KEY": 1,
- "REGISTER_METHOD_CLI": 2,
- "REGISTER_METHOD_OIDC": 3,
- }
-)
-
-func (x RegisterMethod) Enum() *RegisterMethod {
- p := new(RegisterMethod)
- *p = x
- return p
-}
-
-func (x RegisterMethod) String() string {
- return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (RegisterMethod) Descriptor() protoreflect.EnumDescriptor {
- return file_headscale_v1_headscale_proto_enumTypes[0].Descriptor()
-}
-
-func (RegisterMethod) Type() protoreflect.EnumType {
- return &file_headscale_v1_headscale_proto_enumTypes[0]
-}
-
-func (x RegisterMethod) Number() protoreflect.EnumNumber {
- return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use RegisterMethod.Descriptor instead.
-func (RegisterMethod) EnumDescriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{0}
-}
-
-type GetMachineRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
-}
-
-func (x *GetMachineRequest) Reset() {
- *x = GetMachineRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[0]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *GetMachineRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*GetMachineRequest) ProtoMessage() {}
-
-func (x *GetMachineRequest) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[0]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use GetMachineRequest.ProtoReflect.Descriptor instead.
-func (*GetMachineRequest) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *GetMachineRequest) GetMachineId() uint64 {
- if x != nil {
- return x.MachineId
- }
- return 0
-}
-
-type GetMachineResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
- MachineKey string `protobuf:"bytes,2,opt,name=machine_key,json=machineKey,proto3" json:"machine_key,omitempty"`
- NodeKey string `protobuf:"bytes,3,opt,name=node_key,json=nodeKey,proto3" json:"node_key,omitempty"`
- DiscoKey string `protobuf:"bytes,4,opt,name=disco_key,json=discoKey,proto3" json:"disco_key,omitempty"`
- IpAddress string `protobuf:"bytes,5,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
- Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
- NamespaceId uint32 `protobuf:"varint,7,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"`
- Registered bool `protobuf:"varint,8,opt,name=registered,proto3" json:"registered,omitempty"`
- RegisterMethod RegisterMethod `protobuf:"varint,9,opt,name=register_method,json=registerMethod,proto3,enum=headscale.v1.RegisterMethod" json:"register_method,omitempty"`
- AuthKeyId uint32 `protobuf:"varint,10,opt,name=auth_key_id,json=authKeyId,proto3" json:"auth_key_id,omitempty"` // PreAuthKey auth_key = 11;
- LastSeen *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"`
- LastSuccessfulUpdate *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=last_successful_update,json=lastSuccessfulUpdate,proto3" json:"last_successful_update,omitempty"`
- Expiry *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=expiry,proto3" json:"expiry,omitempty"`
-}
-
-func (x *GetMachineResponse) Reset() {
- *x = GetMachineResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[1]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *GetMachineResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*GetMachineResponse) ProtoMessage() {}
-
-func (x *GetMachineResponse) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[1]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use GetMachineResponse.ProtoReflect.Descriptor instead.
-func (*GetMachineResponse) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *GetMachineResponse) GetId() uint64 {
- if x != nil {
- return x.Id
- }
- return 0
-}
-
-func (x *GetMachineResponse) GetMachineKey() string {
- if x != nil {
- return x.MachineKey
- }
- return ""
-}
-
-func (x *GetMachineResponse) GetNodeKey() string {
- if x != nil {
- return x.NodeKey
- }
- return ""
-}
-
-func (x *GetMachineResponse) GetDiscoKey() string {
- if x != nil {
- return x.DiscoKey
- }
- return ""
-}
-
-func (x *GetMachineResponse) GetIpAddress() string {
- if x != nil {
- return x.IpAddress
- }
- return ""
-}
-
-func (x *GetMachineResponse) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-func (x *GetMachineResponse) GetNamespaceId() uint32 {
- if x != nil {
- return x.NamespaceId
- }
- return 0
-}
-
-func (x *GetMachineResponse) GetRegistered() bool {
- if x != nil {
- return x.Registered
- }
- return false
-}
-
-func (x *GetMachineResponse) GetRegisterMethod() RegisterMethod {
- if x != nil {
- return x.RegisterMethod
- }
- return RegisterMethod_REGISTER_METHOD_UNSPECIFIED
-}
-
-func (x *GetMachineResponse) GetAuthKeyId() uint32 {
- if x != nil {
- return x.AuthKeyId
- }
- return 0
-}
-
-func (x *GetMachineResponse) GetLastSeen() *timestamppb.Timestamp {
- if x != nil {
- return x.LastSeen
- }
- return nil
-}
-
-func (x *GetMachineResponse) GetLastSuccessfulUpdate() *timestamppb.Timestamp {
- if x != nil {
- return x.LastSuccessfulUpdate
- }
- return nil
-}
-
-func (x *GetMachineResponse) GetExpiry() *timestamppb.Timestamp {
- if x != nil {
- return x.Expiry
- }
- return nil
-}
-
-type CreateNamespaceRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *CreateNamespaceRequest) Reset() {
- *x = CreateNamespaceRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[2]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *CreateNamespaceRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*CreateNamespaceRequest) ProtoMessage() {}
-
-func (x *CreateNamespaceRequest) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[2]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use CreateNamespaceRequest.ProtoReflect.Descriptor instead.
-func (*CreateNamespaceRequest) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *CreateNamespaceRequest) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-type CreateNamespaceResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *CreateNamespaceResponse) Reset() {
- *x = CreateNamespaceResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[3]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *CreateNamespaceResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*CreateNamespaceResponse) ProtoMessage() {}
-
-func (x *CreateNamespaceResponse) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[3]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use CreateNamespaceResponse.ProtoReflect.Descriptor instead.
-func (*CreateNamespaceResponse) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *CreateNamespaceResponse) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-type DeleteNamespaceRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *DeleteNamespaceRequest) Reset() {
- *x = DeleteNamespaceRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[4]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *DeleteNamespaceRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*DeleteNamespaceRequest) ProtoMessage() {}
-
-func (x *DeleteNamespaceRequest) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[4]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use DeleteNamespaceRequest.ProtoReflect.Descriptor instead.
-func (*DeleteNamespaceRequest) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *DeleteNamespaceRequest) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-type DeleteNamespaceResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-}
-
-func (x *DeleteNamespaceResponse) Reset() {
- *x = DeleteNamespaceResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[5]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *DeleteNamespaceResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*DeleteNamespaceResponse) ProtoMessage() {}
-
-func (x *DeleteNamespaceResponse) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[5]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use DeleteNamespaceResponse.ProtoReflect.Descriptor instead.
-func (*DeleteNamespaceResponse) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{5}
-}
-
-type ListNamespacesRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-}
-
-func (x *ListNamespacesRequest) Reset() {
- *x = ListNamespacesRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[6]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *ListNamespacesRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ListNamespacesRequest) ProtoMessage() {}
-
-func (x *ListNamespacesRequest) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[6]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use ListNamespacesRequest.ProtoReflect.Descriptor instead.
-func (*ListNamespacesRequest) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{6}
-}
-
-type ListNamespacesResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Namespaces []string `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
-}
-
-func (x *ListNamespacesResponse) Reset() {
- *x = ListNamespacesResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_headscale_v1_headscale_proto_msgTypes[7]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *ListNamespacesResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ListNamespacesResponse) ProtoMessage() {}
-
-func (x *ListNamespacesResponse) ProtoReflect() protoreflect.Message {
- mi := &file_headscale_v1_headscale_proto_msgTypes[7]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use ListNamespacesResponse.ProtoReflect.Descriptor instead.
-func (*ListNamespacesResponse) Descriptor() ([]byte, []int) {
- return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *ListNamespacesResponse) GetNamespaces() []string {
- if x != nil {
- return x.Namespaces
- }
- return nil
-}
-
var File_headscale_v1_headscale_proto protoreflect.FileDescriptor
var file_headscale_v1_headscale_proto_rawDesc = []byte{
0x0a, 0x1c, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x68,
0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c,
- 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69,
- 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x32, 0x0a, 0x11, 0x47,
- 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22,
- 0x99, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
- 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63,
- 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f,
- 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x4b,
- 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x4b, 0x65, 0x79, 0x12,
- 0x1d, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12,
- 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
- 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
- 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
- 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
- 0x72, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73,
- 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
- 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c,
- 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65,
- 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0e, 0x72, 0x65,
- 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0b,
- 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28,
- 0x0d, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x09,
- 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
- 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73,
- 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75,
- 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18,
- 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
- 0x70, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75,
- 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72,
- 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
- 0x61, 0x6d, 0x70, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, 0x2c, 0x0a, 0x16, 0x43,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x68, 0x65, 0x61, 0x64,
+ 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65,
+ 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76,
+ 0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xec,
+ 0x11, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
+ 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93,
+ 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7c, 0x0a, 0x0f,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12,
+ 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65,
- 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
- 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
- 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x38, 0x0a, 0x16, 0x4c, 0x69,
- 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
- 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
- 0x61, 0x63, 0x65, 0x73, 0x2a, 0x82, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
- 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53,
- 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
- 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49,
- 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48,
- 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54,
- 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12,
- 0x18, 0x0a, 0x14, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48,
- 0x4f, 0x44, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x03, 0x32, 0xfa, 0x03, 0x0a, 0x10, 0x48, 0x65,
- 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x75,
- 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x2e, 0x68,
- 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d,
- 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e,
- 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74,
- 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
- 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31,
- 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e,
- 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x7c, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e,
- 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73,
- 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61,
- 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25,
- 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f,
- 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
- 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d,
- 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
- 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65,
- 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68,
- 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65,
- 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x61, 0x70,
- 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x76,
- 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3,
+ 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x96, 0x01, 0x0a, 0x0f, 0x52,
+ 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x24,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65,
+ 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x30, 0x22, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x7b, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x7d, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61,
+ 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c,
+ 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x61,
+ 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f,
+ 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x76, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61,
+ 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73,
+ 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+ 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73,
+ 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70,
+ 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x80,
+ 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68,
+ 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
+ 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68,
+ 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x61, 0x70, 0x69,
+ 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x3a, 0x01,
+ 0x2a, 0x12, 0x87, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41,
+ 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41,
+ 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70,
+ 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x22, 0x19, 0x2f,
+ 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65,
+ 0x79, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x7a, 0x0a, 0x0f, 0x4c,
+ 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x24,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69,
+ 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b,
+ 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65,
+ 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75,
+ 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x27,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
+ 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+ 0x76, 0x31, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
+ 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
+ 0x65, 0x12, 0x1f, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31,
+ 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61,
+ 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x52,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x24,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65,
+ 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68,
+ 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x7e, 0x0a,
+ 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x22,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
+ 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a,
+ 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
+ 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x6e, 0x0a,
+ 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x21, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73,
+ 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+ 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61,
+ 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x8d, 0x01,
+ 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x21,
+ 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68,
+ 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31,
+ 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2e, 0x2f,
+ 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b,
+ 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, 0x61, 0x72,
+ 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x12, 0x95, 0x01,
+ 0x0a, 0x0e, 0x55, 0x6e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65,
0x12, 0x23, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
- 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65,
+ 0x55, 0x6e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
- 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
- 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4,
- 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d,
- 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
- 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65,
- 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76,
- 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68,
+ 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4,
+ 0x93, 0x02, 0x32, 0x22, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64,
+ 0x7d, 0x2f, 0x75, 0x6e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x68, 0x65, 0x61, 0x64,
+ 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68,
+ 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+ 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23,
+ 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f,
+ 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75,
+ 0x74, 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
+ 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x29, 0x5a,
+ 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e,
+ 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67,
+ 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
-var (
- file_headscale_v1_headscale_proto_rawDescOnce sync.Once
- file_headscale_v1_headscale_proto_rawDescData = file_headscale_v1_headscale_proto_rawDesc
-)
-
-func file_headscale_v1_headscale_proto_rawDescGZIP() []byte {
- file_headscale_v1_headscale_proto_rawDescOnce.Do(func() {
- file_headscale_v1_headscale_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_headscale_proto_rawDescData)
- })
- return file_headscale_v1_headscale_proto_rawDescData
-}
-
-var file_headscale_v1_headscale_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_headscale_v1_headscale_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_headscale_v1_headscale_proto_goTypes = []interface{}{
- (RegisterMethod)(0), // 0: headscale.v1.RegisterMethod
- (*GetMachineRequest)(nil), // 1: headscale.v1.GetMachineRequest
- (*GetMachineResponse)(nil), // 2: headscale.v1.GetMachineResponse
- (*CreateNamespaceRequest)(nil), // 3: headscale.v1.CreateNamespaceRequest
- (*CreateNamespaceResponse)(nil), // 4: headscale.v1.CreateNamespaceResponse
- (*DeleteNamespaceRequest)(nil), // 5: headscale.v1.DeleteNamespaceRequest
- (*DeleteNamespaceResponse)(nil), // 6: headscale.v1.DeleteNamespaceResponse
- (*ListNamespacesRequest)(nil), // 7: headscale.v1.ListNamespacesRequest
- (*ListNamespacesResponse)(nil), // 8: headscale.v1.ListNamespacesResponse
- (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
+ (*GetNamespaceRequest)(nil), // 0: headscale.v1.GetNamespaceRequest
+ (*CreateNamespaceRequest)(nil), // 1: headscale.v1.CreateNamespaceRequest
+ (*RenameNamespaceRequest)(nil), // 2: headscale.v1.RenameNamespaceRequest
+ (*DeleteNamespaceRequest)(nil), // 3: headscale.v1.DeleteNamespaceRequest
+ (*ListNamespacesRequest)(nil), // 4: headscale.v1.ListNamespacesRequest
+ (*CreatePreAuthKeyRequest)(nil), // 5: headscale.v1.CreatePreAuthKeyRequest
+ (*ExpirePreAuthKeyRequest)(nil), // 6: headscale.v1.ExpirePreAuthKeyRequest
+ (*ListPreAuthKeysRequest)(nil), // 7: headscale.v1.ListPreAuthKeysRequest
+ (*DebugCreateMachineRequest)(nil), // 8: headscale.v1.DebugCreateMachineRequest
+ (*GetMachineRequest)(nil), // 9: headscale.v1.GetMachineRequest
+ (*RegisterMachineRequest)(nil), // 10: headscale.v1.RegisterMachineRequest
+ (*DeleteMachineRequest)(nil), // 11: headscale.v1.DeleteMachineRequest
+ (*ListMachinesRequest)(nil), // 12: headscale.v1.ListMachinesRequest
+ (*ShareMachineRequest)(nil), // 13: headscale.v1.ShareMachineRequest
+ (*UnshareMachineRequest)(nil), // 14: headscale.v1.UnshareMachineRequest
+ (*GetMachineRouteRequest)(nil), // 15: headscale.v1.GetMachineRouteRequest
+ (*EnableMachineRoutesRequest)(nil), // 16: headscale.v1.EnableMachineRoutesRequest
+ (*GetNamespaceResponse)(nil), // 17: headscale.v1.GetNamespaceResponse
+ (*CreateNamespaceResponse)(nil), // 18: headscale.v1.CreateNamespaceResponse
+ (*RenameNamespaceResponse)(nil), // 19: headscale.v1.RenameNamespaceResponse
+ (*DeleteNamespaceResponse)(nil), // 20: headscale.v1.DeleteNamespaceResponse
+ (*ListNamespacesResponse)(nil), // 21: headscale.v1.ListNamespacesResponse
+ (*CreatePreAuthKeyResponse)(nil), // 22: headscale.v1.CreatePreAuthKeyResponse
+ (*ExpirePreAuthKeyResponse)(nil), // 23: headscale.v1.ExpirePreAuthKeyResponse
+ (*ListPreAuthKeysResponse)(nil), // 24: headscale.v1.ListPreAuthKeysResponse
+ (*DebugCreateMachineResponse)(nil), // 25: headscale.v1.DebugCreateMachineResponse
+ (*GetMachineResponse)(nil), // 26: headscale.v1.GetMachineResponse
+ (*RegisterMachineResponse)(nil), // 27: headscale.v1.RegisterMachineResponse
+ (*DeleteMachineResponse)(nil), // 28: headscale.v1.DeleteMachineResponse
+ (*ListMachinesResponse)(nil), // 29: headscale.v1.ListMachinesResponse
+ (*ShareMachineResponse)(nil), // 30: headscale.v1.ShareMachineResponse
+ (*UnshareMachineResponse)(nil), // 31: headscale.v1.UnshareMachineResponse
+ (*GetMachineRouteResponse)(nil), // 32: headscale.v1.GetMachineRouteResponse
+ (*EnableMachineRoutesResponse)(nil), // 33: headscale.v1.EnableMachineRoutesResponse
}
var file_headscale_v1_headscale_proto_depIdxs = []int32{
- 0, // 0: headscale.v1.GetMachineResponse.register_method:type_name -> headscale.v1.RegisterMethod
- 9, // 1: headscale.v1.GetMachineResponse.last_seen:type_name -> google.protobuf.Timestamp
- 9, // 2: headscale.v1.GetMachineResponse.last_successful_update:type_name -> google.protobuf.Timestamp
- 9, // 3: headscale.v1.GetMachineResponse.expiry:type_name -> google.protobuf.Timestamp
- 1, // 4: headscale.v1.HeadscaleService.GetMachine:input_type -> headscale.v1.GetMachineRequest
- 3, // 5: headscale.v1.HeadscaleService.CreateNamespace:input_type -> headscale.v1.CreateNamespaceRequest
- 5, // 6: headscale.v1.HeadscaleService.DeleteNamespace:input_type -> headscale.v1.DeleteNamespaceRequest
- 7, // 7: headscale.v1.HeadscaleService.ListNamespaces:input_type -> headscale.v1.ListNamespacesRequest
- 2, // 8: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
- 4, // 9: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
- 6, // 10: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
- 8, // 11: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
- 8, // [8:12] is the sub-list for method output_type
- 4, // [4:8] is the sub-list for method input_type
- 4, // [4:4] is the sub-list for extension type_name
- 4, // [4:4] is the sub-list for extension extendee
- 0, // [0:4] is the sub-list for field type_name
+ 0, // 0: headscale.v1.HeadscaleService.GetNamespace:input_type -> headscale.v1.GetNamespaceRequest
+ 1, // 1: headscale.v1.HeadscaleService.CreateNamespace:input_type -> headscale.v1.CreateNamespaceRequest
+ 2, // 2: headscale.v1.HeadscaleService.RenameNamespace:input_type -> headscale.v1.RenameNamespaceRequest
+ 3, // 3: headscale.v1.HeadscaleService.DeleteNamespace:input_type -> headscale.v1.DeleteNamespaceRequest
+ 4, // 4: headscale.v1.HeadscaleService.ListNamespaces:input_type -> headscale.v1.ListNamespacesRequest
+ 5, // 5: headscale.v1.HeadscaleService.CreatePreAuthKey:input_type -> headscale.v1.CreatePreAuthKeyRequest
+ 6, // 6: headscale.v1.HeadscaleService.ExpirePreAuthKey:input_type -> headscale.v1.ExpirePreAuthKeyRequest
+ 7, // 7: headscale.v1.HeadscaleService.ListPreAuthKeys:input_type -> headscale.v1.ListPreAuthKeysRequest
+ 8, // 8: headscale.v1.HeadscaleService.DebugCreateMachine:input_type -> headscale.v1.DebugCreateMachineRequest
+ 9, // 9: headscale.v1.HeadscaleService.GetMachine:input_type -> headscale.v1.GetMachineRequest
+ 10, // 10: headscale.v1.HeadscaleService.RegisterMachine:input_type -> headscale.v1.RegisterMachineRequest
+ 11, // 11: headscale.v1.HeadscaleService.DeleteMachine:input_type -> headscale.v1.DeleteMachineRequest
+ 12, // 12: headscale.v1.HeadscaleService.ListMachines:input_type -> headscale.v1.ListMachinesRequest
+ 13, // 13: headscale.v1.HeadscaleService.ShareMachine:input_type -> headscale.v1.ShareMachineRequest
+ 14, // 14: headscale.v1.HeadscaleService.UnshareMachine:input_type -> headscale.v1.UnshareMachineRequest
+ 15, // 15: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest
+ 16, // 16: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest
+ 17, // 17: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse
+ 18, // 18: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
+ 19, // 19: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse
+ 20, // 20: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
+ 21, // 21: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
+ 22, // 22: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
+ 23, // 23: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
+ 24, // 24: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
+ 25, // 25: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse
+ 26, // 26: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
+ 27, // 27: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse
+ 28, // 28: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse
+ 29, // 29: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse
+ 30, // 30: headscale.v1.HeadscaleService.ShareMachine:output_type -> headscale.v1.ShareMachineResponse
+ 31, // 31: headscale.v1.HeadscaleService.UnshareMachine:output_type -> headscale.v1.UnshareMachineResponse
+ 32, // 32: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse
+ 33, // 33: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse
+ 17, // [17:34] is the sub-list for method output_type
+ 0, // [0:17] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
}
func init() { file_headscale_v1_headscale_proto_init() }
@@ -687,118 +266,22 @@ func file_headscale_v1_headscale_proto_init() {
if File_headscale_v1_headscale_proto != nil {
return
}
- if !protoimpl.UnsafeEnabled {
- file_headscale_v1_headscale_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetMachineRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetMachineResponse); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*CreateNamespaceRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*CreateNamespaceResponse); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DeleteNamespaceRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DeleteNamespaceResponse); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ListNamespacesRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_headscale_v1_headscale_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*ListNamespacesResponse); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- }
+ file_headscale_v1_namespace_proto_init()
+ file_headscale_v1_preauthkey_proto_init()
+ file_headscale_v1_machine_proto_init()
+ file_headscale_v1_routes_proto_init()
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_headscale_v1_headscale_proto_rawDesc,
- NumEnums: 1,
- NumMessages: 8,
+ NumEnums: 0,
+ NumMessages: 0,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_headscale_v1_headscale_proto_goTypes,
DependencyIndexes: file_headscale_v1_headscale_proto_depIdxs,
- EnumInfos: file_headscale_v1_headscale_proto_enumTypes,
- MessageInfos: file_headscale_v1_headscale_proto_msgTypes,
}.Build()
File_headscale_v1_headscale_proto = out.File
file_headscale_v1_headscale_proto_rawDesc = nil
diff --git a/gen/go/headscale/v1/headscale.pb.gw.go b/gen/go/headscale/v1/headscale.pb.gw.go
index 226afe50..ba2d492f 100644
--- a/gen/go/headscale/v1/headscale.pb.gw.go
+++ b/gen/go/headscale/v1/headscale.pb.gw.go
@@ -31,6 +31,372 @@ var _ = runtime.String
var _ = utilities.NewDoubleArray
var _ = metadata.Join
+func request_HeadscaleService_GetNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq GetNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+ }
+
+ protoReq.Name, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+ }
+
+ msg, err := client.GetNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_GetNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq GetNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+ }
+
+ protoReq.Name, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+ }
+
+ msg, err := server.GetNamespace(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_CreateNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq CreateNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.CreateNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_CreateNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq CreateNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.CreateNamespace(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_RenameNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq RenameNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["old_name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "old_name")
+ }
+
+ protoReq.OldName, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "old_name", err)
+ }
+
+ val, ok = pathParams["new_name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "new_name")
+ }
+
+ protoReq.NewName, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "new_name", err)
+ }
+
+ msg, err := client.RenameNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_RenameNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq RenameNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["old_name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "old_name")
+ }
+
+ protoReq.OldName, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "old_name", err)
+ }
+
+ val, ok = pathParams["new_name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "new_name")
+ }
+
+ protoReq.NewName, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "new_name", err)
+ }
+
+ msg, err := server.RenameNamespace(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_DeleteNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DeleteNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+ }
+
+ protoReq.Name, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+ }
+
+ msg, err := client.DeleteNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_DeleteNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DeleteNamespaceRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["name"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+ }
+
+ protoReq.Name, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+ }
+
+ msg, err := server.DeleteNamespace(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_ListNamespaces_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListNamespacesRequest
+ var metadata runtime.ServerMetadata
+
+ msg, err := client.ListNamespaces(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_ListNamespaces_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListNamespacesRequest
+ var metadata runtime.ServerMetadata
+
+ msg, err := server.ListNamespaces(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_CreatePreAuthKey_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq CreatePreAuthKeyRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.CreatePreAuthKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_CreatePreAuthKey_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq CreatePreAuthKeyRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.CreatePreAuthKey(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_ExpirePreAuthKey_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ExpirePreAuthKeyRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.ExpirePreAuthKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_ExpirePreAuthKey_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ExpirePreAuthKeyRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.ExpirePreAuthKey(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+var (
+ filter_HeadscaleService_ListPreAuthKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
+)
+
+func request_HeadscaleService_ListPreAuthKeys_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListPreAuthKeysRequest
+ var metadata runtime.ServerMetadata
+
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_ListPreAuthKeys_0); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.ListPreAuthKeys(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_ListPreAuthKeys_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListPreAuthKeysRequest
+ var metadata runtime.ServerMetadata
+
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_ListPreAuthKeys_0); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.ListPreAuthKeys(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_DebugCreateMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DebugCreateMachineRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.DebugCreateMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_DebugCreateMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DebugCreateMachineRequest
+ var metadata runtime.ServerMetadata
+
+ newReader, berr := utilities.IOReaderFactory(req.Body)
+ if berr != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ }
+ if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.DebugCreateMachine(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
func request_HeadscaleService_GetMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetMachineRequest
var metadata runtime.ServerMetadata
@@ -83,90 +449,392 @@ func local_request_HeadscaleService_GetMachine_0(ctx context.Context, marshaler
}
-func request_HeadscaleService_CreateNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq CreateNamespaceRequest
+var (
+ filter_HeadscaleService_RegisterMachine_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
+)
+
+func request_HeadscaleService_RegisterMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq RegisterMachineRequest
var metadata runtime.ServerMetadata
- newReader, berr := utilities.IOReaderFactory(req.Body)
- if berr != nil {
- return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_RegisterMachine_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- msg, err := client.CreateNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ msg, err := client.RegisterMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
-func local_request_HeadscaleService_CreateNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq CreateNamespaceRequest
+func local_request_HeadscaleService_RegisterMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq RegisterMachineRequest
var metadata runtime.ServerMetadata
- newReader, berr := utilities.IOReaderFactory(req.Body)
- if berr != nil {
- return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_RegisterMachine_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- msg, err := server.CreateNamespace(ctx, &protoReq)
+ msg, err := server.RegisterMachine(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_DeleteMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DeleteMachineRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ msg, err := client.DeleteMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_DeleteMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq DeleteMachineRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ msg, err := server.DeleteMachine(ctx, &protoReq)
return msg, metadata, err
}
var (
- filter_HeadscaleService_DeleteNamespace_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
+ filter_HeadscaleService_ListMachines_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
)
-func request_HeadscaleService_DeleteNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq DeleteNamespaceRequest
+func request_HeadscaleService_ListMachines_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListMachinesRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_DeleteNamespace_0); err != nil {
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_ListMachines_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- msg, err := client.DeleteNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ msg, err := client.ListMachines(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
-func local_request_HeadscaleService_DeleteNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq DeleteNamespaceRequest
+func local_request_HeadscaleService_ListMachines_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ListMachinesRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_DeleteNamespace_0); err != nil {
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_ListMachines_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
- msg, err := server.DeleteNamespace(ctx, &protoReq)
+ msg, err := server.ListMachines(ctx, &protoReq)
return msg, metadata, err
}
-func request_HeadscaleService_ListNamespaces_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq ListNamespacesRequest
+func request_HeadscaleService_ShareMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ShareMachineRequest
var metadata runtime.ServerMetadata
- msg, err := client.ListNamespaces(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ val, ok = pathParams["namespace"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+ }
+
+ protoReq.Namespace, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+ }
+
+ msg, err := client.ShareMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
-func local_request_HeadscaleService_ListNamespaces_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
- var protoReq ListNamespacesRequest
+func local_request_HeadscaleService_ShareMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq ShareMachineRequest
var metadata runtime.ServerMetadata
- msg, err := server.ListNamespaces(ctx, &protoReq)
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ val, ok = pathParams["namespace"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+ }
+
+ protoReq.Namespace, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+ }
+
+ msg, err := server.ShareMachine(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_UnshareMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq UnshareMachineRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ val, ok = pathParams["namespace"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+ }
+
+ protoReq.Namespace, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+ }
+
+ msg, err := client.UnshareMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_UnshareMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq UnshareMachineRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ val, ok = pathParams["namespace"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+ }
+
+ protoReq.Namespace, err = runtime.String(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+ }
+
+ msg, err := server.UnshareMachine(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+func request_HeadscaleService_GetMachineRoute_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq GetMachineRouteRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ msg, err := client.GetMachineRoute(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_GetMachineRoute_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq GetMachineRouteRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ msg, err := server.GetMachineRoute(ctx, &protoReq)
+ return msg, metadata, err
+
+}
+
+var (
+ filter_HeadscaleService_EnableMachineRoutes_0 = &utilities.DoubleArray{Encoding: map[string]int{"machine_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_HeadscaleService_EnableMachineRoutes_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq EnableMachineRoutesRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_EnableMachineRoutes_0); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := client.EnableMachineRoutes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_HeadscaleService_EnableMachineRoutes_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq EnableMachineRoutesRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["machine_id"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "machine_id")
+ }
+
+ protoReq.MachineId, err = runtime.Uint64(val)
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "machine_id", err)
+ }
+
+ if err := req.ParseForm(); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+ if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_HeadscaleService_EnableMachineRoutes_0); err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+ }
+
+ msg, err := server.EnableMachineRoutes(ctx, &protoReq)
return msg, metadata, err
}
@@ -177,18 +845,18 @@ func local_request_HeadscaleService_ListNamespaces_0(ctx context.Context, marsha
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterHeadscaleServiceHandlerFromEndpoint instead.
func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server HeadscaleServiceServer) error {
- mux.Handle("GET", pattern_HeadscaleService_GetMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ mux.Handle("GET", pattern_HeadscaleService_GetNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
- rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{name}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
- resp, md, err := local_request_HeadscaleService_GetMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ resp, md, err := local_request_HeadscaleService_GetNamespace_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
@@ -196,7 +864,7 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser
return
}
- forward_HeadscaleService_GetMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+ forward_HeadscaleService_GetNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
@@ -223,13 +891,36 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser
})
+ mux.Handle("POST", pattern_HeadscaleService_RenameNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/RenameNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{old_name}/rename/{new_name}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_RenameNamespace_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_RenameNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
mux.Handle("DELETE", pattern_HeadscaleService_DeleteNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
- rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace"))
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{name}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
@@ -269,6 +960,282 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser
})
+ mux.Handle("POST", pattern_HeadscaleService_CreatePreAuthKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/CreatePreAuthKey", runtime.WithHTTPPathPattern("/api/v1/preauthkey"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_CreatePreAuthKey_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_CreatePreAuthKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_ExpirePreAuthKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ExpirePreAuthKey", runtime.WithHTTPPathPattern("/api/v1/preauthkey/expire"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_ExpirePreAuthKey_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ExpirePreAuthKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_ListPreAuthKeys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ListPreAuthKeys", runtime.WithHTTPPathPattern("/api/v1/preauthkey"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_ListPreAuthKeys_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ListPreAuthKeys_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_DebugCreateMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DebugCreateMachine", runtime.WithHTTPPathPattern("/api/v1/debug/machine"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_DebugCreateMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_DebugCreateMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_GetMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_GetMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_GetMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_RegisterMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/RegisterMachine", runtime.WithHTTPPathPattern("/api/v1/machine/register"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_RegisterMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_RegisterMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("DELETE", pattern_HeadscaleService_DeleteMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_DeleteMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_DeleteMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_ListMachines_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ListMachines", runtime.WithHTTPPathPattern("/api/v1/machine"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_ListMachines_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ListMachines_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_ShareMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ShareMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/share/{namespace}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_ShareMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ShareMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_UnshareMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/UnshareMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/unshare/{namespace}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_UnshareMachine_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_UnshareMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_GetMachineRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachineRoute", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/routes"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_GetMachineRoute_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_GetMachineRoute_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_EnableMachineRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ var stream runtime.ServerTransportStream
+ ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/headscale.v1.HeadscaleService/EnableMachineRoutes", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/routes"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := local_request_HeadscaleService_EnableMachineRoutes_0(rctx, inboundMarshaler, server, req, pathParams)
+ md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_EnableMachineRoutes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
return nil
}
@@ -310,23 +1277,23 @@ func RegisterHeadscaleServiceHandler(ctx context.Context, mux *runtime.ServeMux,
// "HeadscaleServiceClient" to call the correct interceptors.
func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client HeadscaleServiceClient) error {
- mux.Handle("GET", pattern_HeadscaleService_GetMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ mux.Handle("GET", pattern_HeadscaleService_GetNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
- rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{name}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
- resp, md, err := request_HeadscaleService_GetMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ resp, md, err := request_HeadscaleService_GetNamespace_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
- forward_HeadscaleService_GetMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+ forward_HeadscaleService_GetNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
@@ -350,11 +1317,31 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser
})
+ mux.Handle("POST", pattern_HeadscaleService_RenameNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/RenameNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{old_name}/rename/{new_name}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_RenameNamespace_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_RenameNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
mux.Handle("DELETE", pattern_HeadscaleService_DeleteNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
- rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace"))
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteNamespace", runtime.WithHTTPPathPattern("/api/v1/namespace/{name}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
@@ -390,25 +1377,317 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser
})
+ mux.Handle("POST", pattern_HeadscaleService_CreatePreAuthKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/CreatePreAuthKey", runtime.WithHTTPPathPattern("/api/v1/preauthkey"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_CreatePreAuthKey_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_CreatePreAuthKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_ExpirePreAuthKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ExpirePreAuthKey", runtime.WithHTTPPathPattern("/api/v1/preauthkey/expire"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_ExpirePreAuthKey_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ExpirePreAuthKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_ListPreAuthKeys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ListPreAuthKeys", runtime.WithHTTPPathPattern("/api/v1/preauthkey"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_ListPreAuthKeys_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ListPreAuthKeys_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_DebugCreateMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DebugCreateMachine", runtime.WithHTTPPathPattern("/api/v1/debug/machine"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_DebugCreateMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_DebugCreateMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_GetMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_GetMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_GetMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_RegisterMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/RegisterMachine", runtime.WithHTTPPathPattern("/api/v1/machine/register"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_RegisterMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_RegisterMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("DELETE", pattern_HeadscaleService_DeleteMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/DeleteMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_DeleteMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_DeleteMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_ListMachines_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ListMachines", runtime.WithHTTPPathPattern("/api/v1/machine"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_ListMachines_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ListMachines_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_ShareMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/ShareMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/share/{namespace}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_ShareMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_ShareMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_UnshareMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/UnshareMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/unshare/{namespace}"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_UnshareMachine_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_UnshareMachine_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("GET", pattern_HeadscaleService_GetMachineRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/GetMachineRoute", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/routes"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_GetMachineRoute_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_GetMachineRoute_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
+ mux.Handle("POST", pattern_HeadscaleService_EnableMachineRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+ ctx, cancel := context.WithCancel(req.Context())
+ defer cancel()
+ inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+ rctx, err := runtime.AnnotateContext(ctx, mux, req, "/headscale.v1.HeadscaleService/EnableMachineRoutes", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/routes"))
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+ resp, md, err := request_HeadscaleService_EnableMachineRoutes_0(rctx, inboundMarshaler, client, req, pathParams)
+ ctx = runtime.NewServerMetadataContext(ctx, md)
+ if err != nil {
+ runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+ return
+ }
+
+ forward_HeadscaleService_EnableMachineRoutes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
return nil
}
var (
- pattern_HeadscaleService_GetMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "machine", "machine_id"}, ""))
+ pattern_HeadscaleService_GetNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "namespace", "name"}, ""))
pattern_HeadscaleService_CreateNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "namespace"}, ""))
- pattern_HeadscaleService_DeleteNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "namespace"}, ""))
+ pattern_HeadscaleService_RenameNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "namespace", "old_name", "rename", "new_name"}, ""))
+
+ pattern_HeadscaleService_DeleteNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "namespace", "name"}, ""))
pattern_HeadscaleService_ListNamespaces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "namespace"}, ""))
+
+ pattern_HeadscaleService_CreatePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, ""))
+
+ pattern_HeadscaleService_ExpirePreAuthKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "preauthkey", "expire"}, ""))
+
+ pattern_HeadscaleService_ListPreAuthKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "preauthkey"}, ""))
+
+ pattern_HeadscaleService_DebugCreateMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "debug", "machine"}, ""))
+
+ pattern_HeadscaleService_GetMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "machine", "machine_id"}, ""))
+
+ pattern_HeadscaleService_RegisterMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "machine", "register"}, ""))
+
+ pattern_HeadscaleService_DeleteMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "machine", "machine_id"}, ""))
+
+ pattern_HeadscaleService_ListMachines_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "machine"}, ""))
+
+ pattern_HeadscaleService_ShareMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "machine", "machine_id", "share", "namespace"}, ""))
+
+ pattern_HeadscaleService_UnshareMachine_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v1", "machine", "machine_id", "unshare", "namespace"}, ""))
+
+ pattern_HeadscaleService_GetMachineRoute_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "machine", "machine_id", "routes"}, ""))
+
+ pattern_HeadscaleService_EnableMachineRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "machine", "machine_id", "routes"}, ""))
)
var (
- forward_HeadscaleService_GetMachine_0 = runtime.ForwardResponseMessage
+ forward_HeadscaleService_GetNamespace_0 = runtime.ForwardResponseMessage
forward_HeadscaleService_CreateNamespace_0 = runtime.ForwardResponseMessage
+ forward_HeadscaleService_RenameNamespace_0 = runtime.ForwardResponseMessage
+
forward_HeadscaleService_DeleteNamespace_0 = runtime.ForwardResponseMessage
forward_HeadscaleService_ListNamespaces_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_CreatePreAuthKey_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_ExpirePreAuthKey_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_ListPreAuthKeys_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_DebugCreateMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_GetMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_RegisterMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_DeleteMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_ListMachines_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_ShareMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_UnshareMachine_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_GetMachineRoute_0 = runtime.ForwardResponseMessage
+
+ forward_HeadscaleService_EnableMachineRoutes_0 = runtime.ForwardResponseMessage
)
diff --git a/gen/go/headscale/v1/headscale_grpc.pb.go b/gen/go/headscale/v1/headscale_grpc.pb.go
index a613e8e9..06a98b49 100644
--- a/gen/go/headscale/v1/headscale_grpc.pb.go
+++ b/gen/go/headscale/v1/headscale_grpc.pb.go
@@ -18,10 +18,27 @@ const _ = grpc.SupportPackageIsVersion7
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type HeadscaleServiceClient interface {
- GetMachine(ctx context.Context, in *GetMachineRequest, opts ...grpc.CallOption) (*GetMachineResponse, error)
+ // --- Namespace start ---
+ GetNamespace(ctx context.Context, in *GetNamespaceRequest, opts ...grpc.CallOption) (*GetNamespaceResponse, error)
CreateNamespace(ctx context.Context, in *CreateNamespaceRequest, opts ...grpc.CallOption) (*CreateNamespaceResponse, error)
+ RenameNamespace(ctx context.Context, in *RenameNamespaceRequest, opts ...grpc.CallOption) (*RenameNamespaceResponse, error)
DeleteNamespace(ctx context.Context, in *DeleteNamespaceRequest, opts ...grpc.CallOption) (*DeleteNamespaceResponse, error)
ListNamespaces(ctx context.Context, in *ListNamespacesRequest, opts ...grpc.CallOption) (*ListNamespacesResponse, error)
+ // --- PreAuthKeys start ---
+ CreatePreAuthKey(ctx context.Context, in *CreatePreAuthKeyRequest, opts ...grpc.CallOption) (*CreatePreAuthKeyResponse, error)
+ ExpirePreAuthKey(ctx context.Context, in *ExpirePreAuthKeyRequest, opts ...grpc.CallOption) (*ExpirePreAuthKeyResponse, error)
+ ListPreAuthKeys(ctx context.Context, in *ListPreAuthKeysRequest, opts ...grpc.CallOption) (*ListPreAuthKeysResponse, error)
+ // --- Machine start ---
+ DebugCreateMachine(ctx context.Context, in *DebugCreateMachineRequest, opts ...grpc.CallOption) (*DebugCreateMachineResponse, error)
+ GetMachine(ctx context.Context, in *GetMachineRequest, opts ...grpc.CallOption) (*GetMachineResponse, error)
+ RegisterMachine(ctx context.Context, in *RegisterMachineRequest, opts ...grpc.CallOption) (*RegisterMachineResponse, error)
+ DeleteMachine(ctx context.Context, in *DeleteMachineRequest, opts ...grpc.CallOption) (*DeleteMachineResponse, error)
+ ListMachines(ctx context.Context, in *ListMachinesRequest, opts ...grpc.CallOption) (*ListMachinesResponse, error)
+ ShareMachine(ctx context.Context, in *ShareMachineRequest, opts ...grpc.CallOption) (*ShareMachineResponse, error)
+ UnshareMachine(ctx context.Context, in *UnshareMachineRequest, opts ...grpc.CallOption) (*UnshareMachineResponse, error)
+ // --- Route start ---
+ GetMachineRoute(ctx context.Context, in *GetMachineRouteRequest, opts ...grpc.CallOption) (*GetMachineRouteResponse, error)
+ EnableMachineRoutes(ctx context.Context, in *EnableMachineRoutesRequest, opts ...grpc.CallOption) (*EnableMachineRoutesResponse, error)
}
type headscaleServiceClient struct {
@@ -32,9 +49,9 @@ func NewHeadscaleServiceClient(cc grpc.ClientConnInterface) HeadscaleServiceClie
return &headscaleServiceClient{cc}
}
-func (c *headscaleServiceClient) GetMachine(ctx context.Context, in *GetMachineRequest, opts ...grpc.CallOption) (*GetMachineResponse, error) {
- out := new(GetMachineResponse)
- err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetMachine", in, out, opts...)
+func (c *headscaleServiceClient) GetNamespace(ctx context.Context, in *GetNamespaceRequest, opts ...grpc.CallOption) (*GetNamespaceResponse, error) {
+ out := new(GetNamespaceResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetNamespace", in, out, opts...)
if err != nil {
return nil, err
}
@@ -50,6 +67,15 @@ func (c *headscaleServiceClient) CreateNamespace(ctx context.Context, in *Create
return out, nil
}
+func (c *headscaleServiceClient) RenameNamespace(ctx context.Context, in *RenameNamespaceRequest, opts ...grpc.CallOption) (*RenameNamespaceResponse, error) {
+ out := new(RenameNamespaceResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RenameNamespace", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *headscaleServiceClient) DeleteNamespace(ctx context.Context, in *DeleteNamespaceRequest, opts ...grpc.CallOption) (*DeleteNamespaceResponse, error) {
out := new(DeleteNamespaceResponse)
err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteNamespace", in, out, opts...)
@@ -68,14 +94,139 @@ func (c *headscaleServiceClient) ListNamespaces(ctx context.Context, in *ListNam
return out, nil
}
+func (c *headscaleServiceClient) CreatePreAuthKey(ctx context.Context, in *CreatePreAuthKeyRequest, opts ...grpc.CallOption) (*CreatePreAuthKeyResponse, error) {
+ out := new(CreatePreAuthKeyResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/CreatePreAuthKey", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) ExpirePreAuthKey(ctx context.Context, in *ExpirePreAuthKeyRequest, opts ...grpc.CallOption) (*ExpirePreAuthKeyResponse, error) {
+ out := new(ExpirePreAuthKeyResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ExpirePreAuthKey", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) ListPreAuthKeys(ctx context.Context, in *ListPreAuthKeysRequest, opts ...grpc.CallOption) (*ListPreAuthKeysResponse, error) {
+ out := new(ListPreAuthKeysResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListPreAuthKeys", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) DebugCreateMachine(ctx context.Context, in *DebugCreateMachineRequest, opts ...grpc.CallOption) (*DebugCreateMachineResponse, error) {
+ out := new(DebugCreateMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DebugCreateMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) GetMachine(ctx context.Context, in *GetMachineRequest, opts ...grpc.CallOption) (*GetMachineResponse, error) {
+ out := new(GetMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) RegisterMachine(ctx context.Context, in *RegisterMachineRequest, opts ...grpc.CallOption) (*RegisterMachineResponse, error) {
+ out := new(RegisterMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/RegisterMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) DeleteMachine(ctx context.Context, in *DeleteMachineRequest, opts ...grpc.CallOption) (*DeleteMachineResponse, error) {
+ out := new(DeleteMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/DeleteMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) ListMachines(ctx context.Context, in *ListMachinesRequest, opts ...grpc.CallOption) (*ListMachinesResponse, error) {
+ out := new(ListMachinesResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ListMachines", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) ShareMachine(ctx context.Context, in *ShareMachineRequest, opts ...grpc.CallOption) (*ShareMachineResponse, error) {
+ out := new(ShareMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/ShareMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) UnshareMachine(ctx context.Context, in *UnshareMachineRequest, opts ...grpc.CallOption) (*UnshareMachineResponse, error) {
+ out := new(UnshareMachineResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/UnshareMachine", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) GetMachineRoute(ctx context.Context, in *GetMachineRouteRequest, opts ...grpc.CallOption) (*GetMachineRouteResponse, error) {
+ out := new(GetMachineRouteResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/GetMachineRoute", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *headscaleServiceClient) EnableMachineRoutes(ctx context.Context, in *EnableMachineRoutesRequest, opts ...grpc.CallOption) (*EnableMachineRoutesResponse, error) {
+ out := new(EnableMachineRoutesResponse)
+ err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/EnableMachineRoutes", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// HeadscaleServiceServer is the server API for HeadscaleService service.
// All implementations must embed UnimplementedHeadscaleServiceServer
// for forward compatibility
type HeadscaleServiceServer interface {
- GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error)
+ // --- Namespace start ---
+ GetNamespace(context.Context, *GetNamespaceRequest) (*GetNamespaceResponse, error)
CreateNamespace(context.Context, *CreateNamespaceRequest) (*CreateNamespaceResponse, error)
+ RenameNamespace(context.Context, *RenameNamespaceRequest) (*RenameNamespaceResponse, error)
DeleteNamespace(context.Context, *DeleteNamespaceRequest) (*DeleteNamespaceResponse, error)
ListNamespaces(context.Context, *ListNamespacesRequest) (*ListNamespacesResponse, error)
+ // --- PreAuthKeys start ---
+ CreatePreAuthKey(context.Context, *CreatePreAuthKeyRequest) (*CreatePreAuthKeyResponse, error)
+ ExpirePreAuthKey(context.Context, *ExpirePreAuthKeyRequest) (*ExpirePreAuthKeyResponse, error)
+ ListPreAuthKeys(context.Context, *ListPreAuthKeysRequest) (*ListPreAuthKeysResponse, error)
+ // --- Machine start ---
+ DebugCreateMachine(context.Context, *DebugCreateMachineRequest) (*DebugCreateMachineResponse, error)
+ GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error)
+ RegisterMachine(context.Context, *RegisterMachineRequest) (*RegisterMachineResponse, error)
+ DeleteMachine(context.Context, *DeleteMachineRequest) (*DeleteMachineResponse, error)
+ ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error)
+ ShareMachine(context.Context, *ShareMachineRequest) (*ShareMachineResponse, error)
+ UnshareMachine(context.Context, *UnshareMachineRequest) (*UnshareMachineResponse, error)
+ // --- Route start ---
+ GetMachineRoute(context.Context, *GetMachineRouteRequest) (*GetMachineRouteResponse, error)
+ EnableMachineRoutes(context.Context, *EnableMachineRoutesRequest) (*EnableMachineRoutesResponse, error)
mustEmbedUnimplementedHeadscaleServiceServer()
}
@@ -83,18 +234,57 @@ type HeadscaleServiceServer interface {
type UnimplementedHeadscaleServiceServer struct {
}
-func (UnimplementedHeadscaleServiceServer) GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error) {
- return nil, status.Errorf(codes.Unimplemented, "method GetMachine not implemented")
+func (UnimplementedHeadscaleServiceServer) GetNamespace(context.Context, *GetNamespaceRequest) (*GetNamespaceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetNamespace not implemented")
}
func (UnimplementedHeadscaleServiceServer) CreateNamespace(context.Context, *CreateNamespaceRequest) (*CreateNamespaceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateNamespace not implemented")
}
+func (UnimplementedHeadscaleServiceServer) RenameNamespace(context.Context, *RenameNamespaceRequest) (*RenameNamespaceResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method RenameNamespace not implemented")
+}
func (UnimplementedHeadscaleServiceServer) DeleteNamespace(context.Context, *DeleteNamespaceRequest) (*DeleteNamespaceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteNamespace not implemented")
}
func (UnimplementedHeadscaleServiceServer) ListNamespaces(context.Context, *ListNamespacesRequest) (*ListNamespacesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListNamespaces not implemented")
}
+func (UnimplementedHeadscaleServiceServer) CreatePreAuthKey(context.Context, *CreatePreAuthKeyRequest) (*CreatePreAuthKeyResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method CreatePreAuthKey not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) ExpirePreAuthKey(context.Context, *ExpirePreAuthKeyRequest) (*ExpirePreAuthKeyResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ExpirePreAuthKey not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) ListPreAuthKeys(context.Context, *ListPreAuthKeysRequest) (*ListPreAuthKeysResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListPreAuthKeys not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) DebugCreateMachine(context.Context, *DebugCreateMachineRequest) (*DebugCreateMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DebugCreateMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) GetMachine(context.Context, *GetMachineRequest) (*GetMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) RegisterMachine(context.Context, *RegisterMachineRequest) (*RegisterMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method RegisterMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) DeleteMachine(context.Context, *DeleteMachineRequest) (*DeleteMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListMachines not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) ShareMachine(context.Context, *ShareMachineRequest) (*ShareMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ShareMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) UnshareMachine(context.Context, *UnshareMachineRequest) (*UnshareMachineResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UnshareMachine not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) GetMachineRoute(context.Context, *GetMachineRouteRequest) (*GetMachineRouteResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetMachineRoute not implemented")
+}
+func (UnimplementedHeadscaleServiceServer) EnableMachineRoutes(context.Context, *EnableMachineRoutesRequest) (*EnableMachineRoutesResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method EnableMachineRoutes not implemented")
+}
func (UnimplementedHeadscaleServiceServer) mustEmbedUnimplementedHeadscaleServiceServer() {}
// UnsafeHeadscaleServiceServer may be embedded to opt out of forward compatibility for this service.
@@ -108,20 +298,20 @@ func RegisterHeadscaleServiceServer(s grpc.ServiceRegistrar, srv HeadscaleServic
s.RegisterService(&HeadscaleService_ServiceDesc, srv)
}
-func _HeadscaleService_GetMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(GetMachineRequest)
+func _HeadscaleService_GetNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetNamespaceRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
- return srv.(HeadscaleServiceServer).GetMachine(ctx, in)
+ return srv.(HeadscaleServiceServer).GetNamespace(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
- FullMethod: "/headscale.v1.HeadscaleService/GetMachine",
+ FullMethod: "/headscale.v1.HeadscaleService/GetNamespace",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(HeadscaleServiceServer).GetMachine(ctx, req.(*GetMachineRequest))
+ return srv.(HeadscaleServiceServer).GetNamespace(ctx, req.(*GetNamespaceRequest))
}
return interceptor(ctx, in, info, handler)
}
@@ -144,6 +334,24 @@ func _HeadscaleService_CreateNamespace_Handler(srv interface{}, ctx context.Cont
return interceptor(ctx, in, info, handler)
}
+func _HeadscaleService_RenameNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RenameNamespaceRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).RenameNamespace(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/RenameNamespace",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).RenameNamespace(ctx, req.(*RenameNamespaceRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _HeadscaleService_DeleteNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteNamespaceRequest)
if err := dec(in); err != nil {
@@ -180,6 +388,222 @@ func _HeadscaleService_ListNamespaces_Handler(srv interface{}, ctx context.Conte
return interceptor(ctx, in, info, handler)
}
+func _HeadscaleService_CreatePreAuthKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CreatePreAuthKeyRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).CreatePreAuthKey(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/CreatePreAuthKey",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).CreatePreAuthKey(ctx, req.(*CreatePreAuthKeyRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_ExpirePreAuthKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ExpirePreAuthKeyRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).ExpirePreAuthKey(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/ExpirePreAuthKey",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).ExpirePreAuthKey(ctx, req.(*ExpirePreAuthKeyRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_ListPreAuthKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListPreAuthKeysRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).ListPreAuthKeys(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/ListPreAuthKeys",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).ListPreAuthKeys(ctx, req.(*ListPreAuthKeysRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_DebugCreateMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DebugCreateMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).DebugCreateMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/DebugCreateMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).DebugCreateMachine(ctx, req.(*DebugCreateMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_GetMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).GetMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/GetMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).GetMachine(ctx, req.(*GetMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_RegisterMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RegisterMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).RegisterMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/RegisterMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).RegisterMachine(ctx, req.(*RegisterMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_DeleteMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DeleteMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).DeleteMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/DeleteMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).DeleteMachine(ctx, req.(*DeleteMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_ListMachines_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListMachinesRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).ListMachines(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/ListMachines",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).ListMachines(ctx, req.(*ListMachinesRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_ShareMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ShareMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).ShareMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/ShareMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).ShareMachine(ctx, req.(*ShareMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_UnshareMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UnshareMachineRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).UnshareMachine(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/UnshareMachine",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).UnshareMachine(ctx, req.(*UnshareMachineRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_GetMachineRoute_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetMachineRouteRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).GetMachineRoute(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/GetMachineRoute",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).GetMachineRoute(ctx, req.(*GetMachineRouteRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HeadscaleService_EnableMachineRoutes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(EnableMachineRoutesRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HeadscaleServiceServer).EnableMachineRoutes(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/headscale.v1.HeadscaleService/EnableMachineRoutes",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HeadscaleServiceServer).EnableMachineRoutes(ctx, req.(*EnableMachineRoutesRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
// HeadscaleService_ServiceDesc is the grpc.ServiceDesc for HeadscaleService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -188,13 +612,17 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{
HandlerType: (*HeadscaleServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
- MethodName: "GetMachine",
- Handler: _HeadscaleService_GetMachine_Handler,
+ MethodName: "GetNamespace",
+ Handler: _HeadscaleService_GetNamespace_Handler,
},
{
MethodName: "CreateNamespace",
Handler: _HeadscaleService_CreateNamespace_Handler,
},
+ {
+ MethodName: "RenameNamespace",
+ Handler: _HeadscaleService_RenameNamespace_Handler,
+ },
{
MethodName: "DeleteNamespace",
Handler: _HeadscaleService_DeleteNamespace_Handler,
@@ -203,6 +631,54 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{
MethodName: "ListNamespaces",
Handler: _HeadscaleService_ListNamespaces_Handler,
},
+ {
+ MethodName: "CreatePreAuthKey",
+ Handler: _HeadscaleService_CreatePreAuthKey_Handler,
+ },
+ {
+ MethodName: "ExpirePreAuthKey",
+ Handler: _HeadscaleService_ExpirePreAuthKey_Handler,
+ },
+ {
+ MethodName: "ListPreAuthKeys",
+ Handler: _HeadscaleService_ListPreAuthKeys_Handler,
+ },
+ {
+ MethodName: "DebugCreateMachine",
+ Handler: _HeadscaleService_DebugCreateMachine_Handler,
+ },
+ {
+ MethodName: "GetMachine",
+ Handler: _HeadscaleService_GetMachine_Handler,
+ },
+ {
+ MethodName: "RegisterMachine",
+ Handler: _HeadscaleService_RegisterMachine_Handler,
+ },
+ {
+ MethodName: "DeleteMachine",
+ Handler: _HeadscaleService_DeleteMachine_Handler,
+ },
+ {
+ MethodName: "ListMachines",
+ Handler: _HeadscaleService_ListMachines_Handler,
+ },
+ {
+ MethodName: "ShareMachine",
+ Handler: _HeadscaleService_ShareMachine_Handler,
+ },
+ {
+ MethodName: "UnshareMachine",
+ Handler: _HeadscaleService_UnshareMachine_Handler,
+ },
+ {
+ MethodName: "GetMachineRoute",
+ Handler: _HeadscaleService_GetMachineRoute_Handler,
+ },
+ {
+ MethodName: "EnableMachineRoutes",
+ Handler: _HeadscaleService_EnableMachineRoutes_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "headscale/v1/headscale.proto",
diff --git a/gen/go/headscale/v1/machine.pb.go b/gen/go/headscale/v1/machine.pb.go
new file mode 100644
index 00000000..b5ec2cda
--- /dev/null
+++ b/gen/go/headscale/v1/machine.pb.go
@@ -0,0 +1,1316 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.18.1
+// source: headscale/v1/machine.proto
+
+package v1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type RegisterMethod int32
+
+const (
+ RegisterMethod_REGISTER_METHOD_UNSPECIFIED RegisterMethod = 0
+ RegisterMethod_REGISTER_METHOD_AUTH_KEY RegisterMethod = 1
+ RegisterMethod_REGISTER_METHOD_CLI RegisterMethod = 2
+ RegisterMethod_REGISTER_METHOD_OIDC RegisterMethod = 3
+)
+
+// Enum value maps for RegisterMethod.
+var (
+ RegisterMethod_name = map[int32]string{
+ 0: "REGISTER_METHOD_UNSPECIFIED",
+ 1: "REGISTER_METHOD_AUTH_KEY",
+ 2: "REGISTER_METHOD_CLI",
+ 3: "REGISTER_METHOD_OIDC",
+ }
+ RegisterMethod_value = map[string]int32{
+ "REGISTER_METHOD_UNSPECIFIED": 0,
+ "REGISTER_METHOD_AUTH_KEY": 1,
+ "REGISTER_METHOD_CLI": 2,
+ "REGISTER_METHOD_OIDC": 3,
+ }
+)
+
+func (x RegisterMethod) Enum() *RegisterMethod {
+ p := new(RegisterMethod)
+ *p = x
+ return p
+}
+
+func (x RegisterMethod) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (RegisterMethod) Descriptor() protoreflect.EnumDescriptor {
+ return file_headscale_v1_machine_proto_enumTypes[0].Descriptor()
+}
+
+func (RegisterMethod) Type() protoreflect.EnumType {
+ return &file_headscale_v1_machine_proto_enumTypes[0]
+}
+
+func (x RegisterMethod) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use RegisterMethod.Descriptor instead.
+func (RegisterMethod) EnumDescriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{0}
+}
+
+type Machine struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ MachineKey string `protobuf:"bytes,2,opt,name=machine_key,json=machineKey,proto3" json:"machine_key,omitempty"`
+ NodeKey string `protobuf:"bytes,3,opt,name=node_key,json=nodeKey,proto3" json:"node_key,omitempty"`
+ DiscoKey string `protobuf:"bytes,4,opt,name=disco_key,json=discoKey,proto3" json:"disco_key,omitempty"`
+ IpAddress string `protobuf:"bytes,5,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
+ Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
+ Namespace *Namespace `protobuf:"bytes,7,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Registered bool `protobuf:"varint,8,opt,name=registered,proto3" json:"registered,omitempty"`
+ RegisterMethod RegisterMethod `protobuf:"varint,9,opt,name=register_method,json=registerMethod,proto3,enum=headscale.v1.RegisterMethod" json:"register_method,omitempty"`
+ LastSeen *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"`
+ LastSuccessfulUpdate *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=last_successful_update,json=lastSuccessfulUpdate,proto3" json:"last_successful_update,omitempty"`
+ Expiry *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=expiry,proto3" json:"expiry,omitempty"`
+ PreAuthKey *PreAuthKey `protobuf:"bytes,13,opt,name=pre_auth_key,json=preAuthKey,proto3" json:"pre_auth_key,omitempty"`
+ CreatedAt *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+}
+
+func (x *Machine) Reset() {
+ *x = Machine{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Machine) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Machine) ProtoMessage() {}
+
+func (x *Machine) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Machine.ProtoReflect.Descriptor instead.
+func (*Machine) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Machine) GetId() uint64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (x *Machine) GetMachineKey() string {
+ if x != nil {
+ return x.MachineKey
+ }
+ return ""
+}
+
+func (x *Machine) GetNodeKey() string {
+ if x != nil {
+ return x.NodeKey
+ }
+ return ""
+}
+
+func (x *Machine) GetDiscoKey() string {
+ if x != nil {
+ return x.DiscoKey
+ }
+ return ""
+}
+
+func (x *Machine) GetIpAddress() string {
+ if x != nil {
+ return x.IpAddress
+ }
+ return ""
+}
+
+func (x *Machine) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Machine) GetNamespace() *Namespace {
+ if x != nil {
+ return x.Namespace
+ }
+ return nil
+}
+
+func (x *Machine) GetRegistered() bool {
+ if x != nil {
+ return x.Registered
+ }
+ return false
+}
+
+func (x *Machine) GetRegisterMethod() RegisterMethod {
+ if x != nil {
+ return x.RegisterMethod
+ }
+ return RegisterMethod_REGISTER_METHOD_UNSPECIFIED
+}
+
+func (x *Machine) GetLastSeen() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSeen
+ }
+ return nil
+}
+
+func (x *Machine) GetLastSuccessfulUpdate() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSuccessfulUpdate
+ }
+ return nil
+}
+
+func (x *Machine) GetExpiry() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Expiry
+ }
+ return nil
+}
+
+func (x *Machine) GetPreAuthKey() *PreAuthKey {
+ if x != nil {
+ return x.PreAuthKey
+ }
+ return nil
+}
+
+func (x *Machine) GetCreatedAt() *timestamppb.Timestamp {
+ if x != nil {
+ return x.CreatedAt
+ }
+ return nil
+}
+
+type RegisterMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
+}
+
+func (x *RegisterMachineRequest) Reset() {
+ *x = RegisterMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RegisterMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterMachineRequest) ProtoMessage() {}
+
+func (x *RegisterMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterMachineRequest.ProtoReflect.Descriptor instead.
+func (*RegisterMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *RegisterMachineRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+func (x *RegisterMachineRequest) GetKey() string {
+ if x != nil {
+ return x.Key
+ }
+ return ""
+}
+
+type RegisterMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
+}
+
+func (x *RegisterMachineResponse) Reset() {
+ *x = RegisterMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RegisterMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterMachineResponse) ProtoMessage() {}
+
+func (x *RegisterMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RegisterMachineResponse.ProtoReflect.Descriptor instead.
+func (*RegisterMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *RegisterMachineResponse) GetMachine() *Machine {
+ if x != nil {
+ return x.Machine
+ }
+ return nil
+}
+
+type GetMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+}
+
+func (x *GetMachineRequest) Reset() {
+ *x = GetMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMachineRequest) ProtoMessage() {}
+
+func (x *GetMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMachineRequest.ProtoReflect.Descriptor instead.
+func (*GetMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetMachineRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+type GetMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
+}
+
+func (x *GetMachineResponse) Reset() {
+ *x = GetMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMachineResponse) ProtoMessage() {}
+
+func (x *GetMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMachineResponse.ProtoReflect.Descriptor instead.
+func (*GetMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetMachineResponse) GetMachine() *Machine {
+ if x != nil {
+ return x.Machine
+ }
+ return nil
+}
+
+type DeleteMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+}
+
+func (x *DeleteMachineRequest) Reset() {
+ *x = DeleteMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMachineRequest) ProtoMessage() {}
+
+func (x *DeleteMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteMachineRequest.ProtoReflect.Descriptor instead.
+func (*DeleteMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *DeleteMachineRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+type DeleteMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteMachineResponse) Reset() {
+ *x = DeleteMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMachineResponse) ProtoMessage() {}
+
+func (x *DeleteMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteMachineResponse.ProtoReflect.Descriptor instead.
+func (*DeleteMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{6}
+}
+
+type ListMachinesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *ListMachinesRequest) Reset() {
+ *x = ListMachinesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListMachinesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListMachinesRequest) ProtoMessage() {}
+
+func (x *ListMachinesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListMachinesRequest.ProtoReflect.Descriptor instead.
+func (*ListMachinesRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ListMachinesRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+type ListMachinesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machines []*Machine `protobuf:"bytes,1,rep,name=machines,proto3" json:"machines,omitempty"`
+}
+
+func (x *ListMachinesResponse) Reset() {
+ *x = ListMachinesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListMachinesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListMachinesResponse) ProtoMessage() {}
+
+func (x *ListMachinesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListMachinesResponse.ProtoReflect.Descriptor instead.
+func (*ListMachinesResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ListMachinesResponse) GetMachines() []*Machine {
+ if x != nil {
+ return x.Machines
+ }
+ return nil
+}
+
+type ShareMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+ Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *ShareMachineRequest) Reset() {
+ *x = ShareMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ShareMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ShareMachineRequest) ProtoMessage() {}
+
+func (x *ShareMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ShareMachineRequest.ProtoReflect.Descriptor instead.
+func (*ShareMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ShareMachineRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+func (x *ShareMachineRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+type ShareMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
+}
+
+func (x *ShareMachineResponse) Reset() {
+ *x = ShareMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ShareMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ShareMachineResponse) ProtoMessage() {}
+
+func (x *ShareMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ShareMachineResponse.ProtoReflect.Descriptor instead.
+func (*ShareMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ShareMachineResponse) GetMachine() *Machine {
+ if x != nil {
+ return x.Machine
+ }
+ return nil
+}
+
+type UnshareMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+ Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *UnshareMachineRequest) Reset() {
+ *x = UnshareMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UnshareMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnshareMachineRequest) ProtoMessage() {}
+
+func (x *UnshareMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[11]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnshareMachineRequest.ProtoReflect.Descriptor instead.
+func (*UnshareMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *UnshareMachineRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+func (x *UnshareMachineRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+type UnshareMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
+}
+
+func (x *UnshareMachineResponse) Reset() {
+ *x = UnshareMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UnshareMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnshareMachineResponse) ProtoMessage() {}
+
+func (x *UnshareMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[12]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnshareMachineResponse.ProtoReflect.Descriptor instead.
+func (*UnshareMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *UnshareMachineResponse) GetMachine() *Machine {
+ if x != nil {
+ return x.Machine
+ }
+ return nil
+}
+
+type DebugCreateMachineRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
+ Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+ Routes []string `protobuf:"bytes,4,rep,name=routes,proto3" json:"routes,omitempty"`
+}
+
+func (x *DebugCreateMachineRequest) Reset() {
+ *x = DebugCreateMachineRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DebugCreateMachineRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DebugCreateMachineRequest) ProtoMessage() {}
+
+func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[13]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DebugCreateMachineRequest.ProtoReflect.Descriptor instead.
+func (*DebugCreateMachineRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *DebugCreateMachineRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+func (x *DebugCreateMachineRequest) GetKey() string {
+ if x != nil {
+ return x.Key
+ }
+ return ""
+}
+
+func (x *DebugCreateMachineRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *DebugCreateMachineRequest) GetRoutes() []string {
+ if x != nil {
+ return x.Routes
+ }
+ return nil
+}
+
+type DebugCreateMachineResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"`
+}
+
+func (x *DebugCreateMachineResponse) Reset() {
+ *x = DebugCreateMachineResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_machine_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DebugCreateMachineResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DebugCreateMachineResponse) ProtoMessage() {}
+
+func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_machine_proto_msgTypes[14]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DebugCreateMachineResponse.ProtoReflect.Descriptor instead.
+func (*DebugCreateMachineResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *DebugCreateMachineResponse) GetMachine() *Machine {
+ if x != nil {
+ return x.Machine
+ }
+ return nil
+}
+
+var File_headscale_v1_machine_proto protoreflect.FileDescriptor
+
+var file_headscale_v1_machine_proto_rawDesc = []byte{
+ 0x0a, 0x1a, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73,
+ 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b,
+ 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf9, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f,
+ 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6b, 0x65,
+ 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x4b, 0x65, 0x79,
+ 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x12, 0x35, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
+ 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6e, 0x61,
+ 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e,
+ 0x32, 0x1c, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+ 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0e,
+ 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x37,
+ 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c,
+ 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f,
+ 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+ 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73,
+ 0x66, 0x75, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x78, 0x70,
+ 0x69, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x3a, 0x0a,
+ 0x0c, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
+ 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x70,
+ 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x41, 0x74, 0x22, 0x48, 0x0a, 0x16, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+ 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+ 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03,
+ 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x4a,
+ 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
+ 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e,
+ 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x32, 0x0a, 0x11, 0x47, 0x65,
+ 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x45,
+ 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x35, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a,
+ 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x69,
+ 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x52, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+ 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+ 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x14, 0x53, 0x68, 0x61,
+ 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76,
+ 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x22, 0x54, 0x0a, 0x15, 0x55, 0x6e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+ 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61,
+ 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x49, 0x0a, 0x16, 0x55, 0x6e, 0x73, 0x68,
+ 0x61, 0x72, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e,
+ 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68,
+ 0x69, 0x6e, 0x65, 0x22, 0x77, 0x0a, 0x19, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10,
+ 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+ 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04,
+ 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x1a,
+ 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2a, 0x82, 0x01, 0x0a, 0x0e,
+ 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1f,
+ 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f,
+ 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+ 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48,
+ 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, 0x17, 0x0a,
+ 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44,
+ 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54,
+ 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x03,
+ 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a,
+ 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
+ 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_headscale_v1_machine_proto_rawDescOnce sync.Once
+ file_headscale_v1_machine_proto_rawDescData = file_headscale_v1_machine_proto_rawDesc
+)
+
+func file_headscale_v1_machine_proto_rawDescGZIP() []byte {
+ file_headscale_v1_machine_proto_rawDescOnce.Do(func() {
+ file_headscale_v1_machine_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_machine_proto_rawDescData)
+ })
+ return file_headscale_v1_machine_proto_rawDescData
+}
+
+var file_headscale_v1_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_headscale_v1_machine_proto_goTypes = []interface{}{
+ (RegisterMethod)(0), // 0: headscale.v1.RegisterMethod
+ (*Machine)(nil), // 1: headscale.v1.Machine
+ (*RegisterMachineRequest)(nil), // 2: headscale.v1.RegisterMachineRequest
+ (*RegisterMachineResponse)(nil), // 3: headscale.v1.RegisterMachineResponse
+ (*GetMachineRequest)(nil), // 4: headscale.v1.GetMachineRequest
+ (*GetMachineResponse)(nil), // 5: headscale.v1.GetMachineResponse
+ (*DeleteMachineRequest)(nil), // 6: headscale.v1.DeleteMachineRequest
+ (*DeleteMachineResponse)(nil), // 7: headscale.v1.DeleteMachineResponse
+ (*ListMachinesRequest)(nil), // 8: headscale.v1.ListMachinesRequest
+ (*ListMachinesResponse)(nil), // 9: headscale.v1.ListMachinesResponse
+ (*ShareMachineRequest)(nil), // 10: headscale.v1.ShareMachineRequest
+ (*ShareMachineResponse)(nil), // 11: headscale.v1.ShareMachineResponse
+ (*UnshareMachineRequest)(nil), // 12: headscale.v1.UnshareMachineRequest
+ (*UnshareMachineResponse)(nil), // 13: headscale.v1.UnshareMachineResponse
+ (*DebugCreateMachineRequest)(nil), // 14: headscale.v1.DebugCreateMachineRequest
+ (*DebugCreateMachineResponse)(nil), // 15: headscale.v1.DebugCreateMachineResponse
+ (*Namespace)(nil), // 16: headscale.v1.Namespace
+ (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp
+ (*PreAuthKey)(nil), // 18: headscale.v1.PreAuthKey
+}
+var file_headscale_v1_machine_proto_depIdxs = []int32{
+ 16, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace
+ 0, // 1: headscale.v1.Machine.register_method:type_name -> headscale.v1.RegisterMethod
+ 17, // 2: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp
+ 17, // 3: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp
+ 17, // 4: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp
+ 18, // 5: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey
+ 17, // 6: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp
+ 1, // 7: headscale.v1.RegisterMachineResponse.machine:type_name -> headscale.v1.Machine
+ 1, // 8: headscale.v1.GetMachineResponse.machine:type_name -> headscale.v1.Machine
+ 1, // 9: headscale.v1.ListMachinesResponse.machines:type_name -> headscale.v1.Machine
+ 1, // 10: headscale.v1.ShareMachineResponse.machine:type_name -> headscale.v1.Machine
+ 1, // 11: headscale.v1.UnshareMachineResponse.machine:type_name -> headscale.v1.Machine
+ 1, // 12: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine
+ 13, // [13:13] is the sub-list for method output_type
+ 13, // [13:13] is the sub-list for method input_type
+ 13, // [13:13] is the sub-list for extension type_name
+ 13, // [13:13] is the sub-list for extension extendee
+ 0, // [0:13] is the sub-list for field type_name
+}
+
+func init() { file_headscale_v1_machine_proto_init() }
+func file_headscale_v1_machine_proto_init() {
+ if File_headscale_v1_machine_proto != nil {
+ return
+ }
+ file_headscale_v1_namespace_proto_init()
+ file_headscale_v1_preauthkey_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_headscale_v1_machine_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Machine); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RegisterMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RegisterMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListMachinesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListMachinesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ShareMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ShareMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UnshareMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UnshareMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DebugCreateMachineRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_machine_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DebugCreateMachineResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_headscale_v1_machine_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 15,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_headscale_v1_machine_proto_goTypes,
+ DependencyIndexes: file_headscale_v1_machine_proto_depIdxs,
+ EnumInfos: file_headscale_v1_machine_proto_enumTypes,
+ MessageInfos: file_headscale_v1_machine_proto_msgTypes,
+ }.Build()
+ File_headscale_v1_machine_proto = out.File
+ file_headscale_v1_machine_proto_rawDesc = nil
+ file_headscale_v1_machine_proto_goTypes = nil
+ file_headscale_v1_machine_proto_depIdxs = nil
+}
diff --git a/gen/go/headscale/v1/namespace.pb.go b/gen/go/headscale/v1/namespace.pb.go
new file mode 100644
index 00000000..f8af539e
--- /dev/null
+++ b/gen/go/headscale/v1/namespace.pb.go
@@ -0,0 +1,801 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.18.1
+// source: headscale/v1/namespace.proto
+
+package v1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Namespace struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+ CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+}
+
+func (x *Namespace) Reset() {
+ *x = Namespace{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Namespace) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Namespace) ProtoMessage() {}
+
+func (x *Namespace) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Namespace.ProtoReflect.Descriptor instead.
+func (*Namespace) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Namespace) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *Namespace) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Namespace) GetCreatedAt() *timestamppb.Timestamp {
+ if x != nil {
+ return x.CreatedAt
+ }
+ return nil
+}
+
+type GetNamespaceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *GetNamespaceRequest) Reset() {
+ *x = GetNamespaceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetNamespaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetNamespaceRequest) ProtoMessage() {}
+
+func (x *GetNamespaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetNamespaceRequest.ProtoReflect.Descriptor instead.
+func (*GetNamespaceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetNamespaceRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+type GetNamespaceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace *Namespace `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *GetNamespaceResponse) Reset() {
+ *x = GetNamespaceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetNamespaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetNamespaceResponse) ProtoMessage() {}
+
+func (x *GetNamespaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetNamespaceResponse.ProtoReflect.Descriptor instead.
+func (*GetNamespaceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetNamespaceResponse) GetNamespace() *Namespace {
+ if x != nil {
+ return x.Namespace
+ }
+ return nil
+}
+
+type CreateNamespaceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *CreateNamespaceRequest) Reset() {
+ *x = CreateNamespaceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateNamespaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateNamespaceRequest) ProtoMessage() {}
+
+func (x *CreateNamespaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateNamespaceRequest.ProtoReflect.Descriptor instead.
+func (*CreateNamespaceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *CreateNamespaceRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+type CreateNamespaceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace *Namespace `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *CreateNamespaceResponse) Reset() {
+ *x = CreateNamespaceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreateNamespaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateNamespaceResponse) ProtoMessage() {}
+
+func (x *CreateNamespaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateNamespaceResponse.ProtoReflect.Descriptor instead.
+func (*CreateNamespaceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *CreateNamespaceResponse) GetNamespace() *Namespace {
+ if x != nil {
+ return x.Namespace
+ }
+ return nil
+}
+
+type RenameNamespaceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ OldName string `protobuf:"bytes,1,opt,name=old_name,json=oldName,proto3" json:"old_name,omitempty"`
+ NewName string `protobuf:"bytes,2,opt,name=new_name,json=newName,proto3" json:"new_name,omitempty"`
+}
+
+func (x *RenameNamespaceRequest) Reset() {
+ *x = RenameNamespaceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RenameNamespaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RenameNamespaceRequest) ProtoMessage() {}
+
+func (x *RenameNamespaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RenameNamespaceRequest.ProtoReflect.Descriptor instead.
+func (*RenameNamespaceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *RenameNamespaceRequest) GetOldName() string {
+ if x != nil {
+ return x.OldName
+ }
+ return ""
+}
+
+func (x *RenameNamespaceRequest) GetNewName() string {
+ if x != nil {
+ return x.NewName
+ }
+ return ""
+}
+
+type RenameNamespaceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace *Namespace `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *RenameNamespaceResponse) Reset() {
+ *x = RenameNamespaceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *RenameNamespaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RenameNamespaceResponse) ProtoMessage() {}
+
+func (x *RenameNamespaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RenameNamespaceResponse.ProtoReflect.Descriptor instead.
+func (*RenameNamespaceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *RenameNamespaceResponse) GetNamespace() *Namespace {
+ if x != nil {
+ return x.Namespace
+ }
+ return nil
+}
+
+type DeleteNamespaceRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *DeleteNamespaceRequest) Reset() {
+ *x = DeleteNamespaceRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteNamespaceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteNamespaceRequest) ProtoMessage() {}
+
+func (x *DeleteNamespaceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteNamespaceRequest.ProtoReflect.Descriptor instead.
+func (*DeleteNamespaceRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DeleteNamespaceRequest) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+type DeleteNamespaceResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteNamespaceResponse) Reset() {
+ *x = DeleteNamespaceResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DeleteNamespaceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteNamespaceResponse) ProtoMessage() {}
+
+func (x *DeleteNamespaceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteNamespaceResponse.ProtoReflect.Descriptor instead.
+func (*DeleteNamespaceResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{8}
+}
+
+type ListNamespacesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *ListNamespacesRequest) Reset() {
+ *x = ListNamespacesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListNamespacesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListNamespacesRequest) ProtoMessage() {}
+
+func (x *ListNamespacesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListNamespacesRequest.ProtoReflect.Descriptor instead.
+func (*ListNamespacesRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{9}
+}
+
+type ListNamespacesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespaces []*Namespace `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
+}
+
+func (x *ListNamespacesResponse) Reset() {
+ *x = ListNamespacesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListNamespacesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListNamespacesResponse) ProtoMessage() {}
+
+func (x *ListNamespacesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_namespace_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListNamespacesResponse.ProtoReflect.Descriptor instead.
+func (*ListNamespacesResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_namespace_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ListNamespacesResponse) GetNamespaces() []*Namespace {
+ if x != nil {
+ return x.Namespaces
+ }
+ return nil
+}
+
+var File_headscale_v1_namespace_proto protoreflect.FileDescriptor
+
+var file_headscale_v1_namespace_proto_rawDesc = []byte{
+ 0x0a, 0x1c, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a,
+ 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39,
+ 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, 0x74,
+ 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x17, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x22, 0x50, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x17, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x22, 0x4e, 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+ 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e,
+ 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x17, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35,
+ 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x17, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31,
+ 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+ 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17,
+ 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c,
+ 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69,
+ 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e,
+ 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f,
+ 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_headscale_v1_namespace_proto_rawDescOnce sync.Once
+ file_headscale_v1_namespace_proto_rawDescData = file_headscale_v1_namespace_proto_rawDesc
+)
+
+func file_headscale_v1_namespace_proto_rawDescGZIP() []byte {
+ file_headscale_v1_namespace_proto_rawDescOnce.Do(func() {
+ file_headscale_v1_namespace_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_namespace_proto_rawDescData)
+ })
+ return file_headscale_v1_namespace_proto_rawDescData
+}
+
+var file_headscale_v1_namespace_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
+var file_headscale_v1_namespace_proto_goTypes = []interface{}{
+ (*Namespace)(nil), // 0: headscale.v1.Namespace
+ (*GetNamespaceRequest)(nil), // 1: headscale.v1.GetNamespaceRequest
+ (*GetNamespaceResponse)(nil), // 2: headscale.v1.GetNamespaceResponse
+ (*CreateNamespaceRequest)(nil), // 3: headscale.v1.CreateNamespaceRequest
+ (*CreateNamespaceResponse)(nil), // 4: headscale.v1.CreateNamespaceResponse
+ (*RenameNamespaceRequest)(nil), // 5: headscale.v1.RenameNamespaceRequest
+ (*RenameNamespaceResponse)(nil), // 6: headscale.v1.RenameNamespaceResponse
+ (*DeleteNamespaceRequest)(nil), // 7: headscale.v1.DeleteNamespaceRequest
+ (*DeleteNamespaceResponse)(nil), // 8: headscale.v1.DeleteNamespaceResponse
+ (*ListNamespacesRequest)(nil), // 9: headscale.v1.ListNamespacesRequest
+ (*ListNamespacesResponse)(nil), // 10: headscale.v1.ListNamespacesResponse
+ (*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp
+}
+var file_headscale_v1_namespace_proto_depIdxs = []int32{
+ 11, // 0: headscale.v1.Namespace.created_at:type_name -> google.protobuf.Timestamp
+ 0, // 1: headscale.v1.GetNamespaceResponse.namespace:type_name -> headscale.v1.Namespace
+ 0, // 2: headscale.v1.CreateNamespaceResponse.namespace:type_name -> headscale.v1.Namespace
+ 0, // 3: headscale.v1.RenameNamespaceResponse.namespace:type_name -> headscale.v1.Namespace
+ 0, // 4: headscale.v1.ListNamespacesResponse.namespaces:type_name -> headscale.v1.Namespace
+ 5, // [5:5] is the sub-list for method output_type
+ 5, // [5:5] is the sub-list for method input_type
+ 5, // [5:5] is the sub-list for extension type_name
+ 5, // [5:5] is the sub-list for extension extendee
+ 0, // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_headscale_v1_namespace_proto_init() }
+func file_headscale_v1_namespace_proto_init() {
+ if File_headscale_v1_namespace_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_headscale_v1_namespace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Namespace); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetNamespaceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetNamespaceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateNamespaceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreateNamespaceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RenameNamespaceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*RenameNamespaceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteNamespaceRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*DeleteNamespaceResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListNamespacesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_namespace_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListNamespacesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_headscale_v1_namespace_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 11,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_headscale_v1_namespace_proto_goTypes,
+ DependencyIndexes: file_headscale_v1_namespace_proto_depIdxs,
+ MessageInfos: file_headscale_v1_namespace_proto_msgTypes,
+ }.Build()
+ File_headscale_v1_namespace_proto = out.File
+ file_headscale_v1_namespace_proto_rawDesc = nil
+ file_headscale_v1_namespace_proto_goTypes = nil
+ file_headscale_v1_namespace_proto_depIdxs = nil
+}
diff --git a/gen/go/headscale/v1/preauthkey.pb.go b/gen/go/headscale/v1/preauthkey.pb.go
new file mode 100644
index 00000000..82b16bf8
--- /dev/null
+++ b/gen/go/headscale/v1/preauthkey.pb.go
@@ -0,0 +1,640 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.18.1
+// source: headscale/v1/preauthkey.proto
+
+package v1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type PreAuthKey struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+ Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
+ Reusable bool `protobuf:"varint,4,opt,name=reusable,proto3" json:"reusable,omitempty"`
+ Ephemeral bool `protobuf:"varint,5,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"`
+ Used bool `protobuf:"varint,6,opt,name=used,proto3" json:"used,omitempty"`
+ Expiration *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=expiration,proto3" json:"expiration,omitempty"`
+ CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+}
+
+func (x *PreAuthKey) Reset() {
+ *x = PreAuthKey{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PreAuthKey) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PreAuthKey) ProtoMessage() {}
+
+func (x *PreAuthKey) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PreAuthKey.ProtoReflect.Descriptor instead.
+func (*PreAuthKey) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *PreAuthKey) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+func (x *PreAuthKey) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *PreAuthKey) GetKey() string {
+ if x != nil {
+ return x.Key
+ }
+ return ""
+}
+
+func (x *PreAuthKey) GetReusable() bool {
+ if x != nil {
+ return x.Reusable
+ }
+ return false
+}
+
+func (x *PreAuthKey) GetEphemeral() bool {
+ if x != nil {
+ return x.Ephemeral
+ }
+ return false
+}
+
+func (x *PreAuthKey) GetUsed() bool {
+ if x != nil {
+ return x.Used
+ }
+ return false
+}
+
+func (x *PreAuthKey) GetExpiration() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Expiration
+ }
+ return nil
+}
+
+func (x *PreAuthKey) GetCreatedAt() *timestamppb.Timestamp {
+ if x != nil {
+ return x.CreatedAt
+ }
+ return nil
+}
+
+type CreatePreAuthKeyRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Reusable bool `protobuf:"varint,2,opt,name=reusable,proto3" json:"reusable,omitempty"`
+ Ephemeral bool `protobuf:"varint,3,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"`
+ Expiration *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expiration,proto3" json:"expiration,omitempty"`
+}
+
+func (x *CreatePreAuthKeyRequest) Reset() {
+ *x = CreatePreAuthKeyRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreatePreAuthKeyRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePreAuthKeyRequest) ProtoMessage() {}
+
+func (x *CreatePreAuthKeyRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePreAuthKeyRequest.ProtoReflect.Descriptor instead.
+func (*CreatePreAuthKeyRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *CreatePreAuthKeyRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+func (x *CreatePreAuthKeyRequest) GetReusable() bool {
+ if x != nil {
+ return x.Reusable
+ }
+ return false
+}
+
+func (x *CreatePreAuthKeyRequest) GetEphemeral() bool {
+ if x != nil {
+ return x.Ephemeral
+ }
+ return false
+}
+
+func (x *CreatePreAuthKeyRequest) GetExpiration() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Expiration
+ }
+ return nil
+}
+
+type CreatePreAuthKeyResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ PreAuthKey *PreAuthKey `protobuf:"bytes,1,opt,name=pre_auth_key,json=preAuthKey,proto3" json:"pre_auth_key,omitempty"`
+}
+
+func (x *CreatePreAuthKeyResponse) Reset() {
+ *x = CreatePreAuthKeyResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CreatePreAuthKeyResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePreAuthKeyResponse) ProtoMessage() {}
+
+func (x *CreatePreAuthKeyResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePreAuthKeyResponse.ProtoReflect.Descriptor instead.
+func (*CreatePreAuthKeyResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *CreatePreAuthKeyResponse) GetPreAuthKey() *PreAuthKey {
+ if x != nil {
+ return x.PreAuthKey
+ }
+ return nil
+}
+
+type ExpirePreAuthKeyRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+ Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
+}
+
+func (x *ExpirePreAuthKeyRequest) Reset() {
+ *x = ExpirePreAuthKeyRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ExpirePreAuthKeyRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExpirePreAuthKeyRequest) ProtoMessage() {}
+
+func (x *ExpirePreAuthKeyRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExpirePreAuthKeyRequest.ProtoReflect.Descriptor instead.
+func (*ExpirePreAuthKeyRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ExpirePreAuthKeyRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+func (x *ExpirePreAuthKeyRequest) GetKey() string {
+ if x != nil {
+ return x.Key
+ }
+ return ""
+}
+
+type ExpirePreAuthKeyResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *ExpirePreAuthKeyResponse) Reset() {
+ *x = ExpirePreAuthKeyResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ExpirePreAuthKeyResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExpirePreAuthKeyResponse) ProtoMessage() {}
+
+func (x *ExpirePreAuthKeyResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExpirePreAuthKeyResponse.ProtoReflect.Descriptor instead.
+func (*ExpirePreAuthKeyResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{4}
+}
+
+type ListPreAuthKeysRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+}
+
+func (x *ListPreAuthKeysRequest) Reset() {
+ *x = ListPreAuthKeysRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListPreAuthKeysRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListPreAuthKeysRequest) ProtoMessage() {}
+
+func (x *ListPreAuthKeysRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListPreAuthKeysRequest.ProtoReflect.Descriptor instead.
+func (*ListPreAuthKeysRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ListPreAuthKeysRequest) GetNamespace() string {
+ if x != nil {
+ return x.Namespace
+ }
+ return ""
+}
+
+type ListPreAuthKeysResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ PreAuthKeys []*PreAuthKey `protobuf:"bytes,1,rep,name=pre_auth_keys,json=preAuthKeys,proto3" json:"pre_auth_keys,omitempty"`
+}
+
+func (x *ListPreAuthKeysResponse) Reset() {
+ *x = ListPreAuthKeysResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListPreAuthKeysResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListPreAuthKeysResponse) ProtoMessage() {}
+
+func (x *ListPreAuthKeysResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_preauthkey_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListPreAuthKeysResponse.ProtoReflect.Descriptor instead.
+func (*ListPreAuthKeysResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_preauthkey_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ListPreAuthKeysResponse) GetPreAuthKeys() []*PreAuthKey {
+ if x != nil {
+ return x.PreAuthKeys
+ }
+ return nil
+}
+
+var File_headscale_v1_preauthkey_proto protoreflect.FileDescriptor
+
+var file_headscale_v1_preauthkey_proto_rawDesc = []byte{
+ 0x0a, 0x1d, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70,
+ 0x72, 0x65, 0x61, 0x75, 0x74, 0x68, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+ 0x0c, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91,
+ 0x02, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a,
+ 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+ 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a,
+ 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68,
+ 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70,
+ 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65,
+ 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70,
+ 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+ 0x41, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65,
+ 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+ 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08,
+ 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,
+ 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65,
+ 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68,
+ 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x41,
+ 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a,
+ 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0a,
+ 0x70, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x49, 0x0a, 0x17, 0x45, 0x78,
+ 0x70, 0x69, 0x72, 0x65, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x1a, 0x0a, 0x18, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x50,
+ 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x22, 0x36, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68,
+ 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x57, 0x0a, 0x17, 0x4c, 0x69, 0x73,
+ 0x74, 0x50, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68,
+ 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x41, 0x75,
+ 0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65,
+ 0x79, 0x73, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_headscale_v1_preauthkey_proto_rawDescOnce sync.Once
+ file_headscale_v1_preauthkey_proto_rawDescData = file_headscale_v1_preauthkey_proto_rawDesc
+)
+
+func file_headscale_v1_preauthkey_proto_rawDescGZIP() []byte {
+ file_headscale_v1_preauthkey_proto_rawDescOnce.Do(func() {
+ file_headscale_v1_preauthkey_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_preauthkey_proto_rawDescData)
+ })
+ return file_headscale_v1_preauthkey_proto_rawDescData
+}
+
+var file_headscale_v1_preauthkey_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_headscale_v1_preauthkey_proto_goTypes = []interface{}{
+ (*PreAuthKey)(nil), // 0: headscale.v1.PreAuthKey
+ (*CreatePreAuthKeyRequest)(nil), // 1: headscale.v1.CreatePreAuthKeyRequest
+ (*CreatePreAuthKeyResponse)(nil), // 2: headscale.v1.CreatePreAuthKeyResponse
+ (*ExpirePreAuthKeyRequest)(nil), // 3: headscale.v1.ExpirePreAuthKeyRequest
+ (*ExpirePreAuthKeyResponse)(nil), // 4: headscale.v1.ExpirePreAuthKeyResponse
+ (*ListPreAuthKeysRequest)(nil), // 5: headscale.v1.ListPreAuthKeysRequest
+ (*ListPreAuthKeysResponse)(nil), // 6: headscale.v1.ListPreAuthKeysResponse
+ (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp
+}
+var file_headscale_v1_preauthkey_proto_depIdxs = []int32{
+ 7, // 0: headscale.v1.PreAuthKey.expiration:type_name -> google.protobuf.Timestamp
+ 7, // 1: headscale.v1.PreAuthKey.created_at:type_name -> google.protobuf.Timestamp
+ 7, // 2: headscale.v1.CreatePreAuthKeyRequest.expiration:type_name -> google.protobuf.Timestamp
+ 0, // 3: headscale.v1.CreatePreAuthKeyResponse.pre_auth_key:type_name -> headscale.v1.PreAuthKey
+ 0, // 4: headscale.v1.ListPreAuthKeysResponse.pre_auth_keys:type_name -> headscale.v1.PreAuthKey
+ 5, // [5:5] is the sub-list for method output_type
+ 5, // [5:5] is the sub-list for method input_type
+ 5, // [5:5] is the sub-list for extension type_name
+ 5, // [5:5] is the sub-list for extension extendee
+ 0, // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_headscale_v1_preauthkey_proto_init() }
+func file_headscale_v1_preauthkey_proto_init() {
+ if File_headscale_v1_preauthkey_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_headscale_v1_preauthkey_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PreAuthKey); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreatePreAuthKeyRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CreatePreAuthKeyResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ExpirePreAuthKeyRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ExpirePreAuthKeyResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListPreAuthKeysRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_preauthkey_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListPreAuthKeysResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_headscale_v1_preauthkey_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 7,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_headscale_v1_preauthkey_proto_goTypes,
+ DependencyIndexes: file_headscale_v1_preauthkey_proto_depIdxs,
+ MessageInfos: file_headscale_v1_preauthkey_proto_msgTypes,
+ }.Build()
+ File_headscale_v1_preauthkey_proto = out.File
+ file_headscale_v1_preauthkey_proto_rawDesc = nil
+ file_headscale_v1_preauthkey_proto_goTypes = nil
+ file_headscale_v1_preauthkey_proto_depIdxs = nil
+}
diff --git a/gen/go/headscale/v1/routes.pb.go b/gen/go/headscale/v1/routes.pb.go
new file mode 100644
index 00000000..e32e1d15
--- /dev/null
+++ b/gen/go/headscale/v1/routes.pb.go
@@ -0,0 +1,424 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.27.1
+// protoc v3.18.1
+// source: headscale/v1/routes.proto
+
+package v1
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Routes struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ AdvertisedRoutes []string `protobuf:"bytes,1,rep,name=advertised_routes,json=advertisedRoutes,proto3" json:"advertised_routes,omitempty"`
+ EnabledRoutes []string `protobuf:"bytes,2,rep,name=enabled_routes,json=enabledRoutes,proto3" json:"enabled_routes,omitempty"`
+}
+
+func (x *Routes) Reset() {
+ *x = Routes{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_routes_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Routes) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Routes) ProtoMessage() {}
+
+func (x *Routes) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_routes_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Routes.ProtoReflect.Descriptor instead.
+func (*Routes) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_routes_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Routes) GetAdvertisedRoutes() []string {
+ if x != nil {
+ return x.AdvertisedRoutes
+ }
+ return nil
+}
+
+func (x *Routes) GetEnabledRoutes() []string {
+ if x != nil {
+ return x.EnabledRoutes
+ }
+ return nil
+}
+
+type GetMachineRouteRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+}
+
+func (x *GetMachineRouteRequest) Reset() {
+ *x = GetMachineRouteRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_routes_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetMachineRouteRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMachineRouteRequest) ProtoMessage() {}
+
+func (x *GetMachineRouteRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_routes_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMachineRouteRequest.ProtoReflect.Descriptor instead.
+func (*GetMachineRouteRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_routes_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetMachineRouteRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+type GetMachineRouteResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Routes *Routes `protobuf:"bytes,1,opt,name=routes,proto3" json:"routes,omitempty"`
+}
+
+func (x *GetMachineRouteResponse) Reset() {
+ *x = GetMachineRouteResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_routes_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetMachineRouteResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMachineRouteResponse) ProtoMessage() {}
+
+func (x *GetMachineRouteResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_routes_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetMachineRouteResponse.ProtoReflect.Descriptor instead.
+func (*GetMachineRouteResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_routes_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetMachineRouteResponse) GetRoutes() *Routes {
+ if x != nil {
+ return x.Routes
+ }
+ return nil
+}
+
+type EnableMachineRoutesRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MachineId uint64 `protobuf:"varint,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"`
+ Routes []string `protobuf:"bytes,2,rep,name=routes,proto3" json:"routes,omitempty"`
+}
+
+func (x *EnableMachineRoutesRequest) Reset() {
+ *x = EnableMachineRoutesRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_routes_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnableMachineRoutesRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnableMachineRoutesRequest) ProtoMessage() {}
+
+func (x *EnableMachineRoutesRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_routes_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnableMachineRoutesRequest.ProtoReflect.Descriptor instead.
+func (*EnableMachineRoutesRequest) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_routes_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *EnableMachineRoutesRequest) GetMachineId() uint64 {
+ if x != nil {
+ return x.MachineId
+ }
+ return 0
+}
+
+func (x *EnableMachineRoutesRequest) GetRoutes() []string {
+ if x != nil {
+ return x.Routes
+ }
+ return nil
+}
+
+type EnableMachineRoutesResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Routes *Routes `protobuf:"bytes,1,opt,name=routes,proto3" json:"routes,omitempty"`
+}
+
+func (x *EnableMachineRoutesResponse) Reset() {
+ *x = EnableMachineRoutesResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_headscale_v1_routes_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnableMachineRoutesResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnableMachineRoutesResponse) ProtoMessage() {}
+
+func (x *EnableMachineRoutesResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_headscale_v1_routes_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnableMachineRoutesResponse.ProtoReflect.Descriptor instead.
+func (*EnableMachineRoutesResponse) Descriptor() ([]byte, []int) {
+ return file_headscale_v1_routes_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *EnableMachineRoutesResponse) GetRoutes() *Routes {
+ if x != nil {
+ return x.Routes
+ }
+ return nil
+}
+
+var File_headscale_v1_routes_proto protoreflect.FileDescriptor
+
+var file_headscale_v1_routes_proto_rawDesc = []byte{
+ 0x0a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x72,
+ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x68, 0x65, 0x61,
+ 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x5c, 0x0a, 0x06, 0x52, 0x6f, 0x75,
+ 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65,
+ 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10,
+ 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74,
+ 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+ 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x37, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61,
+ 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64,
+ 0x22, 0x47, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f,
+ 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x72,
+ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x68, 0x65,
+ 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65,
+ 0x73, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x1a, 0x45, 0x6e, 0x61,
+ 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73,
+ 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0x4b,
+ 0x0a, 0x1b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52,
+ 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a,
+ 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
+ 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x75,
+ 0x74, 0x65, 0x73, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x29, 0x5a, 0x27, 0x67,
+ 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f,
+ 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e,
+ 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_headscale_v1_routes_proto_rawDescOnce sync.Once
+ file_headscale_v1_routes_proto_rawDescData = file_headscale_v1_routes_proto_rawDesc
+)
+
+func file_headscale_v1_routes_proto_rawDescGZIP() []byte {
+ file_headscale_v1_routes_proto_rawDescOnce.Do(func() {
+ file_headscale_v1_routes_proto_rawDescData = protoimpl.X.CompressGZIP(file_headscale_v1_routes_proto_rawDescData)
+ })
+ return file_headscale_v1_routes_proto_rawDescData
+}
+
+var file_headscale_v1_routes_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_headscale_v1_routes_proto_goTypes = []interface{}{
+ (*Routes)(nil), // 0: headscale.v1.Routes
+ (*GetMachineRouteRequest)(nil), // 1: headscale.v1.GetMachineRouteRequest
+ (*GetMachineRouteResponse)(nil), // 2: headscale.v1.GetMachineRouteResponse
+ (*EnableMachineRoutesRequest)(nil), // 3: headscale.v1.EnableMachineRoutesRequest
+ (*EnableMachineRoutesResponse)(nil), // 4: headscale.v1.EnableMachineRoutesResponse
+}
+var file_headscale_v1_routes_proto_depIdxs = []int32{
+ 0, // 0: headscale.v1.GetMachineRouteResponse.routes:type_name -> headscale.v1.Routes
+ 0, // 1: headscale.v1.EnableMachineRoutesResponse.routes:type_name -> headscale.v1.Routes
+ 2, // [2:2] is the sub-list for method output_type
+ 2, // [2:2] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_headscale_v1_routes_proto_init() }
+func file_headscale_v1_routes_proto_init() {
+ if File_headscale_v1_routes_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_headscale_v1_routes_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Routes); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_routes_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetMachineRouteRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_routes_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetMachineRouteResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_routes_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnableMachineRoutesRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_headscale_v1_routes_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnableMachineRoutesResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_headscale_v1_routes_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_headscale_v1_routes_proto_goTypes,
+ DependencyIndexes: file_headscale_v1_routes_proto_depIdxs,
+ MessageInfos: file_headscale_v1_routes_proto_msgTypes,
+ }.Build()
+ File_headscale_v1_routes_proto = out.File
+ file_headscale_v1_routes_proto_rawDesc = nil
+ file_headscale_v1_routes_proto_goTypes = nil
+ file_headscale_v1_routes_proto_depIdxs = nil
+}
diff --git a/gen/openapiv2/headscale/v1/device.swagger.json b/gen/openapiv2/headscale/v1/device.swagger.json
new file mode 100644
index 00000000..5360527a
--- /dev/null
+++ b/gen/openapiv2/headscale/v1/device.swagger.json
@@ -0,0 +1,43 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "headscale/v1/device.proto",
+ "version": "version not set"
+ },
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {},
+ "definitions": {
+ "protobufAny": {
+ "type": "object",
+ "properties": {
+ "@type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": {}
+ },
+ "rpcStatus": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "details": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/protobufAny"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gen/openapiv2/headscale/v1/headscale.swagger.json b/gen/openapiv2/headscale/v1/headscale.swagger.json
index 567a921f..f1e95cad 100644
--- a/gen/openapiv2/headscale/v1/headscale.swagger.json
+++ b/gen/openapiv2/headscale/v1/headscale.swagger.json
@@ -16,6 +16,91 @@
"application/json"
],
"paths": {
+ "/api/v1/debug/machine": {
+ "post": {
+ "summary": "--- Machine start ---",
+ "operationId": "HeadscaleService_DebugCreateMachine",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1DebugCreateMachineResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "body",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1DebugCreateMachineRequest"
+ }
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/machine": {
+ "get": {
+ "operationId": "HeadscaleService_ListMachines",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1ListMachinesResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "namespace",
+ "in": "query",
+ "required": false,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/machine/register": {
+ "post": {
+ "operationId": "HeadscaleService_RegisterMachine",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1RegisterMachineResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
"/api/v1/machine/{machineId}": {
"get": {
"operationId": "HeadscaleService_GetMachine",
@@ -45,6 +130,170 @@
"tags": [
"HeadscaleService"
]
+ },
+ "delete": {
+ "operationId": "HeadscaleService_DeleteMachine",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1DeleteMachineResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "machineId",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "format": "uint64"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/machine/{machineId}/routes": {
+ "get": {
+ "summary": "--- Route start ---",
+ "operationId": "HeadscaleService_GetMachineRoute",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1GetMachineRouteResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "machineId",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "format": "uint64"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ },
+ "post": {
+ "operationId": "HeadscaleService_EnableMachineRoutes",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1EnableMachineRoutesResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "machineId",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "format": "uint64"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/machine/{machineId}/share/{namespace}": {
+ "post": {
+ "operationId": "HeadscaleService_ShareMachine",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1ShareMachineResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "machineId",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "format": "uint64"
+ },
+ {
+ "name": "namespace",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/machine/{machineId}/unshare/{namespace}": {
+ "post": {
+ "operationId": "HeadscaleService_UnshareMachine",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1UnshareMachineResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "machineId",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "format": "uint64"
+ },
+ {
+ "name": "namespace",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
}
},
"/api/v1/namespace": {
@@ -68,34 +317,6 @@
"HeadscaleService"
]
},
- "delete": {
- "operationId": "HeadscaleService_DeleteNamespace",
- "responses": {
- "200": {
- "description": "A successful response.",
- "schema": {
- "$ref": "#/definitions/v1DeleteNamespaceResponse"
- }
- },
- "default": {
- "description": "An unexpected error response.",
- "schema": {
- "$ref": "#/definitions/rpcStatus"
- }
- }
- },
- "parameters": [
- {
- "name": "name",
- "in": "query",
- "required": false,
- "type": "string"
- }
- ],
- "tags": [
- "HeadscaleService"
- ]
- },
"post": {
"operationId": "HeadscaleService_CreateNamespace",
"responses": {
@@ -126,6 +347,194 @@
"HeadscaleService"
]
}
+ },
+ "/api/v1/namespace/{name}": {
+ "get": {
+ "summary": "--- Namespace start ---",
+ "operationId": "HeadscaleService_GetNamespace",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1GetNamespaceResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "name",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ },
+ "delete": {
+ "operationId": "HeadscaleService_DeleteNamespace",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1DeleteNamespaceResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "name",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/namespace/{oldName}/rename/{newName}": {
+ "post": {
+ "operationId": "HeadscaleService_RenameNamespace",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1RenameNamespaceResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "oldName",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "newName",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/preauthkey": {
+ "get": {
+ "operationId": "HeadscaleService_ListPreAuthKeys",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1ListPreAuthKeysResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "namespace",
+ "in": "query",
+ "required": false,
+ "type": "string"
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ },
+ "post": {
+ "summary": "--- PreAuthKeys start ---",
+ "operationId": "HeadscaleService_CreatePreAuthKey",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1CreatePreAuthKeyResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "body",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1CreatePreAuthKeyRequest"
+ }
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
+ },
+ "/api/v1/preauthkey/expire": {
+ "post": {
+ "operationId": "HeadscaleService_ExpirePreAuthKey",
+ "responses": {
+ "200": {
+ "description": "A successful response.",
+ "schema": {
+ "$ref": "#/definitions/v1ExpirePreAuthKeyResponse"
+ }
+ },
+ "default": {
+ "description": "An unexpected error response.",
+ "schema": {
+ "$ref": "#/definitions/rpcStatus"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "body",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1ExpirePreAuthKeyRequest"
+ }
+ }
+ ],
+ "tags": [
+ "HeadscaleService"
+ ]
+ }
}
},
"definitions": {
@@ -167,15 +576,151 @@
"v1CreateNamespaceResponse": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
+ "namespace": {
+ "$ref": "#/definitions/v1Namespace"
}
}
},
+ "v1CreatePreAuthKeyRequest": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "type": "string"
+ },
+ "reusable": {
+ "type": "boolean"
+ },
+ "ephemeral": {
+ "type": "boolean"
+ },
+ "expiration": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "v1CreatePreAuthKeyResponse": {
+ "type": "object",
+ "properties": {
+ "preAuthKey": {
+ "$ref": "#/definitions/v1PreAuthKey"
+ }
+ }
+ },
+ "v1DebugCreateMachineRequest": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "type": "string"
+ },
+ "key": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "routes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "v1DebugCreateMachineResponse": {
+ "type": "object",
+ "properties": {
+ "machine": {
+ "$ref": "#/definitions/v1Machine"
+ }
+ }
+ },
+ "v1DeleteMachineResponse": {
+ "type": "object"
+ },
"v1DeleteNamespaceResponse": {
"type": "object"
},
+ "v1EnableMachineRoutesResponse": {
+ "type": "object",
+ "properties": {
+ "routes": {
+ "$ref": "#/definitions/v1Routes"
+ }
+ }
+ },
+ "v1ExpirePreAuthKeyRequest": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "type": "string"
+ },
+ "key": {
+ "type": "string"
+ }
+ }
+ },
+ "v1ExpirePreAuthKeyResponse": {
+ "type": "object"
+ },
"v1GetMachineResponse": {
+ "type": "object",
+ "properties": {
+ "machine": {
+ "$ref": "#/definitions/v1Machine"
+ }
+ }
+ },
+ "v1GetMachineRouteResponse": {
+ "type": "object",
+ "properties": {
+ "routes": {
+ "$ref": "#/definitions/v1Routes"
+ }
+ }
+ },
+ "v1GetNamespaceResponse": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "$ref": "#/definitions/v1Namespace"
+ }
+ }
+ },
+ "v1ListMachinesResponse": {
+ "type": "object",
+ "properties": {
+ "machines": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/v1Machine"
+ }
+ }
+ }
+ },
+ "v1ListNamespacesResponse": {
+ "type": "object",
+ "properties": {
+ "namespaces": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/v1Namespace"
+ }
+ }
+ }
+ },
+ "v1ListPreAuthKeysResponse": {
+ "type": "object",
+ "properties": {
+ "preAuthKeys": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/v1PreAuthKey"
+ }
+ }
+ }
+ },
+ "v1Machine": {
"type": "object",
"properties": {
"id": {
@@ -197,9 +742,8 @@
"name": {
"type": "string"
},
- "namespaceId": {
- "type": "integer",
- "format": "int64"
+ "namespace": {
+ "$ref": "#/definitions/v1Namespace"
},
"registered": {
"type": "boolean"
@@ -207,10 +751,6 @@
"registerMethod": {
"$ref": "#/definitions/v1RegisterMethod"
},
- "authKeyId": {
- "type": "integer",
- "format": "int64"
- },
"lastSeen": {
"type": "string",
"format": "date-time"
@@ -222,17 +762,67 @@
"expiry": {
"type": "string",
"format": "date-time"
+ },
+ "preAuthKey": {
+ "$ref": "#/definitions/v1PreAuthKey"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
}
}
},
- "v1ListNamespacesResponse": {
+ "v1Namespace": {
"type": "object",
"properties": {
- "namespaces": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "v1PreAuthKey": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "key": {
+ "type": "string"
+ },
+ "reusable": {
+ "type": "boolean"
+ },
+ "ephemeral": {
+ "type": "boolean"
+ },
+ "used": {
+ "type": "boolean"
+ },
+ "expiration": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "v1RegisterMachineResponse": {
+ "type": "object",
+ "properties": {
+ "machine": {
+ "$ref": "#/definitions/v1Machine"
}
}
},
@@ -245,6 +835,47 @@
"REGISTER_METHOD_OIDC"
],
"default": "REGISTER_METHOD_UNSPECIFIED"
+ },
+ "v1RenameNamespaceResponse": {
+ "type": "object",
+ "properties": {
+ "namespace": {
+ "$ref": "#/definitions/v1Namespace"
+ }
+ }
+ },
+ "v1Routes": {
+ "type": "object",
+ "properties": {
+ "advertisedRoutes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "enabledRoutes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "v1ShareMachineResponse": {
+ "type": "object",
+ "properties": {
+ "machine": {
+ "$ref": "#/definitions/v1Machine"
+ }
+ }
+ },
+ "v1UnshareMachineResponse": {
+ "type": "object",
+ "properties": {
+ "machine": {
+ "$ref": "#/definitions/v1Machine"
+ }
+ }
}
}
}
diff --git a/gen/openapiv2/headscale/v1/machine.swagger.json b/gen/openapiv2/headscale/v1/machine.swagger.json
new file mode 100644
index 00000000..714624b8
--- /dev/null
+++ b/gen/openapiv2/headscale/v1/machine.swagger.json
@@ -0,0 +1,43 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "headscale/v1/machine.proto",
+ "version": "version not set"
+ },
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {},
+ "definitions": {
+ "protobufAny": {
+ "type": "object",
+ "properties": {
+ "@type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": {}
+ },
+ "rpcStatus": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "details": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/protobufAny"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gen/openapiv2/headscale/v1/namespace.swagger.json b/gen/openapiv2/headscale/v1/namespace.swagger.json
new file mode 100644
index 00000000..13687f0a
--- /dev/null
+++ b/gen/openapiv2/headscale/v1/namespace.swagger.json
@@ -0,0 +1,43 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "headscale/v1/namespace.proto",
+ "version": "version not set"
+ },
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {},
+ "definitions": {
+ "protobufAny": {
+ "type": "object",
+ "properties": {
+ "@type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": {}
+ },
+ "rpcStatus": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "details": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/protobufAny"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gen/openapiv2/headscale/v1/preauthkey.swagger.json b/gen/openapiv2/headscale/v1/preauthkey.swagger.json
new file mode 100644
index 00000000..ef16319c
--- /dev/null
+++ b/gen/openapiv2/headscale/v1/preauthkey.swagger.json
@@ -0,0 +1,43 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "headscale/v1/preauthkey.proto",
+ "version": "version not set"
+ },
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {},
+ "definitions": {
+ "protobufAny": {
+ "type": "object",
+ "properties": {
+ "@type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": {}
+ },
+ "rpcStatus": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "details": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/protobufAny"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gen/openapiv2/headscale/v1/routes.swagger.json b/gen/openapiv2/headscale/v1/routes.swagger.json
new file mode 100644
index 00000000..34eda676
--- /dev/null
+++ b/gen/openapiv2/headscale/v1/routes.swagger.json
@@ -0,0 +1,43 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "headscale/v1/routes.proto",
+ "version": "version not set"
+ },
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {},
+ "definitions": {
+ "protobufAny": {
+ "type": "object",
+ "properties": {
+ "@type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": {}
+ },
+ "rpcStatus": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "message": {
+ "type": "string"
+ },
+ "details": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/protobufAny"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/go.mod b/go.mod
index 296def85..65a8582e 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,7 @@ require (
github.com/AlecAivazis/survey/v2 v2.3.2
github.com/Microsoft/go-winio v0.5.0 // indirect
github.com/cenkalti/backoff/v4 v4.1.1 // indirect
+ github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/containerd/continuity v0.1.0 // indirect
github.com/coreos/go-oidc/v3 v3.1.0
github.com/docker/cli v20.10.8+incompatible // indirect
@@ -13,44 +14,53 @@ require (
github.com/efekarakus/termcolor v1.0.1
github.com/fatih/set v0.2.1
github.com/gin-gonic/gin v1.7.4
- github.com/gofrs/uuid v4.0.0+incompatible
+ github.com/go-playground/validator/v10 v10.9.0 // indirect
+ github.com/gofrs/uuid v4.1.0+incompatible
github.com/google/go-github v17.0.0+incompatible // indirect
github.com/google/go-querystring v1.1.0 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0
- github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b
github.com/infobloxopen/protoc-gen-gorm v1.0.1
- github.com/klauspost/compress v1.13.5
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/compress v1.13.6
github.com/lib/pq v1.10.3 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
github.com/opencontainers/runc v1.0.2 // indirect
github.com/ory/dockertest/v3 v3.7.0
github.com/patrickmn/go-cache v2.1.0+incompatible
+ github.com/philip-bui/grpc-zerolog v1.0.1
github.com/prometheus/client_golang v1.11.0
+ github.com/prometheus/common v0.32.1 // indirect
+ github.com/prometheus/procfs v0.7.3 // indirect
github.com/pterm/pterm v0.12.30
- github.com/rs/zerolog v1.25.0
+ github.com/rs/zerolog v1.26.0
github.com/soheilhy/cmux v0.1.5
github.com/spf13/cobra v1.2.1
github.com/spf13/viper v1.8.1
github.com/stretchr/testify v1.7.0
- github.com/tailscale/hujson v0.0.0-20210818175511-7360507a6e88
+ github.com/tailscale/hujson v0.0.0-20210923003652-c3758b31534b
github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e
+ github.com/ugorji/go v1.2.6 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/zsais/go-gin-prometheus v0.1.0
- golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
- golang.org/x/net v0.0.0-20210913180222-943fd674d43e // indirect
- golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f
+ go4.org/mem v0.0.0-20210711025021-927187094b94 // indirect
+ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
+ golang.org/x/net v0.0.0-20211104170005-ce137452f963 // indirect
+ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
- golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0 // indirect
- google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83
- google.golang.org/grpc v1.40.0
+ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect
+ google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247
+ google.golang.org/grpc v1.42.0
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0
google.golang.org/protobuf v1.27.1
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
+ gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/yaml.v2 v2.4.0
gorm.io/datatypes v1.0.2
gorm.io/driver/postgres v1.1.1
gorm.io/driver/sqlite v1.1.5
gorm.io/gorm v1.21.15
- inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e
- tailscale.com v1.14.2
+ inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6
+ tailscale.com v1.14.6
)
diff --git a/go.sum b/go.sum
index 96eb50bd..a34ef217 100644
--- a/go.sum
+++ b/go.sum
@@ -40,6 +40,7 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
contrib.go.opencensus.io/exporter/ocagent v0.7.0/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/mkcert v1.4.3/go.mod h1:64ke566uBwAQcdK3vRDABgsgVHqrfORPTw6YytZCTxk=
github.com/AlecAivazis/survey/v2 v2.3.2 h1:TqTB+aDDCLYhf9/bD2TwSO8u8jDSmMUd2SUVO4gCnU8=
github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
@@ -127,8 +128,9 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq
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 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
@@ -140,7 +142,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
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-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
@@ -212,6 +218,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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
@@ -258,12 +265,15 @@ github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dT
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
-github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
+github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
+github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
-github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
+github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
+github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A=
+github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
@@ -284,8 +294,9 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofrs/uuid v4.1.0+incompatible h1:sIa2eCvUTwgjbqXrPLfNwUf9S3i3mpH1O1atV+iL/Wk=
+github.com/gofrs/uuid v4.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -416,6 +427,8 @@ github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXf
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
@@ -426,8 +439,6 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.3.0/go.mod h1:d2gYTOTUQklu06xp0AJYY
github.com/grpc-ecosystem/grpc-gateway/v2 v2.4.0/go.mod h1:IOyTYjcIO0rkmnGBfJTL0NJ11exy/Tc2QEuv7hCXp24=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0/go.mod h1:qrJPVzv9YlhsrxJc3P/Q85nr0w1lIRikTl4JlhdDH5w=
-github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4=
-github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
@@ -573,8 +584,9 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
@@ -592,8 +604,8 @@ github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs
github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
-github.com/klauspost/compress v1.13.5 h1:9O69jUPDcsT9fEm74W92rZL9FQY7rCdaXVneq+yyzl4=
-github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -601,8 +613,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI=
@@ -612,8 +625,9 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30=
github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg=
-github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -654,8 +668,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
@@ -714,8 +729,9 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
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=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k=
github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
@@ -782,9 +798,12 @@ github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9
github.com/peterbourgon/ff/v2 v2.0.0/go.mod h1:xjwr+t+SjWm4L46fcj/D+Ap+6ME7+HqFzaP22pP5Ggk=
github.com/peterbourgon/ff/v3 v3.0.0/go.mod h1:UILIFjRH5a/ar8TjXYLTkIvSvekZqPm5Eb/qbGk6CT0=
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=
+github.com/philip-bui/grpc-zerolog v1.0.1/go.mod h1:qXbiq/2X4ZUMMshsqlWyTHOcw7ns+GZmlqZZN05ZHcQ=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -819,16 +838,18 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI=
github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg=
@@ -848,12 +869,14 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
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/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.25.0 h1:Rj7XygbUHKUlDPcVdoLyR91fJBsduXj5fRxyqIQj/II=
-github.com/rs/zerolog v1.25.0/go.mod h1:7KHcEGe0QZPOm2IE4Kpb5rTh6n1h2hIgS5OOnu1rUaI=
+github.com/rs/zerolog v1.26.0 h1:ORM4ibhEZeTeQlCojCK2kPz1ogAY4bGs4tD+SaAdGaE=
+github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM=
github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
@@ -928,6 +951,7 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As=
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -944,8 +968,8 @@ github.com/tailscale/certstore v0.0.0-20210528134328-066c94b793d3/go.mod h1:2P+h
github.com/tailscale/depaware v0.0.0-20201214215404-77d1e9757027/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8=
github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05/go.mod h1:PdCqy9JzfWMJf1H5UJW2ip33/d4YkoKN0r67yKH1mG8=
github.com/tailscale/hujson v0.0.0-20200924210142-dde312d0d6a2/go.mod h1:STqf+YV0ADdzk4ejtXFsGqDpATP9JoL0OB+hiFQbkdE=
-github.com/tailscale/hujson v0.0.0-20210818175511-7360507a6e88 h1:q5Sxx79nhG4xWsYEJBlLdqo1hNhUV31/NhA4qQ1SKAY=
-github.com/tailscale/hujson v0.0.0-20210818175511-7360507a6e88/go.mod h1:iTDXJsA6A2wNNjurgic2rk+is6uzU4U2NLm4T+edr6M=
+github.com/tailscale/hujson v0.0.0-20210923003652-c3758b31534b h1:bvys7zUACfrQZBUAinXREfu9jUgq6KcNQcQnUkzl3yc=
+github.com/tailscale/hujson v0.0.0-20210923003652-c3758b31534b/go.mod h1:iTDXJsA6A2wNNjurgic2rk+is6uzU4U2NLm4T+edr6M=
github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8=
github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e h1:IWllFTiDjjLIf2oeKxpIUmtiDV5sn71VgeQgg6vcE7k=
github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e/go.mod h1:d7u6HkTYKSv5m6MCKkOQlHwaShTMl3HjqSGW3XtVhXM=
@@ -964,10 +988,12 @@ github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJ
github.com/twitchtv/twirp v7.1.0+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A=
github.com/u-root/uio v0.0.0-20210528114334-82958018845c/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
-github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
+github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E=
+github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
+github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
@@ -999,6 +1025,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4=
github.com/zsais/go-gin-prometheus v0.1.0 h1:bkLv1XCdzqVgQ36ScgRi09MA2UC1t3tAB6nsfErsGO4=
@@ -1035,13 +1062,16 @@ 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.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go4.org/intern v0.0.0-20210108033219-3eb7198706b2 h1:VFTf+jjIgsldaz/Mr00VaCSswHJrI2hIjQygE/W4IMg=
go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc=
-go4.org/mem v0.0.0-20201119185036-c04c5a6ff174 h1:vSug/WNOi2+4jrKdivxayTN/zd8EA1UrStjpWvvo1jk=
+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-20201119185036-c04c5a6ff174/go.mod h1:reUoABIJ9ikfM5sgtSF3Wushcza7+WeD01VB9Lirh3g=
+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-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
-go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
+go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 h1:Tx9kY6yUkLge/pFG7IEMwDZy6CS2ajFc9TvQdPCW0uA=
+go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
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=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1068,8 +1098,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
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=
@@ -1164,8 +1195,9 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210913180222-943fd674d43e h1:+b/22bPvDYt4NPDcy4xAGCmON713ONAWFeY3Z7I3tR8=
-golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211104170005-ce137452f963 h1:8gJUadZl+kWvZBqG/LautX0X6qe5qTC2VI/3V3NBRAY=
+golang.org/x/net v0.0.0-20211104170005-ce137452f963/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
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=
@@ -1179,8 +1211,10 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/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 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
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=
@@ -1285,9 +1319,12 @@ golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0 h1:xrCZDmdtoloIiooiA9q0OQb9r8HejIHYoHGhGCe1pGg=
-golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4=
+golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/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=
@@ -1394,6 +1431,7 @@ golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752/go.mod h1:z6u4i615ZeAfBE4X
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201121010211-780cb80bd7fb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201124202034-299f270db459/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -1402,6 +1440,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1492,8 +1531,9 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210426193834-eac7f76ac494/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 h1:3V2dxSZpz4zozWWUq36vUxXEKnSYitEH2LdsAx+RUmg=
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247 h1:ZONpjmFT5e+I/0/xE3XXbG5OIvX2hRYzol04MhKBl2E=
+google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
@@ -1521,8 +1561,9 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
@@ -1560,8 +1601,9 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
gopkg.in/ini.v1 v1.62.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=
@@ -1608,10 +1650,11 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY=
honnef.co/go/tools v0.1.4/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
inet.af/netaddr v0.0.0-20210515010201-ad03edc7c841/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls=
inet.af/netaddr v0.0.0-20210721214506-ce7a8ad02cc1/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls=
-inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e h1:tvgqez5ZQoBBiBAGNU/fmJy247yB/7++kcLOEoMYup0=
-inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls=
+inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 h1:acCzuUSQ79tGsM/O50VRFySfMm19IoMKL+sZztZkCxw=
+inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6/go.mod h1:y3MGhcFMlh0KZPMuXXow8mpjxxAk3yoDNsp4cQz54i8=
inet.af/netstack v0.0.0-20210622165351-29b14ebc044e/go.mod h1:fG3G1dekmK8oDX3iVzt8c0zICLMLSN8SjdxbXVt0WjU=
inet.af/peercred v0.0.0-20210318190834-4259e17bb763/go.mod h1:FjawnflS/udxX+SvpsMgZfdqx2aykOlkISeAsADi5IU=
inet.af/wf v0.0.0-20210516214145-a5343001b756/go.mod h1:ViGMZRA6+RA318D7GCncrjv5gHUrPYrNDejjU12tikA=
@@ -1624,6 +1667,7 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
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-20180114231543-2291e8f0f237/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ=
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
-tailscale.com v1.14.2 h1:iSbnr+3eVt0ZsRJQG+KLw46K8Hq2fbCMSH/dGoJXnkY=
-tailscale.com v1.14.2/go.mod h1:WbJAb2AwrBO8jGQgxZ8E2mj3l628a3ysdPV7bJHBKlY=
+tailscale.com v1.14.6 h1:xhpDI3hks1lz80Tq7gxybdM0vt8NSuWEFpQeBqBZJhw=
+tailscale.com v1.14.6/go.mod h1:3F94TfP5nSn9M40v7jEQB+QI3m/4trasLDF3Dcljs8o=
diff --git a/grpcv1.go b/grpcv1.go
index 08c977b8..998f0c0e 100644
--- a/grpcv1.go
+++ b/grpcv1.go
@@ -3,73 +3,375 @@ package headscale
import (
"context"
+ "encoding/json"
+ "time"
- apiV1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ "github.com/juanfont/headscale/gen/go/headscale/v1"
+ "github.com/rs/zerolog/log"
+ "gorm.io/datatypes"
+ "tailscale.com/tailcfg"
)
-type headscaleV1APIServer struct { // apiV1.HeadscaleServiceServer
- apiV1.UnimplementedHeadscaleServiceServer
+type headscaleV1APIServer struct { // v1.HeadscaleServiceServer
+ v1.UnimplementedHeadscaleServiceServer
h *Headscale
}
-func newHeadscaleV1APIServer(h *Headscale) apiV1.HeadscaleServiceServer {
+func newHeadscaleV1APIServer(h *Headscale) v1.HeadscaleServiceServer {
return headscaleV1APIServer{
h: h,
}
}
-func (api headscaleV1APIServer) GetMachine(
+func (api headscaleV1APIServer) GetNamespace(
ctx context.Context,
- request *apiV1.GetMachineRequest,
-) (*apiV1.GetMachineResponse, error) {
- // m, err := api.h.GetMachineByID(request.MachineId)
- // if err != nil {
- // return nil, err
- // }
+ request *v1.GetNamespaceRequest,
+) (*v1.GetNamespaceResponse, error) {
+ namespace, err := api.h.GetNamespace(request.GetName())
+ if err != nil {
+ return nil, err
+ }
- // TODO(kradalby): Make this function actually do something
- return &apiV1.GetMachineResponse{Name: "test"}, nil
+ return &v1.GetNamespaceResponse{Namespace: namespace.toProto()}, nil
}
func (api headscaleV1APIServer) CreateNamespace(
ctx context.Context,
- request *apiV1.CreateNamespaceRequest,
-) (*apiV1.CreateNamespaceResponse, error) {
- namespace, err := api.h.CreateNamespace(request.Name)
+ request *v1.CreateNamespaceRequest,
+) (*v1.CreateNamespaceResponse, error) {
+ namespace, err := api.h.CreateNamespace(request.GetName())
if err != nil {
return nil, err
}
- return &apiV1.CreateNamespaceResponse{Name: namespace.Name}, nil
+ return &v1.CreateNamespaceResponse{Namespace: namespace.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) RenameNamespace(
+ ctx context.Context,
+ request *v1.RenameNamespaceRequest,
+) (*v1.RenameNamespaceResponse, error) {
+ err := api.h.RenameNamespace(request.GetOldName(), request.GetNewName())
+ if err != nil {
+ return nil, err
+ }
+
+ namespace, err := api.h.GetNamespace(request.GetNewName())
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.RenameNamespaceResponse{Namespace: namespace.toProto()}, nil
}
func (api headscaleV1APIServer) DeleteNamespace(
ctx context.Context,
- request *apiV1.DeleteNamespaceRequest,
-) (*apiV1.DeleteNamespaceResponse, error) {
- err := api.h.DestroyNamespace(request.Name)
+ request *v1.DeleteNamespaceRequest,
+) (*v1.DeleteNamespaceResponse, error) {
+ err := api.h.DestroyNamespace(request.GetName())
if err != nil {
return nil, err
}
- return &apiV1.DeleteNamespaceResponse{}, nil
+ return &v1.DeleteNamespaceResponse{}, nil
}
func (api headscaleV1APIServer) ListNamespaces(
ctx context.Context,
- request *apiV1.ListNamespacesRequest,
-) (*apiV1.ListNamespacesResponse, error) {
+ request *v1.ListNamespacesRequest,
+) (*v1.ListNamespacesResponse, error) {
namespaces, err := api.h.ListNamespaces()
if err != nil {
return nil, err
}
- response := make([]string, len(*namespaces))
- for index, namespace := range *namespaces {
- response[index] = namespace.Name
+ response := make([]*v1.Namespace, len(namespaces))
+ for index, namespace := range namespaces {
+ response[index] = namespace.toProto()
}
- return &apiV1.ListNamespacesResponse{Namespaces: response}, nil
+ log.Trace().Caller().Interface("namespaces", response).Msg("")
+
+ return &v1.ListNamespacesResponse{Namespaces: response}, nil
+}
+
+func (api headscaleV1APIServer) CreatePreAuthKey(
+ ctx context.Context,
+ request *v1.CreatePreAuthKeyRequest,
+) (*v1.CreatePreAuthKeyResponse, error) {
+ var expiration time.Time
+ if request.GetExpiration() != nil {
+ expiration = request.GetExpiration().AsTime()
+ }
+
+ preAuthKey, err := api.h.CreatePreAuthKey(
+ request.GetNamespace(),
+ request.GetReusable(),
+ request.GetEphemeral(),
+ &expiration,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.CreatePreAuthKeyResponse{PreAuthKey: preAuthKey.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) ExpirePreAuthKey(
+ ctx context.Context,
+ request *v1.ExpirePreAuthKeyRequest,
+) (*v1.ExpirePreAuthKeyResponse, error) {
+ preAuthKey, err := api.h.GetPreAuthKey(request.GetNamespace(), request.Key)
+ if err != nil {
+ return nil, err
+ }
+
+ err = api.h.ExpirePreAuthKey(preAuthKey)
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.ExpirePreAuthKeyResponse{}, nil
+}
+
+func (api headscaleV1APIServer) ListPreAuthKeys(
+ ctx context.Context,
+ request *v1.ListPreAuthKeysRequest,
+) (*v1.ListPreAuthKeysResponse, error) {
+ preAuthKeys, err := api.h.ListPreAuthKeys(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ response := make([]*v1.PreAuthKey, len(preAuthKeys))
+ for index, key := range preAuthKeys {
+ response[index] = key.toProto()
+ }
+
+ return &v1.ListPreAuthKeysResponse{PreAuthKeys: response}, nil
+}
+
+func (api headscaleV1APIServer) RegisterMachine(
+ ctx context.Context,
+ request *v1.RegisterMachineRequest,
+) (*v1.RegisterMachineResponse, error) {
+ log.Trace().Str("namespace", request.GetNamespace()).Str("machine_key", request.GetKey()).Msg("Registering machine")
+ machine, err := api.h.RegisterMachine(
+ request.GetKey(),
+ request.GetNamespace(),
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.RegisterMachineResponse{Machine: machine.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) GetMachine(
+ ctx context.Context,
+ request *v1.GetMachineRequest,
+) (*v1.GetMachineResponse, error) {
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.GetMachineResponse{Machine: machine.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) DeleteMachine(
+ ctx context.Context,
+ request *v1.DeleteMachineRequest,
+) (*v1.DeleteMachineResponse, error) {
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ err = api.h.DeleteMachine(
+ machine,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.DeleteMachineResponse{}, nil
+}
+
+func (api headscaleV1APIServer) ListMachines(
+ ctx context.Context,
+ request *v1.ListMachinesRequest,
+) (*v1.ListMachinesResponse, error) {
+ if request.GetNamespace() != "" {
+ machines, err := api.h.ListMachinesInNamespace(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ sharedMachines, err := api.h.ListSharedMachinesInNamespace(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ machines = append(machines, sharedMachines...)
+
+ response := make([]*v1.Machine, len(machines))
+ for index, machine := range machines {
+ response[index] = machine.toProto()
+ }
+
+ return &v1.ListMachinesResponse{Machines: response}, nil
+ }
+
+ machines, err := api.h.ListMachines()
+ if err != nil {
+ return nil, err
+ }
+
+ response := make([]*v1.Machine, len(machines))
+ for index, machine := range machines {
+ response[index] = machine.toProto()
+ }
+
+ return &v1.ListMachinesResponse{Machines: response}, nil
+}
+
+func (api headscaleV1APIServer) ShareMachine(
+ ctx context.Context,
+ request *v1.ShareMachineRequest,
+) (*v1.ShareMachineResponse, error) {
+ destinationNamespace, err := api.h.GetNamespace(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ err = api.h.AddSharedMachineToNamespace(machine, destinationNamespace)
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.ShareMachineResponse{Machine: machine.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) UnshareMachine(
+ ctx context.Context,
+ request *v1.UnshareMachineRequest,
+) (*v1.UnshareMachineResponse, error) {
+ destinationNamespace, err := api.h.GetNamespace(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ err = api.h.RemoveSharedMachineFromNamespace(machine, destinationNamespace)
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.UnshareMachineResponse{Machine: machine.toProto()}, nil
+}
+
+func (api headscaleV1APIServer) GetMachineRoute(
+ ctx context.Context,
+ request *v1.GetMachineRouteRequest,
+) (*v1.GetMachineRouteResponse, error) {
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ routes, err := machine.RoutesToProto()
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.GetMachineRouteResponse{
+ Routes: routes,
+ }, nil
+}
+
+func (api headscaleV1APIServer) EnableMachineRoutes(
+ ctx context.Context,
+ request *v1.EnableMachineRoutesRequest,
+) (*v1.EnableMachineRoutesResponse, error) {
+ machine, err := api.h.GetMachineByID(request.GetMachineId())
+ if err != nil {
+ return nil, err
+ }
+
+ err = api.h.EnableRoutes(machine, request.GetRoutes()...)
+ if err != nil {
+ return nil, err
+ }
+
+ routes, err := machine.RoutesToProto()
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.EnableMachineRoutesResponse{
+ Routes: routes,
+ }, nil
+}
+
+// The following service calls are for testing and debugging
+func (api headscaleV1APIServer) DebugCreateMachine(
+ ctx context.Context,
+ request *v1.DebugCreateMachineRequest,
+) (*v1.DebugCreateMachineResponse, error) {
+ namespace, err := api.h.GetNamespace(request.GetNamespace())
+ if err != nil {
+ return nil, err
+ }
+
+ routes, err := stringToIpPrefix(request.GetRoutes())
+ if err != nil {
+ return nil, err
+ }
+
+ log.Trace().Caller().Interface("route-prefix", routes).Interface("route-str", request.GetRoutes()).Msg("")
+
+ hostinfo := tailcfg.Hostinfo{
+ RoutableIPs: routes,
+ OS: "TestOS",
+ Hostname: "DebugTestMachine",
+ }
+
+ log.Trace().Caller().Interface("hostinfo", hostinfo).Msg("")
+
+ hostinfoJson, err := json.Marshal(hostinfo)
+ if err != nil {
+ return nil, err
+ }
+
+ newMachine := Machine{
+ MachineKey: request.GetKey(),
+ Name: request.GetName(),
+ Namespace: *namespace,
+
+ Expiry: &time.Time{},
+ LastSeen: &time.Time{},
+ LastSuccessfulUpdate: &time.Time{},
+
+ HostInfo: datatypes.JSON(hostinfoJson),
+ }
+
+ // log.Trace().Caller().Interface("machine", newMachine).Msg("")
+
+ if err := api.h.db.Create(&newMachine).Error; err != nil {
+ return nil, err
+ }
+
+ return &v1.DebugCreateMachineResponse{Machine: newMachine.toProto()}, nil
}
func (api headscaleV1APIServer) mustEmbedUnimplementedHeadscaleServiceServer() {}
diff --git a/integration_cli_test.go b/integration_cli_test.go
new file mode 100644
index 00000000..e1b16727
--- /dev/null
+++ b/integration_cli_test.go
@@ -0,0 +1,1014 @@
+//go:build integration
+// +build integration
+
+package headscale
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+ "testing"
+ "time"
+
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
+ "github.com/ory/dockertest/v3"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/suite"
+)
+
+type IntegrationCLITestSuite struct {
+ suite.Suite
+ stats *suite.SuiteInformation
+
+ pool dockertest.Pool
+ network dockertest.Network
+ headscale dockertest.Resource
+ env []string
+}
+
+func TestCLIIntegrationTestSuite(t *testing.T) {
+ s := new(IntegrationCLITestSuite)
+
+ suite.Run(t, s)
+}
+
+func (s *IntegrationCLITestSuite) SetupTest() {
+ var err error
+
+ if ppool, err := dockertest.NewPool(""); err == nil {
+ s.pool = *ppool
+ } else {
+ log.Fatalf("Could not connect to docker: %s", err)
+ }
+
+ if pnetwork, err := s.pool.CreateNetwork("headscale-test"); err == nil {
+ s.network = *pnetwork
+ } else {
+ log.Fatalf("Could not create network: %s", err)
+ }
+
+ headscaleBuildOptions := &dockertest.BuildOptions{
+ Dockerfile: "Dockerfile",
+ ContextDir: ".",
+ }
+
+ currentPath, err := os.Getwd()
+ if err != nil {
+ log.Fatalf("Could not determine current path: %s", err)
+ }
+
+ headscaleOptions := &dockertest.RunOptions{
+ Name: "headscale",
+ Mounts: []string{
+ fmt.Sprintf("%s/integration_test/etc:/etc/headscale", currentPath),
+ },
+ Networks: []*dockertest.Network{&s.network},
+ Cmd: []string{"headscale", "serve"},
+ }
+
+ fmt.Println("Creating headscale container")
+ if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil {
+ s.headscale = *pheadscale
+ } else {
+ log.Fatalf("Could not start resource: %s", err)
+ }
+ fmt.Println("Created headscale container")
+
+ fmt.Println("Waiting for headscale to be ready")
+ hostEndpoint := fmt.Sprintf("localhost:%s", s.headscale.GetPort("8080/tcp"))
+
+ if err := s.pool.Retry(func() error {
+ url := fmt.Sprintf("http://%s/health", hostEndpoint)
+ resp, err := http.Get(url)
+ if err != nil {
+ return err
+ }
+ if resp.StatusCode != http.StatusOK {
+ return fmt.Errorf("status code not OK")
+ }
+ return nil
+ }); err != nil {
+ // TODO(kradalby): If we cannot access headscale, or any other fatal error during
+ // test setup, we need to abort and tear down. However, testify does not seem to
+ // support that at the moment:
+ // https://github.com/stretchr/testify/issues/849
+ return // fmt.Errorf("Could not connect to headscale: %s", err)
+ }
+ fmt.Println("headscale container is ready")
+}
+
+func (s *IntegrationCLITestSuite) TearDownTest() {
+ if err := s.pool.Purge(&s.headscale); err != nil {
+ log.Printf("Could not purge resource: %s\n", err)
+ }
+
+ if err := s.network.Close(); err != nil {
+ log.Printf("Could not close network: %s\n", err)
+ }
+}
+
+func (s *IntegrationCLITestSuite) HandleStats(suiteName string, stats *suite.SuiteInformation) {
+ s.stats = stats
+}
+
+func (s *IntegrationCLITestSuite) createNamespace(name string) (*v1.Namespace, error) {
+ result, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "namespaces",
+ "create",
+ name,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ var namespace v1.Namespace
+ err = json.Unmarshal([]byte(result), &namespace)
+ if err != nil {
+ return nil, err
+ }
+
+ return &namespace, nil
+}
+
+func (s *IntegrationCLITestSuite) TestNamespaceCommand() {
+ names := []string{"namespace1", "otherspace", "tasty"}
+ namespaces := make([]*v1.Namespace, len(names))
+
+ for index, namespaceName := range names {
+
+ namespace, err := s.createNamespace(namespaceName)
+ assert.Nil(s.T(), err)
+
+ namespaces[index] = namespace
+ }
+
+ assert.Len(s.T(), namespaces, len(names))
+
+ assert.Equal(s.T(), names[0], namespaces[0].Name)
+ assert.Equal(s.T(), names[1], namespaces[1].Name)
+ assert.Equal(s.T(), names[2], namespaces[2].Name)
+
+ // Test list namespaces
+ listResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "namespaces",
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedNamespaces []v1.Namespace
+ err = json.Unmarshal([]byte(listResult), &listedNamespaces)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), names[0], listedNamespaces[0].Name)
+ assert.Equal(s.T(), names[1], listedNamespaces[1].Name)
+ assert.Equal(s.T(), names[2], listedNamespaces[2].Name)
+
+ // Test rename namespace
+ renameResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "namespaces",
+ "rename",
+ "--output",
+ "json",
+ "tasty",
+ "newname",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var renamedNamespace v1.Namespace
+ err = json.Unmarshal([]byte(renameResult), &renamedNamespace)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), renamedNamespace.Name, "newname")
+
+ // Test list after rename namespaces
+ listAfterRenameResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "namespaces",
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedAfterRenameNamespaces []v1.Namespace
+ err = json.Unmarshal([]byte(listAfterRenameResult), &listedAfterRenameNamespaces)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), names[0], listedAfterRenameNamespaces[0].Name)
+ assert.Equal(s.T(), names[1], listedAfterRenameNamespaces[1].Name)
+ assert.Equal(s.T(), "newname", listedAfterRenameNamespaces[2].Name)
+}
+
+func (s *IntegrationCLITestSuite) TestPreAuthKeyCommand() {
+ count := 5
+
+ namespace, err := s.createNamespace("pre-auth-key-namespace")
+
+ keys := make([]*v1.PreAuthKey, count)
+ assert.Nil(s.T(), err)
+
+ for i := 0; i < count; i++ {
+ preAuthResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "create",
+ "--reusable",
+ "--expiration",
+ "24h",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var preAuthKey v1.PreAuthKey
+ err = json.Unmarshal([]byte(preAuthResult), &preAuthKey)
+ assert.Nil(s.T(), err)
+
+ keys[i] = &preAuthKey
+ }
+
+ assert.Len(s.T(), keys, 5)
+
+ // Test list of keys
+ listResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedPreAuthKeys []v1.PreAuthKey
+ err = json.Unmarshal([]byte(listResult), &listedPreAuthKeys)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), "1", listedPreAuthKeys[0].Id)
+ assert.Equal(s.T(), "2", listedPreAuthKeys[1].Id)
+ assert.Equal(s.T(), "3", listedPreAuthKeys[2].Id)
+ assert.Equal(s.T(), "4", listedPreAuthKeys[3].Id)
+ assert.Equal(s.T(), "5", listedPreAuthKeys[4].Id)
+
+ assert.NotEmpty(s.T(), listedPreAuthKeys[0].Key)
+ assert.NotEmpty(s.T(), listedPreAuthKeys[1].Key)
+ assert.NotEmpty(s.T(), listedPreAuthKeys[2].Key)
+ assert.NotEmpty(s.T(), listedPreAuthKeys[3].Key)
+ assert.NotEmpty(s.T(), listedPreAuthKeys[4].Key)
+
+ assert.True(s.T(), listedPreAuthKeys[0].Expiration.AsTime().After(time.Now()))
+ assert.True(s.T(), listedPreAuthKeys[1].Expiration.AsTime().After(time.Now()))
+ assert.True(s.T(), listedPreAuthKeys[2].Expiration.AsTime().After(time.Now()))
+ assert.True(s.T(), listedPreAuthKeys[3].Expiration.AsTime().After(time.Now()))
+ assert.True(s.T(), listedPreAuthKeys[4].Expiration.AsTime().After(time.Now()))
+
+ assert.True(s.T(), listedPreAuthKeys[0].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)))
+ assert.True(s.T(), listedPreAuthKeys[1].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)))
+ assert.True(s.T(), listedPreAuthKeys[2].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)))
+ assert.True(s.T(), listedPreAuthKeys[3].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)))
+ assert.True(s.T(), listedPreAuthKeys[4].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)))
+
+ // Expire three keys
+ for i := 0; i < 3; i++ {
+ _, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "expire",
+ listedPreAuthKeys[i].Key,
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+ }
+
+ // Test list pre auth keys after expire
+ listAfterExpireResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedAfterExpirePreAuthKeys []v1.PreAuthKey
+ err = json.Unmarshal([]byte(listAfterExpireResult), &listedAfterExpirePreAuthKeys)
+ assert.Nil(s.T(), err)
+
+ assert.True(s.T(), listedAfterExpirePreAuthKeys[0].Expiration.AsTime().Before(time.Now()))
+ assert.True(s.T(), listedAfterExpirePreAuthKeys[1].Expiration.AsTime().Before(time.Now()))
+ assert.True(s.T(), listedAfterExpirePreAuthKeys[2].Expiration.AsTime().Before(time.Now()))
+ assert.True(s.T(), listedAfterExpirePreAuthKeys[3].Expiration.AsTime().After(time.Now()))
+ assert.True(s.T(), listedAfterExpirePreAuthKeys[4].Expiration.AsTime().After(time.Now()))
+}
+
+func (s *IntegrationCLITestSuite) TestPreAuthKeyCommandWithoutExpiry() {
+ namespace, err := s.createNamespace("pre-auth-key-without-exp-namespace")
+ assert.Nil(s.T(), err)
+
+ preAuthResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "create",
+ "--reusable",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var preAuthKey v1.PreAuthKey
+ err = json.Unmarshal([]byte(preAuthResult), &preAuthKey)
+ assert.Nil(s.T(), err)
+
+ // Test list of keys
+ listResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedPreAuthKeys []v1.PreAuthKey
+ err = json.Unmarshal([]byte(listResult), &listedPreAuthKeys)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listedPreAuthKeys, 1)
+ assert.True(s.T(), time.Time{}.Equal(listedPreAuthKeys[0].Expiration.AsTime()))
+}
+
+func (s *IntegrationCLITestSuite) TestPreAuthKeyCommandReusableEphemeral() {
+ namespace, err := s.createNamespace("pre-auth-key-reus-ephm-namespace")
+ assert.Nil(s.T(), err)
+
+ preAuthReusableResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "create",
+ "--reusable=true",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var preAuthReusableKey v1.PreAuthKey
+ err = json.Unmarshal([]byte(preAuthReusableResult), &preAuthReusableKey)
+ assert.Nil(s.T(), err)
+
+ assert.True(s.T(), preAuthReusableKey.GetReusable())
+ assert.False(s.T(), preAuthReusableKey.GetEphemeral())
+
+ preAuthEphemeralResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "create",
+ "--ephemeral=true",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var preAuthEphemeralKey v1.PreAuthKey
+ err = json.Unmarshal([]byte(preAuthEphemeralResult), &preAuthEphemeralKey)
+ assert.Nil(s.T(), err)
+
+ assert.True(s.T(), preAuthEphemeralKey.GetEphemeral())
+ assert.False(s.T(), preAuthEphemeralKey.GetReusable())
+
+ // TODO(kradalby): Evaluate if we need a case to test for reusable and ephemeral
+ // preAuthReusableAndEphemeralResult, err := ExecuteCommand(
+ // &s.headscale,
+ // []string{
+ // "headscale",
+ // "preauthkeys",
+ // "--namespace",
+ // namespace.Name,
+ // "create",
+ // "--ephemeral",
+ // "--reusable",
+ // "--output",
+ // "json",
+ // },
+ // []string{},
+ // )
+ // assert.NotNil(s.T(), err)
+
+ // Test list of keys
+ listResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "preauthkeys",
+ "--namespace",
+ namespace.Name,
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listedPreAuthKeys []v1.PreAuthKey
+ err = json.Unmarshal([]byte(listResult), &listedPreAuthKeys)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listedPreAuthKeys, 2)
+}
+
+func (s *IntegrationCLITestSuite) TestNodeCommand() {
+ namespace, err := s.createNamespace("machine-namespace")
+ assert.Nil(s.T(), err)
+
+ sharedNamespace, err := s.createNamespace("shared-namespace")
+ assert.Nil(s.T(), err)
+
+ // Randomly generated machine keys
+ machineKeys := []string{
+ "9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
+ "6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
+ "f08305b4ee4250b95a70f3b7504d048d75d899993c624a26d422c67af0422507",
+ "8bc13285cee598acf76b1824a6f4490f7f2e3751b201e28aeb3b07fe81d5b4a1",
+ "cf7b0fd05da556fdc3bab365787b506fd82d64a70745db70e00e86c1b1c03084",
+ }
+ machines := make([]*v1.Machine, len(machineKeys))
+ assert.Nil(s.T(), err)
+
+ for index, machineKey := range machineKeys {
+ _, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "debug",
+ "create-node",
+ "--name",
+ fmt.Sprintf("machine-%d", index+1),
+ "--namespace",
+ namespace.Name,
+ "--key",
+ machineKey,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ machineResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "--namespace",
+ namespace.Name,
+ "register",
+ "--key",
+ machineKey,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var machine v1.Machine
+ err = json.Unmarshal([]byte(machineResult), &machine)
+ assert.Nil(s.T(), err)
+
+ machines[index] = &machine
+ }
+
+ assert.Len(s.T(), machines, len(machineKeys))
+
+ // Test list all nodes after added shared
+ listAllResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listAll []v1.Machine
+ err = json.Unmarshal([]byte(listAllResult), &listAll)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listAll, 5)
+
+ assert.Equal(s.T(), uint64(1), listAll[0].Id)
+ assert.Equal(s.T(), uint64(2), listAll[1].Id)
+ assert.Equal(s.T(), uint64(3), listAll[2].Id)
+ assert.Equal(s.T(), uint64(4), listAll[3].Id)
+ assert.Equal(s.T(), uint64(5), listAll[4].Id)
+
+ assert.Equal(s.T(), "machine-1", listAll[0].Name)
+ assert.Equal(s.T(), "machine-2", listAll[1].Name)
+ assert.Equal(s.T(), "machine-3", listAll[2].Name)
+ assert.Equal(s.T(), "machine-4", listAll[3].Name)
+ assert.Equal(s.T(), "machine-5", listAll[4].Name)
+
+ assert.True(s.T(), listAll[0].Registered)
+ assert.True(s.T(), listAll[1].Registered)
+ assert.True(s.T(), listAll[2].Registered)
+ assert.True(s.T(), listAll[3].Registered)
+ assert.True(s.T(), listAll[4].Registered)
+
+ sharedMachineKeys := []string{
+ "b5b444774186d4217adcec407563a1223929465ee2c68a4da13af0d0185b4f8e",
+ "dc721977ac7415aafa87f7d4574cbe07c6b171834a6d37375782bdc1fb6b3584",
+ }
+ sharedMachines := make([]*v1.Machine, len(sharedMachineKeys))
+ assert.Nil(s.T(), err)
+
+ for index, machineKey := range sharedMachineKeys {
+ _, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "debug",
+ "create-node",
+ "--name",
+ fmt.Sprintf("shared-machine-%d", index+1),
+ "--namespace",
+ namespace.Name,
+ "--key",
+ machineKey,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ machineResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "--namespace",
+ sharedNamespace.Name,
+ "register",
+ "--key",
+ machineKey,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var machine v1.Machine
+ err = json.Unmarshal([]byte(machineResult), &machine)
+ assert.Nil(s.T(), err)
+
+ sharedMachines[index] = &machine
+ }
+
+ assert.Len(s.T(), sharedMachines, len(sharedMachineKeys))
+
+ // Test list all nodes after added shared
+ listAllWithSharedResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listAllWithShared []v1.Machine
+ err = json.Unmarshal([]byte(listAllWithSharedResult), &listAllWithShared)
+ assert.Nil(s.T(), err)
+
+ // All nodes, machines + shared
+ assert.Len(s.T(), listAllWithShared, 7)
+
+ assert.Equal(s.T(), uint64(6), listAllWithShared[5].Id)
+ assert.Equal(s.T(), uint64(7), listAllWithShared[6].Id)
+
+ assert.Equal(s.T(), "shared-machine-1", listAllWithShared[5].Name)
+ assert.Equal(s.T(), "shared-machine-2", listAllWithShared[6].Name)
+
+ assert.True(s.T(), listAllWithShared[5].Registered)
+ assert.True(s.T(), listAllWithShared[6].Registered)
+
+ // Test list all nodes after added shared
+ listOnlySharedMachineNamespaceResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--namespace",
+ sharedNamespace.Name,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listOnlySharedMachineNamespace []v1.Machine
+ err = json.Unmarshal([]byte(listOnlySharedMachineNamespaceResult), &listOnlySharedMachineNamespace)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listOnlySharedMachineNamespace, 2)
+
+ assert.Equal(s.T(), uint64(6), listOnlySharedMachineNamespace[0].Id)
+ assert.Equal(s.T(), uint64(7), listOnlySharedMachineNamespace[1].Id)
+
+ assert.Equal(s.T(), "shared-machine-1", listOnlySharedMachineNamespace[0].Name)
+ assert.Equal(s.T(), "shared-machine-2", listOnlySharedMachineNamespace[1].Name)
+
+ assert.True(s.T(), listOnlySharedMachineNamespace[0].Registered)
+ assert.True(s.T(), listOnlySharedMachineNamespace[1].Registered)
+
+ // Delete a machines
+ _, err = ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "delete",
+ "--identifier",
+ // Delete the last added machine
+ "4",
+ "--output",
+ "json",
+ "--force",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ // Test: list main namespace after machine is deleted
+ listOnlyMachineNamespaceAfterDeleteResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--namespace",
+ namespace.Name,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listOnlyMachineNamespaceAfterDelete []v1.Machine
+ err = json.Unmarshal([]byte(listOnlyMachineNamespaceAfterDeleteResult), &listOnlyMachineNamespaceAfterDelete)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listOnlyMachineNamespaceAfterDelete, 4)
+
+ // test: share node
+
+ shareMachineResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "share",
+ "--namespace",
+ namespace.Name,
+ "--identifier",
+ "7",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var shareMachine v1.Machine
+ err = json.Unmarshal([]byte(shareMachineResult), &shareMachine)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), uint64(7), shareMachine.Id)
+
+ assert.Equal(s.T(), "shared-machine-2", shareMachine.Name)
+
+ assert.True(s.T(), shareMachine.Registered)
+
+ // Test: list main namespace after machine has been shared
+ listOnlyMachineNamespaceAfterShareResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--namespace",
+ namespace.Name,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listOnlyMachineNamespaceAfterShare []v1.Machine
+ err = json.Unmarshal([]byte(listOnlyMachineNamespaceAfterShareResult), &listOnlyMachineNamespaceAfterShare)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listOnlyMachineNamespaceAfterShare, 5)
+
+ assert.Equal(s.T(), uint64(7), listOnlyMachineNamespaceAfterShare[4].Id)
+
+ assert.Equal(s.T(), "shared-machine-2", listOnlyMachineNamespaceAfterShare[4].Name)
+
+ assert.True(s.T(), listOnlyMachineNamespaceAfterShare[4].Registered)
+
+ // test: unshare node
+
+ unshareMachineResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "unshare",
+ "--namespace",
+ namespace.Name,
+ "--identifier",
+ "7",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var unshareMachine v1.Machine
+ err = json.Unmarshal([]byte(unshareMachineResult), &unshareMachine)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), uint64(7), unshareMachine.Id)
+
+ assert.Equal(s.T(), "shared-machine-2", unshareMachine.Name)
+
+ assert.True(s.T(), unshareMachine.Registered)
+
+ // Test: list main namespace after machine has been shared
+ listOnlyMachineNamespaceAfterUnshareResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "list",
+ "--namespace",
+ namespace.Name,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listOnlyMachineNamespaceAfterUnshare []v1.Machine
+ err = json.Unmarshal([]byte(listOnlyMachineNamespaceAfterUnshareResult), &listOnlyMachineNamespaceAfterUnshare)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listOnlyMachineNamespaceAfterUnshare, 4)
+}
+
+func (s *IntegrationCLITestSuite) TestRouteCommand() {
+ namespace, err := s.createNamespace("routes-namespace")
+ assert.Nil(s.T(), err)
+
+ // Randomly generated machine keys
+ machineKey := "9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe"
+
+ _, err = ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "debug",
+ "create-node",
+ "--name",
+ "route-machine",
+ "--namespace",
+ namespace.Name,
+ "--key",
+ machineKey,
+ "--route",
+ "10.0.0.0/8",
+ "--route",
+ "192.168.1.0/24",
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ machineResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "--namespace",
+ namespace.Name,
+ "register",
+ "--key",
+ machineKey,
+ "--output",
+ "json",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var machine v1.Machine
+ err = json.Unmarshal([]byte(machineResult), &machine)
+ assert.Nil(s.T(), err)
+
+ assert.Equal(s.T(), uint64(1), machine.Id)
+ assert.Equal(s.T(), "route-machine", machine.Name)
+ assert.True(s.T(), machine.Registered)
+
+ listAllResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "routes",
+ "list",
+ "--output",
+ "json",
+ "--identifier",
+ "0",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var listAll v1.Routes
+ err = json.Unmarshal([]byte(listAllResult), &listAll)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), listAll.AdvertisedRoutes, 2)
+ assert.Contains(s.T(), listAll.AdvertisedRoutes, "10.0.0.0/8")
+ assert.Contains(s.T(), listAll.AdvertisedRoutes, "192.168.1.0/24")
+
+ assert.Empty(s.T(), listAll.EnabledRoutes)
+
+ enableTwoRoutesResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "routes",
+ "enable",
+ "--output",
+ "json",
+ "--identifier",
+ "0",
+ "--route",
+ "10.0.0.0/8",
+ "--route",
+ "192.168.1.0/24",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var enableTwoRoutes v1.Routes
+ err = json.Unmarshal([]byte(enableTwoRoutesResult), &enableTwoRoutes)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), enableTwoRoutes.AdvertisedRoutes, 2)
+ assert.Contains(s.T(), enableTwoRoutes.AdvertisedRoutes, "10.0.0.0/8")
+ assert.Contains(s.T(), enableTwoRoutes.AdvertisedRoutes, "192.168.1.0/24")
+
+ assert.Len(s.T(), enableTwoRoutes.EnabledRoutes, 2)
+ assert.Contains(s.T(), enableTwoRoutes.EnabledRoutes, "10.0.0.0/8")
+ assert.Contains(s.T(), enableTwoRoutes.EnabledRoutes, "192.168.1.0/24")
+
+ // Enable only one route, effectively disabling one of the routes
+ enableOneRouteResult, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "routes",
+ "enable",
+ "--output",
+ "json",
+ "--identifier",
+ "0",
+ "--route",
+ "10.0.0.0/8",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ var enableOneRoute v1.Routes
+ err = json.Unmarshal([]byte(enableOneRouteResult), &enableOneRoute)
+ assert.Nil(s.T(), err)
+
+ assert.Len(s.T(), enableOneRoute.AdvertisedRoutes, 2)
+ assert.Contains(s.T(), enableOneRoute.AdvertisedRoutes, "10.0.0.0/8")
+ assert.Contains(s.T(), enableOneRoute.AdvertisedRoutes, "192.168.1.0/24")
+
+ assert.Len(s.T(), enableOneRoute.EnabledRoutes, 1)
+ assert.Contains(s.T(), enableOneRoute.EnabledRoutes, "10.0.0.0/8")
+
+ // Enable only one route, effectively disabling one of the routes
+ failEnableNonAdvertisedRoute, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "routes",
+ "enable",
+ "--output",
+ "json",
+ "--identifier",
+ "0",
+ "--route",
+ "11.0.0.0/8",
+ },
+ []string{},
+ )
+ assert.Nil(s.T(), err)
+
+ assert.Contains(s.T(), string(failEnableNonAdvertisedRoute), "route (route-machine) is not available on node")
+}
diff --git a/integration_common_test.go b/integration_common_test.go
new file mode 100644
index 00000000..71d48669
--- /dev/null
+++ b/integration_common_test.go
@@ -0,0 +1,69 @@
+//go:build integration
+// +build integration
+
+package headscale
+
+import (
+ "bytes"
+ "fmt"
+ "time"
+
+ "github.com/ory/dockertest/v3"
+ "github.com/ory/dockertest/v3/docker"
+)
+
+func ExecuteCommand(resource *dockertest.Resource, cmd []string, env []string) (string, error) {
+ var stdout bytes.Buffer
+ var stderr bytes.Buffer
+
+ // TODO(kradalby): Make configurable
+ timeout := 10 * time.Second
+
+ type result struct {
+ exitCode int
+ err error
+ }
+
+ resultChan := make(chan result, 1)
+
+ // Run your long running function in it's own goroutine and pass back it's
+ // response into our channel.
+ go func() {
+ exitCode, err := resource.Exec(
+ cmd,
+ dockertest.ExecOptions{
+ Env: append(env, "HEADSCALE_LOG_LEVEL=disabled"),
+ StdOut: &stdout,
+ StdErr: &stderr,
+ },
+ )
+ resultChan <- result{exitCode, err}
+ }()
+
+ // Listen on our channel AND a timeout channel - which ever happens first.
+ select {
+ case res := <-resultChan:
+ if res.err != nil {
+ return "", res.err
+ }
+
+ if res.exitCode != 0 {
+ fmt.Println("Command: ", cmd)
+ fmt.Println("stdout: ", stdout.String())
+ fmt.Println("stderr: ", stderr.String())
+ return "", fmt.Errorf("command failed with: %s", stderr.String())
+ }
+
+ return stdout.String(), nil
+ case <-time.After(timeout):
+ return "", fmt.Errorf("command timed out after %s", timeout)
+ }
+}
+
+func DockerRestartPolicy(config *docker.HostConfig) {
+ // set AutoRemove to true so that stopped container goes away by itself
+ config.AutoRemove = true
+ config.RestartPolicy = docker.RestartPolicy{
+ Name: "no",
+ }
+}
diff --git a/integration_test.go b/integration_test.go
index 1f30bcab..c4f6bb41 100644
--- a/integration_test.go
+++ b/integration_test.go
@@ -18,6 +18,7 @@ import (
"testing"
"time"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/ory/dockertest/v3"
"github.com/ory/dockertest/v3/docker"
"github.com/stretchr/testify/assert"
@@ -28,17 +29,6 @@ import (
"inet.af/netaddr"
)
-var (
- integrationTmpDir string
- ih Headscale
-)
-
-var (
- pool dockertest.Pool
- network dockertest.Network
- headscale dockertest.Resource
-)
-
var tailscaleVersions = []string{"1.16.2", "1.14.3", "1.12.3"}
type TestNamespace struct {
@@ -50,6 +40,10 @@ type IntegrationTestSuite struct {
suite.Suite
stats *suite.SuiteInformation
+ pool dockertest.Pool
+ network dockertest.Network
+ headscale dockertest.Resource
+
namespaces map[string]TestNamespace
}
@@ -74,76 +68,28 @@ func TestIntegrationTestSuite(t *testing.T) {
// we have potentially saved the logs.
for _, scales := range s.namespaces {
for _, tailscale := range scales.tailscales {
- if err := pool.Purge(&tailscale); err != nil {
+ if err := s.pool.Purge(&tailscale); err != nil {
log.Printf("Could not purge resource: %s\n", err)
}
}
}
if !s.stats.Passed() {
- err := saveLog(&headscale, "test_output")
+ err := s.saveLog(&s.headscale, "test_output")
if err != nil {
log.Printf("Could not save log: %s\n", err)
}
}
- if err := pool.Purge(&headscale); err != nil {
+ if err := s.pool.Purge(&s.headscale); err != nil {
log.Printf("Could not purge resource: %s\n", err)
}
- if err := network.Close(); err != nil {
+ if err := s.network.Close(); err != nil {
log.Printf("Could not close network: %s\n", err)
}
}
-func executeCommand(resource *dockertest.Resource, cmd []string, env []string) (string, error) {
- var stdout bytes.Buffer
- var stderr bytes.Buffer
-
- // TODO(kradalby): Make configurable
- timeout := 10 * time.Second
-
- type result struct {
- exitCode int
- err error
- }
-
- resultChan := make(chan result, 1)
-
- // Run your long running function in it's own goroutine and pass back it's
- // response into our channel.
- go func() {
- exitCode, err := resource.Exec(
- cmd,
- dockertest.ExecOptions{
- Env: env,
- StdOut: &stdout,
- StdErr: &stderr,
- },
- )
- resultChan <- result{exitCode, err}
- }()
-
- // Listen on our channel AND a timeout channel - which ever happens first.
- select {
- case res := <-resultChan:
- if res.err != nil {
- return "", res.err
- }
-
- if res.exitCode != 0 {
- fmt.Println("Command: ", cmd)
- fmt.Println("stdout: ", stdout.String())
- fmt.Println("stderr: ", stderr.String())
- return "", fmt.Errorf("command failed with: %s", stderr.String())
- }
-
- return stdout.String(), nil
- case <-time.After(timeout):
- return "", fmt.Errorf("command timed out after %s", timeout)
- }
-}
-
-func saveLog(resource *dockertest.Resource, basePath string) error {
+func (s *IntegrationTestSuite) saveLog(resource *dockertest.Resource, basePath string) error {
err := os.MkdirAll(basePath, os.ModePerm)
if err != nil {
return err
@@ -152,7 +98,7 @@ func saveLog(resource *dockertest.Resource, basePath string) error {
var stdout bytes.Buffer
var stderr bytes.Buffer
- err = pool.Client.Logs(
+ err = s.pool.Client.Logs(
docker.LogsOptions{
Context: context.TODO(),
Container: resource.Container.ID,
@@ -185,15 +131,9 @@ func saveLog(resource *dockertest.Resource, basePath string) error {
return nil
}
-func dockerRestartPolicy(config *docker.HostConfig) {
- // set AutoRemove to true so that stopped container goes away by itself
- config.AutoRemove = true
- config.RestartPolicy = docker.RestartPolicy{
- Name: "no",
- }
-}
-
-func tailscaleContainer(namespace, identifier, version string) (string, *dockertest.Resource) {
+func (s *IntegrationTestSuite) tailscaleContainer(
+ namespace, identifier, version string,
+) (string, *dockertest.Resource) {
tailscaleBuildOptions := &dockertest.BuildOptions{
Dockerfile: "Dockerfile.tailscale",
ContextDir: ".",
@@ -207,11 +147,11 @@ func tailscaleContainer(namespace, identifier, version string) (string, *dockert
hostname := fmt.Sprintf("%s-tailscale-%s-%s", namespace, strings.Replace(version, ".", "-", -1), identifier)
tailscaleOptions := &dockertest.RunOptions{
Name: hostname,
- Networks: []*dockertest.Network{&network},
+ Networks: []*dockertest.Network{&s.network},
Cmd: []string{"tailscaled", "--tun=userspace-networking", "--socks5-server=localhost:1055"},
}
- pts, err := pool.BuildAndRunWithBuildOptions(tailscaleBuildOptions, tailscaleOptions, dockerRestartPolicy)
+ pts, err := s.pool.BuildAndRunWithBuildOptions(tailscaleBuildOptions, tailscaleOptions, DockerRestartPolicy)
if err != nil {
log.Fatalf("Could not start resource: %s", err)
}
@@ -227,13 +167,13 @@ func (s *IntegrationTestSuite) SetupSuite() {
}
if ppool, err := dockertest.NewPool(""); err == nil {
- pool = *ppool
+ s.pool = *ppool
} else {
log.Fatalf("Could not connect to docker: %s", err)
}
- if pnetwork, err := pool.CreateNetwork("headscale-test"); err == nil {
- network = *pnetwork
+ if pnetwork, err := s.pool.CreateNetwork("headscale-test"); err == nil {
+ s.network = *pnetwork
} else {
log.Fatalf("Could not create network: %s", err)
}
@@ -253,13 +193,13 @@ func (s *IntegrationTestSuite) SetupSuite() {
Mounts: []string{
fmt.Sprintf("%s/integration_test/etc:/etc/headscale", currentPath),
},
- Networks: []*dockertest.Network{&network},
+ Networks: []*dockertest.Network{&s.network},
Cmd: []string{"headscale", "serve"},
}
fmt.Println("Creating headscale container")
- if pheadscale, err := pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, dockerRestartPolicy); err == nil {
- headscale = *pheadscale
+ if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil {
+ s.headscale = *pheadscale
} else {
log.Fatalf("Could not start resource: %s", err)
}
@@ -270,15 +210,15 @@ func (s *IntegrationTestSuite) SetupSuite() {
for i := 0; i < scales.count; i++ {
version := tailscaleVersions[i%len(tailscaleVersions)]
- hostname, container := tailscaleContainer(namespace, fmt.Sprint(i), version)
+ hostname, container := s.tailscaleContainer(namespace, fmt.Sprint(i), version)
scales.tailscales[hostname] = *container
}
}
fmt.Println("Waiting for headscale to be ready")
- hostEndpoint := fmt.Sprintf("localhost:%s", headscale.GetPort("8080/tcp"))
+ hostEndpoint := fmt.Sprintf("localhost:%s", s.headscale.GetPort("8080/tcp"))
- if err := pool.Retry(func() error {
+ if err := s.pool.Retry(func() error {
url := fmt.Sprintf("http://%s/health", hostEndpoint)
resp, err := http.Get(url)
if err != nil {
@@ -299,8 +239,8 @@ func (s *IntegrationTestSuite) SetupSuite() {
for namespace, scales := range s.namespaces {
fmt.Printf("Creating headscale namespace: %s\n", namespace)
- result, err := executeCommand(
- &headscale,
+ result, err := ExecuteCommand(
+ &s.headscale,
[]string{"headscale", "namespaces", "create", namespace},
[]string{},
)
@@ -308,8 +248,8 @@ func (s *IntegrationTestSuite) SetupSuite() {
assert.Nil(s.T(), err)
fmt.Printf("Creating pre auth key for %s\n", namespace)
- authKey, err := executeCommand(
- &headscale,
+ preAuthResult, err := ExecuteCommand(
+ &s.headscale,
[]string{
"headscale",
"--namespace",
@@ -319,11 +259,18 @@ func (s *IntegrationTestSuite) SetupSuite() {
"--reusable",
"--expiration",
"24h",
+ "--output",
+ "json",
},
- []string{},
+ []string{"LOG_LEVEL=error"},
)
assert.Nil(s.T(), err)
+ var preAuthKey v1.PreAuthKey
+ err = json.Unmarshal([]byte(preAuthResult), &preAuthKey)
+ assert.Nil(s.T(), err)
+ assert.True(s.T(), preAuthKey.Reusable)
+
headscaleEndpoint := "http://headscale:8080"
fmt.Printf("Joining tailscale containers to headscale at %s\n", headscaleEndpoint)
@@ -334,14 +281,14 @@ func (s *IntegrationTestSuite) SetupSuite() {
"-login-server",
headscaleEndpoint,
"--authkey",
- strings.TrimSuffix(authKey, "\n"),
+ preAuthKey.Key,
"--hostname",
hostname,
}
fmt.Println("Join command:", command)
fmt.Printf("Running join command for %s\n", hostname)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -367,8 +314,8 @@ func (s *IntegrationTestSuite) HandleStats(suiteName string, stats *suite.SuiteI
func (s *IntegrationTestSuite) TestListNodes() {
for namespace, scales := range s.namespaces {
fmt.Println("Listing nodes")
- result, err := executeCommand(
- &headscale,
+ result, err := ExecuteCommand(
+ &s.headscale,
[]string{"headscale", "--namespace", namespace, "nodes", "list"},
[]string{},
)
@@ -419,7 +366,7 @@ func (s *IntegrationTestSuite) TestStatus() {
command := []string{"tailscale", "status", "--json"}
fmt.Printf("Getting status for %s\n", hostname)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -481,7 +428,7 @@ func (s *IntegrationTestSuite) TestPingAllPeers() {
}
fmt.Printf("Pinging from %s (%s) to %s (%s)\n", hostname, ips[hostname], peername, ip)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -500,22 +447,28 @@ func (s *IntegrationTestSuite) TestSharedNodes() {
main := s.namespaces["main"]
shared := s.namespaces["shared"]
- result, err := executeCommand(
- &headscale,
- []string{"headscale", "nodes", "list", "-o", "json", "--namespace", "shared"},
+ result, err := ExecuteCommand(
+ &s.headscale,
+ []string{"headscale", "nodes", "list", "--output", "json", "--namespace", "shared"},
[]string{},
)
assert.Nil(s.T(), err)
- var machineList []Machine
+ var machineList []v1.Machine
err = json.Unmarshal([]byte(result), &machineList)
assert.Nil(s.T(), err)
for _, machine := range machineList {
- result, err := executeCommand(
- &headscale,
- []string{"headscale", "nodes", "share", "--identifier", fmt.Sprint(machine.ID), "--namespace", "main"},
+ result, err := ExecuteCommand(
+ &s.headscale,
+ []string{
+ "headscale",
+ "nodes",
+ "share",
+ "--identifier", fmt.Sprint(machine.Id),
+ "--namespace", "main",
+ },
[]string{},
)
assert.Nil(s.T(), err)
@@ -523,8 +476,8 @@ func (s *IntegrationTestSuite) TestSharedNodes() {
fmt.Println("Shared node with result: ", result)
}
- result, err = executeCommand(
- &headscale,
+ result, err = ExecuteCommand(
+ &s.headscale,
[]string{"headscale", "nodes", "list", "--namespace", "main"},
[]string{},
)
@@ -568,7 +521,7 @@ func (s *IntegrationTestSuite) TestSharedNodes() {
}
fmt.Printf("Pinging from %s (%s) to %s (%s)\n", hostname, mainIps[hostname], peername, ip)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -591,7 +544,7 @@ func (s *IntegrationTestSuite) TestTailDrop() {
for hostname, tailscale := range scales.tailscales {
command := []string{"touch", fmt.Sprintf("/tmp/file_from_%s", hostname)}
- _, err := executeCommand(
+ _, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -628,7 +581,7 @@ func (s *IntegrationTestSuite) TestTailDrop() {
fmt.Sprintf("%s/v0/put/file_from_%s", peerAPI, hostname),
}
fmt.Printf("Sending file from %s (%s) to %s (%s)\n", hostname, ips[hostname], peername, ip)
- _, err = executeCommand(
+ _, err = ExecuteCommand(
&tailscale,
command,
[]string{"ALL_PROXY=socks5://localhost:1055"},
@@ -655,7 +608,7 @@ func (s *IntegrationTestSuite) TestTailDrop() {
"get",
"/tmp/",
}
- _, err := executeCommand(
+ _, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -669,7 +622,7 @@ func (s *IntegrationTestSuite) TestTailDrop() {
fmt.Sprintf("/tmp/file_from_%s", peername),
}
fmt.Printf("Checking file in %s (%s) from %s (%s)\n", hostname, ips[hostname], peername, ip)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -707,7 +660,7 @@ func (s *IntegrationTestSuite) TestMagicDNS() {
peername,
ip,
)
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -727,7 +680,7 @@ func getIPs(tailscales map[string]dockertest.Resource) (map[string]netaddr.IP, e
for hostname, tailscale := range tailscales {
command := []string{"tailscale", "ip"}
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
@@ -755,7 +708,7 @@ func getAPIURLs(tailscales map[string]dockertest.Resource) (map[netaddr.IP]strin
"/run/tailscale/tailscaled.sock",
"http://localhost/localapi/v0/file-targets",
}
- result, err := executeCommand(
+ result, err := ExecuteCommand(
&tailscale,
command,
[]string{},
diff --git a/machine.go b/machine.go
index ccd30e3e..557ab5b6 100644
--- a/machine.go
+++ b/machine.go
@@ -2,6 +2,7 @@ package headscale
import (
"encoding/json"
+ "errors"
"fmt"
"sort"
"strconv"
@@ -10,8 +11,11 @@ import (
"github.com/fatih/set"
"github.com/rs/zerolog/log"
+ "google.golang.org/protobuf/types/known/timestamppb"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"gorm.io/datatypes"
+ "gorm.io/gorm"
"inet.af/netaddr"
"tailscale.com/tailcfg"
"tailscale.com/types/wgkey"
@@ -91,7 +95,7 @@ func (h *Headscale) updateMachineExpiry(m *Machine) {
func (h *Headscale) getDirectPeers(m *Machine) (Machines, error) {
log.Trace().
- Str("func", "getDirectPeers").
+ Caller().
Str("machine", m.Name).
Msg("Finding direct peers")
@@ -105,7 +109,7 @@ func (h *Headscale) getDirectPeers(m *Machine) (Machines, error) {
sort.Slice(machines, func(i, j int) bool { return machines[i].ID < machines[j].ID })
log.Trace().
- Str("func", "getDirectmachines").
+ Caller().
Str("machine", m.Name).
Msgf("Found direct machines: %s", machines.String())
return machines, nil
@@ -114,7 +118,7 @@ func (h *Headscale) getDirectPeers(m *Machine) (Machines, error) {
// getShared fetches machines that are shared to the `Namespace` of the machine we are getting peers for
func (h *Headscale) getShared(m *Machine) (Machines, error) {
log.Trace().
- Str("func", "getShared").
+ Caller().
Str("machine", m.Name).
Msg("Finding shared peers")
@@ -132,7 +136,7 @@ func (h *Headscale) getShared(m *Machine) (Machines, error) {
sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID })
log.Trace().
- Str("func", "getShared").
+ Caller().
Str("machine", m.Name).
Msgf("Found shared peers: %s", peers.String())
return peers, nil
@@ -141,7 +145,7 @@ func (h *Headscale) getShared(m *Machine) (Machines, error) {
// getSharedTo fetches the machines of the namespaces this machine is shared in
func (h *Headscale) getSharedTo(m *Machine) (Machines, error) {
log.Trace().
- Str("func", "getSharedTo").
+ Caller().
Str("machine", m.Name).
Msg("Finding peers in namespaces this machine is shared with")
@@ -157,13 +161,13 @@ func (h *Headscale) getSharedTo(m *Machine) (Machines, error) {
if err != nil {
return Machines{}, err
}
- peers = append(peers, *namespaceMachines...)
+ peers = append(peers, namespaceMachines...)
}
sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID })
log.Trace().
- Str("func", "getSharedTo").
+ Caller().
Str("machine", m.Name).
Msgf("Found peers we are shared with: %s", peers.String())
return peers, nil
@@ -173,7 +177,7 @@ func (h *Headscale) getPeers(m *Machine) (Machines, error) {
direct, err := h.getDirectPeers(m)
if err != nil {
log.Error().
- Str("func", "getPeers").
+ Caller().
Err(err).
Msg("Cannot fetch peers")
return Machines{}, err
@@ -182,7 +186,7 @@ func (h *Headscale) getPeers(m *Machine) (Machines, error) {
shared, err := h.getShared(m)
if err != nil {
log.Error().
- Str("func", "getShared").
+ Caller().
Err(err).
Msg("Cannot fetch peers")
return Machines{}, err
@@ -191,7 +195,7 @@ func (h *Headscale) getPeers(m *Machine) (Machines, error) {
sharedTo, err := h.getSharedTo(m)
if err != nil {
log.Error().
- Str("func", "sharedTo").
+ Caller().
Err(err).
Msg("Cannot fetch peers")
return Machines{}, err
@@ -203,13 +207,21 @@ func (h *Headscale) getPeers(m *Machine) (Machines, error) {
sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID })
log.Trace().
- Str("func", "getShared").
+ Caller().
Str("machine", m.Name).
Msgf("Found total peers: %s", peers.String())
return peers, nil
}
+func (h *Headscale) ListMachines() ([]Machine, error) {
+ machines := []Machine{}
+ if err := h.db.Preload("AuthKey").Preload("AuthKey.Namespace").Preload("Namespace").Find(&machines).Error; err != nil {
+ return nil, err
+ }
+ return machines, nil
+}
+
// GetMachine finds a Machine by name and namespace and returns the Machine struct
func (h *Headscale) GetMachine(namespace string, name string) (*Machine, error) {
machines, err := h.ListMachinesInNamespace(namespace)
@@ -217,7 +229,7 @@ func (h *Headscale) GetMachine(namespace string, name string) (*Machine, error)
return nil, err
}
- for _, m := range *machines {
+ for _, m := range machines {
if m.Name == name {
return &m, nil
}
@@ -326,7 +338,7 @@ func (h *Headscale) isOutdated(m *Machine) bool {
lastChange := h.getLastStateChange(namespaces...)
log.Trace().
- Str("func", "keepAlive").
+ Caller().
Str("machine", m.Name).
Time("last_successful_update", *m.LastSuccessfulUpdate).
Time("last_state_change", lastChange).
@@ -405,7 +417,7 @@ func (m Machine) toNode(baseDomain string, dnsConfig *tailcfg.DNSConfig, include
ip, err := netaddr.ParseIPPrefix(fmt.Sprintf("%s/32", m.IPAddress))
if err != nil {
log.Trace().
- Str("func", "toNode").
+ Caller().
Str("ip", m.IPAddress).
Msgf("Failed to parse IP Prefix from IP: %s", m.IPAddress)
return nil, err
@@ -508,3 +520,212 @@ func (m Machine) toNode(baseDomain string, dnsConfig *tailcfg.DNSConfig, include
}
return &n, nil
}
+
+func (m *Machine) toProto() *v1.Machine {
+ machine := &v1.Machine{
+ Id: m.ID,
+ MachineKey: m.MachineKey,
+
+ NodeKey: m.NodeKey,
+ DiscoKey: m.DiscoKey,
+ IpAddress: m.IPAddress,
+ Name: m.Name,
+ Namespace: m.Namespace.toProto(),
+
+ Registered: m.Registered,
+
+ // TODO(kradalby): Implement register method enum converter
+ // RegisterMethod: ,
+
+ CreatedAt: timestamppb.New(m.CreatedAt),
+ }
+
+ if m.AuthKey != nil {
+ machine.PreAuthKey = m.AuthKey.toProto()
+ }
+
+ if m.LastSeen != nil {
+ machine.LastSeen = timestamppb.New(*m.LastSeen)
+ }
+
+ if m.LastSuccessfulUpdate != nil {
+ machine.LastSuccessfulUpdate = timestamppb.New(*m.LastSuccessfulUpdate)
+ }
+
+ if m.Expiry != nil {
+ machine.Expiry = timestamppb.New(*m.Expiry)
+ }
+
+ return machine
+}
+
+// RegisterMachine is executed from the CLI to register a new Machine using its MachineKey
+func (h *Headscale) RegisterMachine(key string, namespace string) (*Machine, error) {
+ ns, err := h.GetNamespace(namespace)
+ if err != nil {
+ return nil, err
+ }
+ mKey, err := wgkey.ParseHex(key)
+ if err != nil {
+ return nil, err
+ }
+
+ m := Machine{}
+ if result := h.db.First(&m, "machine_key = ?", mKey.HexString()); errors.Is(result.Error, gorm.ErrRecordNotFound) {
+ return nil, errors.New("Machine not found")
+ }
+
+ log.Trace().
+ Caller().
+ Str("machine", m.Name).
+ Msg("Attempting to register machine")
+
+ if m.isAlreadyRegistered() {
+ err := errors.New("Machine already registered")
+ log.Error().
+ Caller().
+ Err(err).
+ Str("machine", m.Name).
+ Msg("Attempting to register machine")
+
+ return nil, err
+ }
+
+ ip, err := h.getAvailableIP()
+ if err != nil {
+ log.Error().
+ Caller().
+ Err(err).
+ Str("machine", m.Name).
+ Msg("Could not find IP for the new machine")
+ return nil, err
+ }
+
+ log.Trace().
+ Caller().
+ Str("machine", m.Name).
+ Str("ip", ip.String()).
+ Msg("Found IP for host")
+
+ m.IPAddress = ip.String()
+ m.NamespaceID = ns.ID
+ m.Registered = true
+ m.RegisterMethod = "cli"
+ h.db.Save(&m)
+
+ log.Trace().
+ Caller().
+ Str("machine", m.Name).
+ Str("ip", ip.String()).
+ Msg("Machine registered with the database")
+
+ return &m, nil
+}
+
+func (m *Machine) GetAdvertisedRoutes() ([]netaddr.IPPrefix, error) {
+ hostInfo, err := m.GetHostInfo()
+ if err != nil {
+ return nil, err
+ }
+ return hostInfo.RoutableIPs, nil
+}
+
+func (m *Machine) GetEnabledRoutes() ([]netaddr.IPPrefix, error) {
+ data, err := m.EnabledRoutes.MarshalJSON()
+ if err != nil {
+ return nil, err
+ }
+
+ routesStr := []string{}
+ err = json.Unmarshal(data, &routesStr)
+ if err != nil {
+ return nil, err
+ }
+
+ routes := make([]netaddr.IPPrefix, len(routesStr))
+ for index, routeStr := range routesStr {
+ route, err := netaddr.ParseIPPrefix(routeStr)
+ if err != nil {
+ return nil, err
+ }
+ routes[index] = route
+ }
+
+ return routes, nil
+}
+
+func (m *Machine) IsRoutesEnabled(routeStr string) bool {
+ route, err := netaddr.ParseIPPrefix(routeStr)
+ if err != nil {
+ return false
+ }
+
+ enabledRoutes, err := m.GetEnabledRoutes()
+ if err != nil {
+ return false
+ }
+
+ for _, enabledRoute := range enabledRoutes {
+ if route == enabledRoute {
+ return true
+ }
+ }
+ return false
+}
+
+// EnableNodeRoute enables new routes based on a list of new routes. It will _replace_ the
+// previous list of routes.
+func (h *Headscale) EnableRoutes(m *Machine, routeStrs ...string) error {
+ newRoutes := make([]netaddr.IPPrefix, len(routeStrs))
+ for index, routeStr := range routeStrs {
+ route, err := netaddr.ParseIPPrefix(routeStr)
+ if err != nil {
+ return err
+ }
+
+ newRoutes[index] = route
+ }
+
+ availableRoutes, err := m.GetAdvertisedRoutes()
+ if err != nil {
+ return err
+ }
+
+ for _, newRoute := range newRoutes {
+ if !containsIpPrefix(availableRoutes, newRoute) {
+ return fmt.Errorf("route (%s) is not available on node %s", m.Name, newRoute)
+ }
+ }
+
+ routes, err := json.Marshal(newRoutes)
+ if err != nil {
+ return err
+ }
+
+ m.EnabledRoutes = datatypes.JSON(routes)
+ h.db.Save(&m)
+
+ err = h.RequestMapUpdates(m.NamespaceID)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *Machine) RoutesToProto() (*v1.Routes, error) {
+ availableRoutes, err := m.GetAdvertisedRoutes()
+ if err != nil {
+ return nil, err
+ }
+
+ enabledRoutes, err := m.GetEnabledRoutes()
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.Routes{
+ AdvertisedRoutes: ipPrefixToString(availableRoutes),
+ EnabledRoutes: ipPrefixToString(enabledRoutes),
+ }, nil
+}
diff --git a/namespaces.go b/namespaces.go
index d7c1e035..66deb1a2 100644
--- a/namespaces.go
+++ b/namespaces.go
@@ -4,16 +4,21 @@ import (
"encoding/json"
"errors"
"fmt"
+ "strconv"
"time"
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/rs/zerolog/log"
+ "google.golang.org/protobuf/types/known/timestamppb"
"gorm.io/gorm"
"tailscale.com/tailcfg"
)
-const errorNamespaceExists = Error("Namespace already exists")
-const errorNamespaceNotFound = Error("Namespace not found")
-const errorNamespaceNotEmpty = Error("Namespace not empty")
+const (
+ errorNamespaceExists = Error("Namespace already exists")
+ errorNamespaceNotFound = Error("Namespace not found")
+ errorNamespaceNotEmpty = Error("Namespace not empty")
+)
// Namespace is the way Headscale implements the concept of users in Tailscale
//
@@ -54,7 +59,7 @@ func (h *Headscale) DestroyNamespace(name string) error {
if err != nil {
return err
}
- if len(*m) > 0 {
+ if len(m) > 0 {
return errorNamespaceNotEmpty
}
@@ -104,16 +109,16 @@ func (h *Headscale) GetNamespace(name string) (*Namespace, error) {
}
// ListNamespaces gets all the existing namespaces
-func (h *Headscale) ListNamespaces() (*[]Namespace, error) {
+func (h *Headscale) ListNamespaces() ([]Namespace, error) {
namespaces := []Namespace{}
if err := h.db.Find(&namespaces).Error; err != nil {
return nil, err
}
- return &namespaces, nil
+ return namespaces, nil
}
// ListMachinesInNamespace gets all the nodes in a given namespace
-func (h *Headscale) ListMachinesInNamespace(name string) (*[]Machine, error) {
+func (h *Headscale) ListMachinesInNamespace(name string) ([]Machine, error) {
n, err := h.GetNamespace(name)
if err != nil {
return nil, err
@@ -123,11 +128,11 @@ func (h *Headscale) ListMachinesInNamespace(name string) (*[]Machine, error) {
if err := h.db.Preload("AuthKey").Preload("AuthKey.Namespace").Preload("Namespace").Where(&Machine{NamespaceID: n.ID}).Find(&machines).Error; err != nil {
return nil, err
}
- return &machines, nil
+ return machines, nil
}
// ListSharedMachinesInNamespace returns all the machines that are shared to the specified namespace
-func (h *Headscale) ListSharedMachinesInNamespace(name string) (*[]Machine, error) {
+func (h *Headscale) ListSharedMachinesInNamespace(name string) ([]Machine, error) {
namespace, err := h.GetNamespace(name)
if err != nil {
return nil, err
@@ -145,7 +150,7 @@ func (h *Headscale) ListSharedMachinesInNamespace(name string) (*[]Machine, erro
}
machines = append(machines, *machine)
}
- return &machines, nil
+ return machines, nil
}
// SetMachineNamespace assigns a Machine to a namespace
@@ -275,3 +280,11 @@ func getMapResponseUserProfiles(m Machine, peers Machines) []tailcfg.UserProfile
}
return profiles
}
+
+func (n *Namespace) toProto() *v1.Namespace {
+ return &v1.Namespace{
+ Id: strconv.FormatUint(uint64(n.ID), 10),
+ Name: n.Name,
+ CreatedAt: timestamppb.New(n.CreatedAt),
+ }
+}
diff --git a/namespaces_test.go b/namespaces_test.go
index 2a211da9..7ce4850e 100644
--- a/namespaces_test.go
+++ b/namespaces_test.go
@@ -12,7 +12,7 @@ func (s *Suite) TestCreateAndDestroyNamespace(c *check.C) {
ns, err := h.ListNamespaces()
c.Assert(err, check.IsNil)
- c.Assert(len(*ns), check.Equals, 1)
+ c.Assert(len(ns), check.Equals, 1)
err = h.DestroyNamespace("test")
c.Assert(err, check.IsNil)
@@ -55,7 +55,7 @@ func (s *Suite) TestRenameNamespace(c *check.C) {
ns, err := h.ListNamespaces()
c.Assert(err, check.IsNil)
- c.Assert(len(*ns), check.Equals, 1)
+ c.Assert(len(ns), check.Equals, 1)
err = h.RenameNamespace("test", "test_renamed")
c.Assert(err, check.IsNil)
diff --git a/oidc_test.go b/oidc_test.go
index b501ff14..c7a29ce9 100644
--- a/oidc_test.go
+++ b/oidc_test.go
@@ -22,7 +22,7 @@ func TestHeadscale_getNamespaceFromEmail(t *testing.T) {
publicKey *wgkey.Key
privateKey *wgkey.Private
aclPolicy *ACLPolicy
- aclRules *[]tailcfg.FilterRule
+ aclRules []tailcfg.FilterRule
lastStateChange sync.Map
oidcProvider *oidc.Provider
oauth2Config *oauth2.Config
diff --git a/preauth_keys.go b/preauth_keys.go
index de10cdb7..1cb9c112 100644
--- a/preauth_keys.go
+++ b/preauth_keys.go
@@ -4,14 +4,20 @@ import (
"crypto/rand"
"encoding/hex"
"errors"
+ "strconv"
"time"
+ "google.golang.org/protobuf/types/known/timestamppb"
"gorm.io/gorm"
+
+ v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
)
-const errorAuthKeyNotFound = Error("AuthKey not found")
-const errorAuthKeyExpired = Error("AuthKey expired")
-const errSingleUseAuthKeyHasBeenUsed = Error("AuthKey has already been used")
+const (
+ errorAuthKeyNotFound = Error("AuthKey not found")
+ errorAuthKeyExpired = Error("AuthKey expired")
+ errSingleUseAuthKeyHasBeenUsed = Error("AuthKey has already been used")
+)
// PreAuthKey describes a pre-authorization key usable in a particular namespace
type PreAuthKey struct {
@@ -28,7 +34,12 @@ type PreAuthKey struct {
}
// CreatePreAuthKey creates a new PreAuthKey in a namespace, and returns it
-func (h *Headscale) CreatePreAuthKey(namespaceName string, reusable bool, ephemeral bool, expiration *time.Time) (*PreAuthKey, error) {
+func (h *Headscale) CreatePreAuthKey(
+ namespaceName string,
+ reusable bool,
+ ephemeral bool,
+ expiration *time.Time,
+) (*PreAuthKey, error) {
n, err := h.GetNamespace(namespaceName)
if err != nil {
return nil, err
@@ -54,8 +65,8 @@ func (h *Headscale) CreatePreAuthKey(namespaceName string, reusable bool, epheme
return &k, nil
}
-// GetPreAuthKeys returns the list of PreAuthKeys for a namespace
-func (h *Headscale) GetPreAuthKeys(namespaceName string) (*[]PreAuthKey, error) {
+// ListPreAuthKeys returns the list of PreAuthKeys for a namespace
+func (h *Headscale) ListPreAuthKeys(namespaceName string) ([]PreAuthKey, error) {
n, err := h.GetNamespace(namespaceName)
if err != nil {
return nil, err
@@ -65,7 +76,7 @@ func (h *Headscale) GetPreAuthKeys(namespaceName string) (*[]PreAuthKey, error)
if err := h.db.Preload("Namespace").Where(&PreAuthKey{NamespaceID: n.ID}).Find(&keys).Error; err != nil {
return nil, err
}
- return &keys, nil
+ return keys, nil
}
// GetPreAuthKey returns a PreAuthKey for a given key
@@ -83,7 +94,7 @@ func (h *Headscale) GetPreAuthKey(namespace string, key string) (*PreAuthKey, er
}
// MarkExpirePreAuthKey marks a PreAuthKey as expired
-func (h *Headscale) MarkExpirePreAuthKey(k *PreAuthKey) error {
+func (h *Headscale) ExpirePreAuthKey(k *PreAuthKey) error {
if err := h.db.Model(&k).Update("Expiration", time.Now()).Error; err != nil {
return err
}
@@ -126,3 +137,24 @@ func (h *Headscale) generateKey() (string, error) {
}
return hex.EncodeToString(bytes), nil
}
+
+func (key *PreAuthKey) toProto() *v1.PreAuthKey {
+ protoKey := v1.PreAuthKey{
+ Namespace: key.Namespace.Name,
+ Id: strconv.FormatUint(key.ID, 10),
+ Key: key.Key,
+ Ephemeral: key.Ephemeral,
+ Reusable: key.Reusable,
+ Used: key.Used,
+ }
+
+ if key.Expiration != nil {
+ protoKey.Expiration = timestamppb.New(*key.Expiration)
+ }
+
+ if key.CreatedAt != nil {
+ protoKey.CreatedAt = timestamppb.New(*key.CreatedAt)
+ }
+
+ return &protoKey
+}
diff --git a/preauth_keys_test.go b/preauth_keys_test.go
index f8973eaf..dceec00b 100644
--- a/preauth_keys_test.go
+++ b/preauth_keys_test.go
@@ -24,15 +24,15 @@ func (*Suite) TestCreatePreAuthKey(c *check.C) {
// Make sure the Namespace association is populated
c.Assert(k.Namespace.Name, check.Equals, n.Name)
- _, err = h.GetPreAuthKeys("bogus")
+ _, err = h.ListPreAuthKeys("bogus")
c.Assert(err, check.NotNil)
- keys, err := h.GetPreAuthKeys(n.Name)
+ keys, err := h.ListPreAuthKeys(n.Name)
c.Assert(err, check.IsNil)
- c.Assert(len(*keys), check.Equals, 1)
+ c.Assert(len(keys), check.Equals, 1)
// Make sure the Namespace association is populated
- c.Assert((*keys)[0].Namespace.Name, check.Equals, n.Name)
+ c.Assert((keys)[0].Namespace.Name, check.Equals, n.Name)
}
func (*Suite) TestExpiredPreAuthKey(c *check.C) {
@@ -172,7 +172,7 @@ func (*Suite) TestExpirePreauthKey(c *check.C) {
c.Assert(err, check.IsNil)
c.Assert(pak.Expiration, check.IsNil)
- err = h.MarkExpirePreAuthKey(pak)
+ err = h.ExpirePreAuthKey(pak)
c.Assert(err, check.IsNil)
c.Assert(pak.Expiration, check.NotNil)
diff --git a/proto/headscale/v1/device.proto b/proto/headscale/v1/device.proto
new file mode 100644
index 00000000..207ff374
--- /dev/null
+++ b/proto/headscale/v1/device.proto
@@ -0,0 +1,83 @@
+syntax = "proto3";
+package headscale.v1;
+option go_package = "github.com/juanfont/headscale/gen/go/v1";
+
+import "google/protobuf/timestamp.proto";
+
+// This is a potential reimplementation of Tailscale's API
+// https://github.com/tailscale/tailscale/blob/main/api.md
+
+message Latency {
+ float latency_ms = 1;
+ bool preferred = 2;
+}
+
+message ClientSupports {
+ bool hair_pinning = 1;
+ bool ipv6 = 2;
+ bool pcp = 3;
+ bool pmp = 4;
+ bool udp = 5;
+ bool upnp = 6;
+}
+
+message ClientConnectivity {
+ repeated string endpoints = 1;
+ string derp = 2;
+ bool mapping_varies_by_dest_ip = 3;
+ map latency = 4;
+ ClientSupports client_supports = 5;
+}
+
+message GetDeviceRequest {
+ string id = 1;
+}
+
+message GetDeviceResponse {
+ repeated string addresses = 1;
+ string id = 2;
+ string user = 3;
+ string name = 4;
+ string hostname = 5;
+ string client_version = 6;
+ bool update_available = 7;
+ string os = 8;
+ google.protobuf.Timestamp created = 9;
+ google.protobuf.Timestamp last_seen = 10;
+ bool key_expiry_disabled = 11;
+ google.protobuf.Timestamp expires = 12;
+ bool authorized = 13;
+ bool is_external = 14;
+ string machine_key = 15;
+ string node_key = 16;
+ bool blocks_incoming_connections = 17;
+ repeated string enabled_routes = 18;
+ repeated string advertised_routes = 19;
+ ClientConnectivity client_connectivity = 20;
+}
+
+message DeleteDeviceRequest {
+ string id = 1;
+}
+
+message DeleteDeviceResponse {
+}
+
+message GetDeviceRoutesRequest {
+ string id = 1;
+}
+
+message GetDeviceRoutesResponse {
+ repeated string enabled_routes = 1;
+ repeated string advertised_routes = 2;
+}
+
+message EnableDeviceRoutesRequest {
+ string id = 1;
+ repeated string routes = 2;
+}
+
+message EnableDeviceRoutesResponse {
+ repeated string enabled_routes = 1;
+ repeated string advertised_routes = 2;
+}
diff --git a/proto/headscale/v1/headscale.proto b/proto/headscale/v1/headscale.proto
index 2e6b0a67..26fe2f96 100644
--- a/proto/headscale/v1/headscale.proto
+++ b/proto/headscale/v1/headscale.proto
@@ -2,86 +2,19 @@ syntax = "proto3";
package headscale.v1;
option go_package = "github.com/juanfont/headscale/gen/go/v1";
-import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
-enum RegisterMethod {
- REGISTER_METHOD_UNSPECIFIED = 0;
- REGISTER_METHOD_AUTH_KEY = 1;
- REGISTER_METHOD_CLI = 2;
- REGISTER_METHOD_OIDC = 3;
-}
-
-// message PreAuthKey {
-// uint64 id = 1;
-// string key = 2;
-// uint32 namespace_id = 3;
-// Namespace namespace = 4;
-// bool reusable = 5;
-// bool ephemeral = 6;
-// bool used = 7;
-//
-// google.protobuf.Timestamp created_at = 8;
-// google.protobuf.Timestamp expiration = 9;
-// }
-
-message GetMachineRequest {
- uint64 machine_id = 1;
-}
-
-message GetMachineResponse {
- uint64 id = 1;
- string machine_key = 2;
- string node_key = 3;
- string disco_key = 4;
- string ip_address = 5;
- string name = 6;
- uint32 namespace_id = 7;
-
- bool registered = 8;
- RegisterMethod register_method = 9;
- uint32 auth_key_id = 10;
- // PreAuthKey auth_key = 11;
-
- google.protobuf.Timestamp last_seen = 12;
- google.protobuf.Timestamp last_successful_update = 13;
- google.protobuf.Timestamp expiry = 14;
-
- // bytes host_info = 15;
- // bytes endpoints = 16;
- // bytes enabled_routes = 17;
-
- // google.protobuf.Timestamp created_at = 18;
- // google.protobuf.Timestamp updated_at = 19;
- // google.protobuf.Timestamp deleted_at = 20;
-}
-
-message CreateNamespaceRequest {
- string name = 1;
-}
-
-message CreateNamespaceResponse {
- string name = 1;
-}
-
-message DeleteNamespaceRequest {
- string name = 1;
-}
-
-message DeleteNamespaceResponse {
-}
-
-message ListNamespacesRequest {
-}
-
-message ListNamespacesResponse {
- repeated string namespaces = 1;
-}
+import "headscale/v1/namespace.proto";
+import "headscale/v1/preauthkey.proto";
+import "headscale/v1/machine.proto";
+import "headscale/v1/routes.proto";
+// import "headscale/v1/device.proto";
service HeadscaleService {
- rpc GetMachine(GetMachineRequest) returns(GetMachineResponse) {
+ // --- Namespace start ---
+ rpc GetNamespace(GetNamespaceRequest) returns(GetNamespaceResponse) {
option(google.api.http) = {
- get : "/api/v1/machine/{machine_id}"
+ get : "/api/v1/namespace/{name}"
};
}
@@ -92,9 +25,15 @@ service HeadscaleService {
};
}
+ rpc RenameNamespace(RenameNamespaceRequest) returns(RenameNamespaceResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/namespace/{old_name}/rename/{new_name}"
+ };
+ }
+
rpc DeleteNamespace(DeleteNamespaceRequest) returns(DeleteNamespaceResponse) {
option(google.api.http) = {
- delete : "/api/v1/namespace"
+ delete : "/api/v1/namespace/{name}"
};
}
@@ -103,4 +42,111 @@ service HeadscaleService {
get : "/api/v1/namespace"
};
}
+ // --- Namespace end ---
+
+ // --- PreAuthKeys start ---
+ rpc CreatePreAuthKey(CreatePreAuthKeyRequest) returns(CreatePreAuthKeyResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/preauthkey"
+ body : "*"
+ };
+ }
+
+ rpc ExpirePreAuthKey(ExpirePreAuthKeyRequest) returns(ExpirePreAuthKeyResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/preauthkey/expire"
+ body : "*"
+ };
+ }
+
+ rpc ListPreAuthKeys(ListPreAuthKeysRequest) returns(ListPreAuthKeysResponse) {
+ option(google.api.http) = {
+ get : "/api/v1/preauthkey"
+ };
+ }
+ // --- PreAuthKeys end ---
+
+ // --- Machine start ---
+ rpc DebugCreateMachine(DebugCreateMachineRequest) returns(DebugCreateMachineResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/debug/machine"
+ body : "*"
+ };
+ }
+
+ rpc GetMachine(GetMachineRequest) returns(GetMachineResponse) {
+ option(google.api.http) = {
+ get : "/api/v1/machine/{machine_id}"
+ };
+ }
+
+ rpc RegisterMachine(RegisterMachineRequest) returns(RegisterMachineResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/machine/register"
+ };
+ }
+
+ rpc DeleteMachine(DeleteMachineRequest) returns(DeleteMachineResponse) {
+ option(google.api.http) = {
+ delete : "/api/v1/machine/{machine_id}"
+ };
+ }
+
+ rpc ListMachines(ListMachinesRequest) returns(ListMachinesResponse) {
+ option(google.api.http) = {
+ get : "/api/v1/machine"
+ };
+ }
+
+ rpc ShareMachine(ShareMachineRequest) returns(ShareMachineResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/machine/{machine_id}/share/{namespace}"
+ };
+ }
+
+ rpc UnshareMachine(UnshareMachineRequest) returns(UnshareMachineResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/machine/{machine_id}/unshare/{namespace}"
+ };
+ }
+ // --- Machine end ---
+
+ // --- Route start ---
+ rpc GetMachineRoute(GetMachineRouteRequest) returns(GetMachineRouteResponse) {
+ option(google.api.http) = {
+ get : "/api/v1/machine/{machine_id}/routes"
+ };
+ }
+
+ rpc EnableMachineRoutes(EnableMachineRoutesRequest) returns(EnableMachineRoutesResponse) {
+ option(google.api.http) = {
+ post : "/api/v1/machine/{machine_id}/routes"
+ };
+ }
+ // --- Route end ---
+
+ // Implement Tailscale API
+ // rpc GetDevice(GetDeviceRequest) returns(GetDeviceResponse) {
+ // option(google.api.http) = {
+ // get : "/api/v1/device/{id}"
+ // };
+ // }
+
+ // rpc DeleteDevice(DeleteDeviceRequest) returns(DeleteDeviceResponse) {
+ // option(google.api.http) = {
+ // delete : "/api/v1/device/{id}"
+ // };
+ // }
+
+ // rpc GetDeviceRoutes(GetDeviceRoutesRequest) returns(GetDeviceRoutesResponse) {
+ // option(google.api.http) = {
+ // get : "/api/v1/device/{id}/routes"
+ // };
+ // }
+
+ // rpc EnableDeviceRoutes(EnableDeviceRoutesRequest) returns(EnableDeviceRoutesResponse) {
+ // option(google.api.http) = {
+ // post : "/api/v1/device/{id}/routes"
+ // };
+ // }
}
diff --git a/proto/headscale/v1/machine.proto b/proto/headscale/v1/machine.proto
new file mode 100644
index 00000000..4e53c4ad
--- /dev/null
+++ b/proto/headscale/v1/machine.proto
@@ -0,0 +1,102 @@
+syntax = "proto3";
+package headscale.v1;
+option go_package = "github.com/juanfont/headscale/gen/go/v1";
+
+import "google/protobuf/timestamp.proto";
+import "headscale/v1/namespace.proto";
+import "headscale/v1/preauthkey.proto";
+
+enum RegisterMethod {
+ REGISTER_METHOD_UNSPECIFIED = 0;
+ REGISTER_METHOD_AUTH_KEY = 1;
+ REGISTER_METHOD_CLI = 2;
+ REGISTER_METHOD_OIDC = 3;
+}
+
+message Machine {
+ uint64 id = 1;
+ string machine_key = 2;
+ string node_key = 3;
+ string disco_key = 4;
+ string ip_address = 5;
+ string name = 6;
+ Namespace namespace = 7;
+
+ bool registered = 8;
+ RegisterMethod register_method = 9;
+
+ google.protobuf.Timestamp last_seen = 10;
+ google.protobuf.Timestamp last_successful_update = 11;
+ google.protobuf.Timestamp expiry = 12;
+
+ PreAuthKey pre_auth_key = 13;
+
+ google.protobuf.Timestamp created_at = 14;
+ // google.protobuf.Timestamp updated_at = 14;
+ // google.protobuf.Timestamp deleted_at = 15;
+
+ // bytes host_info = 15;
+ // bytes endpoints = 16;
+ // bytes enabled_routes = 17;
+}
+
+message RegisterMachineRequest {
+ string namespace = 1;
+ string key = 2;
+}
+
+message RegisterMachineResponse {
+ Machine machine = 1;
+}
+
+message GetMachineRequest {
+ uint64 machine_id = 1;
+}
+
+message GetMachineResponse {
+ Machine machine = 1;
+}
+
+message DeleteMachineRequest {
+ uint64 machine_id = 1;
+}
+
+message DeleteMachineResponse {
+}
+
+message ListMachinesRequest {
+ string namespace = 1;
+}
+
+message ListMachinesResponse {
+ repeated Machine machines = 1;
+}
+
+message ShareMachineRequest {
+ uint64 machine_id = 1;
+ string namespace = 2;
+}
+
+message ShareMachineResponse {
+ Machine machine = 1;
+}
+
+message UnshareMachineRequest {
+ uint64 machine_id = 1;
+ string namespace = 2;
+}
+
+message UnshareMachineResponse {
+ Machine machine = 1;
+}
+
+message DebugCreateMachineRequest {
+ string namespace = 1;
+ string key = 2;
+ string name = 3;
+ repeated string routes = 4;
+}
+
+message DebugCreateMachineResponse {
+ Machine machine = 1;
+}
diff --git a/proto/headscale/v1/namespace.proto b/proto/headscale/v1/namespace.proto
new file mode 100644
index 00000000..997b74c3
--- /dev/null
+++ b/proto/headscale/v1/namespace.proto
@@ -0,0 +1,50 @@
+syntax = "proto3";
+package headscale.v1;
+option go_package = "github.com/juanfont/headscale/gen/go/v1";
+
+import "google/protobuf/timestamp.proto";
+
+message Namespace {
+ string id = 1;
+ string name = 2;
+ google.protobuf.Timestamp created_at = 3;
+}
+
+message GetNamespaceRequest {
+ string name = 1;
+}
+
+message GetNamespaceResponse {
+ Namespace namespace = 1;
+}
+
+message CreateNamespaceRequest {
+ string name = 1;
+}
+
+message CreateNamespaceResponse {
+ Namespace namespace = 1;
+}
+
+message RenameNamespaceRequest {
+ string old_name = 1;
+ string new_name = 2;
+}
+
+message RenameNamespaceResponse {
+ Namespace namespace = 1;
+}
+
+message DeleteNamespaceRequest {
+ string name = 1;
+}
+
+message DeleteNamespaceResponse {
+}
+
+message ListNamespacesRequest {
+}
+
+message ListNamespacesResponse {
+ repeated Namespace namespaces = 1;
+}
diff --git a/proto/headscale/v1/preauthkey.proto b/proto/headscale/v1/preauthkey.proto
new file mode 100644
index 00000000..a945ba01
--- /dev/null
+++ b/proto/headscale/v1/preauthkey.proto
@@ -0,0 +1,43 @@
+syntax = "proto3";
+package headscale.v1;
+option go_package = "github.com/juanfont/headscale/gen/go/v1";
+
+import "google/protobuf/timestamp.proto";
+
+message PreAuthKey {
+ string namespace = 1;
+ string id = 2;
+ string key = 3;
+ bool reusable = 4;
+ bool ephemeral = 5;
+ bool used = 6;
+ google.protobuf.Timestamp expiration = 7;
+ google.protobuf.Timestamp created_at = 8;
+}
+
+message CreatePreAuthKeyRequest {
+ string namespace = 1;
+ bool reusable = 2;
+ bool ephemeral = 3;
+ google.protobuf.Timestamp expiration = 4;
+}
+
+message CreatePreAuthKeyResponse {
+ PreAuthKey pre_auth_key = 1;
+}
+
+message ExpirePreAuthKeyRequest {
+ string namespace = 1;
+ string key = 2;
+}
+
+message ExpirePreAuthKeyResponse {
+}
+
+message ListPreAuthKeysRequest {
+ string namespace = 1;
+}
+
+message ListPreAuthKeysResponse {
+ repeated PreAuthKey pre_auth_keys = 1;
+}
diff --git a/proto/headscale/v1/routes.proto b/proto/headscale/v1/routes.proto
new file mode 100644
index 00000000..353c4294
--- /dev/null
+++ b/proto/headscale/v1/routes.proto
@@ -0,0 +1,25 @@
+syntax = "proto3";
+package headscale.v1;
+option go_package = "github.com/juanfont/headscale/gen/go/v1";
+
+message Routes {
+ repeated string advertised_routes = 1;
+ repeated string enabled_routes = 2;
+}
+
+message GetMachineRouteRequest {
+ uint64 machine_id = 1;
+}
+
+message GetMachineRouteResponse {
+ Routes routes = 1;
+}
+
+message EnableMachineRoutesRequest {
+ uint64 machine_id = 1;
+ repeated string routes = 2;
+}
+
+message EnableMachineRoutesResponse {
+ Routes routes = 1;
+}
diff --git a/routes.go b/routes.go
index 0ef01780..f07b709a 100644
--- a/routes.go
+++ b/routes.go
@@ -3,13 +3,12 @@ package headscale
import (
"encoding/json"
"fmt"
- "strconv"
- "github.com/pterm/pterm"
"gorm.io/datatypes"
"inet.af/netaddr"
)
+// Deprecated: use machine function instead
// GetAdvertisedNodeRoutes returns the subnet routes advertised by a node (identified by
// namespace and node name)
func (h *Headscale) GetAdvertisedNodeRoutes(namespace string, nodeName string) (*[]netaddr.IPPrefix, error) {
@@ -25,6 +24,7 @@ func (h *Headscale) GetAdvertisedNodeRoutes(namespace string, nodeName string) (
return &hostInfo.RoutableIPs, nil
}
+// Deprecated: use machine function instead
// GetEnabledNodeRoutes returns the subnet routes enabled by a node (identified by
// namespace and node name)
func (h *Headscale) GetEnabledNodeRoutes(namespace string, nodeName string) ([]netaddr.IPPrefix, error) {
@@ -56,6 +56,7 @@ func (h *Headscale) GetEnabledNodeRoutes(namespace string, nodeName string) ([]n
return routes, nil
}
+// Deprecated: use machine function instead
// IsNodeRouteEnabled checks if a certain route has been enabled
func (h *Headscale) IsNodeRouteEnabled(namespace string, nodeName string, routeStr string) bool {
route, err := netaddr.ParseIPPrefix(routeStr)
@@ -76,6 +77,7 @@ func (h *Headscale) IsNodeRouteEnabled(namespace string, nodeName string, routeS
return false
}
+// Deprecated: use EnableRoute in machine.go
// EnableNodeRoute enables a subnet route advertised by a node (identified by
// namespace and node name)
func (h *Headscale) EnableNodeRoute(namespace string, nodeName string, routeStr string) error {
@@ -129,15 +131,3 @@ func (h *Headscale) EnableNodeRoute(namespace string, nodeName string, routeStr
return nil
}
-
-// RoutesToPtables converts the list of routes to a nice table
-func (h *Headscale) RoutesToPtables(namespace string, nodeName string, availableRoutes []netaddr.IPPrefix) pterm.TableData {
- d := pterm.TableData{{"Route", "Enabled"}}
-
- for _, route := range availableRoutes {
- enabled := h.IsNodeRouteEnabled(namespace, nodeName, route.String())
-
- d = append(d, []string{route.String(), strconv.FormatBool(enabled)})
- }
- return d
-}
diff --git a/sharing_test.go b/sharing_test.go
index 1133fd92..4d9e4092 100644
--- a/sharing_test.go
+++ b/sharing_test.go
@@ -35,8 +35,20 @@ func CreateNodeNamespace(c *check.C, namespace, node, key, IP string) (*Namespac
}
func (s *Suite) TestBasicSharedNodesInNamespace(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_get_shared_nodes_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_get_shared_nodes_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
p1s, err := h.getPeers(m1)
c.Assert(err, check.IsNil)
@@ -52,7 +64,13 @@ func (s *Suite) TestBasicSharedNodesInNamespace(c *check.C) {
}
func (s *Suite) TestSameNamespace(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
p1s, err := h.getPeers(m1)
c.Assert(err, check.IsNil)
@@ -63,8 +81,20 @@ func (s *Suite) TestSameNamespace(c *check.C) {
}
func (s *Suite) TestUnshare(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_unshare_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_unshare_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_unshare_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_unshare_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
p1s, err := h.getPeers(m1)
c.Assert(err, check.IsNil)
@@ -92,8 +122,20 @@ func (s *Suite) TestUnshare(c *check.C) {
}
func (s *Suite) TestAlreadyShared(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_get_shared_nodes_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_get_shared_nodes_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
p1s, err := h.getPeers(m1)
c.Assert(err, check.IsNil)
@@ -106,8 +148,20 @@ func (s *Suite) TestAlreadyShared(c *check.C) {
}
func (s *Suite) TestDoNotIncludeRoutesOnShared(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_get_shared_nodes_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_get_shared_nodes_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
p1s, err := h.getPeers(m1)
c.Assert(err, check.IsNil)
@@ -123,9 +177,27 @@ func (s *Suite) TestDoNotIncludeRoutesOnShared(c *check.C) {
}
func (s *Suite) TestComplexSharingAcrossNamespaces(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_get_shared_nodes_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
- _, m3 := CreateNodeNamespace(c, "shared3", "test_get_shared_nodes_3", "6e704bee83eb93db6fc2c417d7882964cd3f8cc87082cbb645982e34020c76c8", "100.64.0.3")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_get_shared_nodes_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
+ _, m3 := CreateNodeNamespace(
+ c,
+ "shared3",
+ "test_get_shared_nodes_3",
+ "6e704bee83eb93db6fc2c417d7882964cd3f8cc87082cbb645982e34020c76c8",
+ "100.64.0.3",
+ )
pak4, err := h.CreatePreAuthKey(n1.Name, false, false, nil)
c.Assert(err, check.IsNil)
@@ -172,15 +244,37 @@ func (s *Suite) TestComplexSharingAcrossNamespaces(c *check.C) {
pSharedTo, err := h.getPeers(m2)
c.Assert(err, check.IsNil)
- c.Assert(len(pSharedTo), check.Equals, 2) // node2 should see node1 (sharedTo) and node4 (sharedTo), as is shared in namespace1
+ c.Assert(
+ len(pSharedTo),
+ check.Equals,
+ 2,
+ ) // node2 should see node1 (sharedTo) and node4 (sharedTo), as is shared in namespace1
c.Assert(pSharedTo[0].Name, check.Equals, m1.Name)
c.Assert(pSharedTo[1].Name, check.Equals, m4.Name)
}
func (s *Suite) TestDeleteSharedMachine(c *check.C) {
- n1, m1 := CreateNodeNamespace(c, "shared1", "test_get_shared_nodes_1", "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66", "100.64.0.1")
- _, m2 := CreateNodeNamespace(c, "shared2", "test_get_shared_nodes_2", "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863", "100.64.0.2")
- _, m3 := CreateNodeNamespace(c, "shared3", "test_get_shared_nodes_3", "6e704bee83eb93db6fc2c417d7882964cd3f8cc87082cbb645982e34020c76c8", "100.64.0.3")
+ n1, m1 := CreateNodeNamespace(
+ c,
+ "shared1",
+ "test_get_shared_nodes_1",
+ "686824e749f3b7f2a5927ee6c1e422aee5292592d9179a271ed7b3e659b44a66",
+ "100.64.0.1",
+ )
+ _, m2 := CreateNodeNamespace(
+ c,
+ "shared2",
+ "test_get_shared_nodes_2",
+ "dec46ef9dc45c7d2f03bfcd5a640d9e24e3cc68ce3d9da223867c9bc6d5e9863",
+ "100.64.0.2",
+ )
+ _, m3 := CreateNodeNamespace(
+ c,
+ "shared3",
+ "test_get_shared_nodes_3",
+ "6e704bee83eb93db6fc2c417d7882964cd3f8cc87082cbb645982e34020c76c8",
+ "100.64.0.3",
+ )
pak4n1, err := h.CreatePreAuthKey(n1.Name, false, false, nil)
c.Assert(err, check.IsNil)
@@ -226,12 +320,12 @@ func (s *Suite) TestDeleteSharedMachine(c *check.C) {
sharedMachines, err := h.ListSharedMachinesInNamespace(n1.Name)
c.Assert(err, check.IsNil)
- c.Assert(len(*sharedMachines), check.Equals, 1)
+ c.Assert(len(sharedMachines), check.Equals, 1)
err = h.DeleteMachine(m2)
c.Assert(err, check.IsNil)
sharedMachines, err = h.ListSharedMachinesInNamespace(n1.Name)
c.Assert(err, check.IsNil)
- c.Assert(len(*sharedMachines), check.Equals, 0)
+ c.Assert(len(sharedMachines), check.Equals, 0)
}
diff --git a/utils.go b/utils.go
index 555227ec..ad0a72d7 100644
--- a/utils.go
+++ b/utils.go
@@ -163,3 +163,38 @@ func GrpcSocketDialer(ctx context.Context, addr string) (net.Conn, error) {
var d net.Dialer
return d.DialContext(ctx, "unix", addr)
}
+
+func ipPrefixToString(prefixes []netaddr.IPPrefix) []string {
+ result := make([]string, len(prefixes))
+
+ for index, prefix := range prefixes {
+ result[index] = prefix.String()
+ }
+
+ return result
+}
+
+func stringToIpPrefix(prefixes []string) ([]netaddr.IPPrefix, error) {
+ result := make([]netaddr.IPPrefix, len(prefixes))
+
+ for index, prefixStr := range prefixes {
+ prefix, err := netaddr.ParseIPPrefix(prefixStr)
+ if err != nil {
+ return []netaddr.IPPrefix{}, err
+ }
+
+ result[index] = prefix
+ }
+
+ return result, nil
+}
+
+func containsIpPrefix(prefixes []netaddr.IPPrefix, prefix netaddr.IPPrefix) bool {
+ for _, p := range prefixes {
+ if prefix == p {
+ return true
+ }
+ }
+
+ return false
+}