diff --git a/go.mod b/go.mod index b937ea7..bcdfbbd 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/uuid v1.4.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pion/datachannel v1.5.5 // indirect github.com/pion/dtls/v2 v2.2.8 // indirect github.com/pion/ice/v3 v3.0.2 // indirect diff --git a/go.sum b/go.sum index a6b1dff..68c8fd7 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= diff --git a/ministream.toml b/ministream.toml new file mode 100644 index 0000000..57d11b6 --- /dev/null +++ b/ministream.toml @@ -0,0 +1,9 @@ +# SiteName is used for displaying title of site on frontend. +# Default: "ministream" +# Env: MINISTREAM_SITENAME +SiteName = "stream.example.org" + +# HTTPListenAddr is which port the HTTP server will listen on. +# Default: ":8080" +# Env: MINISTREAM_HTTPLISTENADDR +HTTPListenAddr = ":8080" diff --git a/server/config.go b/server/config.go new file mode 100644 index 0000000..a52c6bc --- /dev/null +++ b/server/config.go @@ -0,0 +1,73 @@ +package server + +import ( + "io" + "os" + + "github.com/pelletier/go-toml/v2" +) + +type Config struct { + SiteName string `json:"siteName" toml:"siteName"` + HTTPListenAddr string `json:"httpListenAddr" toml:"HTTPListenAddr"` +} + +func DefaultConfig() *Config { + return &Config{ + SiteName: "ministream", + HTTPListenAddr: ":8080", + } +} + +func (c *Config) OverrideFromEnv() { + if siteName, ok := os.LookupEnv("MINISTREAM_SITENAME"); ok { + c.SiteName = siteName + } + + if httpAddr, ok := os.LookupEnv("MINISTREAM_HTTPLISTENADDR"); ok { + c.HTTPListenAddr = httpAddr + } +} + +func ConfigFromReader(r io.Reader) (*Config, error) { + var c Config + + err := toml.NewDecoder(r).Decode(&c) + if err != nil { + return nil, err + } + + return &c, nil +} + +func ConfigFromFile(path string) (*Config, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + return ConfigFromReader(f) +} + +func ConfigFromDefault() (*Config, error) { + var config *Config + defaultPaths := []string{ + "ministream.toml", + } + + for _, p := range defaultPaths { + c, err := ConfigFromFile(p) + if err != nil { + continue + } + config = c + break + } + + if config == nil { + config = DefaultConfig() + } + + return config, nil +} diff --git a/server/config_test.go b/server/config_test.go new file mode 100644 index 0000000..5e839ce --- /dev/null +++ b/server/config_test.go @@ -0,0 +1,37 @@ +package server_test + +import ( + "strings" + "testing" + + "git.t-juice.club/torjus/ministream/server" +) + +func TestConfig(t *testing.T) { + t.Run("FromReader", func(t *testing.T) { + configString := `SiteName = "ministream.example.org"` + expectedSiteName := "ministream.example.org" + r := strings.NewReader(configString) + + c, err := server.ConfigFromReader(r) + if err != nil { + t.Fatalf("Error reading config: %s", err) + } + + if c.SiteName != expectedSiteName { + t.Errorf("SiteName incorrect. Got %s want %s", c.SiteName, expectedSiteName) + } + }) + t.Run("OverrideFromEnv", func(t *testing.T) { + c := server.DefaultConfig() + expectedSiteName := "ms.example.org" + + t.Setenv("MINISTREAM_SITENAME", expectedSiteName) + + c.OverrideFromEnv() + + if c.SiteName != expectedSiteName { + t.Errorf("SiteName incorrect. Got %s want %s", c.SiteName, expectedSiteName) + } + }) +}