Skip to content

Commit 55dbf3a

Browse files
authored
Merge pull request #43 from blacknon/develop
Version 0.1.16
2 parents ab245c9 + 6840d8c commit 55dbf3a

10 files changed

+460
-77
lines changed

auth_pkcs11.go

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
package sshlib
88

99
import (
10+
"errors"
11+
"os"
12+
1013
"github.com/miekg/pkcs11"
1114
"golang.org/x/crypto/ssh"
1215
)
@@ -37,6 +40,11 @@ func CreateSignerPKCS11(provider, pin string) (signers []ssh.Signer, err error)
3740
// get absolute path
3841
provider = getAbsPath(provider)
3942

43+
// Check exist provider
44+
if _, err = os.Stat(provider); errors.Is(err, os.ErrNotExist) {
45+
return
46+
}
47+
4048
ctx := pkcs11.New(provider)
4149
err = ctx.Initialize()
4250
if err != nil {

cmd.go

-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ func (c *Connect) Command(command string) (err error) {
5959
return
6060
}
6161

62-
//
6362
func (c *Connect) setOption(session *ssh.Session) (err error) {
6463
// Request tty
6564
if c.TTY {

connect.go

+32-30
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,15 @@ func (c *Connect) CreateClient(host, port, user string, authMethods []ssh.AuthMe
117117
uri := net.JoinHostPort(host, port)
118118

119119
timeout := 20
120-
if c.ConnectTimeout > 0 {
121-
timeout = c.ConnectTimeout
120+
if c.ConnectTimeout == 0 {
121+
c.ConnectTimeout = timeout
122122
}
123123

124124
// Create new ssh.ClientConfig{}
125125
config := &ssh.ClientConfig{
126126
User: user,
127127
Auth: authMethods,
128-
Timeout: time.Duration(timeout) * time.Second,
128+
Timeout: time.Duration(c.ConnectTimeout) * time.Second,
129129
}
130130

131131
if c.HostKeyCallback != nil {
@@ -147,21 +147,27 @@ func (c *Connect) CreateClient(host, port, user string, authMethods []ssh.AuthMe
147147
c.ProxyDialer = proxy.Direct
148148
}
149149

150-
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second)
150+
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(c.ConnectTimeout)*time.Second)
151151
defer cancel()
152152

153153
// Dial to host:port
154-
netConn, err := c.ProxyDialer.DialContext(ctx, "tcp", uri)
155-
if err != nil {
156-
return
154+
netConn, cerr := c.ProxyDialer.DialContext(ctx, "tcp", uri)
155+
if cerr != nil {
156+
return cerr
157157
}
158158

159+
// Set deadline
160+
netConn.SetDeadline(time.Now().Add(time.Duration(c.ConnectTimeout) * time.Second))
161+
159162
// Create new ssh connect
160-
sshCon, channel, req, err := ssh.NewClientConn(netConn, uri, config)
161-
if err != nil {
162-
return
163+
sshCon, channel, req, cerr := ssh.NewClientConn(netConn, uri, config)
164+
if cerr != nil {
165+
return cerr
163166
}
164167

168+
// Reet deadline
169+
netConn.SetDeadline(time.Time{})
170+
165171
// Create *ssh.Client
166172
c.Client = ssh.NewClient(sshCon, channel, req)
167173

@@ -172,40 +178,36 @@ func (c *Connect) CreateClient(host, port, user string, authMethods []ssh.AuthMe
172178
func (c *Connect) CreateSession() (session *ssh.Session, err error) {
173179
// Create session
174180
session, err = c.Client.NewSession()
175-
176181
return
177182
}
178183

179184
// SendKeepAlive send packet to session.
180185
// TODO(blacknon): Interval及びMaxを設定できるようにする(v0.1.1)
181186
func (c *Connect) SendKeepAlive(session *ssh.Session) {
182187
// keep alive interval (default 30 sec)
183-
interval := 30
188+
interval := 1
184189
if c.SendKeepAliveInterval > 0 {
185190
interval = c.SendKeepAliveInterval
186191
}
187192

188-
// keep alive max (default 5)
189-
max := 5
190-
if c.SendKeepAliveMax > 0 {
191-
max = c.SendKeepAliveMax
192-
}
193-
194-
// keep alive counter
195-
i := 0
196193
for {
197-
// Send keep alive packet
198-
_, err := session.SendRequest("keepalive", true, nil)
199-
// _, _, err := c.Client.SendRequest("keepalive", true, nil)
200-
if err == nil {
201-
i = 0
202-
} else {
203-
i += 1
204-
}
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+
}()
205204

206-
// check counter
207-
if max <= i {
205+
select {
206+
case <-tc:
207+
case <-time.After(time.Duration(c.ConnectTimeout) * time.Second):
208208
session.Close()
209+
c.Client.Close()
210+
log.Println("keepalive timeout")
209211
return
210212
}
211213

go.mod

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module github.com/blacknon/go-sshlib
22

3+
// NOTE: go-nfsについては、オリジナルがアップデートされたらベースのリポジトリに変更する(2024/08/10)
4+
// => debug commitが何故か0.0.2に含まれていないので…
5+
36
require (
47
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5
58
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
@@ -16,13 +19,23 @@ require (
1619
golang.org/x/term v0.23.0
1720
)
1821

22+
require (
23+
github.com/blacknon/go-nfs-sshlib v0.0.3
24+
github.com/go-git/go-billy/v5 v5.5.0
25+
github.com/pkg/sftp v1.13.6
26+
)
27+
1928
require (
2029
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
30+
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
2131
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a // indirect
32+
github.com/google/uuid v1.6.0 // indirect
33+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
34+
github.com/kr/fs v0.1.0 // indirect
2235
github.com/pkg/errors v0.9.1 // indirect
23-
github.com/stretchr/testify v1.7.1 // indirect
36+
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93 // indirect
2437
github.com/thales-e-security/pool v0.0.2 // indirect
25-
gopkg.in/yaml.v3 v3.0.1 // indirect
38+
github.com/willscott/go-nfs-client v0.0.0-20240104095149-b44639837b00 // indirect
2639
)
2740

2841
go 1.22.4

go.sum

+61-10
Original file line numberDiff line numberDiff line change
@@ -6,62 +6,113 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd
66
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
77
github.com/blacknon/crypto11 v1.2.7 h1:LKrnCeXAk4jQmpJTeg/tVvNjqEgKHIE+tYSNXQj8Fco=
88
github.com/blacknon/crypto11 v1.2.7/go.mod h1:Z24sFD9pMX3NdUFzX52ggcV7HurAYAGvxud73BrHudA=
9+
github.com/blacknon/go-nfs-sshlib v0.0.3 h1:tq83kTZibrr99/GCn0pqkJhmBTDMupL/eMI3ZhSM0G4=
10+
github.com/blacknon/go-nfs-sshlib v0.0.3/go.mod h1:jaCmHgFoj8j08rGrBnhJ4nFO7nUWs4xFrUd2vEPwyx8=
911
github.com/blacknon/go-x11auth v0.1.0 h1:SnljCPWcvglWeGAlKc1RAPMHnOfMpM9+GrTGEUQ1lqQ=
1012
github.com/blacknon/go-x11auth v0.1.0/go.mod h1:SKOCa19LluXHyB+OaLYobquzceE0SWxVW7e/qU5xGBM=
1113
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
12-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
14+
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
15+
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
1316
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
17+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
18+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1419
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a h1:saTgr5tMLFnmy/yg3qDTft4rE5DY2uJ/cCxCe3q0XTU=
1520
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a/go.mod h1:Bw9BbhOJVNR+t0jCqx2GC6zv0TGBsShs56Y3gfSCvl0=
21+
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
22+
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
1623
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
1724
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
25+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
26+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
27+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
28+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
29+
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
30+
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
31+
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
32+
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
33+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
34+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
35+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
36+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1837
github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8=
1938
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
2039
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
2140
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
2241
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
2342
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
43+
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
44+
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
2445
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
2546
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
2647
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
48+
github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo=
49+
github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk=
2750
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2851
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
52+
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93 h1:UVArwN/wkKjMVhh2EQGC0tEc1+FqiLlvYXY5mQ2f8Wg=
53+
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93/go.mod h1:Nfe4efndBz4TibWycNE+lqyJZiMX4ycx+QKV8Ta0f/o=
54+
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
55+
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
2956
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
3057
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
58+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
3159
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
32-
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
3360
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
61+
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
62+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
3463
github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg=
3564
github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU=
65+
github.com/willscott/go-nfs-client v0.0.0-20240104095149-b44639837b00 h1:U0DnHRZFzoIV1oFEZczg5XyPut9yxk9jjtax/9Bxr/o=
66+
github.com/willscott/go-nfs-client v0.0.0-20240104095149-b44639837b00/go.mod h1:Tq++Lr/FgiS3X48q5FETemXiSLGuYMQT2sPjYNPJSwA=
67+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
3668
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
3769
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
38-
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
39-
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
70+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
71+
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
4072
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
4173
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
74+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
4275
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
4376
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
44-
golang.org/x/net v0.0.0-20220526153639-5463443f8c37 h1:lUkvobShwKsOesNfWWlCS5q7fnbG1MEliIzwu886fn8=
45-
golang.org/x/net v0.0.0-20220526153639-5463443f8c37/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
77+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
78+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
79+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
80+
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
4681
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
4782
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
4883
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
84+
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
4985
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5086
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5187
golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
88+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
89+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5290
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
53-
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
54-
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
91+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
92+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
93+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5594
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
5695
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
57-
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
58-
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
96+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
97+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
98+
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
5999
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
60100
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
61101
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
102+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
103+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
104+
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
105+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
106+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
107+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
62108
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
109+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
110+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
111+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
63112
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
64113
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
114+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
115+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
65116
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
66117
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
67118
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

nfs_cos.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) 2024 Blacknon. All rights reserved.
2+
// Use of this source code is governed by an MIT license
3+
// that can be found in the LICENSE file.
4+
5+
package sshlib
6+
7+
import (
8+
"os"
9+
"time"
10+
11+
"github.com/go-git/go-billy/v5"
12+
)
13+
14+
// NewChangeOSFS wraps billy osfs to add the change interface
15+
func NewChangeOSFS(fs billy.Filesystem) billy.Filesystem {
16+
return COS{fs}
17+
}
18+
19+
// COS or OSFS + Change wraps a billy.FS to not fail the `Change` interface.
20+
type COS struct {
21+
billy.Filesystem
22+
}
23+
24+
// Chmod changes mode
25+
func (fs COS) Chmod(name string, mode os.FileMode) error {
26+
return os.Chmod(fs.Join(fs.Root(), name), mode)
27+
}
28+
29+
// Lchown changes ownership
30+
func (fs COS) Lchown(name string, uid, gid int) error {
31+
return os.Lchown(fs.Join(fs.Root(), name), uid, gid)
32+
}
33+
34+
// Chown changes ownership
35+
func (fs COS) Chown(name string, uid, gid int) error {
36+
return os.Chown(fs.Join(fs.Root(), name), uid, gid)
37+
}
38+
39+
// Chtimes changes access time
40+
func (fs COS) Chtimes(name string, atime time.Time, mtime time.Time) error {
41+
return os.Chtimes(fs.Join(fs.Root(), name), atime, mtime)
42+
}

nfs_cos_unix.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//go:build darwin || dragonfly || freebsd || linux || nacl || netbsd || openbsd || solaris
2+
3+
// Copyright (c) 2024 Blacknon. All rights reserved.
4+
// Use of this source code is governed by an MIT license
5+
// that can be found in the LICENSE file.
6+
7+
package sshlib
8+
9+
import "golang.org/x/sys/unix"
10+
11+
func (fs COS) Mknod(path string, mode uint32, major uint32, minor uint32) error {
12+
dev := unix.Mkdev(major, minor)
13+
return unix.Mknod(fs.Join(fs.Root(), path), mode, int(dev))
14+
}
15+
16+
func (fs COS) Mkfifo(path string, mode uint32) error {
17+
return unix.Mkfifo(fs.Join(fs.Root(), path), mode)
18+
}
19+
20+
func (fs COS) Link(path string, link string) error {
21+
return unix.Link(fs.Join(fs.Root(), path), link)
22+
}
23+
24+
func (fs COS) Socket(path string) error {
25+
fd, err := unix.Socket(unix.AF_UNIX, unix.SOCK_STREAM, 0)
26+
if err != nil {
27+
return err
28+
}
29+
return unix.Bind(fd, &unix.SockaddrUnix{Name: fs.Join(fs.Root(), path)})
30+
}

0 commit comments

Comments
 (0)