obs-access-signer/main.go
Nugraha 12a595ed74
All checks were successful
continuous-integration/drone Build is passing
all: option to remove bucket name from prefix
default value for option to remove bucket name is `false`
2023-01-09 13:14:19 +07:00

148 lines
3.3 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"os"
"strings"
_ "github.com/joho/godotenv/autoload"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var (
httpAddr = ":9003"
logLevel = "INFO"
serverMode = "s3"
zapLogLevel zapcore.Level
postFlagParse = []func(){}
registeredServers = []Server{
&serverS3{},
&serverStorj{},
}
mappedServers = map[string]Server{}
)
func init() {
var err error
_ = err
/* --- [preload] --- */
var availableServerNames []string
for _, s := range registeredServers {
serverName := s.Name()
if old, exist := mappedServers[serverName]; exist {
panic(fmt.Sprintf("duplicate server name old: %T, new: %T", old, s))
}
mappedServers[serverName] = s
availableServerNames = append(availableServerNames, serverName)
}
/* --- app --- */
var vHttpAddr = httpAddr
if sHttpAddr := os.Getenv("HTTP_ADDR"); sHttpAddr != "" {
vHttpAddr = sHttpAddr
}
flag.StringVar(&httpAddr, "addr", vHttpAddr, "Server address")
var vServerMode = serverMode
if sServerMode := os.Getenv("SERVER_MODE"); sServerMode != "" {
vServerMode = sServerMode
}
flag.StringVar(&serverMode, "server", vServerMode,
fmt.Sprintf("Server mode (available [%s])", strings.Join(availableServerNames, ", ")))
qpostFlagParse(func() {
if httpAddr == "" {
httpAddr = ":9003"
}
if serverMode == "" {
serverMode = "s3"
}
})
/* --- log --- */
var vLogLevel = logLevel
if sLogLevel := os.Getenv("LOG_LEVEL"); sLogLevel != "" {
vLogLevel = sLogLevel
}
flag.StringVar(&logLevel, "log-level", vLogLevel, "Log level")
qpostFlagParse(func() {
err := zapLogLevel.UnmarshalText([]byte(logLevel))
if err != nil {
zapLogLevel = zapcore.InfoLevel
}
})
/* --- OBS --- */
if err = defaultObsOpts.Bind(flag.CommandLine); err != nil {
panic(err)
}
/* --- OBS S3 --- */
if err = defaultObsS3Opts.Bind(flag.CommandLine); err != nil {
panic(err)
}
/* --- OBS Storj (via LibUplink) --- */
if err = defaultObsUplinkOpts.Bind(flag.CommandLine); err != nil {
panic(err)
}
}
func qpostFlagParse(f func()) {
postFlagParse = append(postFlagParse, f)
}
func qpostFlagParseInvoke() {
for _, f := range postFlagParse {
f()
}
}
func main() {
flag.Parse()
qpostFlagParseInvoke()
zcfg := zap.NewProductionConfig()
zcfg.Level = zap.NewAtomicLevelAt(zapLogLevel)
logger := unwrap1(zcfg.Build())
defer logger.Sync()
sug := logger.Named("main").Sugar()
sug.Infow("starting",
"log_level", zapLogLevel,
"server_mode", serverMode,
// Generic OBS
"obs_bucket", defaultObsOpts.BucketName,
"obs_remove_bucket_name", defaultObsOpts.RemoveBucketName,
"obs_redirect_secure", defaultObsOpts.RedirectSecure,
"obs_host_redirect", defaultObsOpts.HostRedirect,
"obs_redirect_code", defaultObsOpts.RedirectCode,
"obs_url_expiry", defaultObsOpts.URLExpiry.String(),
// S3
"obs_s3_endpoint", defaultObsS3Opts.Endpoint,
// Storj (via LibUplink)
"obs_storj_satellite_addr", defaultObsUplinkOpts.SatelliteAddress,
)
// lookup server mode handler
srv, exist := mappedServers[serverMode]
if !exist || srv == nil {
sug.Fatalw("unknown server handler",
"server_mode", serverMode)
}
// run http server
RunServer(context.Background(),
srv,
serverOptions{
Addr: httpAddr,
Logger: logger.Named("server"),
Opts: &defaultObsOpts,
S3Opts: &defaultObsS3Opts,
UplinkOpts: &defaultObsUplinkOpts,
})
}