Skip to content

Commit c6e9a34

Browse files
authored
Merge pull request #3 from arnaud-dfns/feat/tunnel-ssh
feat: add ssh tunnel
2 parents 800b436 + 6b1941c commit c6e9a34

File tree

277 files changed

+22778
-950
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

277 files changed

+22778
-950
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The provider is compatible with HashiCorp Cloud Platform (HCP)
99
## Available tunnel types
1010

1111
- [AWS Systems Manager (SSM)](https://docs.aws.amazon.com/systems-manager/latest/userguide/)
12+
- [SSH Tunneling](https://www.ssh.com/academy/ssh/tunneling)
1213

1314
## Example Usage
1415

docs/data-sources/ssh.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "tunnel_ssh Data Source - tunnel"
4+
subcategory: ""
5+
description: |-
6+
Create a local SSH tunnel to a remote host
7+
---
8+
9+
# tunnel_ssh (Data Source)
10+
11+
Create a local SSH tunnel to a remote host
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "tunnel_ssh" "k8s" {
17+
target_host = "localhost"
18+
target_port = 6443
19+
ssh_host = "k8s-master.example.com"
20+
ssh_user = "ec2-user"
21+
}
22+
23+
provider "kubernetes" {
24+
host = "https://${data.tunnel_ssh.k8s.local_host}:${data.tunnel_ssh.k8s.local_port}"
25+
26+
client_certificate = file("~/.kube/client-cert.pem")
27+
client_key = file("~/.kube/client-key.pem")
28+
cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem")
29+
}
30+
```
31+
32+
<!-- schema generated by tfplugindocs -->
33+
## Schema
34+
35+
### Required
36+
37+
- `ssh_host` (String) The DNS name or IP address of the SSH bastion host
38+
- `target_host` (String) The DNS name or IP address of the remote host
39+
- `target_port` (Number) The port number of the remote host
40+
41+
### Optional
42+
43+
- `ssh_port` (Number) The port number of the SSH bastion host
44+
- `ssh_user` (String) The username to use for the SSH connection
45+
46+
### Read-Only
47+
48+
- `local_host` (String) The DNS name or IP address of the local host
49+
- `local_port` (Number) The local port number to use for the tunnel

docs/ephemeral-resources/ssh.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "tunnel_ssh Ephemeral Resource - tunnel"
4+
subcategory: ""
5+
description: |-
6+
Create a local SSH tunnel to a remote host
7+
---
8+
9+
# tunnel_ssh (Ephemeral Resource)
10+
11+
Create a local SSH tunnel to a remote host
12+
13+
## Example Usage
14+
15+
```terraform
16+
ephemeral "tunnel_ssh" "k8s" {
17+
target_host = "localhost"
18+
target_port = 6443
19+
ssh_host = "k8s-master.example.com"
20+
ssh_user = "ec2-user"
21+
}
22+
23+
provider "kubernetes" {
24+
host = "https://${ephemeral.tunnel_ssh.k8s.local_host}:${ephemeral.tunnel_ssh.k8s.local_port}"
25+
26+
client_certificate = file("~/.kube/client-cert.pem")
27+
client_key = file("~/.kube/client-key.pem")
28+
cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem")
29+
}
30+
```
31+
32+
<!-- schema generated by tfplugindocs -->
33+
## Schema
34+
35+
### Required
36+
37+
- `ssh_host` (String) The DNS name or IP address of the SSH bastion host
38+
- `target_host` (String) The DNS name or IP address of the remote host
39+
- `target_port` (Number) The port number of the remote host
40+
41+
### Optional
42+
43+
- `ssh_port` (Number) The port number of the SSH bastion host
44+
- `ssh_user` (String) The username to use for the SSH connection
45+
46+
### Read-Only
47+
48+
- `local_host` (String) The DNS name or IP address of the local host
49+
- `local_port` (Number) The local port number to use for the tunnel

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The provider is compatible with HashiCorp Cloud Platform (HCP)
1515
## Available tunnel types
1616

1717
- [AWS Systems Manager (SSM)](https://docs.aws.amazon.com/systems-manager/latest/userguide/)
18+
- [SSH Tunneling](https://www.ssh.com/academy/ssh/tunneling)
1819

1920
## Example Usage
2021

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
data "tunnel_ssh" "k8s" {
2+
target_host = "localhost"
3+
target_port = 6443
4+
ssh_host = "k8s-master.example.com"
5+
ssh_user = "ec2-user"
6+
}
7+
8+
provider "kubernetes" {
9+
host = "https://${data.tunnel_ssh.k8s.local_host}:${data.tunnel_ssh.k8s.local_port}"
10+
11+
client_certificate = file("~/.kube/client-cert.pem")
12+
client_key = file("~/.kube/client-key.pem")
13+
cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem")
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
ephemeral "tunnel_ssh" "k8s" {
2+
target_host = "localhost"
3+
target_port = 6443
4+
ssh_host = "k8s-master.example.com"
5+
ssh_user = "ec2-user"
6+
}
7+
8+
provider "kubernetes" {
9+
host = "https://${ephemeral.tunnel_ssh.k8s.local_host}:${ephemeral.tunnel_ssh.k8s.local_port}"
10+
11+
client_certificate = file("~/.kube/client-cert.pem")
12+
client_key = file("~/.kube/client-key.pem")
13+
cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem")
14+
}

go.mod

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module github.com/dfns/terraform-provider-tunnel
22

3-
go 1.22.7
3+
go 1.23
4+
5+
toolchain go1.23.4
46

57
require (
68
github.com/aws/aws-sdk-go-v2 v1.32.6
@@ -9,6 +11,7 @@ require (
911
github.com/aws/session-manager-plugin v0.0.0-20241010233726-61cf1288c7c6
1012
github.com/aws/smithy-go v1.22.1
1113
github.com/hashicorp/terraform-plugin-framework v1.13.0
14+
github.com/rgzr/sshtun v1.2.1
1215
github.com/shirou/gopsutil/v4 v4.24.11
1316
)
1417

@@ -59,10 +62,11 @@ require (
5962
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
6063
github.com/xtaci/smux v1.5.31 // indirect
6164
github.com/yusufpapurcu/wmi v1.2.4 // indirect
65+
golang.org/x/crypto v0.31.0 // indirect
6266
golang.org/x/net v0.28.0 // indirect
63-
golang.org/x/sync v0.8.0 // indirect
64-
golang.org/x/sys v0.26.0 // indirect
65-
golang.org/x/text v0.17.0 // indirect
67+
golang.org/x/sync v0.10.0 // indirect
68+
golang.org/x/sys v0.28.0 // indirect
69+
golang.org/x/text v0.21.0 // indirect
6670
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
6771
google.golang.org/grpc v1.67.1 // indirect
6872
google.golang.org/protobuf v1.35.1 // indirect

go.sum

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
2+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
3+
github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0=
4+
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
15
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
26
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
37
github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4=
@@ -45,6 +49,8 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
4549
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
4650
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
4751
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
52+
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
53+
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
4854
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
4955
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
5056
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
@@ -100,10 +106,14 @@ github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJ
100106
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
101107
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
102108
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
109+
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
110+
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
103111
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
104112
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
105113
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
106114
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
115+
github.com/rgzr/sshtun v1.2.1 h1:XrztteWapZoISyEQ7k7wCi3Yi5V7TYBHqfMPB0UvmhI=
116+
github.com/rgzr/sshtun v1.2.1/go.mod h1:GgLWtjaRz0MVnpFvW6StDchibSbTOh7ggQAH8qIJ1nA=
107117
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
108118
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
109119
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
@@ -129,10 +139,12 @@ github.com/xtaci/smux v1.5.31 h1:3ha7sHtH46h85Iv7MfQogxasuRt1KPRhoFB3S4rmHgU=
129139
github.com/xtaci/smux v1.5.31/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
130140
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
131141
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
142+
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
143+
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
132144
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
133145
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
134-
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
135-
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
146+
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
147+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
136148
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
137149
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
138150
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -144,10 +156,12 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
144156
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
145157
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
146158
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
147-
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
148-
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
149-
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
150-
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
159+
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
160+
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
161+
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
162+
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
163+
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
164+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
151165
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
152166
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
153167
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=

internal/libs/const.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package libs
2+
3+
const (
4+
TunnelTypeEnv = "DFNS_TERRAFORM_TUNNEL_TYPE"
5+
TunnelConfEnv = "DFNS_TERRAFORM_TUNNEL_CONF"
6+
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package provider
1+
package libs
22

33
import (
44
"fmt"

0 commit comments

Comments
 (0)