/
fs.go
123 lines (110 loc) · 2.7 KB
/
fs.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package backend
import (
"context"
"io/fs"
"os"
"strconv"
"syscall"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/fakeyanss/usg-go/internal/model"
"github.com/rs/zerolog/log"
)
type FsBackend struct {
rootPath string
}
func NewFsBackend() *FsBackend {
fsb := &FsBackend{
rootPath: "data/fs",
}
initRootPath(fsb.rootPath)
return fsb
}
func initRootPath(rootPath string) {
err := os.MkdirAll(rootPath, fs.ModePerm)
log.Fatal().Err(err).Msg("Fail to init fs backend, exit.")
}
func (fsb *FsBackend) CreateBucket(bucket string) *model.UsgResp {
return nil
}
func (fsb *FsBackend) ListBuckets(ctx context.Context) *model.UsgResp {
files, err := os.ReadDir(fsb.rootPath)
if err != nil {
log.Error().Err(err).Msgf("Fail to read directory=%s", fsb.rootPath)
}
output := &s3.ListBucketsOutput{
Buckets: []types.Bucket{},
}
var ownerName string
var ownerID string
for _, f := range files {
if !f.IsDir() {
continue
}
info, err := os.Stat(fsb.rootPath + "/" + f.Name())
var creationDate time.Time
if err != nil {
// todo
}
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
if ownerName == "" {
ownerName = strconv.Itoa(int(stat.Uid))
ownerID = ownerName
}
cTimespec := stat.Birthtimespec
// mills := cTimespec.Nano() / 1000000
creationDate = time.Unix(cTimespec.Sec, cTimespec.Nano())
}
output.Buckets = append(output.Buckets, types.Bucket{
Name: aws.String(f.Name()),
CreationDate: &creationDate,
})
}
output.Owner = &types.Owner{
DisplayName: &ownerName,
ID: &ownerID,
}
ur := &model.UsgResp{}
ur.StatusCode = 200
// ur.Header = &header
ur.Body = output
return ur
}
func (fsb *FsBackend) ListObjects(ctx context.Context, bucket, delimiter, encodingType, marker string, maxKeys int32, keyPrefix string) *model.UsgResp {
path := fsb.rootPath + "/" + bucket
files, err := os.ReadDir(fsb.rootPath)
if err != nil {
}
output := &s3.ListObjectsOutput{
Contents: []types.Object{},
MaxKeys: 1000,
}
for _, f := range files {
if !f.IsDir() {
continue
}
info, err := f.Info()
var creationDate time.Time
if err != nil {
creationDate = info.ModTime()
}
output.Contents = append(output.Contents, types.Object{
ETag: aws.String(""),
Key: aws.String(path + "/" + f.Name()),
LastModified: &creationDate,
Owner: &types.Owner{
DisplayName: aws.String(info.Name()),
ID: aws.String(info.Name()),
},
Size: info.Size(),
StorageClass: types.ObjectStorageClassStandard,
})
}
ur := &model.UsgResp{}
ur.StatusCode = 200
// ur.Header = &header
ur.Body = output
return ur
}