From 4be55062fcc59c807b54a7d4ec49d9e84b4054de Mon Sep 17 00:00:00 2001 From: Haris Khan Date: Wed, 30 Oct 2024 09:22:32 -0400 Subject: [PATCH] Moved config funcs to config.go --- lib/config/config.go | 156 ++++++++++++++++++++++++++++++++++++++ main.go | 177 ++++--------------------------------------- 2 files changed, 171 insertions(+), 162 deletions(-) diff --git a/lib/config/config.go b/lib/config/config.go index d912156..81bc5eb 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -1 +1,157 @@ package config + +import ( + "github.com/go-i2p/go-i2p/lib/router" + "github.com/go-i2p/go-i2p/lib/util/logger" + "github.com/go-i2p/go-i2p/lib/util/signals" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" + "os" + "path/filepath" +) + +var ( + CfgFile string + routerInstance *router.Router + log = logger.GetGoI2PLogger() +) + +// RootCmd represents the base command when called without any subcommands +var RootCmd = &cobra.Command{ + Use: "go-i2p", + Short: "I2P Router implementation in Go", + Run: func(cmd *cobra.Command, args []string) { + runRouter() + }, +} + +func InitConfig() { + defaultConfigDir := filepath.Join(os.Getenv("HOME"), ".go-i2p") + defaultConfigFile := filepath.Join(defaultConfigDir, "config.yaml") + + if CfgFile != "" { + // Use config file from the flag + viper.SetConfigFile(CfgFile) + } else { + // Create default config if it doesn't exist + if _, err := os.Stat(defaultConfigFile); os.IsNotExist(err) { + // Ensure directory exists + if err := os.MkdirAll(defaultConfigDir, 0755); err != nil { + log.Fatalf("Could not create config directory: %s", err) + } + + // Create default configuration + defaultConfig := struct { + BaseDir string `yaml:"base_dir"` + WorkingDir string `yaml:"working_dir"` + NetDB NetDbConfig `yaml:"netdb"` + Bootstrap BootstrapConfig `yaml:"bootstrap"` + }{ + BaseDir: DefaultRouterConfig().BaseDir, + WorkingDir: DefaultRouterConfig().WorkingDir, + NetDB: *DefaultRouterConfig().NetDb, + Bootstrap: *DefaultRouterConfig().Bootstrap, + } + + // Marshal config to YAML + yamlData, err := yaml.Marshal(defaultConfig) + if err != nil { + log.Fatalf("Could not marshal default config: %s", err) + } + + // Write default config file + if err := os.WriteFile(defaultConfigFile, yamlData, 0644); err != nil { + log.Fatalf("Could not write default config file: %s", err) + } + + log.Infof("Created default configuration at: %s", defaultConfigFile) + } + + // Set up viper to use the config file + viper.AddConfigPath(defaultConfigDir) + viper.SetConfigName("config") + viper.SetConfigType("yaml") + } + + // Load defaults + setDefaults() + + // Read config file + if err := viper.ReadInConfig(); err != nil { + log.Warnf("Error reading config file: %s", err) + } else { + log.Debugf("Using config file: %s", viper.ConfigFileUsed()) + } + + // Update RouterConfigProperties + updateRouterConfig() +} + +func setDefaults() { + // Router defaults + viper.SetDefault("base_dir", DefaultRouterConfig().BaseDir) + viper.SetDefault("working_dir", DefaultRouterConfig().WorkingDir) + + // NetDb defaults + viper.SetDefault("netdb.path", DefaultNetDbConfig.Path) + + // Bootstrap defaults + viper.SetDefault("bootstrap.low_peer_threshold", DefaultBootstrapConfig.LowPeerThreshold) + viper.SetDefault("bootstrap.reseed_servers", []ReseedConfig{}) +} + +func updateRouterConfig() { + // Update Router configuration + RouterConfigProperties.BaseDir = viper.GetString("base_dir") + RouterConfigProperties.WorkingDir = viper.GetString("working_dir") + + // Update NetDb configuration + RouterConfigProperties.NetDb = &NetDbConfig{ + Path: viper.GetString("netdb.path"), + } + + // Update Bootstrap configuration + var reseedServers []*ReseedConfig + if err := viper.UnmarshalKey("bootstrap.reseed_servers", &reseedServers); err != nil { + log.Warnf("Error parsing reseed servers: %s", err) + reseedServers = []*ReseedConfig{} + } + + RouterConfigProperties.Bootstrap = &BootstrapConfig{ + LowPeerThreshold: viper.GetInt("bootstrap.low_peer_threshold"), + ReseedServers: reseedServers, + } +} + +func runRouter() { + go signals.Handle() + + log.Debug("parsing i2p router configuration") + log.Debug("using netDb in:", RouterConfigProperties.NetDb.Path) + log.Debug("starting up i2p router") + + var err error + routerInstance, err = router.CreateRouter() + if err == nil { + signals.RegisterReloadHandler(func() { + if err := viper.ReadInConfig(); err != nil { + log.Errorf("failed to reload config: %s", err) + return + } + updateRouterConfig() + }) + + signals.RegisterInterruptHandler(func() { + if routerInstance != nil { + routerInstance.Stop() + } + }) + + routerInstance.Start() + routerInstance.Wait() + routerInstance.Close() + } else { + log.Errorf("failed to create i2p router: %s", err) + } +} diff --git a/main.go b/main.go index 6de0034..2fd2206 100644 --- a/main.go +++ b/main.go @@ -2,184 +2,37 @@ package main import ( "fmt" + "github.com/go-i2p/go-i2p/lib/config" + "github.com/go-i2p/go-i2p/lib/util/logger" "github.com/spf13/cobra" "github.com/spf13/viper" - "gopkg.in/yaml.v3" "os" - "path/filepath" - - "github.com/go-i2p/go-i2p/lib/config" - "github.com/go-i2p/go-i2p/lib/router" - "github.com/go-i2p/go-i2p/lib/util/logger" - "github.com/go-i2p/go-i2p/lib/util/signals" ) -var ( - cfgFile string - routerInstance *router.Router - log = logger.GetGoI2PLogger() -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "go-i2p", - Short: "I2P Router implementation in Go", - Run: func(cmd *cobra.Command, args []string) { - runRouter() - }, -} - -func initConfig() { - defaultConfigDir := filepath.Join(os.Getenv("HOME"), ".go-i2p") - defaultConfigFile := filepath.Join(defaultConfigDir, "config.yaml") - - if cfgFile != "" { - // Use config file from the flag - viper.SetConfigFile(cfgFile) - } else { - // Create default config if it doesn't exist - if _, err := os.Stat(defaultConfigFile); os.IsNotExist(err) { - // Ensure directory exists - if err := os.MkdirAll(defaultConfigDir, 0755); err != nil { - log.Fatalf("Could not create config directory: %s", err) - } - - // Create default configuration - defaultConfig := struct { - BaseDir string `yaml:"base_dir"` - WorkingDir string `yaml:"working_dir"` - NetDB config.NetDbConfig `yaml:"netdb"` - Bootstrap config.BootstrapConfig `yaml:"bootstrap"` - }{ - BaseDir: config.DefaultRouterConfig().BaseDir, - WorkingDir: config.DefaultRouterConfig().WorkingDir, - NetDB: *config.DefaultRouterConfig().NetDb, - Bootstrap: *config.DefaultRouterConfig().Bootstrap, - } - - // Marshal config to YAML - yamlData, err := yaml.Marshal(defaultConfig) - if err != nil { - log.Fatalf("Could not marshal default config: %s", err) - } - - // Write default config file - if err := os.WriteFile(defaultConfigFile, yamlData, 0644); err != nil { - log.Fatalf("Could not write default config file: %s", err) - } - - log.Infof("Created default configuration at: %s", defaultConfigFile) - } - - // Set up viper to use the config file - viper.AddConfigPath(defaultConfigDir) - viper.SetConfigName("config") - viper.SetConfigType("yaml") - } - - // Load defaults - setDefaults() - - // Read config file - if err := viper.ReadInConfig(); err != nil { - log.Warnf("Error reading config file: %s", err) - } else { - log.Debugf("Using config file: %s", viper.ConfigFileUsed()) - } - - // Update RouterConfigProperties - updateRouterConfig() -} +var log = logger.GetGoI2PLogger() func init() { - cobra.OnInitialize(initConfig) + cobra.OnInitialize(config.InitConfig) // Global flags - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.go-i2p/config.yaml)") + config.RootCmd.PersistentFlags().StringVar(&config.CfgFile, "config", "", "config file (default is $HOME/.go-i2p/config.yaml)") // Router configuration flags - rootCmd.PersistentFlags().String("base-dir", config.DefaultRouterConfig().BaseDir, "Base directory for I2P router") - rootCmd.PersistentFlags().String("working-dir", config.DefaultRouterConfig().WorkingDir, "Working directory for I2P router") + config.RootCmd.PersistentFlags().String("base-dir", config.DefaultRouterConfig().BaseDir, "Base directory for I2P router") + config.RootCmd.PersistentFlags().String("working-dir", config.DefaultRouterConfig().WorkingDir, "Working directory for I2P router") // NetDb flags - rootCmd.PersistentFlags().String("netdb.path", config.DefaultNetDbConfig.Path, "Path to the netDb") + config.RootCmd.PersistentFlags().String("netdb.path", config.DefaultNetDbConfig.Path, "Path to the netDb") // Bootstrap flags - rootCmd.PersistentFlags().Int("bootstrap.low-peer-threshold", config.DefaultBootstrapConfig.LowPeerThreshold, + config.RootCmd.PersistentFlags().Int("bootstrap.low-peer-threshold", config.DefaultBootstrapConfig.LowPeerThreshold, "Minimum number of peers before reseeding") // Bind flags to viper - viper.BindPFlag("base_dir", rootCmd.PersistentFlags().Lookup("base-dir")) - viper.BindPFlag("working_dir", rootCmd.PersistentFlags().Lookup("working-dir")) - viper.BindPFlag("netdb.path", rootCmd.PersistentFlags().Lookup("netdb.path")) - viper.BindPFlag("bootstrap.low_peer_threshold", rootCmd.PersistentFlags().Lookup("bootstrap.low-peer-threshold")) -} - -func setDefaults() { - // Router defaults - viper.SetDefault("base_dir", config.DefaultRouterConfig().BaseDir) - viper.SetDefault("working_dir", config.DefaultRouterConfig().WorkingDir) - - // NetDb defaults - viper.SetDefault("netdb.path", config.DefaultNetDbConfig.Path) - - // Bootstrap defaults - viper.SetDefault("bootstrap.low_peer_threshold", config.DefaultBootstrapConfig.LowPeerThreshold) - viper.SetDefault("bootstrap.reseed_servers", []config.ReseedConfig{}) -} - -func updateRouterConfig() { - // Update Router configuration - config.RouterConfigProperties.BaseDir = viper.GetString("base_dir") - config.RouterConfigProperties.WorkingDir = viper.GetString("working_dir") - - // Update NetDb configuration - config.RouterConfigProperties.NetDb = &config.NetDbConfig{ - Path: viper.GetString("netdb.path"), - } - - // Update Bootstrap configuration - var reseedServers []*config.ReseedConfig - if err := viper.UnmarshalKey("bootstrap.reseed_servers", &reseedServers); err != nil { - log.Warnf("Error parsing reseed servers: %s", err) - reseedServers = []*config.ReseedConfig{} - } - - config.RouterConfigProperties.Bootstrap = &config.BootstrapConfig{ - LowPeerThreshold: viper.GetInt("bootstrap.low_peer_threshold"), - ReseedServers: reseedServers, - } -} -func runRouter() { - go signals.Handle() - - log.Debug("parsing i2p router configuration") - log.Debug("using netDb in:", config.RouterConfigProperties.NetDb.Path) - log.Debug("starting up i2p router") - - var err error - routerInstance, err = router.CreateRouter() - if err == nil { - signals.RegisterReloadHandler(func() { - if err := viper.ReadInConfig(); err != nil { - log.Errorf("failed to reload config: %s", err) - return - } - updateRouterConfig() - }) - - signals.RegisterInterruptHandler(func() { - if routerInstance != nil { - routerInstance.Stop() - } - }) - - routerInstance.Start() - routerInstance.Wait() - routerInstance.Close() - } else { - log.Errorf("failed to create i2p router: %s", err) - } + viper.BindPFlag("base_dir", config.RootCmd.PersistentFlags().Lookup("base-dir")) + viper.BindPFlag("working_dir", config.RootCmd.PersistentFlags().Lookup("working-dir")) + viper.BindPFlag("netdb.path", config.RootCmd.PersistentFlags().Lookup("netdb.path")) + viper.BindPFlag("bootstrap.low_peer_threshold", config.RootCmd.PersistentFlags().Lookup("bootstrap.low-peer-threshold")) } // configCmd shows current configuration @@ -206,8 +59,8 @@ var configCmd = &cobra.Command{ } func main() { - rootCmd.AddCommand(configCmd) - if err := rootCmd.Execute(); err != nil { + config.RootCmd.AddCommand(configCmd) + if err := config.RootCmd.Execute(); err != nil { log.Error(err) os.Exit(1) }