mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/main' into feat-list-tags-of-machines
This commit is contained in:
		
						commit
						a2fb5b2b9d
					
				
							
								
								
									
										17
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @ -22,30 +22,21 @@ jobs: | ||||
|         uses: tj-actions/changed-files@v14.1 | ||||
|         with: | ||||
|           files: | | ||||
|             *.nix | ||||
|             go.* | ||||
|             **/*.go | ||||
|             integration_test/ | ||||
|             config-example.yaml | ||||
| 
 | ||||
|       - name: Setup Go | ||||
|       - uses: cachix/install-nix-action@v16 | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         uses: actions/setup-go@v2 | ||||
|         with: | ||||
|           go-version: "1.18.0" | ||||
| 
 | ||||
|       - name: Install dependencies | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: | | ||||
|           go version | ||||
|           sudo apt update | ||||
|           sudo apt install -y make | ||||
| 
 | ||||
|       - name: Run build | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: make build | ||||
|         run: nix build | ||||
| 
 | ||||
|       - uses: actions/upload-artifact@v2 | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         with: | ||||
|           name: headscale-linux | ||||
|           path: headscale | ||||
|           path: result/bin/headscale | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,6 +16,7 @@ jobs: | ||||
|         uses: tj-actions/changed-files@v14.1 | ||||
|         with: | ||||
|           files: | | ||||
|             *.nix | ||||
|             go.* | ||||
|             **/*.go | ||||
|             integration_test/ | ||||
| @ -45,6 +46,7 @@ jobs: | ||||
|         uses: tj-actions/changed-files@v14.1 | ||||
|         with: | ||||
|           files: | | ||||
|             *.nix | ||||
|             **/*.md | ||||
|             **/*.yml | ||||
|             **/*.yaml | ||||
|  | ||||
							
								
								
									
										8
									
								
								.github/workflows/test-integration.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/test-integration.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,17 +16,15 @@ jobs: | ||||
|         uses: tj-actions/changed-files@v14.1 | ||||
|         with: | ||||
|           files: | | ||||
|             *.nix | ||||
|             go.* | ||||
|             **/*.go | ||||
|             integration_test/ | ||||
|             config-example.yaml | ||||
| 
 | ||||
|       - name: Setup Go | ||||
|       - uses: cachix/install-nix-action@v16 | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         uses: actions/setup-go@v2 | ||||
|         with: | ||||
|           go-version: "1.18.0" | ||||
| 
 | ||||
|       - name: Run Integration tests | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: make test_integration | ||||
|         run: nix develop --command -- make test_integration | ||||
|  | ||||
							
								
								
									
										19
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,28 +16,15 @@ jobs: | ||||
|         uses: tj-actions/changed-files@v14.1 | ||||
|         with: | ||||
|           files: | | ||||
|             *.nix | ||||
|             go.* | ||||
|             **/*.go | ||||
|             integration_test/ | ||||
|             config-example.yaml | ||||
| 
 | ||||
|       - name: Setup Go | ||||
|       - uses: cachix/install-nix-action@v16 | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         uses: actions/setup-go@v2 | ||||
|         with: | ||||
|           go-version: "1.18.0" | ||||
| 
 | ||||
|       - name: Install dependencies | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: | | ||||
|           go version | ||||
|           sudo apt update | ||||
|           sudo apt install -y make | ||||
| 
 | ||||
|       - name: Run tests | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: make test | ||||
| 
 | ||||
|       - name: Run build | ||||
|         if: steps.changed-files.outputs.any_changed == 'true' | ||||
|         run: make | ||||
|         run: nix develop --check | ||||
|  | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -28,6 +28,6 @@ derp.yaml | ||||
| 
 | ||||
| test_output/  | ||||
| 
 | ||||
| # Nix and direnv | ||||
| .direnv/ | ||||
| # Nix build output | ||||
| result | ||||
| .direnv/ | ||||
|  | ||||
| @ -7,6 +7,9 @@ | ||||
| - Headscale fails to serve if the ACL policy file cannot be parsed [#537](https://github.com/juanfont/headscale/pull/537) | ||||
| - Fix labels cardinality error when registering unknown pre-auth key [#519](https://github.com/juanfont/headscale/pull/519) | ||||
| - Fix send on closed channel crash in polling [#542](https://github.com/juanfont/headscale/pull/542) | ||||
| - Fixed spurious calls to setLastStateChangeToNow from ephemeral nodes [#566](https://github.com/juanfont/headscale/pull/566) | ||||
| - Add command for moving nodes between namespaces [#362](https://github.com/juanfont/headscale/issues/362) | ||||
| - Added more configuration parameters for OpenID Connect (scopes, free-form paramters, domain and user allowlist) | ||||
| 
 | ||||
| ## 0.15.0 (2022-03-20) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										43
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								README.md
									
									
									
									
									
								
							| @ -91,6 +91,10 @@ Please have a look at the documentation under [`docs/`](docs/). | ||||
| To contribute to headscale you would need the lastest version of [Go](https://golang.org) | ||||
| and [Buf](https://buf.build)(Protobuf generator). | ||||
| 
 | ||||
| We recommend using [Nix](https://nixos.org/) to setup a development environment. This can | ||||
| be done with `nix develop`, which will install the tools and give you a shell. | ||||
| This guarantees that you will have the same dev env as `headscale` maintainers. | ||||
| 
 | ||||
| PRs and suggestions are welcome. | ||||
| 
 | ||||
| ### Code style | ||||
| @ -115,10 +119,12 @@ Check out the `.golangci.yaml` and `Makefile` to see the specific configuration. | ||||
| 
 | ||||
| - Go | ||||
| - Buf | ||||
| - Protobuf tools: | ||||
| - Protobuf tools | ||||
| 
 | ||||
| Install and activate: | ||||
| 
 | ||||
| ```shell | ||||
| make install-protobuf-plugins | ||||
| nix develop | ||||
| ``` | ||||
| 
 | ||||
| ### Testing and building | ||||
| @ -140,6 +146,12 @@ make test | ||||
| 
 | ||||
| To build the program: | ||||
| 
 | ||||
| ```shell | ||||
| nix build | ||||
| ``` | ||||
| 
 | ||||
| or | ||||
| 
 | ||||
| ```shell | ||||
| make build | ||||
| ``` | ||||
| @ -338,6 +350,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Abraham Ingersoll</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/apognu> | ||||
|             <img src=https://avatars.githubusercontent.com/u/3017182?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Antoine POPINEAU/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Antoine POPINEAU</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/aofei> | ||||
|             <img src=https://avatars.githubusercontent.com/u/5037285?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Aofei Sheng/> | ||||
| @ -359,6 +378,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Bryan Stenson</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/yangchuansheng> | ||||
|             <img src=https://avatars.githubusercontent.com/u/15308462?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt= Carson Yang/> | ||||
| @ -366,8 +387,6 @@ make build | ||||
|             <sub style="font-size:14px"><b> Carson Yang</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/fkr> | ||||
|             <img src=https://avatars.githubusercontent.com/u/51063?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Felix Kronlage-Dammers/> | ||||
| @ -403,6 +422,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Jim Tittsler</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/piec> | ||||
|             <img src=https://avatars.githubusercontent.com/u/781471?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Pierre Carru/> | ||||
| @ -410,8 +431,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Pierre Carru</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/rcursaru> | ||||
|             <img src=https://avatars.githubusercontent.com/u/16259641?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=rcursaru/> | ||||
| @ -447,6 +466,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Tanner</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/Teteros> | ||||
|             <img src=https://avatars.githubusercontent.com/u/5067989?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Teteros/> | ||||
| @ -454,8 +475,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Teteros</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/gitter-badger> | ||||
|             <img src=https://avatars.githubusercontent.com/u/8518239?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=The Gitter Badger/> | ||||
| @ -491,6 +510,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Zakhar Bessarab</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/Bpazy> | ||||
|             <img src=https://avatars.githubusercontent.com/u/9838749?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=ZiYuan/> | ||||
| @ -498,8 +519,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>ZiYuan</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/bravechamp> | ||||
|             <img src=https://avatars.githubusercontent.com/u/48980452?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=bravechamp/> | ||||
| @ -535,6 +554,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>lion24</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/pernila> | ||||
|             <img src=https://avatars.githubusercontent.com/u/12460060?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=pernila/> | ||||
| @ -542,8 +563,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>pernila</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/Wakeful-Cloud> | ||||
|             <img src=https://avatars.githubusercontent.com/u/38930607?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Wakeful-Cloud/> | ||||
|  | ||||
							
								
								
									
										10
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								app.go
									
									
									
									
									
								
							| @ -119,6 +119,10 @@ type OIDCConfig struct { | ||||
| 	Issuer           string | ||||
| 	ClientID         string | ||||
| 	ClientSecret     string | ||||
| 	Scope            []string | ||||
| 	ExtraParams      map[string]string | ||||
| 	AllowedDomains   []string | ||||
| 	AllowedUsers     []string | ||||
| 	StripEmaildomain bool | ||||
| } | ||||
| 
 | ||||
| @ -292,11 +296,13 @@ func (h *Headscale) expireEphemeralNodesWorker() { | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		expiredFound := false | ||||
| 		for _, machine := range machines { | ||||
| 			if machine.AuthKey != nil && machine.LastSeen != nil && | ||||
| 				machine.AuthKey.Ephemeral && | ||||
| 				time.Now(). | ||||
| 					After(machine.LastSeen.Add(h.cfg.EphemeralNodeInactivityTimeout)) { | ||||
| 				expiredFound = true | ||||
| 				log.Info(). | ||||
| 					Str("machine", machine.Name). | ||||
| 					Msg("Ephemeral client removed from database") | ||||
| @ -311,7 +317,9 @@ func (h *Headscale) expireEphemeralNodesWorker() { | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		h.setLastStateChangeToNow(namespace.Name) | ||||
| 		if expiredFound { | ||||
| 			h.setLastStateChangeToNow(namespace.Name) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -47,15 +47,29 @@ func init() { | ||||
| 	} | ||||
| 	nodeCmd.AddCommand(deleteNodeCmd) | ||||
| 
 | ||||
| 	nodeCmd.AddCommand(tagCmd) | ||||
| 	setTagCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||
| 	err = setTagCmd.MarkFlagRequired("identifier") | ||||
| 	moveNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||
| 
 | ||||
| 	err = moveNodeCmd.MarkFlagRequired("identifier") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 	setTagCmd.Flags(). | ||||
| 		StringSliceP("tags", "t", []string{}, "List of tags to add to the node") | ||||
| 	tagCmd.AddCommand(setTagCmd) | ||||
| 
 | ||||
| 	moveNodeCmd.Flags().StringP("namespace", "n", "", "New namespace") | ||||
| 
 | ||||
| 	err = moveNodeCmd.MarkFlagRequired("namespace") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 	nodeCmd.AddCommand(moveNodeCmd) | ||||
| 
 | ||||
| 	tagCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||
| 
 | ||||
| 	err = tagCmd.MarkFlagRequired("identifier") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 	tagCmd.Flags().StringSliceP("tags", "t", []string{}, "List of tags to add to the node") | ||||
| 	nodeCmd.AddCommand(tagCmd) | ||||
| } | ||||
| 
 | ||||
| var nodeCmd = &cobra.Command{ | ||||
| @ -306,6 +320,80 @@ var deleteNodeCmd = &cobra.Command{ | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| var moveNodeCmd = &cobra.Command{ | ||||
| 	Use:     "move", | ||||
| 	Short:   "Move node to another namespace", | ||||
| 	Aliases: []string{"mv"}, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		output, _ := cmd.Flags().GetString("output") | ||||
| 
 | ||||
| 		identifier, err := cmd.Flags().GetUint64("identifier") | ||||
| 		if err != nil { | ||||
| 			ErrorOutput( | ||||
| 				err, | ||||
| 				fmt.Sprintf("Error converting ID to integer: %s", err), | ||||
| 				output, | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		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() | ||||
| 
 | ||||
| 		getRequest := &v1.GetMachineRequest{ | ||||
| 			MachineId: identifier, | ||||
| 		} | ||||
| 
 | ||||
| 		_, err = client.GetMachine(ctx, getRequest) | ||||
| 		if err != nil { | ||||
| 			ErrorOutput( | ||||
| 				err, | ||||
| 				fmt.Sprintf( | ||||
| 					"Error getting node: %s", | ||||
| 					status.Convert(err).Message(), | ||||
| 				), | ||||
| 				output, | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		moveRequest := &v1.MoveMachineRequest{ | ||||
| 			MachineId: identifier, | ||||
| 			Namespace: namespace, | ||||
| 		} | ||||
| 
 | ||||
| 		moveResponse, err := client.MoveMachine(ctx, moveRequest) | ||||
| 		if err != nil { | ||||
| 			ErrorOutput( | ||||
| 				err, | ||||
| 				fmt.Sprintf( | ||||
| 					"Error moving node: %s", | ||||
| 					status.Convert(err).Message(), | ||||
| 				), | ||||
| 				output, | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		SuccessOutput(moveResponse.Machine, "Node moved to another namespace", output) | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| func nodesToPtables( | ||||
| 	currentNamespace string, | ||||
| 	machines []*v1.Machine, | ||||
| @ -411,14 +499,9 @@ func nodesToPtables( | ||||
| } | ||||
| 
 | ||||
| var tagCmd = &cobra.Command{ | ||||
| 	Use:     "tags", | ||||
| 	Short:   "Manage the tags of Headscale", | ||||
| 	Aliases: []string{"t", "tag"}, | ||||
| } | ||||
| 
 | ||||
| var setTagCmd = &cobra.Command{ | ||||
| 	Use:   "set", | ||||
| 	Short: "set tags to a node in your network", | ||||
| 	Use:     "tag", | ||||
| 	Short:   "Manage the tags of a node", | ||||
| 	Aliases: []string{"tags", "t"}, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		output, _ := cmd.Flags().GetString("output") | ||||
| 		ctx, client, conn, cancel := getHeadscaleCLIClient() | ||||
|  | ||||
| @ -15,6 +15,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/coreos/go-oidc/v3/oidc" | ||||
| 	"github.com/juanfont/headscale" | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| @ -68,6 +69,7 @@ func LoadConfig(path string) error { | ||||
| 	viper.SetDefault("cli.timeout", "5s") | ||||
| 	viper.SetDefault("cli.insecure", false) | ||||
| 
 | ||||
| 	viper.SetDefault("oidc.scope", []string{oidc.ScopeOpenID, "profile", "email"}) | ||||
| 	viper.SetDefault("oidc.strip_email_domain", true) | ||||
| 
 | ||||
| 	if err := viper.ReadInConfig(); err != nil { | ||||
| @ -369,6 +371,10 @@ func getHeadscaleConfig() headscale.Config { | ||||
| 			Issuer:           viper.GetString("oidc.issuer"), | ||||
| 			ClientID:         viper.GetString("oidc.client_id"), | ||||
| 			ClientSecret:     viper.GetString("oidc.client_secret"), | ||||
| 			Scope:            viper.GetStringSlice("oidc.scope"), | ||||
| 			ExtraParams:      viper.GetStringMapString("oidc.extra_params"), | ||||
| 			AllowedDomains:   viper.GetStringSlice("oidc.allowed_domains"), | ||||
| 			AllowedUsers:     viper.GetStringSlice("oidc.allowed_users"), | ||||
| 			StripEmaildomain: viper.GetBool("oidc.strip_email_domain"), | ||||
| 		}, | ||||
| 
 | ||||
|  | ||||
| @ -214,6 +214,21 @@ unix_socket_permission: "0770" | ||||
| #   client_id: "your-oidc-client-id" | ||||
| #   client_secret: "your-oidc-client-secret" | ||||
| # | ||||
| #   Customize the scopes used in the OIDC flow, defaults to "openid", "profile" and "email" and add custom query | ||||
| #   parameters to the Authorize Endpoint request. Scopes default to "openid", "profile" and "email". | ||||
| # | ||||
| #   scope: ["openid", "profile", "email", "custom"] | ||||
| #   extra_params: | ||||
| #     domain_hint: example.com | ||||
| # | ||||
| #   List allowed principal domains and/or users. If an authenticated user's domain is not in this list, the | ||||
| #   authentication request will be rejected. | ||||
| # | ||||
| #   allowed_domains: | ||||
| #     - example.com | ||||
| #   allowed_users: | ||||
| #     - alice@example.com | ||||
| # | ||||
| #   If `strip_email_domain` is set to `true`, the domain part of the username email address will be removed. | ||||
| #   This will transform `first-name.last-name@example.com` to the namespace `first-name.last-name` | ||||
| #   If `strip_email_domain` is set to `false` the domain part will NOT be removed resulting to the following | ||||
|  | ||||
							
								
								
									
										42
									
								
								flake.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								flake.lock
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| { | ||||
|   "nodes": { | ||||
|     "flake-utils": { | ||||
|       "locked": { | ||||
|         "lastModified": 1644229661, | ||||
|         "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", | ||||
|         "owner": "numtide", | ||||
|         "repo": "flake-utils", | ||||
|         "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "numtide", | ||||
|         "repo": "flake-utils", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "nixpkgs": { | ||||
|       "locked": { | ||||
|         "lastModified": 1647536224, | ||||
|         "narHash": "sha256-SUIiz4DhMXgM7i+hvFWmLnhywr1WeRGIz+EIbwQQguM=", | ||||
|         "owner": "NixOS", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "dd8cebebbf0f9352501f251ac37b851d947f92dc", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "id": "nixpkgs", | ||||
|         "ref": "master", | ||||
|         "type": "indirect" | ||||
|       } | ||||
|     }, | ||||
|     "root": { | ||||
|       "inputs": { | ||||
|         "flake-utils": "flake-utils", | ||||
|         "nixpkgs": "nixpkgs" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "root": "root", | ||||
|   "version": 7 | ||||
| } | ||||
							
								
								
									
										148
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,148 @@ | ||||
| { | ||||
|   description = "headscale - Open Source Tailscale Control server"; | ||||
| 
 | ||||
|   inputs = { | ||||
|     # TODO: Use unstable when Go 1.18 has made it in | ||||
|     # https://nixpk.gs/pr-tracker.html?pr=164292 | ||||
|     # nixpkgs.url = "nixpkgs/nixpkgs-unstable"; | ||||
|     nixpkgs.url = "nixpkgs/master"; | ||||
|     flake-utils.url = "github:numtide/flake-utils"; | ||||
|   }; | ||||
| 
 | ||||
|   outputs = { self, nixpkgs, flake-utils, ... }: | ||||
|     let | ||||
|       headscaleVersion = if (self ? shortRev) then self.shortRev else "dev"; | ||||
|     in | ||||
|     { | ||||
|       overlay = final: prev: | ||||
|         let | ||||
|           pkgs = nixpkgs.legacyPackages.${prev.system}; | ||||
|         in | ||||
|         rec { | ||||
|           golines = | ||||
|             pkgs.buildGoModule rec { | ||||
|               pname = "golines"; | ||||
|               version = "0.9.0"; | ||||
| 
 | ||||
|               src = pkgs.fetchFromGitHub { | ||||
|                 owner = "segmentio"; | ||||
|                 repo = "golines"; | ||||
|                 rev = "v${version}"; | ||||
|                 sha256 = "sha256-BUXEg+4r9L/gqe4DhTlhN55P3jWt7ZyWFQycO6QePrw="; | ||||
|               }; | ||||
| 
 | ||||
|               vendorSha256 = "sha256-sEzWUeVk5GB0H41wrp12P8sBWRjg0FHUX6ABDEEBqK8="; | ||||
| 
 | ||||
|               nativeBuildInputs = [ pkgs.installShellFiles ]; | ||||
|             }; | ||||
| 
 | ||||
|           protoc-gen-grpc-gateway = | ||||
|             pkgs.buildGoModule rec { | ||||
|               pname = "grpc-gateway"; | ||||
|               version = "2.8.0"; | ||||
| 
 | ||||
|               src = pkgs.fetchFromGitHub { | ||||
|                 owner = "grpc-ecosystem"; | ||||
|                 repo = "grpc-gateway"; | ||||
|                 rev = "v${version}"; | ||||
|                 sha256 = "sha256-8eBBBYJ+tBjB2fgPMX/ZlbN3eeS75e8TAZYOKXs6hcg="; | ||||
|               }; | ||||
| 
 | ||||
|               vendorSha256 = "sha256-AW2Gn/mlZyLMwF+NpK59eiOmQrYWW/9HPjbunYc9Ij4="; | ||||
| 
 | ||||
|               nativeBuildInputs = [ pkgs.installShellFiles ]; | ||||
| 
 | ||||
|               subPackages = [ "protoc-gen-grpc-gateway" "protoc-gen-openapiv2" ]; | ||||
|             }; | ||||
| 
 | ||||
|           headscale = | ||||
|             pkgs.buildGo118Module rec { | ||||
|               pname = "headscale"; | ||||
|               version = headscaleVersion; | ||||
|               src = pkgs.lib.cleanSource self; | ||||
| 
 | ||||
|               # When updating go.mod or go.sum, a new sha will need to be calculated, | ||||
|               # update this if you have a mismatch after doing a change to thos files. | ||||
|               vendorSha256 = "sha256-VsMhgAP0YY6oo/iW7UXg6jc/rv5oZLSkluQ12TKsXXs="; | ||||
| 
 | ||||
|               ldflags = [ "-s" "-w" "-X github.com/juanfont/headscale/cmd/headscale/cli.Version=v${version}" ]; | ||||
|             }; | ||||
|         }; | ||||
|     } // flake-utils.lib.eachDefaultSystem | ||||
|       (system: | ||||
|         let | ||||
|           pkgs = import nixpkgs { | ||||
|             overlays = [ self.overlay ]; | ||||
|             inherit system; | ||||
|           }; | ||||
|           buildDeps = with pkgs; [ git go_1_18 gnumake ]; | ||||
|           devDeps = with pkgs; | ||||
|             buildDeps ++ [ | ||||
|               golangci-lint | ||||
|               golines | ||||
|               nodePackages.prettier | ||||
| 
 | ||||
|               # Protobuf dependencies | ||||
|               protobuf | ||||
|               protoc-gen-go | ||||
|               protoc-gen-go-grpc | ||||
|               protoc-gen-grpc-gateway | ||||
|               buf | ||||
|               clang-tools # clang-format | ||||
|             ]; | ||||
| 
 | ||||
| 
 | ||||
|           # Add entry to build a docker image with headscale | ||||
|           # caveat: only works on Linux | ||||
|           # | ||||
|           # Usage: | ||||
|           # nix build .#headscale-docker | ||||
|           # docker load < result | ||||
|           headscale-docker = pkgs.dockerTools.buildLayeredImage { | ||||
|             name = "headscale"; | ||||
|             tag = headscaleVersion; | ||||
|             contents = [ pkgs.headscale ]; | ||||
|             config.Entrypoint = [ (pkgs.headscale + "/bin/headscale") ]; | ||||
|           }; | ||||
|         in | ||||
|         rec { | ||||
|           # `nix develop` | ||||
|           devShell = pkgs.mkShell { buildInputs = devDeps; }; | ||||
| 
 | ||||
|           # `nix build` | ||||
|           packages = with pkgs; { | ||||
|             inherit headscale; | ||||
|             inherit headscale-docker; | ||||
|           }; | ||||
| 
 | ||||
|           defaultPackage = pkgs.headscale; | ||||
| 
 | ||||
|           # `nix run` | ||||
|           apps.headscale = flake-utils.lib.mkApp { | ||||
|             drv = packages.headscale; | ||||
|           }; | ||||
|           defaultApp = apps.headscale; | ||||
| 
 | ||||
|           checks = { | ||||
|             format = pkgs.runCommand "check-format" | ||||
|               { | ||||
|                 buildInputs = with pkgs; [ | ||||
|                   gnumake | ||||
|                   nixpkgs-fmt | ||||
|                   golangci-lint | ||||
|                   nodePackages.prettier | ||||
|                   golines | ||||
|                   clang-tools | ||||
|                 ]; | ||||
|               } '' | ||||
|               ${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt ${./.} | ||||
|               ${pkgs.golangci-lint}/bin/golangci-lint run --fix --timeout 10m | ||||
|               ${pkgs.nodePackages.prettier}/bin/prettier --write '**/**.{ts,js,md,yaml,yml,sass,css,scss,html}' | ||||
|               ${pkgs.golines}/bin/golines --max-len=88 --base-formatter=gofumpt -w ${./.} | ||||
|               ${pkgs.clang-tools}/bin/clang-format -style="{BasedOnStyle: Google, IndentWidth: 4, AlignConsecutiveDeclarations: true, AlignConsecutiveAssignments: true, ColumnLimit: 0}" -i ${./.} | ||||
|             ''; | ||||
|           }; | ||||
| 
 | ||||
| 
 | ||||
|         }); | ||||
| } | ||||
| @ -36,7 +36,7 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{ | ||||
| 	0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, | ||||
| 	0x31, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, | ||||
| 	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, | ||||
| 	0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x99, 0x14, 0x0a, 0x10, 0x48, 0x65, | ||||
| 	0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x9e, 0x15, 0x0a, 0x10, 0x48, 0x65, | ||||
| 	0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, | ||||
| 	0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, | ||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, | ||||
| @ -158,50 +158,58 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{ | ||||
| 	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, 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, 0x12, 0x70, | ||||
| 	0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, | ||||
| 	0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, | ||||
| 	0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, | ||||
| 	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, | ||||
| 	0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x3a, 0x01, 0x2a, | ||||
| 	0x12, 0x77, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, | ||||
| 	0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, | ||||
| 	0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, | ||||
| 	0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, | ||||
| 	0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x2f, | ||||
| 	0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, | ||||
| 	0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, | ||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, | ||||
| 	0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, | ||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, | ||||
| 	0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, | ||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, | ||||
| 	0x70, 0x69, 0x6b, 0x65, 0x79, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, | ||||
| 	0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, | ||||
| 	0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, | ||||
| 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x4d, | ||||
| 	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x20, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, | ||||
| 	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, | ||||
| 	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, | ||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, | ||||
| 	0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, | ||||
| 	0x93, 0x02, 0x28, 0x22, 0x26, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x63, | ||||
| 	0x68, 0x69, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, | ||||
| 	0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x0f, | ||||
| 	0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, | ||||
| 	0x24, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, | ||||
| 	0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, | ||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 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, 0x12, 0x70, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, | ||||
| 	0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, | ||||
| 	0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x52, | ||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, | ||||
| 	0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x4b, | ||||
| 	0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, | ||||
| 	0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, | ||||
| 	0x65, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x77, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, | ||||
| 	0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, | ||||
| 	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, 0x69, 0x4b, 0x65, | ||||
| 	0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, | ||||
| 	0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x70, | ||||
| 	0x69, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, | ||||
| 	0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, | ||||
| 	0x69, 0x6b, 0x65, 0x79, 0x2f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6a, | ||||
| 	0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x20, 0x2e, | ||||
| 	0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, | ||||
| 	0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| 	0x21, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, | ||||
| 	0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, | ||||
| 	0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x6b, 0x65, 0x79, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, | ||||
| 	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, | ||||
| 	0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, | ||||
| 	0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
| 
 | ||||
| var file_headscale_v1_headscale_proto_goTypes = []interface{}{ | ||||
| @ -220,31 +228,33 @@ var file_headscale_v1_headscale_proto_goTypes = []interface{}{ | ||||
| 	(*DeleteMachineRequest)(nil),        // 12: headscale.v1.DeleteMachineRequest
 | ||||
| 	(*ExpireMachineRequest)(nil),        // 13: headscale.v1.ExpireMachineRequest
 | ||||
| 	(*ListMachinesRequest)(nil),         // 14: headscale.v1.ListMachinesRequest
 | ||||
| 	(*GetMachineRouteRequest)(nil),      // 15: headscale.v1.GetMachineRouteRequest
 | ||||
| 	(*EnableMachineRoutesRequest)(nil),  // 16: headscale.v1.EnableMachineRoutesRequest
 | ||||
| 	(*CreateApiKeyRequest)(nil),         // 17: headscale.v1.CreateApiKeyRequest
 | ||||
| 	(*ExpireApiKeyRequest)(nil),         // 18: headscale.v1.ExpireApiKeyRequest
 | ||||
| 	(*ListApiKeysRequest)(nil),          // 19: headscale.v1.ListApiKeysRequest
 | ||||
| 	(*GetNamespaceResponse)(nil),        // 20: headscale.v1.GetNamespaceResponse
 | ||||
| 	(*CreateNamespaceResponse)(nil),     // 21: headscale.v1.CreateNamespaceResponse
 | ||||
| 	(*RenameNamespaceResponse)(nil),     // 22: headscale.v1.RenameNamespaceResponse
 | ||||
| 	(*DeleteNamespaceResponse)(nil),     // 23: headscale.v1.DeleteNamespaceResponse
 | ||||
| 	(*ListNamespacesResponse)(nil),      // 24: headscale.v1.ListNamespacesResponse
 | ||||
| 	(*CreatePreAuthKeyResponse)(nil),    // 25: headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	(*ExpirePreAuthKeyResponse)(nil),    // 26: headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	(*ListPreAuthKeysResponse)(nil),     // 27: headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	(*DebugCreateMachineResponse)(nil),  // 28: headscale.v1.DebugCreateMachineResponse
 | ||||
| 	(*GetMachineResponse)(nil),          // 29: headscale.v1.GetMachineResponse
 | ||||
| 	(*SetTagsResponse)(nil),             // 30: headscale.v1.SetTagsResponse
 | ||||
| 	(*RegisterMachineResponse)(nil),     // 31: headscale.v1.RegisterMachineResponse
 | ||||
| 	(*DeleteMachineResponse)(nil),       // 32: headscale.v1.DeleteMachineResponse
 | ||||
| 	(*ExpireMachineResponse)(nil),       // 33: headscale.v1.ExpireMachineResponse
 | ||||
| 	(*ListMachinesResponse)(nil),        // 34: headscale.v1.ListMachinesResponse
 | ||||
| 	(*GetMachineRouteResponse)(nil),     // 35: headscale.v1.GetMachineRouteResponse
 | ||||
| 	(*EnableMachineRoutesResponse)(nil), // 36: headscale.v1.EnableMachineRoutesResponse
 | ||||
| 	(*CreateApiKeyResponse)(nil),        // 37: headscale.v1.CreateApiKeyResponse
 | ||||
| 	(*ExpireApiKeyResponse)(nil),        // 38: headscale.v1.ExpireApiKeyResponse
 | ||||
| 	(*ListApiKeysResponse)(nil),         // 39: headscale.v1.ListApiKeysResponse
 | ||||
| 	(*MoveMachineRequest)(nil),          // 15: headscale.v1.MoveMachineRequest
 | ||||
| 	(*GetMachineRouteRequest)(nil),      // 16: headscale.v1.GetMachineRouteRequest
 | ||||
| 	(*EnableMachineRoutesRequest)(nil),  // 17: headscale.v1.EnableMachineRoutesRequest
 | ||||
| 	(*CreateApiKeyRequest)(nil),         // 18: headscale.v1.CreateApiKeyRequest
 | ||||
| 	(*ExpireApiKeyRequest)(nil),         // 19: headscale.v1.ExpireApiKeyRequest
 | ||||
| 	(*ListApiKeysRequest)(nil),          // 20: headscale.v1.ListApiKeysRequest
 | ||||
| 	(*GetNamespaceResponse)(nil),        // 21: headscale.v1.GetNamespaceResponse
 | ||||
| 	(*CreateNamespaceResponse)(nil),     // 22: headscale.v1.CreateNamespaceResponse
 | ||||
| 	(*RenameNamespaceResponse)(nil),     // 23: headscale.v1.RenameNamespaceResponse
 | ||||
| 	(*DeleteNamespaceResponse)(nil),     // 24: headscale.v1.DeleteNamespaceResponse
 | ||||
| 	(*ListNamespacesResponse)(nil),      // 25: headscale.v1.ListNamespacesResponse
 | ||||
| 	(*CreatePreAuthKeyResponse)(nil),    // 26: headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	(*ExpirePreAuthKeyResponse)(nil),    // 27: headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	(*ListPreAuthKeysResponse)(nil),     // 28: headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	(*DebugCreateMachineResponse)(nil),  // 29: headscale.v1.DebugCreateMachineResponse
 | ||||
| 	(*GetMachineResponse)(nil),          // 30: headscale.v1.GetMachineResponse
 | ||||
| 	(*SetTagsResponse)(nil),             // 31: headscale.v1.SetTagsResponse
 | ||||
| 	(*RegisterMachineResponse)(nil),     // 32: headscale.v1.RegisterMachineResponse
 | ||||
| 	(*DeleteMachineResponse)(nil),       // 33: headscale.v1.DeleteMachineResponse
 | ||||
| 	(*ExpireMachineResponse)(nil),       // 34: headscale.v1.ExpireMachineResponse
 | ||||
| 	(*ListMachinesResponse)(nil),        // 35: headscale.v1.ListMachinesResponse
 | ||||
| 	(*MoveMachineResponse)(nil),         // 36: headscale.v1.MoveMachineResponse
 | ||||
| 	(*GetMachineRouteResponse)(nil),     // 37: headscale.v1.GetMachineRouteResponse
 | ||||
| 	(*EnableMachineRoutesResponse)(nil), // 38: headscale.v1.EnableMachineRoutesResponse
 | ||||
| 	(*CreateApiKeyResponse)(nil),        // 39: headscale.v1.CreateApiKeyResponse
 | ||||
| 	(*ExpireApiKeyResponse)(nil),        // 40: headscale.v1.ExpireApiKeyResponse
 | ||||
| 	(*ListApiKeysResponse)(nil),         // 41: headscale.v1.ListApiKeysResponse
 | ||||
| } | ||||
| var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	0,  // 0: headscale.v1.HeadscaleService.GetNamespace:input_type -> headscale.v1.GetNamespaceRequest
 | ||||
| @ -262,33 +272,35 @@ var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	12, // 12: headscale.v1.HeadscaleService.DeleteMachine:input_type -> headscale.v1.DeleteMachineRequest
 | ||||
| 	13, // 13: headscale.v1.HeadscaleService.ExpireMachine:input_type -> headscale.v1.ExpireMachineRequest
 | ||||
| 	14, // 14: headscale.v1.HeadscaleService.ListMachines:input_type -> headscale.v1.ListMachinesRequest
 | ||||
| 	15, // 15: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest
 | ||||
| 	16, // 16: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest
 | ||||
| 	17, // 17: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest
 | ||||
| 	18, // 18: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest
 | ||||
| 	19, // 19: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest
 | ||||
| 	20, // 20: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse
 | ||||
| 	21, // 21: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
 | ||||
| 	22, // 22: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse
 | ||||
| 	23, // 23: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
 | ||||
| 	24, // 24: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
 | ||||
| 	25, // 25: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	26, // 26: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	27, // 27: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	28, // 28: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse
 | ||||
| 	29, // 29: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
 | ||||
| 	30, // 30: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
 | ||||
| 	31, // 31: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse
 | ||||
| 	32, // 32: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse
 | ||||
| 	33, // 33: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse
 | ||||
| 	34, // 34: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse
 | ||||
| 	35, // 35: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse
 | ||||
| 	36, // 36: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse
 | ||||
| 	37, // 37: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | ||||
| 	38, // 38: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | ||||
| 	39, // 39: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | ||||
| 	20, // [20:40] is the sub-list for method output_type
 | ||||
| 	0,  // [0:20] is the sub-list for method input_type
 | ||||
| 	15, // 15: headscale.v1.HeadscaleService.MoveMachine:input_type -> headscale.v1.MoveMachineRequest
 | ||||
| 	16, // 16: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest
 | ||||
| 	17, // 17: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest
 | ||||
| 	18, // 18: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest
 | ||||
| 	19, // 19: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest
 | ||||
| 	20, // 20: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest
 | ||||
| 	21, // 21: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse
 | ||||
| 	22, // 22: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse
 | ||||
| 	23, // 23: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse
 | ||||
| 	24, // 24: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse
 | ||||
| 	25, // 25: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse
 | ||||
| 	26, // 26: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
 | ||||
| 	27, // 27: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
 | ||||
| 	28, // 28: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
 | ||||
| 	29, // 29: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse
 | ||||
| 	30, // 30: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse
 | ||||
| 	31, // 31: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
 | ||||
| 	32, // 32: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse
 | ||||
| 	33, // 33: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse
 | ||||
| 	34, // 34: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse
 | ||||
| 	35, // 35: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse
 | ||||
| 	36, // 36: headscale.v1.HeadscaleService.MoveMachine:output_type -> headscale.v1.MoveMachineResponse
 | ||||
| 	37, // 37: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse
 | ||||
| 	38, // 38: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse
 | ||||
| 	39, // 39: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
 | ||||
| 	40, // 40: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
 | ||||
| 	41, // 41: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
 | ||||
| 	21, // [21:42] is the sub-list for method output_type
 | ||||
| 	0,  // [0:21] is the sub-list for method input_type
 | ||||
| 	0,  // [0:0] is the sub-list for extension type_name
 | ||||
| 	0,  // [0:0] is the sub-list for extension extendee
 | ||||
| 	0,  // [0:0] is the sub-list for field type_name
 | ||||
|  | ||||
| @ -693,6 +693,76 @@ func local_request_HeadscaleService_ListMachines_0(ctx context.Context, marshale | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	filter_HeadscaleService_MoveMachine_0 = &utilities.DoubleArray{Encoding: map[string]int{"machine_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} | ||||
| ) | ||||
| 
 | ||||
| func request_HeadscaleService_MoveMachine_0(ctx context.Context, marshaler runtime.Marshaler, client HeadscaleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq MoveMachineRequest | ||||
| 	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_MoveMachine_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := client.MoveMachine(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func local_request_HeadscaleService_MoveMachine_0(ctx context.Context, marshaler runtime.Marshaler, server HeadscaleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq MoveMachineRequest | ||||
| 	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_MoveMachine_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := server.MoveMachine(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 | ||||
| @ -1252,6 +1322,29 @@ func RegisterHeadscaleServiceHandlerServer(ctx context.Context, mux *runtime.Ser | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_HeadscaleService_MoveMachine_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/MoveMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/namespace")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_HeadscaleService_MoveMachine_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_MoveMachine_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() | ||||
| @ -1708,6 +1801,26 @@ func RegisterHeadscaleServiceHandlerClient(ctx context.Context, mux *runtime.Ser | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_HeadscaleService_MoveMachine_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/MoveMachine", runtime.WithHTTPPathPattern("/api/v1/machine/{machine_id}/namespace")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_HeadscaleService_MoveMachine_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_MoveMachine_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() | ||||
| @ -1842,6 +1955,8 @@ var ( | ||||
| 
 | ||||
| 	pattern_HeadscaleService_ListMachines_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "machine"}, "")) | ||||
| 
 | ||||
| 	pattern_HeadscaleService_MoveMachine_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", "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"}, "")) | ||||
| @ -1884,6 +1999,8 @@ var ( | ||||
| 
 | ||||
| 	forward_HeadscaleService_ListMachines_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_HeadscaleService_MoveMachine_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_HeadscaleService_GetMachineRoute_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_HeadscaleService_EnableMachineRoutes_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| @ -1,8 +1,4 @@ | ||||
| // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // - protoc-gen-go-grpc v1.2.0
 | ||||
| // - protoc             (unknown)
 | ||||
| // source: headscale/v1/headscale.proto
 | ||||
| 
 | ||||
| package v1 | ||||
| 
 | ||||
| @ -40,6 +36,7 @@ type HeadscaleServiceClient interface { | ||||
| 	DeleteMachine(ctx context.Context, in *DeleteMachineRequest, opts ...grpc.CallOption) (*DeleteMachineResponse, error) | ||||
| 	ExpireMachine(ctx context.Context, in *ExpireMachineRequest, opts ...grpc.CallOption) (*ExpireMachineResponse, error) | ||||
| 	ListMachines(ctx context.Context, in *ListMachinesRequest, opts ...grpc.CallOption) (*ListMachinesResponse, error) | ||||
| 	MoveMachine(ctx context.Context, in *MoveMachineRequest, opts ...grpc.CallOption) (*MoveMachineResponse, 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) | ||||
| @ -192,6 +189,15 @@ func (c *headscaleServiceClient) ListMachines(ctx context.Context, in *ListMachi | ||||
| 	return out, nil | ||||
| } | ||||
| 
 | ||||
| func (c *headscaleServiceClient) MoveMachine(ctx context.Context, in *MoveMachineRequest, opts ...grpc.CallOption) (*MoveMachineResponse, error) { | ||||
| 	out := new(MoveMachineResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/headscale.v1.HeadscaleService/MoveMachine", 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...) | ||||
| @ -259,6 +265,7 @@ type HeadscaleServiceServer interface { | ||||
| 	DeleteMachine(context.Context, *DeleteMachineRequest) (*DeleteMachineResponse, error) | ||||
| 	ExpireMachine(context.Context, *ExpireMachineRequest) (*ExpireMachineResponse, error) | ||||
| 	ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error) | ||||
| 	MoveMachine(context.Context, *MoveMachineRequest) (*MoveMachineResponse, error) | ||||
| 	// --- Route start ---
 | ||||
| 	GetMachineRoute(context.Context, *GetMachineRouteRequest) (*GetMachineRouteResponse, error) | ||||
| 	EnableMachineRoutes(context.Context, *EnableMachineRoutesRequest) (*EnableMachineRoutesResponse, error) | ||||
| @ -318,6 +325,9 @@ func (UnimplementedHeadscaleServiceServer) ExpireMachine(context.Context, *Expir | ||||
| func (UnimplementedHeadscaleServiceServer) ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method ListMachines not implemented") | ||||
| } | ||||
| func (UnimplementedHeadscaleServiceServer) MoveMachine(context.Context, *MoveMachineRequest) (*MoveMachineResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method MoveMachine not implemented") | ||||
| } | ||||
| func (UnimplementedHeadscaleServiceServer) GetMachineRoute(context.Context, *GetMachineRouteRequest) (*GetMachineRouteResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetMachineRoute not implemented") | ||||
| } | ||||
| @ -616,6 +626,24 @@ func _HeadscaleService_ListMachines_Handler(srv interface{}, ctx context.Context | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| func _HeadscaleService_MoveMachine_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(MoveMachineRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(HeadscaleServiceServer).MoveMachine(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/headscale.v1.HeadscaleService/MoveMachine", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(HeadscaleServiceServer).MoveMachine(ctx, req.(*MoveMachineRequest)) | ||||
| 	} | ||||
| 	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 { | ||||
| @ -773,6 +801,10 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "ListMachines", | ||||
| 			Handler:    _HeadscaleService_ListMachines_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "MoveMachine", | ||||
| 			Handler:    _HeadscaleService_MoveMachine_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetMachineRoute", | ||||
| 			Handler:    _HeadscaleService_GetMachineRoute_Handler, | ||||
|  | ||||
| @ -811,6 +811,108 @@ func (x *ListMachinesResponse) GetMachines() []*Machine { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type MoveMachineRequest 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 *MoveMachineRequest) Reset() { | ||||
| 	*x = MoveMachineRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[13] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
| 
 | ||||
| func (*MoveMachineRequest) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *MoveMachineRequest) 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 MoveMachineRequest.ProtoReflect.Descriptor instead.
 | ||||
| func (*MoveMachineRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13} | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineRequest) GetMachineId() uint64 { | ||||
| 	if x != nil { | ||||
| 		return x.MachineId | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| type MoveMachineResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
| 
 | ||||
| 	Machine *Machine `protobuf:"bytes,1,opt,name=machine,proto3" json:"machine,omitempty"` | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineResponse) Reset() { | ||||
| 	*x = MoveMachineResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[14] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
| 
 | ||||
| func (*MoveMachineResponse) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *MoveMachineResponse) 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 MoveMachineResponse.ProtoReflect.Descriptor instead.
 | ||||
| func (*MoveMachineResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14} | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineResponse) GetMachine() *Machine { | ||||
| 	if x != nil { | ||||
| 		return x.Machine | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type DebugCreateMachineRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @ -825,7 +927,7 @@ type DebugCreateMachineRequest struct { | ||||
| func (x *DebugCreateMachineRequest) Reset() { | ||||
| 	*x = DebugCreateMachineRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[13] | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[15] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @ -838,7 +940,7 @@ func (x *DebugCreateMachineRequest) String() string { | ||||
| func (*DebugCreateMachineRequest) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[13] | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[15] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @ -851,7 +953,7 @@ func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message { | ||||
| 
 | ||||
| // Deprecated: Use DebugCreateMachineRequest.ProtoReflect.Descriptor instead.
 | ||||
| func (*DebugCreateMachineRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13} | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{15} | ||||
| } | ||||
| 
 | ||||
| func (x *DebugCreateMachineRequest) GetNamespace() string { | ||||
| @ -893,7 +995,7 @@ type DebugCreateMachineResponse struct { | ||||
| func (x *DebugCreateMachineResponse) Reset() { | ||||
| 	*x = DebugCreateMachineResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[14] | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[16] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @ -906,7 +1008,7 @@ func (x *DebugCreateMachineResponse) String() string { | ||||
| func (*DebugCreateMachineResponse) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[14] | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[16] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @ -919,7 +1021,7 @@ func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message { | ||||
| 
 | ||||
| // Deprecated: Use DebugCreateMachineResponse.ProtoReflect.Descriptor instead.
 | ||||
| func (*DebugCreateMachineResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14} | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{16} | ||||
| } | ||||
| 
 | ||||
| func (x *DebugCreateMachineResponse) GetMachine() *Machine { | ||||
| @ -1031,31 +1133,41 @@ var file_headscale_v1_machine_proto_rawDesc = []byte{ | ||||
| 	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, 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, | ||||
| 	0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x12, | ||||
| 	0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, | ||||
| 	0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, | ||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, | ||||
| 	0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, | ||||
| 	0x46, 0x0a, 0x13, 0x4d, 0x6f, 0x76, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, | ||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, | ||||
| 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, | ||||
| 	0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, | ||||
| 	0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x22, 0x77, 0x0a, 0x19, 0x44, 0x65, 0x62, 0x75, 0x67, | ||||
| 	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, | ||||
| 	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, | ||||
| 	0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, | ||||
| 	0x22, 0x4d, 0x0a, 0x1a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, | ||||
| 	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, | ||||
| 	0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, | ||||
| 	0x15, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, | ||||
| 	0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2a, | ||||
| 	0x82, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x68, | ||||
| 	0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, | ||||
| 	0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, | ||||
| 	0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, | ||||
| 	0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4b, 0x45, 0x59, 0x10, | ||||
| 	0x01, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, | ||||
| 	0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, | ||||
| 	0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4f, 0x49, | ||||
| 	0x44, 0x43, 0x10, 0x03, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, | ||||
| 	0x6f, 0x6d, 0x2f, 0x6a, 0x75, 0x61, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, | ||||
| 	0x73, 0x63, 0x61, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, | ||||
| 	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| @ -1071,7 +1183,7 @@ func file_headscale_v1_machine_proto_rawDescGZIP() []byte { | ||||
| } | ||||
| 
 | ||||
| var file_headscale_v1_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) | ||||
| var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 15) | ||||
| var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 17) | ||||
| var file_headscale_v1_machine_proto_goTypes = []interface{}{ | ||||
| 	(RegisterMethod)(0),                // 0: headscale.v1.RegisterMethod
 | ||||
| 	(*Machine)(nil),                    // 1: headscale.v1.Machine
 | ||||
| @ -1087,31 +1199,34 @@ var file_headscale_v1_machine_proto_goTypes = []interface{}{ | ||||
| 	(*ExpireMachineResponse)(nil),      // 11: headscale.v1.ExpireMachineResponse
 | ||||
| 	(*ListMachinesRequest)(nil),        // 12: headscale.v1.ListMachinesRequest
 | ||||
| 	(*ListMachinesResponse)(nil),       // 13: headscale.v1.ListMachinesResponse
 | ||||
| 	(*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
 | ||||
| 	(*MoveMachineRequest)(nil),         // 14: headscale.v1.MoveMachineRequest
 | ||||
| 	(*MoveMachineResponse)(nil),        // 15: headscale.v1.MoveMachineResponse
 | ||||
| 	(*DebugCreateMachineRequest)(nil),  // 16: headscale.v1.DebugCreateMachineRequest
 | ||||
| 	(*DebugCreateMachineResponse)(nil), // 17: headscale.v1.DebugCreateMachineResponse
 | ||||
| 	(*Namespace)(nil),                  // 18: headscale.v1.Namespace
 | ||||
| 	(*timestamppb.Timestamp)(nil),      // 19: google.protobuf.Timestamp
 | ||||
| 	(*PreAuthKey)(nil),                 // 20: headscale.v1.PreAuthKey
 | ||||
| } | ||||
| var file_headscale_v1_machine_proto_depIdxs = []int32{ | ||||
| 	16, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace
 | ||||
| 	17, // 1: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp
 | ||||
| 	17, // 2: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp
 | ||||
| 	17, // 3: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp
 | ||||
| 	18, // 4: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey
 | ||||
| 	17, // 5: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp
 | ||||
| 	18, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace
 | ||||
| 	19, // 1: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp
 | ||||
| 	19, // 2: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp
 | ||||
| 	19, // 3: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp
 | ||||
| 	20, // 4: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey
 | ||||
| 	19, // 5: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp
 | ||||
| 	0,  // 6: headscale.v1.Machine.register_method:type_name -> headscale.v1.RegisterMethod
 | ||||
| 	1,  // 7: headscale.v1.RegisterMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 8: headscale.v1.GetMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 9: headscale.v1.SetTagsResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 10: headscale.v1.ExpireMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 11: headscale.v1.ListMachinesResponse.machines:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 12: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	13, // [13:13] is the sub-list for method output_type
 | ||||
| 	13, // [13:13] is the sub-list for method input_type
 | ||||
| 	13, // [13:13] is the sub-list for extension type_name
 | ||||
| 	13, // [13:13] is the sub-list for extension extendee
 | ||||
| 	0,  // [0:13] is the sub-list for field type_name
 | ||||
| 	1,  // 12: headscale.v1.MoveMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	1,  // 13: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine
 | ||||
| 	14, // [14:14] is the sub-list for method output_type
 | ||||
| 	14, // [14:14] is the sub-list for method input_type
 | ||||
| 	14, // [14:14] is the sub-list for extension type_name
 | ||||
| 	14, // [14:14] is the sub-list for extension extendee
 | ||||
| 	0,  // [0:14] is the sub-list for field type_name
 | ||||
| } | ||||
| 
 | ||||
| func init() { file_headscale_v1_machine_proto_init() } | ||||
| @ -1279,7 +1394,7 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineRequest); i { | ||||
| 			switch v := v.(*MoveMachineRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @ -1291,6 +1406,30 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*MoveMachineResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @ -1309,7 +1448,7 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_headscale_v1_machine_proto_rawDesc, | ||||
| 			NumEnums:      1, | ||||
| 			NumMessages:   15, | ||||
| 			NumMessages:   17, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
|  | ||||
| @ -291,6 +291,43 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/api/v1/machine/{machineId}/namespace": { | ||||
|       "post": { | ||||
|         "operationId": "HeadscaleService_MoveMachine", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/v1MoveMachineResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/rpcStatus" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "machineId", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string", | ||||
|             "format": "uint64" | ||||
|           }, | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "HeadscaleService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/api/v1/machine/{machineId}/routes": { | ||||
|       "get": { | ||||
|         "summary": "--- Route start ---", | ||||
| @ -974,6 +1011,14 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "v1MoveMachineResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "machine": { | ||||
|           "$ref": "#/definitions/v1Machine" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "v1Namespace": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|  | ||||
							
								
								
									
										112
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								go.mod
									
									
									
									
									
								
							| @ -3,76 +3,69 @@ module github.com/juanfont/headscale | ||||
| go 1.18 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/AlecAivazis/survey/v2 v2.3.2 | ||||
| 	github.com/bufbuild/buf v1.4.0 | ||||
| 	github.com/AlecAivazis/survey/v2 v2.3.4 | ||||
| 	github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029 | ||||
| 	github.com/coreos/go-oidc/v3 v3.1.0 | ||||
| 	github.com/efekarakus/termcolor v1.0.1 | ||||
| 	github.com/fatih/set v0.2.1 | ||||
| 	github.com/gin-gonic/gin v1.7.7 | ||||
| 	github.com/glebarez/sqlite v1.3.5 | ||||
| 	github.com/glebarez/sqlite v1.4.3 | ||||
| 	github.com/gofrs/uuid v4.2.0+incompatible | ||||
| 	github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.3 | ||||
| 	github.com/infobloxopen/protoc-gen-gorm v1.1.0 | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.0 | ||||
| 	github.com/klauspost/compress v1.15.1 | ||||
| 	github.com/ory/dockertest/v3 v3.8.1 | ||||
| 	github.com/patrickmn/go-cache v2.1.0+incompatible | ||||
| 	github.com/philip-bui/grpc-zerolog v1.0.1 | ||||
| 	github.com/prometheus/client_golang v1.12.1 | ||||
| 	github.com/pterm/pterm v0.12.37 | ||||
| 	github.com/pterm/pterm v0.12.41 | ||||
| 	github.com/rs/zerolog v1.26.1 | ||||
| 	github.com/spf13/cobra v1.4.0 | ||||
| 	github.com/spf13/viper v1.10.1 | ||||
| 	github.com/spf13/viper v1.11.0 | ||||
| 	github.com/stretchr/testify v1.7.1 | ||||
| 	github.com/tailscale/hujson v0.0.0-20211215203138-ffd971c5f362 | ||||
| 	github.com/tailscale/hujson v0.0.0-20220421170326-6583d0610064 | ||||
| 	github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e | ||||
| 	github.com/zsais/go-gin-prometheus v0.1.0 | ||||
| 	golang.org/x/crypto v0.0.0-20220214200702-86341886e292 | ||||
| 	golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b | ||||
| 	golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 | ||||
| 	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 | ||||
| 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | ||||
| 	google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 | ||||
| 	google.golang.org/grpc v1.45.0 | ||||
| 	google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 | ||||
| 	google.golang.org/genproto v0.0.0-20220422154200-b37d22cd5731 | ||||
| 	google.golang.org/grpc v1.46.0 | ||||
| 	google.golang.org/protobuf v1.28.0 | ||||
| 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c | ||||
| 	gopkg.in/yaml.v2 v2.4.0 | ||||
| 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b | ||||
| 	gorm.io/driver/postgres v1.3.1 | ||||
| 	gorm.io/gorm v1.23.1 | ||||
| 	gorm.io/driver/postgres v1.3.5 | ||||
| 	gorm.io/gorm v1.23.4 | ||||
| 	inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 | ||||
| 	tailscale.com v1.22.0 | ||||
| 	tailscale.com v1.24.0 | ||||
| ) | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.5.2 // indirect | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.5.1 // indirect | ||||
| 	github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect | ||||
| 	github.com/akutz/memconn v0.1.0 // indirect | ||||
| 	github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 // indirect | ||||
| 	github.com/atomicgo/cursor v0.0.1 // indirect | ||||
| 	github.com/beorn7/perks v1.0.1 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.1.2 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.1.2 // indirect | ||||
| 	github.com/containerd/continuity v0.2.2 // indirect | ||||
| 	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect | ||||
| 	github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/denisenkom/go-mssqldb v0.12.0 // indirect | ||||
| 	github.com/docker/cli v20.10.12+incompatible // indirect | ||||
| 	github.com/docker/docker v20.10.12+incompatible // indirect | ||||
| 	github.com/docker/cli v20.10.11+incompatible // indirect | ||||
| 	github.com/docker/docker v20.10.7+incompatible // indirect | ||||
| 	github.com/docker/go-connections v0.4.0 // indirect | ||||
| 	github.com/docker/go-units v0.4.0 // indirect | ||||
| 	github.com/fsnotify/fsnotify v1.5.1 // indirect | ||||
| 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||
| 	github.com/glebarez/go-sqlite v1.14.8 // indirect | ||||
| 	github.com/go-playground/locales v0.14.0 // indirect | ||||
| 	github.com/go-playground/universal-translator v0.18.0 // indirect | ||||
| 	github.com/go-playground/validator/v10 v10.10.0 // indirect | ||||
| 	github.com/go-sql-driver/mysql v1.6.0 // indirect | ||||
| 	github.com/gofrs/flock v0.8.1 // indirect | ||||
| 	github.com/glebarez/go-sqlite v1.16.0 // indirect | ||||
| 	github.com/go-playground/locales v0.13.0 // indirect | ||||
| 	github.com/go-playground/universal-translator v0.17.0 // indirect | ||||
| 	github.com/go-playground/validator/v10 v10.4.1 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/golang/glog v1.0.0 // indirect | ||||
| 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/go-cmp v0.5.7 // indirect | ||||
| 	github.com/google/go-github v17.0.0+incompatible // indirect | ||||
| 	github.com/google/go-querystring v1.1.0 // indirect | ||||
| 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect | ||||
| @ -83,82 +76,73 @@ require ( | ||||
| 	github.com/imdario/mergo v0.3.12 // indirect | ||||
| 	github.com/inconshreveable/mousetrap v1.0.0 // indirect | ||||
| 	github.com/jackc/chunkreader/v2 v2.0.1 // indirect | ||||
| 	github.com/jackc/pgconn v1.11.0 // indirect | ||||
| 	github.com/jackc/pgconn v1.12.0 // indirect | ||||
| 	github.com/jackc/pgio v1.0.0 // indirect | ||||
| 	github.com/jackc/pgpassfile v1.0.0 // indirect | ||||
| 	github.com/jackc/pgproto3/v2 v2.2.0 // indirect | ||||
| 	github.com/jackc/pgproto3/v2 v2.3.0 // indirect | ||||
| 	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect | ||||
| 	github.com/jackc/pgtype v1.10.0 // indirect | ||||
| 	github.com/jackc/pgx/v4 v4.15.0 // indirect | ||||
| 	github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a // indirect | ||||
| 	github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f // indirect | ||||
| 	github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 // indirect | ||||
| 	github.com/jinzhu/gorm v1.9.16 // indirect | ||||
| 	github.com/jackc/pgtype v1.11.0 // indirect | ||||
| 	github.com/jackc/pgx/v4 v4.16.0 // indirect | ||||
| 	github.com/jinzhu/inflection v1.0.0 // indirect | ||||
| 	github.com/jinzhu/now v1.1.4 // indirect | ||||
| 	github.com/josharian/native v1.0.0 // indirect | ||||
| 	github.com/jsimonetti/rtnetlink v1.1.2-0.20220408201609-d380b505068b // indirect | ||||
| 	github.com/json-iterator/go v1.1.12 // indirect | ||||
| 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | ||||
| 	github.com/klauspost/pgzip v1.2.5 // indirect | ||||
| 	github.com/kr/pretty v0.3.0 // indirect | ||||
| 	github.com/kr/text v0.2.0 // indirect | ||||
| 	github.com/leodido/go-urn v1.2.1 // indirect | ||||
| 	github.com/lib/pq v1.10.3 // indirect | ||||
| 	github.com/leodido/go-urn v1.2.0 // indirect | ||||
| 	github.com/magiconair/properties v1.8.6 // indirect | ||||
| 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.14 // indirect | ||||
| 	github.com/mattn/go-runewidth v0.0.13 // indirect | ||||
| 	github.com/mattn/go-sqlite3 v1.14.11 // indirect | ||||
| 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | ||||
| 	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect | ||||
| 	github.com/mdlayher/netlink v1.6.0 // indirect | ||||
| 	github.com/mdlayher/socket v0.2.3 // indirect | ||||
| 	github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect | ||||
| 	github.com/mitchellh/go-ps v1.0.0 // indirect | ||||
| 	github.com/mitchellh/mapstructure v1.4.3 // indirect | ||||
| 	github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect | ||||
| 	github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
| 	github.com/opencontainers/go-digest v1.0.0 // indirect | ||||
| 	github.com/opencontainers/go-digest v1.0.0-rc1 // indirect | ||||
| 	github.com/opencontainers/image-spec v1.0.2 // indirect | ||||
| 	github.com/opencontainers/runc v1.1.0 // indirect | ||||
| 	github.com/opencontainers/runc v1.0.2 // indirect | ||||
| 	github.com/pelletier/go-toml v1.9.4 // indirect | ||||
| 	github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pkg/profile v1.6.0 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/prometheus/client_model v0.2.0 // indirect | ||||
| 	github.com/prometheus/common v0.32.1 // indirect | ||||
| 	github.com/prometheus/procfs v0.7.3 // indirect | ||||
| 	github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect | ||||
| 	github.com/rivo/uniseg v0.2.0 // indirect | ||||
| 	github.com/rogpeppe/go-internal v1.8.1 // indirect | ||||
| 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||
| 	github.com/rogpeppe/go-internal v1.8.1-0.20211023094830-115ce09fd6b4 // indirect | ||||
| 	github.com/sirupsen/logrus v1.8.1 // indirect | ||||
| 	github.com/spf13/afero v1.8.1 // indirect | ||||
| 	github.com/spf13/afero v1.8.2 // indirect | ||||
| 	github.com/spf13/cast v1.4.1 // indirect | ||||
| 	github.com/spf13/jwalterweatherman v1.1.0 // indirect | ||||
| 	github.com/spf13/pflag v1.0.5 // indirect | ||||
| 	github.com/subosito/gotenv v1.2.0 // indirect | ||||
| 	github.com/ugorji/go/codec v1.2.7 // indirect | ||||
| 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect | ||||
| 	github.com/ugorji/go/codec v1.1.7 // indirect | ||||
| 	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect | ||||
| 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect | ||||
| 	github.com/xeipuuv/gojsonschema v1.2.0 // indirect | ||||
| 	github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect | ||||
| 	go.opencensus.io v0.23.0 // indirect | ||||
| 	go.uber.org/atomic v1.9.0 // indirect | ||||
| 	go.uber.org/multierr v1.8.0 // indirect | ||||
| 	go.uber.org/zap v1.21.0 // indirect | ||||
| 	go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect | ||||
| 	go4.org/mem v0.0.0-20210711025021-927187094b94 // indirect | ||||
| 	go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 // indirect | ||||
| 	golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect | ||||
| 	golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect | ||||
| 	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect | ||||
| 	golang.org/x/text v0.3.7 // indirect | ||||
| 	golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect | ||||
| 	golang.zx2c4.com/wireguard/windows v0.4.10 // indirect | ||||
| 	google.golang.org/appengine v1.6.7 // indirect | ||||
| 	gopkg.in/ini.v1 v1.66.4 // indirect | ||||
| 	gopkg.in/square/go-jose.v2 v2.6.0 // indirect | ||||
| 	modernc.org/libc v1.14.5 // indirect | ||||
| 	gopkg.in/square/go-jose.v2 v2.5.1 // indirect | ||||
| 	modernc.org/libc v1.14.12 // indirect | ||||
| 	modernc.org/mathutil v1.4.1 // indirect | ||||
| 	modernc.org/memory v1.0.5 // indirect | ||||
| 	modernc.org/sqlite v1.14.7 // indirect | ||||
| 	sigs.k8s.io/yaml v1.3.0 // indirect | ||||
| 	modernc.org/memory v1.0.7 // indirect | ||||
| 	modernc.org/sqlite v1.16.0 // indirect | ||||
| ) | ||||
|  | ||||
							
								
								
									
										17
									
								
								grpcv1.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								grpcv1.go
									
									
									
									
									
								
							| @ -280,6 +280,23 @@ func (api headscaleV1APIServer) ListMachines( | ||||
| 	return &v1.ListMachinesResponse{Machines: response}, nil | ||||
| } | ||||
| 
 | ||||
| func (api headscaleV1APIServer) MoveMachine( | ||||
| 	ctx context.Context, | ||||
| 	request *v1.MoveMachineRequest, | ||||
| ) (*v1.MoveMachineResponse, error) { | ||||
| 	machine, err := api.h.GetMachineByID(request.GetMachineId()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	err = api.h.SetMachineNamespace(machine, request.GetNamespace()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &v1.MoveMachineResponse{Machine: machine.toProto()}, nil | ||||
| } | ||||
| 
 | ||||
| func (api headscaleV1APIServer) GetMachineRoute( | ||||
| 	ctx context.Context, | ||||
| 	request *v1.GetMachineRouteRequest, | ||||
|  | ||||
| @ -1222,3 +1222,172 @@ func (s *IntegrationCLITestSuite) TestApiKeyCommand() { | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (s *IntegrationCLITestSuite) TestNodeMoveCommand() { | ||||
| 	oldNamespace, err := s.createNamespace("old-namespace") | ||||
| 	assert.Nil(s.T(), err) | ||||
| 	newNamespace, err := s.createNamespace("new-namespace") | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	// Randomly generated machine key
 | ||||
| 	machineKey := "688411b767663479632d44140f08a9fde87383adc7cdeb518f62ce28a17ef0aa" | ||||
| 
 | ||||
| 	_, err = ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"debug", | ||||
| 			"create-node", | ||||
| 			"--name", | ||||
| 			"nomad-machine", | ||||
| 			"--namespace", | ||||
| 			oldNamespace.Name, | ||||
| 			"--key", | ||||
| 			machineKey, | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	machineResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"--namespace", | ||||
| 			oldNamespace.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(), "nomad-machine", machine.Name) | ||||
| 	assert.Equal(s.T(), machine.Namespace.Name, oldNamespace.Name) | ||||
| 
 | ||||
| 	machineId := fmt.Sprintf("%d", machine.Id) | ||||
| 
 | ||||
| 	moveToNewNSResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"move", | ||||
| 			"--identifier", | ||||
| 			machineId, | ||||
| 			"--namespace", | ||||
| 			newNamespace.Name, | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	err = json.Unmarshal([]byte(moveToNewNSResult), &machine) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Equal(s.T(), machine.Namespace, newNamespace) | ||||
| 
 | ||||
| 	listAllNodesResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"list", | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	var allNodes []v1.Machine | ||||
| 	err = json.Unmarshal([]byte(listAllNodesResult), &allNodes) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Len(s.T(), allNodes, 1) | ||||
| 
 | ||||
| 	assert.Equal(s.T(), allNodes[0].Id, machine.Id) | ||||
| 	assert.Equal(s.T(), allNodes[0].Namespace, machine.Namespace) | ||||
| 	assert.Equal(s.T(), allNodes[0].Namespace, newNamespace) | ||||
| 
 | ||||
| 	moveToNonExistingNSResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"move", | ||||
| 			"--identifier", | ||||
| 			machineId, | ||||
| 			"--namespace", | ||||
| 			"non-existing-namespace", | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Contains( | ||||
| 		s.T(), | ||||
| 		string(moveToNonExistingNSResult), | ||||
| 		"Namespace not found", | ||||
| 	) | ||||
| 	assert.Equal(s.T(), machine.Namespace, newNamespace) | ||||
| 
 | ||||
| 	moveToOldNSResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"move", | ||||
| 			"--identifier", | ||||
| 			machineId, | ||||
| 			"--namespace", | ||||
| 			oldNamespace.Name, | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	err = json.Unmarshal([]byte(moveToOldNSResult), &machine) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Equal(s.T(), machine.Namespace, oldNamespace) | ||||
| 
 | ||||
| 	moveToSameNSResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"nodes", | ||||
| 			"move", | ||||
| 			"--identifier", | ||||
| 			machineId, | ||||
| 			"--namespace", | ||||
| 			oldNamespace.Name, | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	err = json.Unmarshal([]byte(moveToSameNSResult), &machine) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Equal(s.T(), machine.Namespace, oldNamespace) | ||||
| } | ||||
|  | ||||
| @ -23,6 +23,7 @@ var ( | ||||
| 	tailscaleVersions = []string{ | ||||
| 		"head", | ||||
| 		"unstable", | ||||
| 		"1.24.0", | ||||
| 		"1.22.2", | ||||
| 		"1.20.4", | ||||
| 		"1.18.2", | ||||
|  | ||||
| @ -47,11 +47,11 @@ func TestIntegrationTestSuite(t *testing.T) { | ||||
| 
 | ||||
| 	s.namespaces = map[string]TestNamespace{ | ||||
| 		"thisspace": { | ||||
| 			count:      15, | ||||
| 			count:      10, | ||||
| 			tailscales: make(map[string]dockertest.Resource), | ||||
| 		}, | ||||
| 		"otherspace": { | ||||
| 			count:      5, | ||||
| 			count:      2, | ||||
| 			tailscales: make(map[string]dockertest.Resource), | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| @ -177,8 +177,10 @@ func (h *Headscale) SetMachineNamespace(machine *Machine, namespaceName string) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	machine.NamespaceID = namespace.ID | ||||
| 	h.db.Save(&machine) | ||||
| 	machine.Namespace = *namespace | ||||
| 	if result := h.db.Save(&machine); result.Error != nil { | ||||
| 		return result.Error | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @ -372,3 +372,40 @@ func TestCheckForFQDNRules(t *testing.T) { | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (s *Suite) TestSetMachineNamespace(c *check.C) { | ||||
| 	oldNamespace, err := app.CreateNamespace("old") | ||||
| 	c.Assert(err, check.IsNil) | ||||
| 
 | ||||
| 	newNamespace, err := app.CreateNamespace("new") | ||||
| 	c.Assert(err, check.IsNil) | ||||
| 
 | ||||
| 	pak, err := app.CreatePreAuthKey(oldNamespace.Name, false, false, nil) | ||||
| 	c.Assert(err, check.IsNil) | ||||
| 
 | ||||
| 	machine := Machine{ | ||||
| 		ID:             0, | ||||
| 		MachineKey:     "foo", | ||||
| 		NodeKey:        "bar", | ||||
| 		DiscoKey:       "faa", | ||||
| 		Name:           "testmachine", | ||||
| 		NamespaceID:    oldNamespace.ID, | ||||
| 		RegisterMethod: RegisterMethodAuthKey, | ||||
| 		AuthKeyID:      uint(pak.ID), | ||||
| 	} | ||||
| 	app.db.Save(&machine) | ||||
| 	c.Assert(machine.NamespaceID, check.Equals, oldNamespace.ID) | ||||
| 
 | ||||
| 	err = app.SetMachineNamespace(&machine, newNamespace.Name) | ||||
| 	c.Assert(err, check.IsNil) | ||||
| 	c.Assert(machine.NamespaceID, check.Equals, newNamespace.ID) | ||||
| 	c.Assert(machine.Namespace.Name, check.Equals, newNamespace.Name) | ||||
| 
 | ||||
| 	err = app.SetMachineNamespace(&machine, "non-existing-namespace") | ||||
| 	c.Assert(err, check.Equals, errNamespaceNotFound) | ||||
| 
 | ||||
| 	err = app.SetMachineNamespace(&machine, newNamespace.Name) | ||||
| 	c.Assert(err, check.IsNil) | ||||
| 	c.Assert(machine.NamespaceID, check.Equals, newNamespace.ID) | ||||
| 	c.Assert(machine.Namespace.Name, check.Equals, newNamespace.Name) | ||||
| } | ||||
|  | ||||
							
								
								
									
										34
									
								
								oidc.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								oidc.go
									
									
									
									
									
								
							| @ -53,7 +53,7 @@ func (h *Headscale) initOIDC() error { | ||||
| 				"%s/oidc/callback", | ||||
| 				strings.TrimSuffix(h.cfg.ServerURL, "/"), | ||||
| 			), | ||||
| 			Scopes: []string{oidc.ScopeOpenID, "profile", "email"}, | ||||
| 			Scopes: h.cfg.OIDC.Scope, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -91,7 +91,14 @@ func (h *Headscale) RegisterOIDC(ctx *gin.Context) { | ||||
| 	// place the machine key into the state cache, so it can be retrieved later
 | ||||
| 	h.registrationCache.Set(stateStr, machineKeyStr, registerCacheExpiration) | ||||
| 
 | ||||
| 	authURL := h.oauth2Config.AuthCodeURL(stateStr) | ||||
| 	// Add any extra parameter provided in the configuration to the Authorize Endpoint request
 | ||||
| 	extras := make([]oauth2.AuthCodeOption, 0, len(h.cfg.OIDC.ExtraParams)) | ||||
| 
 | ||||
| 	for k, v := range h.cfg.OIDC.ExtraParams { | ||||
| 		extras = append(extras, oauth2.SetAuthURLParam(k, v)) | ||||
| 	} | ||||
| 
 | ||||
| 	authURL := h.oauth2Config.AuthCodeURL(stateStr, extras...) | ||||
| 	log.Debug().Msgf("Redirecting to %s for authentication", authURL) | ||||
| 
 | ||||
| 	ctx.Redirect(http.StatusFound, authURL) | ||||
| @ -187,6 +194,29 @@ func (h *Headscale) OIDCCallback(ctx *gin.Context) { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// If AllowedDomains is provided, check that the authenticated principal ends with @<alloweddomain>.
 | ||||
| 	if len(h.cfg.OIDC.AllowedDomains) > 0 { | ||||
| 		if at := strings.LastIndex(claims.Email, "@"); at < 0 || | ||||
| 			!IsStringInSlice(h.cfg.OIDC.AllowedDomains, claims.Email[at+1:]) { | ||||
| 			log.Error().Msg("authenticated principal does not match any allowed domain") | ||||
| 			ctx.String( | ||||
| 				http.StatusBadRequest, | ||||
| 				"unauthorized principal (domain mismatch)", | ||||
| 			) | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// If AllowedUsers is provided, check that the authenticated princial is part of that list.
 | ||||
| 	if len(h.cfg.OIDC.AllowedUsers) > 0 && | ||||
| 		!IsStringInSlice(h.cfg.OIDC.AllowedUsers, claims.Email) { | ||||
| 		log.Error().Msg("authenticated principal does not match any allowed user") | ||||
| 		ctx.String(http.StatusBadRequest, "unauthorized principal (user mismatch)") | ||||
| 
 | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// retrieve machinekey from state cache
 | ||||
| 	machineKeyIf, machineKeyFound := h.registrationCache.Get(state) | ||||
| 
 | ||||
|  | ||||
| @ -111,6 +111,12 @@ service HeadscaleService { | ||||
|             get: "/api/v1/machine" | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     rpc MoveMachine(MoveMachineRequest) returns (MoveMachineResponse) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/api/v1/machine/{machine_id}/namespace" | ||||
|         }; | ||||
|     } | ||||
|     // --- Machine end --- | ||||
| 
 | ||||
|     // --- Route start --- | ||||
|  | ||||
| @ -94,6 +94,15 @@ message ListMachinesResponse { | ||||
|     repeated Machine machines = 1; | ||||
| } | ||||
| 
 | ||||
| message MoveMachineRequest { | ||||
|     uint64 machine_id = 1; | ||||
|     string namespace  = 2; | ||||
| } | ||||
| 
 | ||||
| message MoveMachineResponse { | ||||
|     Machine machine = 1; | ||||
| } | ||||
| 
 | ||||
| message DebugCreateMachineRequest { | ||||
|     string namespace       = 1; | ||||
|     string          key    = 2; | ||||
|  | ||||
							
								
								
									
										13
									
								
								tools.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								tools.go
									
									
									
									
									
								
							| @ -1,13 +0,0 @@ | ||||
| //go:build tools
 | ||||
| // +build tools
 | ||||
| 
 | ||||
| package tools | ||||
| 
 | ||||
| import ( | ||||
| 	_ "github.com/bufbuild/buf/cmd/buf" | ||||
| 	_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway" | ||||
| 	_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" | ||||
| 	_ "github.com/infobloxopen/protoc-gen-gorm" | ||||
| 	_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" | ||||
| 	_ "google.golang.org/protobuf/cmd/protoc-gen-go" | ||||
| ) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user