diff --git a/README.md b/README.md index 92d9d80..77ac122 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,12 @@ you can build from source: 2. Build with `go build -o mautrix-syncproxy`. The resulting executable will be in the current directory named `mautrix-syncproxy`. -Configuring is done via environment variables. +Configuring is done via .yaml configuration file or via environment variables. + +If using a configuration file, see the included example-config.yaml, and pass +`-config CONFIGURATION_FILENAME.yaml` on the command line. + +If using environment variables (convenient for running syncproxy in docker): * `LISTEN_ADDRESS` - The address where to listen. * `HOMESERVER_URL` - The address to Synapse. If using workers, it is sufficient diff --git a/example-config.yaml b/example-config.yaml new file mode 100755 index 0000000..405e55a --- /dev/null +++ b/example-config.yaml @@ -0,0 +1,6 @@ +listen_address: localhost:29332 +database_url: postgres://user:pass@host/mautrixsyncproxy +homeserver_url: http://localhost:8008 +shared_secret: random string here +debug: true + diff --git a/go.mod b/go.mod index eac61d4..0e2e882 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/jackc/pgx/v4 v4.13.0 github.com/mattn/go-sqlite3 v1.14.8 github.com/prometheus/client_golang v1.11.0 + gopkg.in/yaml.v2 v2.4.0 maunium.net/go/maulogger/v2 v2.3.0 maunium.net/go/mautrix v0.9.22 ) diff --git a/go.sum b/go.sum index 050104c..3a0ac2d 100644 --- a/go.sum +++ b/go.sum @@ -328,6 +328,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/main.go b/main.go index 2d00df7..ba132e0 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ package main import ( "context" + "flag" "net/http" "os" "os/signal" @@ -27,6 +28,7 @@ import ( "github.com/gorilla/mux" "github.com/prometheus/client_golang/prometheus/promhttp" + "gopkg.in/yaml.v2" log "maunium.net/go/maulogger/v2" ) @@ -56,26 +58,48 @@ func getIntEnv(key string, defVal int) int { return val } +var configPath = flag.String("config", "config.yaml", "path to config file") + func readConfig() { - cfg.ListenAddress = os.Getenv("LISTEN_ADDRESS") - cfg.DatabaseURL = os.Getenv("DATABASE_URL") - cfg.DatabaseOpts.MaxOpenConns = getIntEnv("DATABASE_MAX_OPEN_CONNS", 4) - cfg.DatabaseOpts.MaxIdleConns = getIntEnv("DATABASE_MAX_IDLE_CONNS", 2) - cfg.HomeserverURL = os.Getenv("HOMESERVER_URL") - cfg.SharedSecret = os.Getenv("SHARED_SECRET") - cfg.ExpectSynchronous = len(os.Getenv("EXPECT_SYNCHRONOUS")) > 0 - cfg.Debug = len(os.Getenv("DEBUG")) > 0 - - if len(cfg.ListenAddress) == 0 { - log.Fatalln("LISTEN_ADDRESS environment variable is not set") - } else if len(cfg.DatabaseURL) == 0 { - log.Fatalln("DATABASE_URL environment variable is not set") - } else if len(cfg.HomeserverURL) == 0 { - log.Fatalln("HOMESERVER_URL environment variable is not set") - } else if len(cfg.SharedSecret) == 0 { - log.Fatalln("SHARED_SECRET environment variable is not set") + flag.Parse() + if *configPath == "env" { + cfg.ListenAddress = os.Getenv("LISTEN_ADDRESS") + cfg.DatabaseURL = os.Getenv("DATABASE_URL") + cfg.DatabaseOpts.MaxOpenConns = getIntEnv("DATABASE_MAX_OPEN_CONNS", 4) + cfg.DatabaseOpts.MaxIdleConns = getIntEnv("DATABASE_MAX_IDLE_CONNS", 2) + cfg.HomeserverURL = os.Getenv("HOMESERVER_URL") + cfg.SharedSecret = os.Getenv("SHARED_SECRET") + cfg.ExpectSynchronous = len(os.Getenv("EXPECT_SYNCHRONOUS")) > 0 + cfg.Debug = len(os.Getenv("DEBUG")) > 0 + + if len(cfg.ListenAddress) == 0 { + log.Fatalln("LISTEN_ADDRESS environment variable is not set") + } else if len(cfg.DatabaseURL) == 0 { + log.Fatalln("DATABASE_URL environment variable is not set") + } else if len(cfg.HomeserverURL) == 0 { + log.Fatalln("HOMESERVER_URL environment variable is not set") + } else if len(cfg.SharedSecret) == 0 { + log.Fatalln("SHARED_SECRET environment variable is not set") + } else { + return + } } else { - return + file, err := os.Open(*configPath) + if err != nil { + log.Fatalln("Failed to open config:", err) + } + err = yaml.NewDecoder(file).Decode(&cfg) + if err != nil { + log.Fatalln("Failed to read config:", err) + } else if len(cfg.DatabaseURL) == 0 { + log.Fatalln("DATABASE_URL environment variable is not set") + } else if len(cfg.HomeserverURL) == 0 { + log.Fatalln("HOMESERVER_URL environment variable is not set") + } else if len(cfg.SharedSecret) == 0 { + log.Fatalln("SHARED_SECRET environment variable is not set") + } else { + return + } } os.Exit(2)