mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 08:01:34 +01:00 
			
		
		
		
	Merge branch 'main' into acls-doc
This commit is contained in:
		
						commit
						2edb5428f9
					
				
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @ -6,6 +6,8 @@ labels: ["bug"] | ||||
| assignees: "" | ||||
| --- | ||||
| 
 | ||||
| <!-- Headscale is a multinational community across the globe. Our common language is English. Please consider raising the bug report in this language. --> | ||||
| 
 | ||||
| **Bug description** | ||||
| 
 | ||||
| <!-- A clear and concise description of what the bug is. Describe the expected bahavior | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							| @ -7,5 +7,5 @@ contact_links: | ||||
|     url: "https://github.com/juanfont/headscale/blob/main/docs" | ||||
|     about: "Find documentation about how to configure and run headscale." | ||||
|   - name: "headscale Discord community" | ||||
|     url: "https://discord.com/invite/XcQxk2VHjx" | ||||
|     url: "https://discord.gg/xGj2TuqyxY" | ||||
|     about: "Please ask and answer questions about usage of headscale here." | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
								
							| @ -6,6 +6,8 @@ labels: ["enhancement"] | ||||
| assignees: "" | ||||
| --- | ||||
| 
 | ||||
| <!-- Headscale is a multinational community across the globe. Our common language is English. Please consider raising the feature request in this language. --> | ||||
| 
 | ||||
| **Feature request** | ||||
| 
 | ||||
| <!-- A clear and precise description of what new or changed feature you want. --> | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/other_issue.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/other_issue.md
									
									
									
									
										vendored
									
									
								
							| @ -6,6 +6,8 @@ labels: ["bug"] | ||||
| assignees: "" | ||||
| --- | ||||
| 
 | ||||
| <!-- Headscale is a multinational community across the globe. Our common language is English. Please consider raising the issue in this language. --> | ||||
| 
 | ||||
| <!-- If you have a question, please consider using our Discord for asking questions --> | ||||
| 
 | ||||
| **Issue description** | ||||
|  | ||||
							
								
								
									
										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
									
									
								
							| @ -27,3 +27,7 @@ derp.yaml | ||||
| .idea | ||||
| 
 | ||||
| test_output/  | ||||
| 
 | ||||
| # Nix build output | ||||
| result | ||||
| .direnv/ | ||||
|  | ||||
							
								
								
									
										17
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @ -1,6 +1,18 @@ | ||||
| # CHANGELOG | ||||
| 
 | ||||
| ## 0.15.0 (2022-xx-xx) | ||||
| ## 0.16.0 (2022-xx-xx) | ||||
| 
 | ||||
| ### Changes | ||||
| 
 | ||||
| - 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) | ||||
| - Add --all (-a) flag to enable routes command [#360](https://github.com/juanfont/headscale/issues/360) | ||||
| 
 | ||||
| ## 0.15.0 (2022-03-20) | ||||
| 
 | ||||
| **Note:** Take a backup of your database before upgrading. | ||||
| 
 | ||||
| @ -19,7 +31,7 @@ | ||||
| - Users can now use emails in ACL's groups [#372](https://github.com/juanfont/headscale/issues/372) | ||||
| - Add shorthand aliases for commands and subcommands [#376](https://github.com/juanfont/headscale/pull/376) | ||||
| - Add `/windows` endpoint for Windows configuration instructions + registry file download [#392](https://github.com/juanfont/headscale/pull/392) | ||||
| - Added embedded DERP server into Headscale [#388](https://github.com/juanfont/headscale/pull/388) | ||||
| - Added embedded DERP (and STUN) server into Headscale [#388](https://github.com/juanfont/headscale/pull/388) | ||||
| 
 | ||||
| ### Changes | ||||
| 
 | ||||
| @ -30,6 +42,7 @@ | ||||
| - Reduce the overhead of marshal/unmarshal for Hostinfo, routes and endpoints by using specific types in Machine [#371](https://github.com/juanfont/headscale/pull/371) | ||||
| - Apply normalization function to FQDN on hostnames when hosts registers and retrieve informations [#363](https://github.com/juanfont/headscale/issues/363) | ||||
| - Fix a bug that prevented the use of `tailscale logout` with OIDC [#508](https://github.com/juanfont/headscale/issues/508) | ||||
| - Added Tailscale repo HEAD and unstable releases channel to the integration tests targets [#513](https://github.com/juanfont/headscale/pull/513) | ||||
| 
 | ||||
| ## 0.14.0 (2022-02-24) | ||||
| 
 | ||||
|  | ||||
| @ -1,11 +1,12 @@ | ||||
| FROM ubuntu:latest | ||||
| 
 | ||||
| ARG TAILSCALE_VERSION | ||||
| ARG TAILSCALE_VERSION=* | ||||
| ARG TAILSCALE_CHANNEL=stable | ||||
| 
 | ||||
| RUN apt-get update \ | ||||
|     && apt-get install -y gnupg curl \ | ||||
|     && curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.gpg | apt-key add - \ | ||||
|     && curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.list | tee /etc/apt/sources.list.d/tailscale.list \ | ||||
|     && curl -fsSL https://pkgs.tailscale.com/${TAILSCALE_CHANNEL}/ubuntu/focal.gpg | apt-key add - \ | ||||
|     && curl -fsSL https://pkgs.tailscale.com/${TAILSCALE_CHANNEL}/ubuntu/focal.list | tee /etc/apt/sources.list.d/tailscale.list \ | ||||
|     && apt-get update \ | ||||
|     && apt-get install -y ca-certificates tailscale=${TAILSCALE_VERSION} dnsutils \ | ||||
|     && rm -rf /var/lib/apt/lists/* | ||||
|  | ||||
							
								
								
									
										21
									
								
								Dockerfile.tailscale-HEAD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Dockerfile.tailscale-HEAD
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| FROM golang:latest | ||||
| 
 | ||||
| RUN apt-get update \ | ||||
|     && apt-get install -y ca-certificates dnsutils git iptables \ | ||||
|     && rm -rf /var/lib/apt/lists/* | ||||
| 
 | ||||
| 
 | ||||
| RUN git clone https://github.com/tailscale/tailscale.git | ||||
| 
 | ||||
| WORKDIR tailscale | ||||
| 
 | ||||
| RUN sh build_dist.sh tailscale.com/cmd/tailscale | ||||
| RUN sh build_dist.sh tailscale.com/cmd/tailscaled | ||||
| 
 | ||||
| RUN cp tailscale /usr/local/bin/ | ||||
| RUN cp tailscaled /usr/local/bin/ | ||||
| 
 | ||||
| ADD integration_test/etc_embedded_derp/tls/server.crt /usr/local/share/ca-certificates/ | ||||
| RUN chmod 644 /usr/local/share/ca-certificates/server.crt  | ||||
| 
 | ||||
| RUN update-ca-certificates | ||||
							
								
								
									
										8
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| # Calculate version
 | ||||
| version = $(shell ./scripts/version-at-commit.sh) | ||||
| version = $(git describe --always --tags --dirty) | ||||
| 
 | ||||
| rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) | ||||
| 
 | ||||
| @ -10,7 +10,7 @@ PROTO_SOURCES = $(call rwildcard,,*.proto) | ||||
| 
 | ||||
| 
 | ||||
| build: | ||||
| 	GGO_ENABLED=0 go build -ldflags "-s -w -X github.com/juanfont/headscale/cmd/headscale/cli.Version=$(version)" cmd/headscale/headscale.go | ||||
| 	CGO_ENABLED=0 go build -trimpath -buildmode=pie -mod=readonly -ldflags "-s -w -X github.com/juanfont/headscale/cmd/headscale/cli.Version=$(version)" cmd/headscale/headscale.go | ||||
| 
 | ||||
| dev: lint test build | ||||
| 
 | ||||
| @ -41,14 +41,14 @@ fmt: | ||||
| 	clang-format -style="{BasedOnStyle: Google, IndentWidth: 4, AlignConsecutiveDeclarations: true, AlignConsecutiveAssignments: true, ColumnLimit: 0}" -i $(PROTO_SOURCES) | ||||
| 
 | ||||
| proto-lint: | ||||
| 	cd proto/ && buf lint | ||||
| 	cd proto/ && go run github.com/bufbuild/buf/cmd/buf lint | ||||
| 
 | ||||
| compress: build | ||||
| 	upx --brute headscale | ||||
| 
 | ||||
| generate: | ||||
| 	rm -rf gen | ||||
| 	buf generate proto | ||||
| 	go run github.com/bufbuild/buf/cmd/buf generate proto | ||||
| 
 | ||||
| install-protobuf-plugins: | ||||
| 	go install \
 | ||||
|  | ||||
							
								
								
									
										97
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								README.md
									
									
									
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| 
 | ||||
| An open source, self-hosted implementation of the Tailscale control server. | ||||
| 
 | ||||
| Join our [Discord](https://discord.gg/XcQxk2VHjx) server for a chat. | ||||
| Join our [Discord](https://discord.gg/c84AZQhmpx) server for a chat. | ||||
| 
 | ||||
| **Note:** Always select the same GitHub tag as the released version you use | ||||
| to ensure you have the correct example configuration and documentation. | ||||
| @ -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 | ||||
| ``` | ||||
| @ -206,6 +218,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Alessandro (Ale) Segala</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/reynico> | ||||
|             <img src=https://avatars.githubusercontent.com/u/715768?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Nico/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Nico</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/unreality> | ||||
|             <img src=https://avatars.githubusercontent.com/u/352522?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=unreality/> | ||||
| @ -214,12 +233,21 @@ make build | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/reynico> | ||||
|             <img src=https://avatars.githubusercontent.com/u/715768?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Nico/> | ||||
|         <a href=https://github.com/mpldr> | ||||
|             <img src=https://avatars.githubusercontent.com/u/33086936?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Moritz Poldrack/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Nico</b></sub> | ||||
|             <sub style="font-size:14px"><b>Moritz Poldrack</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/Niek> | ||||
|             <img src=https://avatars.githubusercontent.com/u/213140?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Niek van der Maas/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Niek van der Maas</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/negbie> | ||||
|             <img src=https://avatars.githubusercontent.com/u/20154956?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Eugen Biegler/> | ||||
| @ -234,8 +262,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Aaron Bieber</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/fdelucchijr> | ||||
|             <img src=https://avatars.githubusercontent.com/u/69133647?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Fernando De Lucchi/> | ||||
| @ -250,6 +276,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Hoàng Đức Hiếu</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/deonthomasgy> | ||||
|             <img src=https://avatars.githubusercontent.com/u/150036?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Deon Thomas/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Deon Thomas</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/mevansam> | ||||
|             <img src=https://avatars.githubusercontent.com/u/403630?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Mevan Samaratunga/> | ||||
| @ -257,6 +290,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Mevan Samaratunga</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/dragetd> | ||||
|             <img src=https://avatars.githubusercontent.com/u/3639577?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Michael G./> | ||||
| @ -271,6 +306,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Paul Tötterman</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/artemklevtsov> | ||||
|             <img src=https://avatars.githubusercontent.com/u/603798?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Artem Klevtsov/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Artem Klevtsov</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/cmars> | ||||
|             <img src=https://avatars.githubusercontent.com/u/23741?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Casey Marshall/> | ||||
| @ -278,8 +320,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Casey Marshall</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/SilverBut> | ||||
|             <img src=https://avatars.githubusercontent.com/u/6560655?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Silver Bullet/> | ||||
| @ -294,6 +334,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Stefan Majer</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/lachy2849> | ||||
|             <img src=https://avatars.githubusercontent.com/u/98844035?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=lachy2849/> | ||||
| @ -316,14 +358,19 @@ make build | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/artemklevtsov> | ||||
|             <img src=https://avatars.githubusercontent.com/u/603798?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Artem Klevtsov/> | ||||
|         <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>Artem Klevtsov</b></sub> | ||||
|             <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/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>Aofei Sheng</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/awoimbee> | ||||
|             <img src=https://avatars.githubusercontent.com/u/22431493?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Arthur Woimbée/> | ||||
| @ -331,6 +378,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Arthur Woimbée</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/stensonb> | ||||
|             <img src=https://avatars.githubusercontent.com/u/933389?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Bryan Stenson/> | ||||
| @ -338,6 +387,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Bryan Stenson</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <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/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b> Carson Yang</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <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/> | ||||
| @ -484,6 +540,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>derelm</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/nning> | ||||
|             <img src=https://avatars.githubusercontent.com/u/557430?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=henning mueller/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>henning mueller</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/ignoramous> | ||||
|             <img src=https://avatars.githubusercontent.com/u/852289?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=ignoramous/> | ||||
| @ -491,6 +554,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>ignoramous</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/lion24> | ||||
|             <img src=https://avatars.githubusercontent.com/u/1382102?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=lion24/> | ||||
| @ -498,8 +563,6 @@ 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/> | ||||
|  | ||||
							
								
								
									
										2
									
								
								api.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								api.go
									
									
									
									
									
								
							| @ -573,7 +573,7 @@ func (h *Headscale) handleAuthKey( | ||||
| 			machineRegistrations.WithLabelValues("new", RegisterMethodAuthKey, "error", pak.Namespace.Name). | ||||
| 				Inc() | ||||
| 		} else { | ||||
| 			machineRegistrations.WithLabelValues("new", RegisterMethodAuthKey, "error").Inc() | ||||
| 			machineRegistrations.WithLabelValues("new", RegisterMethodAuthKey, "error", "unknown").Inc() | ||||
| 		} | ||||
| 
 | ||||
| 		return | ||||
|  | ||||
							
								
								
									
										11
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								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,14 +317,17 @@ func (h *Headscale) expireEphemeralNodesWorker() { | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if expiredFound { | ||||
| 			h.setLastStateChangeToNow(namespace.Name) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (h *Headscale) grpcAuthenticationInterceptor(ctx context.Context, | ||||
| 	req interface{}, | ||||
| 	info *grpc.UnaryServerInfo, | ||||
| 	handler grpc.UnaryHandler) (interface{}, error) { | ||||
| 	handler grpc.UnaryHandler, | ||||
| ) (interface{}, error) { | ||||
| 	// Check if the request is coming from the on-server client. | ||||
| 	// This is not secure, but it is to maintain maintainability | ||||
| 	// with the "legacy" database-based client | ||||
|  | ||||
| @ -23,7 +23,7 @@ func init() { | ||||
| 	apiKeysCmd.AddCommand(listAPIKeys) | ||||
| 
 | ||||
| 	createAPIKeyCmd.Flags(). | ||||
| 		DurationP("expiration", "e", DefaultAPIKeyExpiry, "Human-readable expiration of the key (30m, 24h, 365d...)") | ||||
| 		DurationP("expiration", "e", DefaultAPIKeyExpiry, "Human-readable expiration of the key (e.g. 30m, 24h)") | ||||
| 
 | ||||
| 	apiKeysCmd.AddCommand(createAPIKeyCmd) | ||||
| 
 | ||||
|  | ||||
| @ -13,6 +13,7 @@ import ( | ||||
| 	"github.com/pterm/pterm" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"inet.af/netaddr" | ||||
| 	"tailscale.com/types/key" | ||||
| ) | ||||
| 
 | ||||
| @ -46,6 +47,21 @@ func init() { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 	nodeCmd.AddCommand(deleteNodeCmd) | ||||
| 
 | ||||
| 	moveNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||
| 
 | ||||
| 	err = moveNodeCmd.MarkFlagRequired("identifier") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	moveNodeCmd.Flags().StringP("namespace", "n", "", "New namespace") | ||||
| 
 | ||||
| 	err = moveNodeCmd.MarkFlagRequired("namespace") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| 	} | ||||
| 	nodeCmd.AddCommand(moveNodeCmd) | ||||
| } | ||||
| 
 | ||||
| var nodeCmd = &cobra.Command{ | ||||
| @ -296,6 +312,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, | ||||
| @ -363,6 +453,17 @@ func nodesToPtables( | ||||
| 			// Shared into this namespace | ||||
| 			namespace = pterm.LightYellow(machine.Namespace.Name) | ||||
| 		} | ||||
| 
 | ||||
| 		var IpV4Address string | ||||
| 		var IpV6Address string | ||||
| 		for _, addr := range machine.IpAddresses { | ||||
| 			if netaddr.MustParseIP(addr).Is4() { | ||||
| 				IpV4Address = addr | ||||
| 			} else { | ||||
| 				IpV6Address = addr | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		tableData = append( | ||||
| 			tableData, | ||||
| 			[]string{ | ||||
| @ -370,7 +471,7 @@ func nodesToPtables( | ||||
| 				machine.Name, | ||||
| 				nodeKey.ShortString(), | ||||
| 				namespace, | ||||
| 				strings.Join(machine.IpAddresses, ", "), | ||||
| 				strings.Join([]string{IpV4Address, IpV6Address}, ", "), | ||||
| 				strconv.FormatBool(ephemeral), | ||||
| 				lastSeenTime, | ||||
| 				online, | ||||
|  | ||||
| @ -31,7 +31,7 @@ func init() { | ||||
| 	createPreAuthKeyCmd.PersistentFlags(). | ||||
| 		Bool("ephemeral", false, "Preauthkey for ephemeral nodes") | ||||
| 	createPreAuthKeyCmd.Flags(). | ||||
| 		DurationP("expiration", "e", DefaultPreAuthKeyExpiry, "Human-readable expiration of the key (30m, 24h, 365d...)") | ||||
| 		DurationP("expiration", "e", DefaultPreAuthKeyExpiry, "Human-readable expiration of the key (e.g. 30m, 24h)") | ||||
| } | ||||
| 
 | ||||
| var preauthkeysCmd = &cobra.Command{ | ||||
|  | ||||
| @ -24,6 +24,8 @@ func init() { | ||||
| 	enableRouteCmd.Flags(). | ||||
| 		StringSliceP("route", "r", []string{}, "List (or repeated flags) of routes to enable") | ||||
| 	enableRouteCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||
| 	enableRouteCmd.Flags().BoolP("all", "a", false, "All routes from host") | ||||
| 
 | ||||
| 	err = enableRouteCmd.MarkFlagRequired("identifier") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf(err.Error()) | ||||
| @ -125,7 +127,32 @@ omit the route you do not want to enable. | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		routes, err := cmd.Flags().GetStringSlice("route") | ||||
| 		ctx, client, conn, cancel := getHeadscaleCLIClient() | ||||
| 		defer cancel() | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		var routes []string | ||||
| 
 | ||||
| 		isAll, _ := cmd.Flags().GetBool("all") | ||||
| 		if isAll { | ||||
| 			response, err := client.GetMachineRoute(ctx, &v1.GetMachineRouteRequest{ | ||||
| 				MachineId: machineID, | ||||
| 			}) | ||||
| 			if err != nil { | ||||
| 				ErrorOutput( | ||||
| 					err, | ||||
| 					fmt.Sprintf( | ||||
| 						"Cannot get machine routes: %s\n", | ||||
| 						status.Convert(err).Message(), | ||||
| 					), | ||||
| 					output, | ||||
| 				) | ||||
| 
 | ||||
| 				return | ||||
| 			} | ||||
| 			routes = response.GetRoutes().GetAdvertisedRoutes() | ||||
| 		} else { | ||||
| 			routes, err = cmd.Flags().GetStringSlice("route") | ||||
| 			if err != nil { | ||||
| 				ErrorOutput( | ||||
| 					err, | ||||
| @ -135,10 +162,7 @@ omit the route you do not want to enable. | ||||
| 
 | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 		ctx, client, conn, cancel := getHeadscaleCLIClient() | ||||
| 		defer cancel() | ||||
| 		defer conn.Close() | ||||
| 		} | ||||
| 
 | ||||
| 		request := &v1.EnableMachineRoutesRequest{ | ||||
| 			MachineId: machineID, | ||||
|  | ||||
| @ -14,6 +14,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" | ||||
| @ -67,6 +68,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 { | ||||
| @ -367,6 +369,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"), | ||||
| 		}, | ||||
| 
 | ||||
| @ -408,7 +414,7 @@ func getHeadscaleApp() (*headscale.Headscale, error) { | ||||
| 		aclPath := absPath(viper.GetString("acl_policy_path")) | ||||
| 		err = app.LoadACLPolicy(aclPath) | ||||
| 		if err != nil { | ||||
| 			log.Error(). | ||||
| 			log.Fatal(). | ||||
| 				Str("path", aclPath). | ||||
| 				Err(err). | ||||
| 				Msg("Could not load the ACL policy") | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -12,4 +12,4 @@ regions: | ||||
|         ipv6: "2604:a880:400:d1::828:b001" | ||||
|         stunport: 0 | ||||
|         stunonly: false | ||||
|         derptestport: 0 | ||||
|         derpport: 0 | ||||
|  | ||||
| @ -122,7 +122,7 @@ func (h *Headscale) DERPHandler(ctx *gin.Context) { | ||||
| 
 | ||||
| 	if !fastStart { | ||||
| 		pubKey := h.privateKey.Public() | ||||
| 		pubKeyStr := pubKey.UntypedHexString() // nolint | ||||
| 		pubKeyStr := pubKey.UntypedHexString() | ||||
| 		fmt.Fprintf(conn, "HTTP/1.1 101 Switching Protocols\r\n"+ | ||||
| 			"Upgrade: DERP\r\n"+ | ||||
| 			"Connection: Upgrade\r\n"+ | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| This page contains the official and community contributed documentation for `headscale`. | ||||
| 
 | ||||
| If you are having trouble with following the documentation or get unexpected results, | ||||
| please ask on [Discord](https://discord.gg/XcQxk2VHjx) instead of opening an Issue. | ||||
| please ask on [Discord](https://discord.gg/c84AZQhmpx) instead of opening an Issue. | ||||
| 
 | ||||
| ## Official documentation | ||||
| 
 | ||||
|  | ||||
| @ -24,7 +24,7 @@ To create a API key, log into your `headscale` server and generate a key: | ||||
| headscale apikeys create --expiration 90d | ||||
| ``` | ||||
| 
 | ||||
| Copy the output of the command and save it for later. Please not that you can not retrieve a key again, | ||||
| Copy the output of the command and save it for later. Please note that you can not retrieve a key again, | ||||
| if the key is lost, expire the old one, and create a new key. | ||||
| 
 | ||||
| To list the keys currently assosicated with the server: | ||||
|  | ||||
| @ -14,8 +14,8 @@ not work with alternatives like [Podman](https://podman.io). The Docker image ca | ||||
| 1. Prepare a directory on the host Docker node in your directory of choice, used to hold `headscale` configuration and the [SQLite](https://www.sqlite.org/) database: | ||||
| 
 | ||||
| ```shell | ||||
| mkdir ./headscale && cd ./headscale | ||||
| mkdir ./config | ||||
| mkdir -p ./headscale/config | ||||
| cd ./headscale | ||||
| ``` | ||||
| 
 | ||||
| 2. Create an empty SQlite datebase in the headscale directory: | ||||
| @ -45,6 +45,17 @@ touch ./config/config.yaml | ||||
| ``` | ||||
| 
 | ||||
| Modify the config file to your preferences before launching Docker container. | ||||
| Here are some settings that you likely want: | ||||
| 
 | ||||
| ```yaml | ||||
| server_url: http://your-host-name:8080 # Change to your hostname or host IP | ||||
| # Listen to 0.0.0.0 so it's accessible outside the container | ||||
| metrics_listen_addr: 0.0.0.0:9090 | ||||
| # The default /var/lib/headscale path is not writable in the container | ||||
| private_key_path: /etc/headscale/private.key | ||||
| # The default /var/lib/headscale path is not writable  in the container | ||||
| db_path: /etc/headscale/db.sqlite | ||||
| ``` | ||||
| 
 | ||||
| 4. Start the headscale server while working in the host headscale directory: | ||||
| 
 | ||||
| @ -61,6 +72,8 @@ docker run \ | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| Note: use `0.0.0.0:8080:8080` instead of `127.0.0.1:8080:8080` if you want to expose the container externally. | ||||
| 
 | ||||
| This command will mount `config/` under `/etc/headscale`, forward port 8080 out of the container so the | ||||
| `headscale` instance becomes available and then detach so headscale runs in the background. | ||||
| 
 | ||||
| @ -87,7 +100,8 @@ curl http://127.0.0.1:9090/metrics | ||||
| 6. Create a namespace ([tailnet](https://tailscale.com/kb/1136/tailnet/)): | ||||
| 
 | ||||
| ```shell | ||||
| docker exec headscale -- headscale namespaces create myfirstnamespace | ||||
| docker exec headscale \ | ||||
|   headscale namespaces create myfirstnamespace | ||||
| ``` | ||||
| 
 | ||||
| ### Register a machine (normal login) | ||||
| @ -101,7 +115,7 @@ tailscale up --login-server YOUR_HEADSCALE_URL | ||||
| To register a machine when running `headscale` in a container, take the headscale command and pass it to the container: | ||||
| 
 | ||||
| ```shell | ||||
| docker exec headscale -- \ | ||||
| docker exec headscale \ | ||||
|   headscale --namespace myfirstnamespace nodes register --key <YOU_+MACHINE_KEY> | ||||
| ``` | ||||
| 
 | ||||
| @ -110,7 +124,7 @@ docker exec headscale -- \ | ||||
| Generate a key using the command line: | ||||
| 
 | ||||
| ```shell | ||||
| docker exec headscale -- \ | ||||
| docker exec headscale \ | ||||
|   headscale --namespace myfirstnamespace preauthkeys create --reusable --expiration 24h | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| @ -30,6 +30,14 @@ mkdir -p /etc/headscale | ||||
| 
 | ||||
| # Directory for Database, and other variable data (like certificates) | ||||
| mkdir -p /var/lib/headscale | ||||
| # or if you create a headscale user: | ||||
| useradd \ | ||||
| 	--create-home \ | ||||
| 	--home-dir /var/lib/headscale/ \ | ||||
| 	--system \ | ||||
| 	--user-group \ | ||||
| 	--shell /usr/bin/nologin \ | ||||
| 	headscale | ||||
| ``` | ||||
| 
 | ||||
| 4. Create an empty SQLite database: | ||||
| @ -50,7 +58,7 @@ from the [headscale repository](../) | ||||
| 6. Start the headscale server: | ||||
| 
 | ||||
| ```shell | ||||
|   headscale serve | ||||
| headscale serve | ||||
| ``` | ||||
| 
 | ||||
| This command will start `headscale` in the current terminal session. | ||||
| @ -150,7 +158,7 @@ or run all headscale commands as the headscale user: | ||||
| su - headscale | ||||
| ``` | ||||
| 
 | ||||
| 2. In `/etc/headscale/config.yaml`, override the default `headscale` unix socket with a SystemD friendly path: | ||||
| 2. In `/etc/headscale/config.yaml`, override the default `headscale` unix socket with path that is writable by the `headscale` user or group: | ||||
| 
 | ||||
| ```yaml | ||||
| unix_socket: /var/run/headscale/headscale.sock | ||||
| @ -165,8 +173,7 @@ systemctl daemon-reload | ||||
| 4. Enable and start the new `headscale` service: | ||||
| 
 | ||||
| ```shell | ||||
| systemctl enable headscale | ||||
| systemctl start headscale | ||||
| systemctl enable --now headscale | ||||
| ``` | ||||
| 
 | ||||
| 5. Verify the headscale service: | ||||
| @ -178,7 +185,7 @@ systemctl status headscale | ||||
| Verify `headscale` is available: | ||||
| 
 | ||||
| ```shell | ||||
| curl http://127.0.0.1:8080/metrics | ||||
| curl http://127.0.0.1:9090/metrics | ||||
| ``` | ||||
| 
 | ||||
| `headscale` will now run in the background and start at boot. | ||||
|  | ||||
							
								
								
									
										42
									
								
								flake.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								flake.lock
									
									
									
										generated
									
									
									
										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, 0xa3, 0x13, 0x0a, 0x10, 0x48, 0x65, | ||||
| 	0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xa8, 0x14, 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, | ||||
| @ -151,50 +151,58 @@ var file_headscale_v1_headscale_proto_rawDesc = []byte{ | ||||
| 	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, | ||||
| 	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{}{ | ||||
| @ -212,30 +220,32 @@ var file_headscale_v1_headscale_proto_goTypes = []interface{}{ | ||||
| 	(*DeleteMachineRequest)(nil),        // 11: headscale.v1.DeleteMachineRequest | ||||
| 	(*ExpireMachineRequest)(nil),        // 12: headscale.v1.ExpireMachineRequest | ||||
| 	(*ListMachinesRequest)(nil),         // 13: headscale.v1.ListMachinesRequest | ||||
| 	(*GetMachineRouteRequest)(nil),      // 14: headscale.v1.GetMachineRouteRequest | ||||
| 	(*EnableMachineRoutesRequest)(nil),  // 15: headscale.v1.EnableMachineRoutesRequest | ||||
| 	(*CreateApiKeyRequest)(nil),         // 16: headscale.v1.CreateApiKeyRequest | ||||
| 	(*ExpireApiKeyRequest)(nil),         // 17: headscale.v1.ExpireApiKeyRequest | ||||
| 	(*ListApiKeysRequest)(nil),          // 18: headscale.v1.ListApiKeysRequest | ||||
| 	(*GetNamespaceResponse)(nil),        // 19: headscale.v1.GetNamespaceResponse | ||||
| 	(*CreateNamespaceResponse)(nil),     // 20: headscale.v1.CreateNamespaceResponse | ||||
| 	(*RenameNamespaceResponse)(nil),     // 21: headscale.v1.RenameNamespaceResponse | ||||
| 	(*DeleteNamespaceResponse)(nil),     // 22: headscale.v1.DeleteNamespaceResponse | ||||
| 	(*ListNamespacesResponse)(nil),      // 23: headscale.v1.ListNamespacesResponse | ||||
| 	(*CreatePreAuthKeyResponse)(nil),    // 24: headscale.v1.CreatePreAuthKeyResponse | ||||
| 	(*ExpirePreAuthKeyResponse)(nil),    // 25: headscale.v1.ExpirePreAuthKeyResponse | ||||
| 	(*ListPreAuthKeysResponse)(nil),     // 26: headscale.v1.ListPreAuthKeysResponse | ||||
| 	(*DebugCreateMachineResponse)(nil),  // 27: headscale.v1.DebugCreateMachineResponse | ||||
| 	(*GetMachineResponse)(nil),          // 28: headscale.v1.GetMachineResponse | ||||
| 	(*RegisterMachineResponse)(nil),     // 29: headscale.v1.RegisterMachineResponse | ||||
| 	(*DeleteMachineResponse)(nil),       // 30: headscale.v1.DeleteMachineResponse | ||||
| 	(*ExpireMachineResponse)(nil),       // 31: headscale.v1.ExpireMachineResponse | ||||
| 	(*ListMachinesResponse)(nil),        // 32: headscale.v1.ListMachinesResponse | ||||
| 	(*GetMachineRouteResponse)(nil),     // 33: headscale.v1.GetMachineRouteResponse | ||||
| 	(*EnableMachineRoutesResponse)(nil), // 34: headscale.v1.EnableMachineRoutesResponse | ||||
| 	(*CreateApiKeyResponse)(nil),        // 35: headscale.v1.CreateApiKeyResponse | ||||
| 	(*ExpireApiKeyResponse)(nil),        // 36: headscale.v1.ExpireApiKeyResponse | ||||
| 	(*ListApiKeysResponse)(nil),         // 37: headscale.v1.ListApiKeysResponse | ||||
| 	(*MoveMachineRequest)(nil),          // 14: headscale.v1.MoveMachineRequest | ||||
| 	(*GetMachineRouteRequest)(nil),      // 15: headscale.v1.GetMachineRouteRequest | ||||
| 	(*EnableMachineRoutesRequest)(nil),  // 16: headscale.v1.EnableMachineRoutesRequest | ||||
| 	(*CreateApiKeyRequest)(nil),         // 17: headscale.v1.CreateApiKeyRequest | ||||
| 	(*ExpireApiKeyRequest)(nil),         // 18: headscale.v1.ExpireApiKeyRequest | ||||
| 	(*ListApiKeysRequest)(nil),          // 19: headscale.v1.ListApiKeysRequest | ||||
| 	(*GetNamespaceResponse)(nil),        // 20: headscale.v1.GetNamespaceResponse | ||||
| 	(*CreateNamespaceResponse)(nil),     // 21: headscale.v1.CreateNamespaceResponse | ||||
| 	(*RenameNamespaceResponse)(nil),     // 22: headscale.v1.RenameNamespaceResponse | ||||
| 	(*DeleteNamespaceResponse)(nil),     // 23: headscale.v1.DeleteNamespaceResponse | ||||
| 	(*ListNamespacesResponse)(nil),      // 24: headscale.v1.ListNamespacesResponse | ||||
| 	(*CreatePreAuthKeyResponse)(nil),    // 25: headscale.v1.CreatePreAuthKeyResponse | ||||
| 	(*ExpirePreAuthKeyResponse)(nil),    // 26: headscale.v1.ExpirePreAuthKeyResponse | ||||
| 	(*ListPreAuthKeysResponse)(nil),     // 27: headscale.v1.ListPreAuthKeysResponse | ||||
| 	(*DebugCreateMachineResponse)(nil),  // 28: headscale.v1.DebugCreateMachineResponse | ||||
| 	(*GetMachineResponse)(nil),          // 29: headscale.v1.GetMachineResponse | ||||
| 	(*RegisterMachineResponse)(nil),     // 30: headscale.v1.RegisterMachineResponse | ||||
| 	(*DeleteMachineResponse)(nil),       // 31: headscale.v1.DeleteMachineResponse | ||||
| 	(*ExpireMachineResponse)(nil),       // 32: headscale.v1.ExpireMachineResponse | ||||
| 	(*ListMachinesResponse)(nil),        // 33: headscale.v1.ListMachinesResponse | ||||
| 	(*MoveMachineResponse)(nil),         // 34: headscale.v1.MoveMachineResponse | ||||
| 	(*GetMachineRouteResponse)(nil),     // 35: headscale.v1.GetMachineRouteResponse | ||||
| 	(*EnableMachineRoutesResponse)(nil), // 36: headscale.v1.EnableMachineRoutesResponse | ||||
| 	(*CreateApiKeyResponse)(nil),        // 37: headscale.v1.CreateApiKeyResponse | ||||
| 	(*ExpireApiKeyResponse)(nil),        // 38: headscale.v1.ExpireApiKeyResponse | ||||
| 	(*ListApiKeysResponse)(nil),         // 39: headscale.v1.ListApiKeysResponse | ||||
| } | ||||
| var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	0,  // 0: headscale.v1.HeadscaleService.GetNamespace:input_type -> headscale.v1.GetNamespaceRequest | ||||
| @ -252,32 +262,34 @@ var file_headscale_v1_headscale_proto_depIdxs = []int32{ | ||||
| 	11, // 11: headscale.v1.HeadscaleService.DeleteMachine:input_type -> headscale.v1.DeleteMachineRequest | ||||
| 	12, // 12: headscale.v1.HeadscaleService.ExpireMachine:input_type -> headscale.v1.ExpireMachineRequest | ||||
| 	13, // 13: headscale.v1.HeadscaleService.ListMachines:input_type -> headscale.v1.ListMachinesRequest | ||||
| 	14, // 14: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest | ||||
| 	15, // 15: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest | ||||
| 	16, // 16: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest | ||||
| 	17, // 17: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest | ||||
| 	18, // 18: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest | ||||
| 	19, // 19: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse | ||||
| 	20, // 20: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse | ||||
| 	21, // 21: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse | ||||
| 	22, // 22: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse | ||||
| 	23, // 23: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse | ||||
| 	24, // 24: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse | ||||
| 	25, // 25: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse | ||||
| 	26, // 26: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse | ||||
| 	27, // 27: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse | ||||
| 	28, // 28: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse | ||||
| 	29, // 29: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse | ||||
| 	30, // 30: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse | ||||
| 	31, // 31: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse | ||||
| 	32, // 32: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse | ||||
| 	33, // 33: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse | ||||
| 	34, // 34: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse | ||||
| 	35, // 35: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse | ||||
| 	36, // 36: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse | ||||
| 	37, // 37: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse | ||||
| 	19, // [19:38] is the sub-list for method output_type | ||||
| 	0,  // [0:19] is the sub-list for method input_type | ||||
| 	14, // 14: headscale.v1.HeadscaleService.MoveMachine:input_type -> headscale.v1.MoveMachineRequest | ||||
| 	15, // 15: headscale.v1.HeadscaleService.GetMachineRoute:input_type -> headscale.v1.GetMachineRouteRequest | ||||
| 	16, // 16: headscale.v1.HeadscaleService.EnableMachineRoutes:input_type -> headscale.v1.EnableMachineRoutesRequest | ||||
| 	17, // 17: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest | ||||
| 	18, // 18: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest | ||||
| 	19, // 19: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest | ||||
| 	20, // 20: headscale.v1.HeadscaleService.GetNamespace:output_type -> headscale.v1.GetNamespaceResponse | ||||
| 	21, // 21: headscale.v1.HeadscaleService.CreateNamespace:output_type -> headscale.v1.CreateNamespaceResponse | ||||
| 	22, // 22: headscale.v1.HeadscaleService.RenameNamespace:output_type -> headscale.v1.RenameNamespaceResponse | ||||
| 	23, // 23: headscale.v1.HeadscaleService.DeleteNamespace:output_type -> headscale.v1.DeleteNamespaceResponse | ||||
| 	24, // 24: headscale.v1.HeadscaleService.ListNamespaces:output_type -> headscale.v1.ListNamespacesResponse | ||||
| 	25, // 25: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse | ||||
| 	26, // 26: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse | ||||
| 	27, // 27: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse | ||||
| 	28, // 28: headscale.v1.HeadscaleService.DebugCreateMachine:output_type -> headscale.v1.DebugCreateMachineResponse | ||||
| 	29, // 29: headscale.v1.HeadscaleService.GetMachine:output_type -> headscale.v1.GetMachineResponse | ||||
| 	30, // 30: headscale.v1.HeadscaleService.RegisterMachine:output_type -> headscale.v1.RegisterMachineResponse | ||||
| 	31, // 31: headscale.v1.HeadscaleService.DeleteMachine:output_type -> headscale.v1.DeleteMachineResponse | ||||
| 	32, // 32: headscale.v1.HeadscaleService.ExpireMachine:output_type -> headscale.v1.ExpireMachineResponse | ||||
| 	33, // 33: headscale.v1.HeadscaleService.ListMachines:output_type -> headscale.v1.ListMachinesResponse | ||||
| 	34, // 34: headscale.v1.HeadscaleService.MoveMachine:output_type -> headscale.v1.MoveMachineResponse | ||||
| 	35, // 35: headscale.v1.HeadscaleService.GetMachineRoute:output_type -> headscale.v1.GetMachineRouteResponse | ||||
| 	36, // 36: headscale.v1.HeadscaleService.EnableMachineRoutes:output_type -> headscale.v1.EnableMachineRoutesResponse | ||||
| 	37, // 37: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse | ||||
| 	38, // 38: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse | ||||
| 	39, // 39: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse | ||||
| 	20, // [20:40] is the sub-list for method output_type | ||||
| 	0,  // [0:20] is the sub-list for method input_type | ||||
| 	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 | ||||
|  | ||||
| @ -625,6 +625,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 | ||||
| @ -1161,6 +1231,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() | ||||
| @ -1597,6 +1690,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() | ||||
| @ -1729,6 +1842,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"}, "")) | ||||
| @ -1769,6 +1884,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 | ||||
| 
 | ||||
| @ -39,6 +35,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) | ||||
| @ -182,6 +179,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...) | ||||
| @ -248,6 +254,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) | ||||
| @ -304,6 +311,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") | ||||
| } | ||||
| @ -584,6 +594,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 { | ||||
| @ -737,6 +765,10 @@ var HeadscaleService_ServiceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "ListMachines", | ||||
| 			Handler:    _HeadscaleService_ListMachines_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "MoveMachine", | ||||
| 			Handler:    _HeadscaleService_MoveMachine_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetMachineRoute", | ||||
| 			Handler:    _HeadscaleService_GetMachineRoute_Handler, | ||||
|  | ||||
| @ -685,6 +685,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[11] | ||||
| 		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[11] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
| 
 | ||||
| // Deprecated: Use MoveMachineRequest.ProtoReflect.Descriptor instead. | ||||
| func (*MoveMachineRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{11} | ||||
| } | ||||
| 
 | ||||
| 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[12] | ||||
| 		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[12] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
| 
 | ||||
| // Deprecated: Use MoveMachineResponse.ProtoReflect.Descriptor instead. | ||||
| func (*MoveMachineResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{12} | ||||
| } | ||||
| 
 | ||||
| func (x *MoveMachineResponse) GetMachine() *Machine { | ||||
| 	if x != nil { | ||||
| 		return x.Machine | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| type DebugCreateMachineRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @ -699,7 +801,7 @@ type DebugCreateMachineRequest struct { | ||||
| func (x *DebugCreateMachineRequest) Reset() { | ||||
| 	*x = DebugCreateMachineRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[11] | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[13] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @ -712,7 +814,7 @@ func (x *DebugCreateMachineRequest) String() string { | ||||
| func (*DebugCreateMachineRequest) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DebugCreateMachineRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[11] | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[13] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @ -725,7 +827,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{11} | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{13} | ||||
| } | ||||
| 
 | ||||
| func (x *DebugCreateMachineRequest) GetNamespace() string { | ||||
| @ -767,7 +869,7 @@ type DebugCreateMachineResponse struct { | ||||
| func (x *DebugCreateMachineResponse) Reset() { | ||||
| 	*x = DebugCreateMachineResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[12] | ||||
| 		mi := &file_headscale_v1_machine_proto_msgTypes[14] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @ -780,7 +882,7 @@ func (x *DebugCreateMachineResponse) String() string { | ||||
| func (*DebugCreateMachineResponse) ProtoMessage() {} | ||||
| 
 | ||||
| func (x *DebugCreateMachineResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[12] | ||||
| 	mi := &file_headscale_v1_machine_proto_msgTypes[14] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @ -793,7 +895,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{12} | ||||
| 	return file_headscale_v1_machine_proto_rawDescGZIP(), []int{14} | ||||
| } | ||||
| 
 | ||||
| func (x *DebugCreateMachineResponse) GetMachine() *Machine { | ||||
| @ -890,31 +992,41 @@ var file_headscale_v1_machine_proto_rawDesc = []byte{ | ||||
| 	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, | ||||
| 	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 ( | ||||
| @ -930,7 +1042,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, 13) | ||||
| var file_headscale_v1_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 15) | ||||
| var file_headscale_v1_machine_proto_goTypes = []interface{}{ | ||||
| 	(RegisterMethod)(0),                // 0: headscale.v1.RegisterMethod | ||||
| 	(*Machine)(nil),                    // 1: headscale.v1.Machine | ||||
| @ -944,30 +1056,33 @@ var file_headscale_v1_machine_proto_goTypes = []interface{}{ | ||||
| 	(*ExpireMachineResponse)(nil),      // 9: headscale.v1.ExpireMachineResponse | ||||
| 	(*ListMachinesRequest)(nil),        // 10: headscale.v1.ListMachinesRequest | ||||
| 	(*ListMachinesResponse)(nil),       // 11: headscale.v1.ListMachinesResponse | ||||
| 	(*DebugCreateMachineRequest)(nil),  // 12: headscale.v1.DebugCreateMachineRequest | ||||
| 	(*DebugCreateMachineResponse)(nil), // 13: headscale.v1.DebugCreateMachineResponse | ||||
| 	(*Namespace)(nil),                  // 14: headscale.v1.Namespace | ||||
| 	(*timestamppb.Timestamp)(nil),      // 15: google.protobuf.Timestamp | ||||
| 	(*PreAuthKey)(nil),                 // 16: headscale.v1.PreAuthKey | ||||
| 	(*MoveMachineRequest)(nil),         // 12: headscale.v1.MoveMachineRequest | ||||
| 	(*MoveMachineResponse)(nil),        // 13: headscale.v1.MoveMachineResponse | ||||
| 	(*DebugCreateMachineRequest)(nil),  // 14: headscale.v1.DebugCreateMachineRequest | ||||
| 	(*DebugCreateMachineResponse)(nil), // 15: headscale.v1.DebugCreateMachineResponse | ||||
| 	(*Namespace)(nil),                  // 16: headscale.v1.Namespace | ||||
| 	(*timestamppb.Timestamp)(nil),      // 17: google.protobuf.Timestamp | ||||
| 	(*PreAuthKey)(nil),                 // 18: headscale.v1.PreAuthKey | ||||
| } | ||||
| var file_headscale_v1_machine_proto_depIdxs = []int32{ | ||||
| 	14, // 0: headscale.v1.Machine.namespace:type_name -> headscale.v1.Namespace | ||||
| 	15, // 1: headscale.v1.Machine.last_seen:type_name -> google.protobuf.Timestamp | ||||
| 	15, // 2: headscale.v1.Machine.last_successful_update:type_name -> google.protobuf.Timestamp | ||||
| 	15, // 3: headscale.v1.Machine.expiry:type_name -> google.protobuf.Timestamp | ||||
| 	16, // 4: headscale.v1.Machine.pre_auth_key:type_name -> headscale.v1.PreAuthKey | ||||
| 	15, // 5: headscale.v1.Machine.created_at:type_name -> google.protobuf.Timestamp | ||||
| 	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 | ||||
| 	0,  // 6: headscale.v1.Machine.register_method:type_name -> headscale.v1.RegisterMethod | ||||
| 	1,  // 7: headscale.v1.RegisterMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	1,  // 8: headscale.v1.GetMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	1,  // 9: headscale.v1.ExpireMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	1,  // 10: headscale.v1.ListMachinesResponse.machines:type_name -> headscale.v1.Machine | ||||
| 	1,  // 11: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	12, // [12:12] is the sub-list for method output_type | ||||
| 	12, // [12:12] is the sub-list for method input_type | ||||
| 	12, // [12:12] is the sub-list for extension type_name | ||||
| 	12, // [12:12] is the sub-list for extension extendee | ||||
| 	0,  // [0:12] is the sub-list for field type_name | ||||
| 	1,  // 11: headscale.v1.MoveMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	1,  // 12: headscale.v1.DebugCreateMachineResponse.machine:type_name -> headscale.v1.Machine | ||||
| 	13, // [13:13] is the sub-list for method output_type | ||||
| 	13, // [13:13] is the sub-list for method input_type | ||||
| 	13, // [13:13] is the sub-list for extension type_name | ||||
| 	13, // [13:13] is the sub-list for extension extendee | ||||
| 	0,  // [0:13] is the sub-list for field type_name | ||||
| } | ||||
| 
 | ||||
| func init() { file_headscale_v1_machine_proto_init() } | ||||
| @ -1111,7 +1226,7 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineRequest); i { | ||||
| 			switch v := v.(*MoveMachineRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @ -1123,6 +1238,30 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*MoveMachineResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_headscale_v1_machine_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DebugCreateMachineResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @ -1141,7 +1280,7 @@ func file_headscale_v1_machine_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_headscale_v1_machine_proto_rawDesc, | ||||
| 			NumEnums:      1, | ||||
| 			NumMessages:   13, | ||||
| 			NumMessages:   15, | ||||
| 			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 ---", | ||||
| @ -909,6 +946,14 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "v1MoveMachineResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "machine": { | ||||
|           "$ref": "#/definitions/v1Machine" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "v1Namespace": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|  | ||||
							
								
								
									
										107
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								go.mod
									
									
									
									
									
								
							| @ -3,72 +3,69 @@ module github.com/juanfont/headscale | ||||
| go 1.18 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/AlecAivazis/survey/v2 v2.3.2 | ||||
| 	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/klauspost/compress v1.14.4 | ||||
| 	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.3.0 | ||||
| 	github.com/spf13/viper v1.10.1 | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	github.com/tailscale/hujson v0.0.0-20211215203138-ffd971c5f362 | ||||
| 	github.com/spf13/cobra v1.4.0 | ||||
| 	github.com/spf13/viper v1.11.0 | ||||
| 	github.com/stretchr/testify v1.7.1 | ||||
| 	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-20220228195345-15d65a4533f7 | ||||
| 	google.golang.org/grpc v1.44.0 | ||||
| 	google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 | ||||
| 	google.golang.org/protobuf v1.27.1 | ||||
| 	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/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/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/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 | ||||
| @ -79,38 +76,40 @@ 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/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/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/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/prometheus/client_model v0.2.0 // indirect | ||||
| @ -118,32 +117,32 @@ require ( | ||||
| 	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/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 | ||||
| 	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-20220225172249-27dd8689420f // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect | ||||
| 	golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect | ||||
| 	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect | ||||
| 	golang.org/x/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
									
									
									
									
									
								
							| @ -253,6 +253,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, | ||||
|  | ||||
| @ -72,7 +72,7 @@ func (s *IntegrationCLITestSuite) SetupTest() { | ||||
| 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil { | ||||
| 		s.headscale = *pheadscale | ||||
| 	} else { | ||||
| 		log.Fatalf("Could not start resource: %s", err) | ||||
| 		log.Fatalf("Could not start headscale container: %s", err) | ||||
| 	} | ||||
| 	fmt.Println("Created headscale container") | ||||
| 
 | ||||
| @ -1076,6 +1076,35 @@ func (s *IntegrationCLITestSuite) TestRouteCommand() { | ||||
| 		string(failEnableNonAdvertisedRoute), | ||||
| 		"route (route-machine) is not available on node", | ||||
| 	) | ||||
| 
 | ||||
| 	// Enable all routes on host | ||||
| 	enableAllRouteResult, err := ExecuteCommand( | ||||
| 		&s.headscale, | ||||
| 		[]string{ | ||||
| 			"headscale", | ||||
| 			"routes", | ||||
| 			"enable", | ||||
| 			"--output", | ||||
| 			"json", | ||||
| 			"--identifier", | ||||
| 			"0", | ||||
| 			"--all", | ||||
| 		}, | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	var enableAllRoute v1.Routes | ||||
| 	err = json.Unmarshal([]byte(enableAllRouteResult), &enableAllRoute) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	assert.Len(s.T(), enableAllRoute.AdvertisedRoutes, 2) | ||||
| 	assert.Contains(s.T(), enableAllRoute.AdvertisedRoutes, "10.0.0.0/8") | ||||
| 	assert.Contains(s.T(), enableAllRoute.AdvertisedRoutes, "192.168.1.0/24") | ||||
| 
 | ||||
| 	assert.Len(s.T(), enableAllRoute.EnabledRoutes, 2) | ||||
| 	assert.Contains(s.T(), enableAllRoute.EnabledRoutes, "10.0.0.0/8") | ||||
| 	assert.Contains(s.T(), enableAllRoute.EnabledRoutes, "192.168.1.0/24") | ||||
| } | ||||
| 
 | ||||
| func (s *IntegrationCLITestSuite) TestApiKeyCommand() { | ||||
| @ -1222,3 +1251,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) | ||||
| } | ||||
|  | ||||
| @ -20,7 +20,17 @@ var ( | ||||
| 	IpPrefix4 = netaddr.MustParseIPPrefix("100.64.0.0/10") | ||||
| 	IpPrefix6 = netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/48") | ||||
| 
 | ||||
| 	tailscaleVersions = []string{"1.22.0", "1.20.4", "1.18.2", "1.16.2", "1.14.3", "1.12.3"} | ||||
| 	tailscaleVersions = []string{ | ||||
| 		"head", | ||||
| 		"unstable", | ||||
| 		"1.24.0", | ||||
| 		"1.22.2", | ||||
| 		"1.20.4", | ||||
| 		"1.18.2", | ||||
| 		"1.16.2", | ||||
| 		"1.14.3", | ||||
| 		"1.12.3", | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| type TestNamespace struct { | ||||
| @ -128,6 +138,49 @@ func DockerAllowNetworkAdministration(config *docker.HostConfig) { | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func getDockerBuildOptions(version string) *dockertest.BuildOptions { | ||||
| 	var tailscaleBuildOptions *dockertest.BuildOptions | ||||
| 	switch version { | ||||
| 	case "head": | ||||
| 		tailscaleBuildOptions = &dockertest.BuildOptions{ | ||||
| 			Dockerfile: "Dockerfile.tailscale-HEAD", | ||||
| 			ContextDir: ".", | ||||
| 			BuildArgs:  []docker.BuildArg{}, | ||||
| 		} | ||||
| 	case "unstable": | ||||
| 		tailscaleBuildOptions = &dockertest.BuildOptions{ | ||||
| 			Dockerfile: "Dockerfile.tailscale", | ||||
| 			ContextDir: ".", | ||||
| 			BuildArgs: []docker.BuildArg{ | ||||
| 				{ | ||||
| 					Name:  "TAILSCALE_VERSION", | ||||
| 					Value: "*", // Installs the latest version https://askubuntu.com/a/824926 | ||||
| 				}, | ||||
| 				{ | ||||
| 					Name:  "TAILSCALE_CHANNEL", | ||||
| 					Value: "unstable", | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 	default: | ||||
| 		tailscaleBuildOptions = &dockertest.BuildOptions{ | ||||
| 			Dockerfile: "Dockerfile.tailscale", | ||||
| 			ContextDir: ".", | ||||
| 			BuildArgs: []docker.BuildArg{ | ||||
| 				{ | ||||
| 					Name:  "TAILSCALE_VERSION", | ||||
| 					Value: version, | ||||
| 				}, | ||||
| 				{ | ||||
| 					Name:  "TAILSCALE_CHANNEL", | ||||
| 					Value: "stable", | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| 	return tailscaleBuildOptions | ||||
| } | ||||
| 
 | ||||
| func getIPs( | ||||
| 	tailscales map[string]dockertest.Resource, | ||||
| ) (map[string][]netaddr.IP, error) { | ||||
|  | ||||
| @ -121,7 +121,7 @@ func (s *IntegrationDERPTestSuite) SetupSuite() { | ||||
| 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil { | ||||
| 		s.headscale = *pheadscale | ||||
| 	} else { | ||||
| 		log.Fatalf("Could not start resource: %s", err) | ||||
| 		log.Fatalf("Could not start headscale container: %s", err) | ||||
| 	} | ||||
| 	log.Println("Created headscale container to test DERP") | ||||
| 
 | ||||
| @ -245,16 +245,8 @@ func (s *IntegrationDERPTestSuite) Join( | ||||
| 
 | ||||
| func (s *IntegrationDERPTestSuite) tailscaleContainer(identifier, version string, network dockertest.Network, | ||||
| ) (string, *dockertest.Resource) { | ||||
| 	tailscaleBuildOptions := &dockertest.BuildOptions{ | ||||
| 		Dockerfile: "Dockerfile.tailscale", | ||||
| 		ContextDir: ".", | ||||
| 		BuildArgs: []docker.BuildArg{ | ||||
| 			{ | ||||
| 				Name:  "TAILSCALE_VERSION", | ||||
| 				Value: version, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	tailscaleBuildOptions := getDockerBuildOptions(version) | ||||
| 
 | ||||
| 	hostname := fmt.Sprintf( | ||||
| 		"tailscale-%s-%s", | ||||
| 		strings.Replace(version, ".", "-", -1), | ||||
| @ -279,7 +271,7 @@ func (s *IntegrationDERPTestSuite) tailscaleContainer(identifier, version string | ||||
| 		DockerAllowNetworkAdministration, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Could not start resource: %s", err) | ||||
| 		log.Fatalf("Could not start tailscale container version %s: %s", version, err) | ||||
| 	} | ||||
| 	log.Printf("Created %s container\n", hostname) | ||||
| 
 | ||||
|  | ||||
| @ -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), | ||||
| 		}, | ||||
| 	} | ||||
| @ -168,16 +168,8 @@ func (s *IntegrationTestSuite) Join( | ||||
| func (s *IntegrationTestSuite) tailscaleContainer( | ||||
| 	namespace, identifier, version string, | ||||
| ) (string, *dockertest.Resource) { | ||||
| 	tailscaleBuildOptions := &dockertest.BuildOptions{ | ||||
| 		Dockerfile: "Dockerfile.tailscale", | ||||
| 		ContextDir: ".", | ||||
| 		BuildArgs: []docker.BuildArg{ | ||||
| 			{ | ||||
| 				Name:  "TAILSCALE_VERSION", | ||||
| 				Value: version, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	tailscaleBuildOptions := getDockerBuildOptions(version) | ||||
| 
 | ||||
| 	hostname := fmt.Sprintf( | ||||
| 		"%s-tailscale-%s-%s", | ||||
| 		namespace, | ||||
| @ -200,7 +192,7 @@ func (s *IntegrationTestSuite) tailscaleContainer( | ||||
| 		DockerAllowNetworkAdministration, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Could not start resource: %s", err) | ||||
| 		log.Fatalf("Could not start tailscale container version %s: %s", version, err) | ||||
| 	} | ||||
| 	log.Printf("Created %s container\n", hostname) | ||||
| 
 | ||||
| @ -249,7 +241,7 @@ func (s *IntegrationTestSuite) SetupSuite() { | ||||
| 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil { | ||||
| 		s.headscale = *pheadscale | ||||
| 	} else { | ||||
| 		log.Fatalf("Could not start resource: %s", err) | ||||
| 		log.Fatalf("Could not start headscale container: %s", err) | ||||
| 	} | ||||
| 	log.Println("Created headscale container") | ||||
| 
 | ||||
|  | ||||
| @ -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) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										68
									
								
								poll.go
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								poll.go
									
									
									
									
									
								
							| @ -175,32 +175,13 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 		Str("machine", machine.Name). | ||||
| 		Msg("Loading or creating update channel") | ||||
| 
 | ||||
| 	// TODO: could probably remove all that duplication once generics land. | ||||
| 	closeChanWithLog := func(channel interface{}, name string) { | ||||
| 		log.Trace(). | ||||
| 			Str("handler", "PollNetMap"). | ||||
| 			Str("machine", machine.Name). | ||||
| 			Str("channel", "Done"). | ||||
| 			Msg(fmt.Sprintf("Closing %s channel", name)) | ||||
| 
 | ||||
| 		switch c := channel.(type) { | ||||
| 		case (chan struct{}): | ||||
| 			close(c) | ||||
| 
 | ||||
| 		case (chan []byte): | ||||
| 			close(c) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	const chanSize = 8 | ||||
| 	updateChan := make(chan struct{}, chanSize) | ||||
| 	defer closeChanWithLog(updateChan, "updateChan") | ||||
| 
 | ||||
| 	pollDataChan := make(chan []byte, chanSize) | ||||
| 	defer closeChanWithLog(pollDataChan, "pollDataChan") | ||||
| 	defer closeChanWithLog(pollDataChan, machine.Name, "pollDataChan") | ||||
| 
 | ||||
| 	keepAliveChan := make(chan []byte) | ||||
| 	defer closeChanWithLog(keepAliveChan, "keepAliveChan") | ||||
| 
 | ||||
| 	if req.OmitPeers && !req.Stream { | ||||
| 		log.Info(). | ||||
| @ -273,7 +254,27 @@ func (h *Headscale) PollNetMapStream( | ||||
| 	updateChan chan struct{}, | ||||
| ) { | ||||
| 	{ | ||||
| 		ctx, cancel := context.WithCancel(ctx.Request.Context()) | ||||
| 		machine, err := h.GetMachineByMachineKey(machineKey) | ||||
| 		if err != nil { | ||||
| 			if errors.Is(err, gorm.ErrRecordNotFound) { | ||||
| 				log.Warn(). | ||||
| 					Str("handler", "PollNetMap"). | ||||
| 					Msgf("Ignoring request, cannot find machine with key %s", machineKey.String()) | ||||
| 				ctx.String(http.StatusUnauthorized, "") | ||||
| 
 | ||||
| 				return | ||||
| 			} | ||||
| 			log.Error(). | ||||
| 				Str("handler", "PollNetMap"). | ||||
| 				Msgf("Failed to fetch machine from the database with Machine key: %s", machineKey.String()) | ||||
| 			ctx.String(http.StatusInternalServerError, "") | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		ctx := context.WithValue(ctx.Request.Context(), "machineName", machine.Name) | ||||
| 
 | ||||
| 		ctx, cancel := context.WithCancel(ctx) | ||||
| 		defer cancel() | ||||
| 
 | ||||
| 		go h.scheduledPollWorker( | ||||
| @ -564,8 +565,8 @@ func (h *Headscale) PollNetMapStream( | ||||
| 
 | ||||
| func (h *Headscale) scheduledPollWorker( | ||||
| 	ctx context.Context, | ||||
| 	updateChan chan<- struct{}, | ||||
| 	keepAliveChan chan<- []byte, | ||||
| 	updateChan chan struct{}, | ||||
| 	keepAliveChan chan []byte, | ||||
| 	machineKey key.MachinePublic, | ||||
| 	mapRequest tailcfg.MapRequest, | ||||
| 	machine *Machine, | ||||
| @ -573,6 +574,17 @@ func (h *Headscale) scheduledPollWorker( | ||||
| 	keepAliveTicker := time.NewTicker(keepAliveInterval) | ||||
| 	updateCheckerTicker := time.NewTicker(updateCheckInterval) | ||||
| 
 | ||||
| 	defer closeChanWithLog( | ||||
| 		updateChan, | ||||
| 		fmt.Sprint(ctx.Value("machineName")), | ||||
| 		"updateChan", | ||||
| 	) | ||||
| 	defer closeChanWithLog( | ||||
| 		keepAliveChan, | ||||
| 		fmt.Sprint(ctx.Value("machineName")), | ||||
| 		"updateChan", | ||||
| 	) | ||||
| 
 | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-ctx.Done(): | ||||
| @ -606,3 +618,13 @@ func (h *Headscale) scheduledPollWorker( | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func closeChanWithLog[C chan []byte | chan struct{}](channel C, machine, name string) { | ||||
| 	log.Trace(). | ||||
| 		Str("handler", "PollNetMap"). | ||||
| 		Str("machine", machine). | ||||
| 		Str("channel", "Done"). | ||||
| 		Msg(fmt.Sprintf("Closing %s channel", name)) | ||||
| 
 | ||||
| 	close(channel) | ||||
| } | ||||
|  | ||||
| @ -104,6 +104,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 --- | ||||
|  | ||||
| @ -22,7 +22,6 @@ message Machine { | ||||
|     string          name         = 6; | ||||
|     Namespace namespace          = 7; | ||||
| 
 | ||||
| 
 | ||||
|     google.protobuf.Timestamp last_seen              = 8; | ||||
|     google.protobuf.Timestamp last_successful_update = 9; | ||||
|     google.protobuf.Timestamp expiry                 = 10; | ||||
| @ -80,6 +79,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; | ||||
|  | ||||
| @ -1,39 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| set -e -o pipefail | ||||
| commit="$1" | ||||
| versionglob="v[0-9].[0-9]*.[0-9]*" | ||||
| devsuffix=".dev" | ||||
| if [ -z "$commit" ]; then | ||||
|   commit=`git log -n1 --first-parent "--format=format:%h"` | ||||
| fi | ||||
| 
 | ||||
| # automatically assign version | ||||
| # | ||||
| # handles the following cases: | ||||
| # | ||||
| # 0. no tags on the repository. Print "dev". | ||||
| # | ||||
| # 1. no local modifications and commit is directly tagged. Print tag. | ||||
| # | ||||
| # 2. no local modifications and commit is not tagged. Take greatest version tag in repo X.Y.Z and assign X.Y.(Z+1). Print that + $devsuffix + $timestamp. | ||||
| # | ||||
| # 3. local modifications. Print "dev". | ||||
| 
 | ||||
| tags=$(git tag) | ||||
| if [[ -z "$tags" ]]; then | ||||
|   echo "dev" | ||||
| elif `git diff --quiet 2>/dev/null`; then | ||||
|   tagged=$(git tag --points-at "$commit") | ||||
|   if [[ -n "$tagged" ]] ; then | ||||
|     echo $tagged | ||||
|   else | ||||
|     nearest_tag=$(git describe --tags --abbrev=0 --match "$versionglob" "$commit") | ||||
|     v=$(echo $nearest_tag | perl -pe 's/(\d+)$/$1+1/e') | ||||
|     isodate=$(TZ=UTC git log -n1 --format=%cd --date=iso "$commit") | ||||
|     ts=$(TZ=UTC date --date="$isodate" "+%Y%m%d%H%M%S") | ||||
|     echo "${v}${devsuffix}${ts}" | ||||
|   fi | ||||
| else | ||||
|   echo "dev" | ||||
| fi | ||||
							
								
								
									
										12
									
								
								tools.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								tools.go
									
									
									
									
									
								
							| @ -1,12 +0,0 @@ | ||||
| //go:build tools | ||||
| // +build tools | ||||
| 
 | ||||
| package tools | ||||
| 
 | ||||
| import ( | ||||
| 	_ "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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user