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