-
Notifications
You must be signed in to change notification settings - Fork 1
/
s3gw.go
132 lines (107 loc) · 2.64 KB
/
s3gw.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
124
125
126
127
128
129
130
131
132
package main
import (
"flag"
"log"
"time"
"s3gw/ranger"
"s3gw/rados"
"os"
"github.com/BurntSushi/toml"
"github.com/patrickmn/go-cache"
"s3gw/s3"
)
type RangerConfig struct {
ServiceName string
EndPoint string
}
type Config struct {
Address string
Port int
Endpoint string
Ranger RangerConfig
Rados rados.RadosClient
KeyFile string
CertFile string
HTTPReadTimeout int
HTTPWriteTimeout int
Auth string
Keytab string
}
var service *ranger.Service
var accessKey2Username map[string]string
var radosClient rados.RadosClient
var ownerCache *cache.Cache
var s3Client s3.Client
func ReadConfig(path string)(Config) {
_, err := os.Stat(path)
if err != nil {
log.Fatal("Config file is missing: ", path)
panic(err)
}
var config Config
_, err = toml.DecodeFile(path, &config)
if err != nil {
log.Fatal("Cannot decode toml: ", err)
panic(err)
}
return config
}
func main() {
const (
defaultConfig = "/etc/s3gw/sg3w.toml"
)
configFile := flag.String("conf", defaultConfig, "configuration file")
flag.Parse()
config := ReadConfig(*configFile)
opts := ServerOptions{
Port: config.Port,
Address: config.Address,
Endpoint: config.Endpoint,
CertFile: config.CertFile,
KeyFile: config.KeyFile,
HTTPWriteTimeout: 60,
HTTPReadTimeout: 60,
}
log.Printf("Listening on: %s\n", config.Port)
log.Printf("S3 Host Endpoint: %s\n", config.Endpoint)
ownerCache = cache.New(time.Hour, time.Hour)
var err error
service, err = ranger.GetPolicy(config.Ranger.ServiceName, config.Ranger.EndPoint)
if err != nil {
log.Fatal("Cannot get initial policy", err)
panic(err)
}
radosClient = config.Rados
s3Client = s3.Client{
AccessKey: radosClient.AccessKey,
SecretKey: radosClient.SecretKey,
EndPoint: radosClient.EndPoint,
}
accessKey2Username, err = radosClient.SyncUserAccessKeys()
if err != nil {
log.Fatal("Cannot get initial users from ceph/rados", err)
panic(err)
}
ticker := time.NewTicker(5 * time.Second)
go func() {
for range ticker.C {
log.Printf("Updating Ranger Policies and Rados Access accessKey2Username\n")
newService, err := ranger.GetPolicy(config.Ranger.ServiceName, config.Ranger.EndPoint)
if err != nil {
log.Printf("Cannot refresh Ranger policy due to error %s", err)
} else {
service = newService
}
newKeys, err := radosClient.SyncUserAccessKeys()
if err != nil {
log.Printf("Cannot refresh users from Ceph/Rados due to error %s", err)
} else {
accessKey2Username = newKeys
}
}
}()
err = Serve(opts)
if err != nil {
log.Fatalf("Cannot start the reverse proxy server: %s\n", err)
}
}