-
Notifications
You must be signed in to change notification settings - Fork 3
/
dialer.go
108 lines (92 loc) · 2.3 KB
/
dialer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package dialer
import (
"net"
"strings"
"github.com/dueckminor/go-sshtunnel/control"
)
// Dialer is a generic interface which is used to establish a net.Conn
type Dialer interface {
Dial(network, addr string) (net.Conn, error)
}
// DialerInfo is the internal representation of a dialer
type DialerInfo struct {
control.Dialer
impl Dialer
}
var (
dialers = make(map[string]DialerInfo)
sshDialer *SSHDialer
)
// Dial uses the selected dialer to establish a network connection
func Dial(dialerName, network, addr string) (net.Conn, error) {
if dialer, ok := dialers[dialerName]; ok {
return dialer.impl.Dial(network, addr)
}
return nil, nil
}
func AddSSHKey(encodedKey string, passPhrase string) error {
return makeSSHDialer().AddSSHKey(encodedKey, passPhrase)
}
func GetSSHKeys() (keys []control.SSHKey, err error) {
return makeSSHDialer().GetSSHKeys()
}
func GetConnector() (sshConnector *SSHConnector, err error) {
return makeSSHDialer().GetConnector(true), nil
}
func makeSSHDialer() *SSHDialer {
if sshDialer == nil {
sshDialer, _ = NewSSHDialer(5)
info := DialerInfo{impl: sshDialer}
info.Name = "default"
info.Type = "ssh"
info.Destination = "..."
if _, ok := dialers["default"]; ok {
dialers["ssh"] = info
} else {
dialers["default"] = info
}
}
return sshDialer
}
func AddDialer(dialerName, uri string) (err error) {
if len(dialerName) == 0 {
dialerName = "default"
}
if strings.HasPrefix(uri, "socks5://") {
dialer, err := NewSocks5Dialer(uri[9:])
if err != nil {
return err
}
info := DialerInfo{impl: dialer}
info.Name = dialerName
info.Type = "socks5"
info.Destination = uri
dialers[dialerName] = info
return nil
}
makeSSHDialer()
for _, u := range strings.Split(uri, ",") {
sshDialer.AddDialer(u)
}
info := DialerInfo{impl: sshDialer}
info.Name = dialerName
info.Type = "ssh"
info.Destination = uri
dialers[dialerName] = info
return nil
}
func ListDialers() (dialerInfos []DialerInfo, err error) {
dialerInfos = make([]DialerInfo, len(dialers), len(dialers))
i := 0
for _, dialerInfo := range dialers {
dialerInfos[i] = dialerInfo
i++
}
return dialerInfos, nil
}
func Marshall(info DialerInfo) (result control.Dialer, err error) {
result.Name = info.Name
result.Destination = info.Destination
result.Type = info.Type
return result, nil
}