Skip to content

Commit d6e302b

Browse files
authored
Merge pull request #44 from blacknon/develop
Version 0.1.17
2 parents 55dbf3a + 22108c0 commit d6e302b

File tree

5 files changed

+63
-39
lines changed

5 files changed

+63
-39
lines changed

connect.go

+21-20
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package sshlib
66

77
import (
88
"context"
9+
"errors"
910
"io"
1011
"log"
1112
"net"
@@ -190,29 +191,29 @@ func (c *Connect) SendKeepAlive(session *ssh.Session) {
190191
interval = c.SendKeepAliveInterval
191192
}
192193

193-
for {
194-
// timeout channel
195-
tc := make(chan bool, 1)
196-
197-
go func() {
198-
// Send keep alive packet
199-
_, err := session.SendRequest("keepalive", true, nil)
200-
if err == nil {
201-
tc <- true
202-
}
203-
}()
194+
t := time.NewTicker(time.Duration(c.ConnectTimeout) * time.Second)
195+
defer t.Stop()
204196

197+
for {
205198
select {
206-
case <-tc:
207-
case <-time.After(time.Duration(c.ConnectTimeout) * time.Second):
208-
session.Close()
209-
c.Client.Close()
210-
log.Println("keepalive timeout")
211-
return
199+
case <-t.C:
200+
if _, err := session.SendRequest("[email protected]", true, nil); err != nil {
201+
if !errors.Is(err, io.EOF) {
202+
log.Println("Failed to send keepalive packet:", err)
203+
session.Close()
204+
c.Client.Close()
205+
break
206+
} else {
207+
// sleep
208+
time.Sleep(time.Duration(interval) * time.Second)
209+
continue
210+
}
211+
} else {
212+
// sleep
213+
time.Sleep(time.Duration(interval) * time.Second)
214+
continue
215+
}
212216
}
213-
214-
// sleep
215-
time.Sleep(time.Duration(interval) * time.Second)
216217
}
217218
}
218219

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ require (
3838
github.com/willscott/go-nfs-client v0.0.0-20240104095149-b44639837b00 // indirect
3939
)
4040

41+
// replace github.com/blacknon/go-nfs-sshlib v0.0.3 => ../go-nfs-sshlib
42+
4143
go 1.22.4

nfs_forward.go

+19
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
package sshlib
66

77
import (
8+
"fmt"
89
"net"
10+
"strings"
911

1012
nfs "github.com/blacknon/go-nfs-sshlib"
1113
nfshelper "github.com/blacknon/go-nfs-sshlib/helpers"
@@ -26,6 +28,14 @@ func (c *Connect) NFSForward(address, port, basepoint string) (err error) {
2628
return
2729
}
2830

31+
// create abs path
32+
homepoint, err := client.RealPath(".")
33+
if err != nil {
34+
return
35+
}
36+
basepoint = getRemoteAbsPath(homepoint, basepoint)
37+
fmt.Println(basepoint)
38+
2939
sftpfsPlusChange := NewChangeSFTPFS(client, basepoint)
3040

3141
handler := nfshelper.NewNullAuthHandler(sftpfsPlusChange)
@@ -58,3 +68,12 @@ func (c *Connect) NFSReverseForward(address, port, sharepoint string) (err error
5868

5969
return
6070
}
71+
72+
func getRemoteAbsPath(wdpath, path string) (result string) {
73+
result = strings.Replace(path, "~", wdpath, 1)
74+
if !strings.HasPrefix(result, "/") {
75+
result = wdpath + "/" + result
76+
}
77+
78+
return result
79+
}

nfs_sftpfs.go

+15-19
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package sshlib
66

77
import (
8+
"fmt"
89
"os"
910
"path/filepath"
1011
"strconv"
@@ -47,30 +48,25 @@ type SFTPFS struct {
4748

4849
// Create
4950
func (fs *SFTPFS) Create(filename string) (billy.File, error) {
50-
_, err := fs.Stat(filename)
51-
if err == nil {
52-
return nil, os.ErrExist
53-
}
54-
55-
dir := filepath.Dir(filename)
56-
err = fs.MkdirAll(dir, os.ModeDir)
57-
if err != nil {
58-
return nil, err
59-
}
60-
61-
f, err := fs.Client.Create(filename)
62-
if err != nil {
63-
return nil, err
64-
}
65-
return &sftpFile{File: f}, nil
51+
return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
6652
}
6753

6854
// OpenFile
6955
func (fs *SFTPFS) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) {
70-
// TODO: create dirをする
71-
// https://github.com/src-d/go-billy/blob/master/osfs/os.go#L31-L54
56+
return fs.openFile(filename, flag, perm, fs.createDir)
57+
}
58+
59+
func (fs *SFTPFS) openFile(fn string, flag int, perm os.FileMode, createDir func(string) error) (billy.File, error) {
60+
if flag&os.O_CREATE != 0 {
61+
if createDir == nil {
62+
return nil, fmt.Errorf("createDir func cannot be nil if file needs to be opened in create mode")
63+
}
64+
if err := createDir(fn); err != nil {
65+
return nil, err
66+
}
67+
}
7268

73-
f, err := fs.Client.OpenFile(filename, flag)
69+
f, err := fs.Client.OpenFile(fn, flag)
7470
if err != nil {
7571
return nil, err
7672
}

proxy.go

+6
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ func (n *NetPipe) Dial(network, addr string) (con net.Conn, err error) {
191191
// Start the command
192192
err = n.Cmd.Start()
193193

194+
// Close the write end of the pipe
195+
go func() {
196+
n.Cmd.Wait()
197+
srv.Close()
198+
}()
199+
194200
return
195201
}
196202

0 commit comments

Comments
 (0)