Skip to content

Commit 62bdf52

Browse files
committed
Fixed #1
Signed-off-by: Vishal Rana <vr@labstack.com>
1 parent ad66242 commit 62bdf52

File tree

4 files changed

+48
-21
lines changed

4 files changed

+48
-21
lines changed

Gopkg.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/root.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"github.com/labstack/tunnel"
1111
"github.com/labstack/tunnel/util"
1212

13+
"time"
14+
1315
"github.com/mitchellh/go-homedir"
1416
"github.com/spf13/cobra"
1517
"github.com/spf13/viper"
@@ -24,21 +26,22 @@ var (
2426
user string
2527
rootCmd = &cobra.Command{
2628
Use: "tunnel",
27-
Short: "Tunnel lets you expose local servers to the internet securely",
29+
Short: "Tunnel lets you expose local servers to internet securely",
2830
Long: ``,
2931
Args: cobra.MinimumNArgs(1),
3032
Run: func(cmd *cobra.Command, args []string) {
3133
c := &tunnel.Config{
3234
Host: "labstack.me:22",
3335
RemoteHost: "0.0.0.0",
3436
RemotePort: 80,
37+
Channel: make(chan int),
3538
}
3639
e := new(tunnel.Error)
3740

3841
if name != "" {
3942
key := viper.GetString("api_key")
4043
if key == "" {
41-
log.Fatalf("Failed to find api key in the config")
44+
log.Fatalf("failed to find api key in the config")
4245
}
4346

4447
// Find config
@@ -50,9 +53,9 @@ var (
5053
SetHeader("User-Agent", "labstack/tunnel").
5154
Get(fmt.Sprintf("https://api.labstack.com/tunnel/configs/%s", name))
5255
if err != nil {
53-
log.Fatalf("Failed to the find tunnel: %v", err)
56+
log.Fatalf("failed to the find tunnel: %v", err)
5457
} else if res.StatusCode() != http.StatusOK {
55-
log.Fatalf("Failed to the find tunnel: %s", e.Message)
58+
log.Fatalf("failed to the find tunnel: %s", e.Message)
5659
}
5760
if c.Protocol == "tcp" {
5861
tcp = true
@@ -69,12 +72,19 @@ var (
6972
c.User = user
7073
c.TargetHost, c.TargetPort, err = util.SplitHostPort(args[0])
7174
if err != nil {
72-
log.Fatalf("Failed to parse target address: %v", err)
75+
log.Fatalf("failed to parse target address: %v", err)
7376
}
7477
if tcp || tls {
7578
c.RemotePort = 0
7679
}
77-
tunnel.Create(c)
80+
CREATE:
81+
go tunnel.Create(c)
82+
event := <-c.Channel
83+
if event == tunnel.EventReconnect {
84+
log.Info("trying to reconnect")
85+
time.Sleep(1 * time.Second)
86+
goto CREATE
87+
}
7888
},
7989
}
8090
)
@@ -105,7 +115,7 @@ func initConfig() {
105115
// Find home directory
106116
home, err := homedir.Dir()
107117
if err != nil {
108-
log.Fatalf("Failed to find the home directory: %v", err)
118+
log.Fatalf("failed to find the home directory: %v", err)
109119
}
110120

111121
// Search config in home directory with name ".tunnel" (without extension)

cmd/tunnel/main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package main
22

3-
import "github.com/labstack/tunnel/cmd"
3+
import (
4+
"github.com/labstack/gommon/log"
5+
"github.com/labstack/tunnel/cmd"
6+
)
47

58
func main() {
9+
log.SetHeader("${time_rfc3339} ${level}")
610
cmd.Execute()
711
}

tunnel.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type (
2626
RemotePort int
2727
TargetHost string
2828
TargetPort int
29+
Channel chan int
2930
HideBanner bool
3031
}
3132

@@ -35,14 +36,19 @@ type (
3536
}
3637
)
3738

39+
const (
40+
_ = iota
41+
EventReconnect
42+
)
43+
3844
var (
3945
hostBytes = []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDoSLknvlFrFzroOlh1cqvcIFelHO+Wvj1UZ/p3J9bgsJGiKfh3DmBqEw1DOEwpHJz4zuV375TyjGuHuGZ4I4xztnwauhFplfEvriVHQkIDs6UnGwJVr15XUQX04r0i6mLbJs5KqIZTZuZ9ZGOj7ZWnaA7C07nPHGrERKV2Fm67rPvT6/qFikdWUbCt7KshbzdwwfxUohmv+NI7vw2X6vPU8pDaNEY7vS3YgwD/WlvQx+WDF2+iwLVW8OWWjFuQso6Eg1BSLygfPNhAHoiOWjDkijc8U9LYkUn7qsDCnvJxCoTTNmdECukeHfzrUjTSw72KZoM5KCRV78Wrctai1Qn6yRQz9BOSguxewLfzHtnT43/MLdwFXirJ/Ajquve2NAtYmyGCq5HcvpDAyi7lQ0nFBnrWv5zU3YxrISIpjovVyJjfPx8SCRlYZwVeUq6N2yAxCzJxbElZPtaTSoXBIFtoas2NXnCWPgenBa/2bbLQqfgbN8VQ9RaUISKNuYDIn4+eO72+RxF9THzZeV17pnhTVK88XU4asHot1gXwAt4vEhSjdUBC9KUIkfukI6F4JFxtvuO96octRahdV1Qg0vF+D0+SPy2HxqjgZWgPE2Xh/NmuIXwbE0wkymR2wrgj8Hd4C92keo2NBRh9dD7D2negnVYaYsC+3k/si5HNuCHnHQ== tunnel@labstack.com")
4046
)
4147

4248
func Create(c *Config) {
4349
hostKey, _, _, _, err := ssh.ParseAuthorizedKey(hostBytes)
4450
if err != nil {
45-
log.Fatalf("Failed to parse host key: %v", err)
51+
log.Fatalf("failed to parse host key: %v", err)
4652
}
4753
config := &ssh.ClientConfig{
4854
User: c.User,
@@ -64,11 +70,11 @@ func Create(c *Config) {
6470
if proxy != "" {
6571
proxyURL, err := url.Parse(proxy)
6672
if err != nil {
67-
log.Fatalf("Cannot open new session: %v", err)
73+
log.Fatalf("cannot open new session: %v", err)
6874
}
6975
tcp, err := net.Dial("tcp", proxyURL.Hostname())
7076
if err != nil {
71-
log.Fatalf("Cannot open new session: %v", err)
77+
log.Fatalf("cannot open new session: %v", err)
7278
}
7379
connReq := &http.Request{
7480
Method: "CONNECT",
@@ -84,27 +90,29 @@ func Create(c *Config) {
8490
connReq.Write(tcp)
8591
resp, err := http.ReadResponse(bufio.NewReader(tcp), connReq)
8692
if err != nil {
87-
log.Fatalf("Cannot open new session: %v", err)
93+
log.Fatalf("cannot open new session: %v", err)
8894
}
8995
defer resp.Body.Close()
9096

9197
conn, chans, reqs, err := ssh.NewClientConn(tcp, c.Host, config)
9298
if err != nil {
93-
log.Fatalf("Cannot open new session: %v", err)
99+
log.Fatalf("cannot open new session: %v", err)
94100
}
95101
client = ssh.NewClient(conn, chans, reqs)
96102
} else {
97103
client, err = ssh.Dial("tcp", c.Host, config)
98104
}
99105
if err != nil {
100-
log.Fatalf("Failed to connect: %v", err)
106+
log.Errorf("failed to connect: %v", err)
107+
c.Channel <- EventReconnect
108+
return
101109
}
102110
defer client.Close()
103111

104112
// Session
105113
sess, err := client.NewSession()
106114
if err != nil {
107-
log.Fatalf("Failed to create session: %v", err)
115+
log.Fatalf("failed to create session: %v", err)
108116
}
109117
defer sess.Close()
110118
r, err := sess.StdoutPipe()
@@ -116,7 +124,12 @@ func Create(c *Config) {
116124
for {
117125
line, _, err := br.ReadLine()
118126
if err != nil {
119-
log.Fatalf("Failed to read: %v", err)
127+
if err == io.EOF {
128+
c.Channel <- EventReconnect
129+
return
130+
} else {
131+
log.Fatalf("failed to read: %v", err)
132+
}
120133
}
121134
fmt.Printf("%s\n", line)
122135
}
@@ -125,15 +138,15 @@ func Create(c *Config) {
125138
// Remote listener
126139
ln, err := client.Listen("tcp", fmt.Sprintf("%s:%d", c.RemoteHost, c.RemotePort))
127140
if err != nil {
128-
log.Fatalf("Failed to listen on remote host: %v", err)
141+
log.Fatalf("failed to listen on remote host: %v", err)
129142
}
130143
defer ln.Close()
131144

132145
for {
133146
// Handle inbound connection
134147
in, err := ln.Accept()
135148
if err != nil {
136-
log.Printf("Failed to accept connection: %v", err)
149+
log.Printf("failed to accept connection: %v", err)
137150
return
138151
}
139152

@@ -143,7 +156,7 @@ func Create(c *Config) {
143156
// Target connection
144157
out, err := net.Dial("tcp", fmt.Sprintf("%s:%d", c.TargetHost, c.TargetPort))
145158
if err != nil {
146-
log.Printf("Failed to connect to target: %v", err)
159+
log.Printf("failed to connect to target: %v", err)
147160
return
148161
}
149162
defer out.Close()
@@ -160,7 +173,7 @@ func Create(c *Config) {
160173
// Handle error
161174
err = <-errCh
162175
if err != nil && err != io.EOF {
163-
log.Printf("Failed to copy: %v", err)
176+
log.Printf("failed to copy: %v", err)
164177
}
165178
}(in)
166179
}

0 commit comments

Comments
 (0)