s3manager-web/main.go

92 lines
2.5 KiB
Go
Raw Normal View History

2017-05-08 23:07:07 +02:00
package main
import (
2021-04-16 14:55:19 +02:00
"crypto/tls"
2021-04-21 11:37:38 +02:00
"embed"
2019-09-05 00:44:02 +02:00
"fmt"
2021-04-21 11:37:38 +02:00
"io/fs"
2017-05-08 23:07:07 +02:00
"log"
"net/http"
"os"
2021-04-16 14:55:19 +02:00
"strconv"
2017-05-08 23:07:07 +02:00
2021-12-30 12:09:42 +01:00
"github.com/cloudlena/adapters/logging"
"github.com/cloudlena/s3manager/internal/app/s3manager"
2018-05-31 16:10:41 +02:00
"github.com/matryer/way"
2021-08-05 11:44:40 +02:00
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
2017-05-08 23:07:07 +02:00
)
2021-04-21 11:37:38 +02:00
//go:embed web/template
var templateFS embed.FS
2017-05-08 23:07:07 +02:00
func main() {
2020-05-04 10:33:23 +02:00
endpoint, ok := os.LookupEnv("ENDPOINT")
if !ok {
endpoint = "s3.amazonaws.com"
}
2018-11-30 23:09:00 +01:00
accessKeyID, ok := os.LookupEnv("ACCESS_KEY_ID")
if !ok {
log.Fatal("please provide ACCESS_KEY_ID")
}
secretAccessKey, ok := os.LookupEnv("SECRET_ACCESS_KEY")
if !ok {
log.Fatal("please provide SECRET_ACCESS_KEY")
}
2021-08-05 11:44:40 +02:00
region := os.Getenv("REGION")
2021-04-16 14:55:19 +02:00
useSSL := getBoolEnvWithDefault("USE_SSL", true)
skipSSLVerification := getBoolEnvWithDefault("SKIP_SSL_VERIFICATION", false)
2018-11-30 23:09:00 +01:00
port, ok := os.LookupEnv("PORT")
if !ok {
port = "8080"
}
2019-09-05 00:44:02 +02:00
2021-04-21 11:37:38 +02:00
// Set up templates
templates, err := fs.Sub(templateFS, "web/template")
if err != nil {
log.Fatal(err)
}
2018-05-31 16:10:41 +02:00
2017-05-08 23:07:07 +02:00
// Set up S3 client
2021-08-05 11:44:40 +02:00
opts := &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
}
if region != "" {
opts.Region = region
2017-05-08 23:07:07 +02:00
}
2021-04-16 14:55:19 +02:00
if useSSL && skipSSLVerification {
2021-08-05 11:44:40 +02:00
opts.Transport = &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} //nolint:gosec
}
s3, err := minio.New(endpoint, opts)
if err != nil {
log.Fatalln(fmt.Errorf("error creating s3 client: %w", err))
2021-04-16 14:55:19 +02:00
}
2017-05-08 23:07:07 +02:00
// Set up router
2018-05-31 16:10:41 +02:00
r := way.NewRouter()
r.Handle(http.MethodGet, "/", http.RedirectHandler("/buckets", http.StatusPermanentRedirect))
2021-04-21 11:37:38 +02:00
r.Handle(http.MethodGet, "/buckets", s3manager.HandleBucketsView(s3, templates))
r.Handle(http.MethodGet, "/buckets/:bucketName", s3manager.HandleBucketView(s3, templates))
2018-05-31 16:10:41 +02:00
r.Handle(http.MethodPost, "/api/buckets", s3manager.HandleCreateBucket(s3))
r.Handle(http.MethodDelete, "/api/buckets/:bucketName", s3manager.HandleDeleteBucket(s3))
r.Handle(http.MethodPost, "/api/buckets/:bucketName/objects", s3manager.HandleCreateObject(s3))
r.Handle(http.MethodGet, "/api/buckets/:bucketName/objects/:objectName", s3manager.HandleGetObject(s3))
r.Handle(http.MethodDelete, "/api/buckets/:bucketName/objects/:objectName", s3manager.HandleDeleteObject(s3))
lr := logging.Handler(os.Stdout)(r)
2018-11-30 23:09:00 +01:00
log.Fatal(http.ListenAndServe(":"+port, lr))
2017-05-08 23:07:07 +02:00
}
2021-04-16 14:55:19 +02:00
func getBoolEnvWithDefault(name string, defaultValue bool) bool {
envValue, ok := os.LookupEnv(name)
if !ok {
return defaultValue
}
value, err := strconv.ParseBool(envValue)
if err != nil {
log.Fatalf("invalid value for %s", name)
}
return value
}