From 63aa02ca6842cb243cc6ac24cf89c1b6964ee87b Mon Sep 17 00:00:00 2001 From: Krishna Iyer Easwaran Date: Wed, 13 Mar 2024 12:50:50 +0100 Subject: [PATCH] all: Use env only when set --- CHANGELOG.md | 2 + pkg/source/ttnv2/config.go | 100 +++++++++++++++++++++++++++---------- pkg/source/ttnv2/source.go | 5 +- pkg/source/ttnv2/ttnv2.go | 4 +- 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f36307..1af248e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed +- Flags are always only loaded from the env. Now flags are loaded from env only if set. + ## [v0.11.2] (2024-03-04) ### Fixed diff --git a/pkg/source/ttnv2/config.go b/pkg/source/ttnv2/config.go index 53b9a36..9d4b7ea 100644 --- a/pkg/source/ttnv2/config.go +++ b/pkg/source/ttnv2/config.go @@ -35,62 +35,62 @@ const ( clientName = "ttn-lw-migrate" ) -func New() (*Config, *pflag.FlagSet) { - var ( - config = &Config{sdkConfig: ttnsdk.NewCommunityConfig(clientName)} - flags = &pflag.FlagSet{} - ) +func NewConfig() *Config { + config := &Config{ + sdkConfig: ttnsdk.NewCommunityConfig(clientName), + flags: &pflag.FlagSet{}, + } - flags.StringVar(&config.frequencyPlanID, + config.flags.StringVar(&config.frequencyPlanID, "frequency-plan-id", - os.Getenv("FREQUENCY_PLAN_ID"), + "", "Frequency Plan ID of exported devices") - flags.StringVar(&config.appID, + config.flags.StringVar(&config.appID, "app-id", - os.Getenv("TTNV2_APP_ID"), + "", "TTN Application ID") - flags.StringVar(&config.appAccessKey, + config.flags.StringVar(&config.appAccessKey, "app-access-key", - os.Getenv("TTNV2_APP_ACCESS_KEY"), + "", "TTN Application Access Key (with 'devices' permissions") - flags.StringVar(&config.caCert, + config.flags.StringVar(&config.caCert, "ca-cert", - os.Getenv("TTNV2_CA_CERT"), + "", "(only for private networks)") - flags.StringVar(&config.sdkConfig.HandlerAddress, + config.flags.StringVar(&config.sdkConfig.HandlerAddress, "handler-address", - os.Getenv("TTNV2_HANDLER_ADDRESS"), + "", "(only for private networks) Address for the Handler") - flags.StringVar(&config.sdkConfig.AccountServerAddress, + config.flags.StringVar(&config.sdkConfig.AccountServerAddress, "account-server-address", - os.Getenv("TTNV2_ACCOUNT_SERVER_ADDRESS"), + "", "(only for private networks) Address for the Account Server") - flags.StringVar(&config.sdkConfig.AccountServerClientID, + config.flags.StringVar(&config.sdkConfig.AccountServerClientID, "account-server-client-id", - os.Getenv("TTNV2_ACCOUNT_SERVER_CLIENT_ID"), + "", "(only for private networks) Client ID for the Account Server") - flags.StringVar(&config.sdkConfig.AccountServerClientSecret, + config.flags.StringVar(&config.sdkConfig.AccountServerClientSecret, "account-server-client-secret", - os.Getenv("TTNV2_ACCOUNT_SERVER_CLIENT_SECRET"), + "", "(only for private networks) Client secret for the Account Server") - flags.StringVar(&config.sdkConfig.DiscoveryServerAddress, + config.flags.StringVar(&config.sdkConfig.DiscoveryServerAddress, "discovery-server-address", - os.Getenv("TTNV2_DISCOVERY_SERVER_ADDRESS"), + "", "(only for private networks) Address for the Discovery Server") - flags.BoolVar(&config.sdkConfig.DiscoveryServerInsecure, + config.flags.BoolVar(&config.sdkConfig.DiscoveryServerInsecure, "discovery-server-insecure", false, "(only for private networks) Not recommended") - flags.BoolVar(&config.withSession, + config.flags.BoolVar(&config.withSession, "with-session", true, "Export device session keys and frame counters") - flags.BoolVar(&config.resetsToFrequencyPlan, + config.flags.BoolVar(&config.resetsToFrequencyPlan, "resets-to-frequency-plan", false, "Configure preset frequencies for ABP devices so that they match the used Frequency Plan") - return config, flags + return config } type Config struct { @@ -106,10 +106,48 @@ type Config struct { dryRun bool resetsToFrequencyPlan bool + flags *pflag.FlagSet fpStore *frequencyplans.Store } func (c *Config) Initialize(rootConfig source.Config) error { + if frequencyPlanID := os.Getenv("FREQUENCY_PLAN_ID"); frequencyPlanID != "" { + c.frequencyPlanID = frequencyPlanID + } + if appID := os.Getenv("TTNV2_APP_ID"); appID != "" { + c.appID = appID + } + if appAccessKey := os.Getenv("TTNV2_APP_ACCESS_KEY"); appAccessKey != "" { + c.appAccessKey = appAccessKey + } + if caCert := os.Getenv("TTNV2_CA_CERT"); caCert != "" { + c.caCert = caCert + } + if handlerAddress := os.Getenv("TTNV2_HANDLER_ADDRESS"); handlerAddress != "" { + c.sdkConfig.HandlerAddress = handlerAddress + } + if accountServerAddress := os.Getenv("TTNV2_ACCOUNT_SERVER_ADDRESS"); accountServerAddress != "" { + c.sdkConfig.AccountServerAddress = accountServerAddress + } + if accountServerClientID := os.Getenv("TTNV2_ACCOUNT_SERVER_CLIENT_ID"); accountServerClientID != "" { + c.sdkConfig.AccountServerClientID = accountServerClientID + } + if accountServerClientSecret := os.Getenv("TTNV2_ACCOUNT_SERVER_CLIENT_SECRET"); accountServerClientSecret != "" { + c.sdkConfig.AccountServerClientSecret = accountServerClientSecret + } + if discoveryServerAddress := os.Getenv("TTNV2_DISCOVERY_SERVER_ADDRESS"); discoveryServerAddress != "" { + c.sdkConfig.DiscoveryServerAddress = discoveryServerAddress + } + if discoveryServerInsecure := os.Getenv("TTNV2_DISCOVERY_SERVER_INSECURE"); discoveryServerInsecure == "true" { + c.sdkConfig.DiscoveryServerInsecure = true + } + if withSession := os.Getenv("TTNV2_WITH_SESSION"); withSession == "true" { + c.withSession = true + } + if resetsToFrequencyPlan := os.Getenv("TTNV2_RESETS_TO_FREQUENCY_PLAN"); resetsToFrequencyPlan == "true" { + c.resetsToFrequencyPlan = true + } + if c.caCert != "" { if c.sdkConfig.TLSConfig == nil { c.sdkConfig.TLSConfig = new(tls.Config) @@ -128,6 +166,9 @@ func (c *Config) Initialize(rootConfig source.Config) error { rootCAs.AppendCertsFromPEM(pemBytes) } + if c.appID == "" { + return errNoAppID.New() + } if c.appAccessKey == "" { return errNoAppAccessKey.New() } @@ -155,3 +196,8 @@ func (c *Config) Initialize(rootConfig source.Config) error { return nil } + +// Flags returns the flags for the configuration. +func (c *Config) Flags() *pflag.FlagSet { + return c.flags +} diff --git a/pkg/source/ttnv2/source.go b/pkg/source/ttnv2/source.go index ebd666e..0f72376 100644 --- a/pkg/source/ttnv2/source.go +++ b/pkg/source/ttnv2/source.go @@ -50,6 +50,9 @@ func createNewSource(cfg *Config) source.CreateSource { // NewSource creates a new TTNv2 Source. func NewSource(ctx context.Context, cfg *Config, rootCfg source.Config) (source.Source, error) { + if err := cfg.Initialize(rootCfg); err != nil { + return nil, err + } s := &Source{ ctx: ctx, config: cfg, @@ -60,7 +63,7 @@ func NewSource(ctx context.Context, cfg *Config, rootCfg source.Config) (source. return nil, err } s.mgr = newDeviceManager(ctx, mgr) - return s, cfg.Initialize(rootCfg) + return s, nil } // ExportDevice implements the source.Source interface. diff --git a/pkg/source/ttnv2/ttnv2.go b/pkg/source/ttnv2/ttnv2.go index a5f4093..5be3624 100644 --- a/pkg/source/ttnv2/ttnv2.go +++ b/pkg/source/ttnv2/ttnv2.go @@ -17,12 +17,12 @@ package ttnv2 import "go.thethings.network/lorawan-stack-migrate/pkg/source" func init() { - cfg, flags := New() + cfg := NewConfig() source.RegisterSource(source.Registration{ Name: "ttnv2", Description: "Migrate from The Things Network Stack V2", - FlagSet: flags, + FlagSet: cfg.Flags(), Create: createNewSource(cfg), }) }