-
Notifications
You must be signed in to change notification settings - Fork 0
/
smb.go
102 lines (84 loc) · 1.7 KB
/
smb.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
package main
import (
"net"
"os"
"github.com/hirochachacha/go-smb2"
)
// Windows から SMB で取得したファイルを表す。io.ReadSeekCloser を実装する。
type winFile struct {
netCon net.Conn
session *smb2.Session
share *smb2.Share
file *smb2.File
}
func (f *winFile) Read(p []byte) (n int, err error) {
n, err = f.file.Read(p)
if err != nil {
return 0, err
}
return n, nil
}
func (f *winFile) Seek(offset int64, whence int) (int64, error) {
n, err := f.file.Seek(offset, whence)
if err != nil {
return 0, err
}
return n, nil
}
func (f *winFile) Close() error {
if err := f.file.Close(); err != nil {
return err
}
if err := f.share.Umount(); err != nil {
return err
}
if err := f.session.Logoff(); err != nil {
return err
}
if err := f.netCon.Close(); err != nil {
return err
}
return nil
}
func (f *winFile) Stat() (os.FileInfo, error) {
s, err := f.file.Stat()
if err != nil {
return nil, err
}
return s, nil
}
// Windows からファイルを読み出す
func openSMB(name string) (*winFile, error) {
host := os.Getenv("SMB_HOST")
user := os.Getenv("SMB_USER")
password := os.Getenv("SMB_PASSWORD")
sharename := os.Getenv("SMB_SHARENAME")
conn, err := net.Dial("tcp", host) // めんどいのでハードコード
if err != nil {
return nil, err
}
d := &smb2.Dialer{
Initiator: &smb2.NTLMInitiator{
User: user,
Password: password,
},
}
s, err := d.Dial(conn)
if err != nil {
return nil, err
}
smbfs, err := s.Mount(sharename)
if err != nil {
return nil, err
}
sf, err := smbfs.Open(name)
if err != nil {
return nil, err
}
return &winFile{
netCon: conn,
session: s,
share: smbfs,
file: sf,
}, nil
}