1
1
package database
2
2
3
3
import (
4
+ "os"
4
5
"context"
5
6
"database/sql"
6
7
"fmt"
@@ -10,6 +11,8 @@ import (
10
11
11
12
_ "github.com/denisenkom/go-mssqldb"
12
13
"github.com/sqls-server/sqls/dialect"
14
+ "github.com/jfcote87/sshdb"
15
+ "github.com/jfcote87/sshdb/mssql"
13
16
"golang.org/x/crypto/ssh"
14
17
)
15
18
@@ -21,21 +24,51 @@ func init() {
21
24
func mssqlOpen (dbConnCfg * DBConfig ) (* DBConnection , error ) {
22
25
var (
23
26
conn * sql.DB
24
- sshConn * ssh.Client
25
27
)
26
28
dsn , err := genMssqlConfig (dbConnCfg )
27
29
if err != nil {
28
30
return nil , err
29
31
}
30
32
31
33
if dbConnCfg .SSHCfg != nil {
32
- return nil , fmt .Errorf ("connect via SSH is not supported" )
33
- }
34
- dbConn , err := sql .Open ("sqlserver" , dsn )
35
- if err != nil {
36
- return nil , err
34
+ key , err := os .ReadFile (dbConnCfg .SSHCfg .PrivateKey )
35
+ if err != nil {
36
+ return nil , fmt .Errorf ("unable to open private key" )
37
+ }
38
+
39
+ signer , err := ssh .ParsePrivateKeyWithPassphrase (key , []byte (dbConnCfg .SSHCfg .PassPhrase ))
40
+ if err != nil {
41
+ return nil , fmt .Errorf ("unable to decrypt private key" )
42
+ }
43
+
44
+ cfg := & ssh.ClientConfig {
45
+ User : dbConnCfg .SSHCfg .User ,
46
+ Auth : []ssh.AuthMethod {
47
+ ssh .PublicKeys (signer ),
48
+ },
49
+ HostKeyCallback : ssh .InsecureIgnoreHostKey (),
50
+ }
51
+
52
+ remoteAddr := fmt .Sprintf ("%s:%d" , dbConnCfg .SSHCfg .Host , dbConnCfg .SSHCfg .Port )
53
+
54
+ tunnel , err := sshdb .New (cfg , remoteAddr )
55
+ if err != nil {
56
+ return nil , fmt .Errorf ("%w" , err )
57
+ }
58
+
59
+ connector , err := tunnel .OpenConnector (mssql .TunnelDriver , dsn )
60
+ if err != nil {
61
+ return nil , err
62
+ }
63
+
64
+ conn = sql .OpenDB (connector )
65
+ } else {
66
+ conn , err = sql .Open ("mssql" , dsn )
67
+ if err != nil {
68
+ return nil , err
69
+ }
37
70
}
38
- conn = dbConn
71
+
39
72
if err = conn .Ping (); err != nil {
40
73
return nil , err
41
74
}
@@ -45,7 +78,6 @@ func mssqlOpen(dbConnCfg *DBConfig) (*DBConnection, error) {
45
78
46
79
return & DBConnection {
47
80
Conn : conn ,
48
- SSHConn : sshConn ,
49
81
}, nil
50
82
}
51
83
0 commit comments