wroofauth/cmd/root.go

129 lines
3.5 KiB
Go

package cmd
import (
"os"
"time"
"git.1in9.net/raider/wroofauth/internal/keystore"
"git.1in9.net/raider/wroofauth/internal/logger"
"github.com/lestrrat-go/jwx/jwk"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"go.uber.org/zap"
)
var cfgFile string
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "wroofauth",
Short: "The auth system that might bite.",
Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
// Uncomment the following line if your bare application
// has an action associated with it:
// Run: func(cmd *cobra.Command, args []string) { },
}
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./config.yaml)")
viper.SetDefault("development", false)
viper.BindEnv("development", "DEV")
logger.StartLogger()
viper.SetDefault("mongo.uri", "mongodb://localhost:27017")
viper.SetDefault("mongo.database", "wroofauth")
viper.SetDefault("mongo.collection.users", "users")
viper.SetDefault("mongo.collection.clients", "clients")
viper.SetDefault("mongo.collection.groups", "groups")
viper.BindEnv("mongo.uri", "MONGO_URI", "MONGODB_URI")
viper.BindEnv("mongo.database", "MONGO_DATABASE", "MONGODB_DATABASE")
viper.SetDefault("redis.addr", "localhost:6379")
viper.SetDefault("redis.username", "")
viper.SetDefault("redis.password", "")
viper.SetDefault("redis.db", 0)
viper.BindEnv("redis.addr", "REDIS_ADDRESS", "REDIS_ADDR")
viper.BindEnv("redis.password", "REDIS_PASSWORD", "REDIS_PASS")
viper.BindEnv("redis.db", "REDIS_DB")
/*viper.SetDefault("http.wyrd_url", "http://localhost:3001")
viper.SetDefault("http.frontend_url", "http://localhost:3000")
viper.BindEnv("http.wyrd_url", "WYRD_URL")
viper.BindEnv("http.frontend_url", "WYRD_FRONTEND_URL")*/
viper.SetDefault("crypto.keys", jwk.NewSet())
viper.SetDefault("crypto.keyfile", nil)
viper.SetDefault("crypto.use_key.frontend", "")
viper.BindEnv("crypto.keyfile", "WROOF_KEYS")
viper.SetDefault("totp.issuer", "WroofAuth") // Used for 2fa issuer value
cobra.OnInitialize(loadConfig)
}
func loadConfig() {
if etcdUrl, found := os.LookupEnv("ETCD_URL"); found {
etcdPath, found := os.LookupEnv("ETCD_WROOF_CONFIG")
if !found {
etcdPath = "/config/wroofauth.json"
}
viper.SetConfigType("json")
viper.AddRemoteProvider("etcd3", etcdUrl, etcdPath)
err := viper.ReadRemoteConfig()
if err != nil {
logger.Sugar.Fatal(err)
}
go func() {
for {
time.Sleep(time.Second * 5)
err := viper.WatchRemoteConfig()
if err != nil {
logger.Sugar.Fatal("unable to read remote config: %v", err)
continue
}
}
}()
}
if cfgFile != "" {
viper.SetConfigFile(cfgFile)
} else {
viper.AddConfigPath(".")
viper.SetConfigName("config")
}
err := viper.ReadInConfig()
if err != nil {
logger.Logger.Fatal("failed to load config", zap.Error(err))
}
logger.StartLogger() // Restart Logger, as we may have changed our loglevel
logger.Sugar.Info("Using config file:", viper.ConfigFileUsed())
keystore.LoadKeystore()
}