package config import ( "context" "flag" "log" "os" "strconv" "github.com/joho/godotenv" ) const LOCAL_ENV = ".env.local" type Nats struct { Url string Name string VerifyCertificates bool Ctx context.Context } type Ws struct { AuthEnable bool Addr string Port string Route string TlsEnable bool TlsPort string SkipTlsVerify bool NoTls bool Ctx context.Context } type Config struct { Nats Nats Ws Ws } func NewConfig() *Config { loadEnvVariables() log.SetFlags(log.LstdFlags | log.Lshortfile) natsUrl := flag.String("nats_url", lookupEnvOrString("NATS_URL", "nats://localhost:4222"), "url for nats server") natsName := flag.String("nats_name", lookupEnvOrString("NATS_NAME", "ws-adapter"), "name for nats client") natsVerifyCertificates := flag.Bool("nats_verify_certificates", lookupEnvOrBool("NATS_VERIFY_CERTIFICATES", false), "verify validity of certificates from nats server") wsAuthEnable := flag.Bool("ws_auth_enable", lookupEnvOrBool("WS_AUTH_ENABLE", false), "enable authentication for websocket server") wsAddr := flag.String("ws_addr", lookupEnvOrString("WS_ADDR", "localhost"), "websocket server address (domain or ip)") wsPort := flag.String("ws_port", lookupEnvOrString("WS_PORT", ":8080"), "websocket server port") wsTlsPort := flag.String("ws_tls_port", lookupEnvOrString("WS_TLS_PORT", ":8081"), "websocket tls server port") wsNoTls := flag.Bool("ws_no_tls", lookupEnvOrBool("WS_NO_TLS", false), "connects to websocket server without tls") wsRoute := flag.String("ws_route", lookupEnvOrString("WS_ROUTE", "/ws/controller"), "websocket server route") wsTlsEnable := flag.Bool("ws_tls_enable", lookupEnvOrBool("WS_TLS_ENABLE", false), "access websocket via tls protocol (wss)") wsSkipTlsVerify := flag.Bool("ws_skip_tls_verify", lookupEnvOrBool("WS_SKIP_TLS_VERIFY", false), "skip tls verification for websocket server") flHelp := flag.Bool("help", false, "Help") flag.Parse() if *flHelp { flag.Usage() os.Exit(0) } if *wsNoTls && !*wsTlsEnable { log.Fatalf("You must configure at least one connection to the websocket server") } ctx := context.TODO() return &Config{ Nats: Nats{ Url: *natsUrl, Name: *natsName, VerifyCertificates: *natsVerifyCertificates, Ctx: ctx, }, Ws: Ws{ AuthEnable: *wsAuthEnable, Addr: *wsAddr, Port: *wsPort, Route: *wsRoute, TlsEnable: *wsTlsEnable, SkipTlsVerify: *wsSkipTlsVerify, Ctx: ctx, TlsPort: *wsTlsPort, NoTls: *wsNoTls, }, } } func loadEnvVariables() { err := godotenv.Load() if _, err := os.Stat(LOCAL_ENV); err == nil { _ = godotenv.Overload(LOCAL_ENV) log.Printf("Loaded variables from '%s'", LOCAL_ENV) } if err != nil { log.Println("Error to load environment variables:", err) } else { log.Println("Loaded variables from '.env'") } } func lookupEnvOrString(key string, defaultVal string) string { if val, _ := os.LookupEnv(key); val != "" { return val } return defaultVal } func lookupEnvOrBool(key string, defaultVal bool) bool { if val, _ := os.LookupEnv(key); val != "" { v, err := strconv.ParseBool(val) if err != nil { log.Fatalf("LookupEnvOrBool[%s]: %v", key, err) } return v } return defaultVal }