-
Notifications
You must be signed in to change notification settings - Fork 4
/
main.go
99 lines (83 loc) · 2.44 KB
/
main.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
// Copyright 2022 Jaana Dogan
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package main contains a program that serves Go modules from S3.
package main
import (
"crypto/tls"
"flag"
"log"
"net/http"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/rakyll/goproxy-s3/proxy"
)
var (
listen string
admin string // Admin API...
provider string // s3, gcs, etc
region string
bucket string
endpoint string // cloud API endpoint
)
func main() {
flag.StringVar(&listen, "listen", ":8080", "")
flag.StringVar(&admin, "admin", ":9999", "")
flag.StringVar(&provider, "provider", "s3", "")
flag.StringVar(®ion, "region", "", "")
flag.StringVar(&bucket, "bucket", "", "")
flag.StringVar(&endpoint, "endpoint", "", "")
flag.Parse()
// TODO(jbd): Consider changing the binary name once
// there are multiple provider implementations.
log.SetPrefix("goproxy-s3: ")
if bucket == "" {
log.Fatalln("Please provide a bucket name")
}
var downloader proxy.Downloader
var copier proxy.Copier
switch provider {
case "s3":
cfg := &aws.Config{}
if region != "" {
cfg.Region = aws.String(region)
}
if endpoint != "" {
cfg.Endpoint = aws.String(endpoint)
}
sess, err := session.NewSession(cfg)
if err != nil {
log.Fatalf("Cannot create AWS session: %v", err)
}
copier = proxy.NewS3Copier(sess, bucket)
downloader = proxy.NewS3Downloader(sess, bucket)
default:
log.Fatalf("Unknown provider: %q", provider)
}
adminServer := http.Server{
Addr: admin,
Handler: copier,
}
go func() {
log.Printf("Admin server is starting at %q", admin)
log.Fatalln(adminServer.ListenAndServe())
}()
server := http.Server{
Addr: listen,
TLSConfig: &tls.Config{
InsecureSkipVerify: true, // TODO(jbd): Support TLS options.
},
Handler: &proxy.ProxyHandler{
Downloader: downloader,
},
}
log.Printf("Proxy server is starting at %q; set GOPROXY", listen)
log.Fatalln(server.ListenAndServe())
}