Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 53 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,16 @@
package config

import (
"crypto/rand"
"encoding/base64"
"fmt"
"io"
"os"
"strings"

"github.com/mendersoftware/go-lib-micro/config"
"github.com/mendersoftware/go-lib-micro/log"
"github.com/pkg/errors"
)

const (
Expand Down Expand Up @@ -201,8 +207,53 @@ func MissingOptionError(option string) error {
return fmt.Errorf("Required option: '%s'", option)
}

func applyAliases() {
for _, alias := range Aliases {
if config.Config.IsSet(alias.Alias) {
config.Config.Set(alias.Key, config.Config.Get(alias.Alias))
}
}
}

func Setup(configPath string) error {
err := config.FromConfigFile(configPath, Defaults)
if err != nil {
return fmt.Errorf("error loading configuration: %s", err)
}

// Enable setting config values by environment variables
config.Config.SetEnvPrefix("DEPLOYMENTS")
config.Config.AutomaticEnv()
config.Config.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
if err := config.ValidateConfig(config.Config, Validators...); err != nil {
return errors.WithMessage(err, "config: error validating configuration")
}
if config.Config.Get(SettingPresignSecret) == "" {
log.NewEmpty().Warnf("'%s' not configured. Generating a random secret.",
SettingPresignSecret,
)
var buf [32]byte
n, err := io.ReadFull(rand.Reader, buf[:])
if err != nil {
return errors.WithMessagef(err,
"failed to generate '%s'",
SettingPresignSecret,
)
} else if n == 0 {
return errors.Errorf(
"failed to generate '%s'",
SettingPresignSecret,
)
}
secret := base64.StdEncoding.EncodeToString(buf[:n])
config.Config.Set(SettingPresignSecret, secret)
}
applyAliases()
return nil
}

var (
Validators = []config.Validator{ValidateAwsAuth, ValidateHttps}
Validators = []config.Validator{ValidateAwsAuth, ValidateHttps, ValidateStorage}
// Aliases for deprecated configuration names to preserve backward compatibility.
Aliases = []struct {
Key string
Expand All @@ -214,6 +265,7 @@ var (
{Key: SettingsStorageUploadExpireSeconds, Alias: deprecatedSettingsAwsUploadExpireSeconds},
{Key: SettingStorageMaxImageSize, Alias: deprecatedSettingAwsS3MaxImageSize},
}

Defaults = []config.Default{
{Key: SettingListen, Value: SettingListenDefault},
{Key: SettingDefaultStorage, Value: SettingDefaultStorageDefault},
Expand Down
42 changes: 2 additions & 40 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,13 @@ package main

import (
"context"
"crypto/rand"
"encoding/base64"
"fmt"
"io"
"os"
"strings"
"time"

"github.com/mendersoftware/go-lib-micro/config"
"github.com/mendersoftware/go-lib-micro/log"
mstore "github.com/mendersoftware/go-lib-micro/store"
"github.com/pkg/errors"
"github.com/urfave/cli"

dconfig "github.com/mendersoftware/deployments/config"
Expand Down Expand Up @@ -83,41 +78,8 @@ func doMain(args []string) {

app.Action = cmdServer
app.Before = func(args *cli.Context) error {

l := log.NewEmpty()
for _, alias := range dconfig.Aliases {
config.Config.RegisterAlias(alias.Alias, alias.Key)
}
err := config.FromConfigFile(configPath, dconfig.Defaults)
if err != nil {
return cli.NewExitError(
fmt.Sprintf("error loading configuration: %s", err),
1)
}

// Enable setting config values by environment variables
config.Config.SetEnvPrefix("DEPLOYMENTS")
config.Config.AutomaticEnv()
config.Config.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
if config.Config.Get(dconfig.SettingPresignSecret) == "" {
l.Infof("'%s' not configured. Generating a random secret.",
dconfig.SettingPresignSecret,
)
var buf [32]byte
n, err := io.ReadFull(rand.Reader, buf[:])
if err != nil {
return errors.Wrapf(err,
"failed to generate '%s'",
dconfig.SettingPresignSecret,
)
} else if n == 0 {
return errors.Errorf(
"failed to generate '%s'",
dconfig.SettingPresignSecret,
)
}
secret := base64.StdEncoding.EncodeToString(buf[:n])
config.Config.Set(dconfig.SettingPresignSecret, secret)
if err := dconfig.Setup(configPath); err != nil {
return cli.NewExitError(err.Error(), 1)
}

return nil
Expand Down
5 changes: 4 additions & 1 deletion storage/s3/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ func NewOptions(opts ...*Options) *Options {
if opt.StaticCredentials != nil {
ret.StaticCredentials = opt.StaticCredentials
}
if opt.Region != nil {
ret.Region = opt.Region
}
if opt.ContentType != nil {
ret.ContentType = opt.ContentType
}
Expand Down Expand Up @@ -174,7 +177,7 @@ func (opts *Options) toS3Options() (
endpointURI := *opts.URI
s3Opts.EndpointResolver = s3.EndpointResolverFromURL(endpointURI,
func(ep *aws.Endpoint) {
ep.HostnameImmutable = opts.ForcePathStyle
ep.HostnameImmutable = true
},
)
}
Expand Down