2022-08-10 05:10:47 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
|
2022-08-26 04:21:46 +00:00
|
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
2022-10-21 04:02:30 +00:00
|
|
|
"github.com/google/uuid"
|
2022-08-10 05:10:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Current loaded settings.json
|
|
|
|
var Current = DefaultVariable()
|
|
|
|
|
|
|
|
// Variable configuration attributes (loaded from settings.json).
|
|
|
|
type Variable struct {
|
2022-09-27 02:12:24 +00:00
|
|
|
BaseURL string
|
|
|
|
AdminEmail string
|
2022-10-21 04:02:30 +00:00
|
|
|
CronAPIKey string
|
2022-09-27 02:12:24 +00:00
|
|
|
Mail Mail
|
|
|
|
Redis Redis
|
|
|
|
Database Database
|
|
|
|
UseXForwardedFor bool
|
2022-08-10 05:10:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// DefaultVariable returns the default settings.json data.
|
|
|
|
func DefaultVariable() Variable {
|
|
|
|
return Variable{
|
|
|
|
BaseURL: "http://localhost:8080",
|
|
|
|
Mail: Mail{
|
|
|
|
Enabled: false,
|
|
|
|
Host: "localhost",
|
|
|
|
Port: 25,
|
|
|
|
From: "no-reply@localhost",
|
|
|
|
},
|
|
|
|
Redis: Redis{
|
|
|
|
Host: "localhost",
|
|
|
|
Port: 6379,
|
|
|
|
},
|
|
|
|
Database: Database{
|
|
|
|
SQLite: "database.sqlite",
|
2022-08-26 04:21:46 +00:00
|
|
|
Postgres: "host=localhost user=nonshy password=nonshy dbname=nonshy port=5679 sslmode=disable TimeZone=America/Los_Angeles",
|
2022-08-10 05:10:47 +00:00
|
|
|
},
|
2022-10-21 04:02:30 +00:00
|
|
|
CronAPIKey: uuid.New().String(),
|
2022-08-10 05:10:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LoadSettings loads the settings.json file or, if not existing, creates it with the default settings.
|
|
|
|
func LoadSettings() {
|
|
|
|
if _, err := os.Stat(SettingsPath); !os.IsNotExist(err) {
|
|
|
|
log.Info("Loading settings from %s", SettingsPath)
|
|
|
|
content, err := ioutil.ReadFile(SettingsPath)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("LoadSettings: couldn't read settings.json: %s", err))
|
|
|
|
}
|
|
|
|
|
|
|
|
var v Variable
|
|
|
|
err = json.Unmarshal(content, &v)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("LoadSettings: couldn't parse settings.json: %s", err))
|
|
|
|
}
|
|
|
|
|
|
|
|
Current = v
|
|
|
|
} else {
|
|
|
|
var buf bytes.Buffer
|
|
|
|
enc := json.NewEncoder(&buf)
|
|
|
|
enc.SetIndent("", " ")
|
|
|
|
err := enc.Encode(DefaultVariable())
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("LoadSettings: couldn't marshal default settings: %s", err))
|
|
|
|
}
|
|
|
|
|
|
|
|
ioutil.WriteFile(SettingsPath, buf.Bytes(), 0600)
|
|
|
|
log.Warn("NOTICE: Created default settings.json file - review it and configure mail servers and database!")
|
|
|
|
}
|
|
|
|
|
|
|
|
// If there is no DB configured, exit now.
|
|
|
|
if !Current.Database.IsSQLite && !Current.Database.IsPostgres {
|
|
|
|
log.Error("No database configured in settings.json. Choose SQLite or Postgres and update the DB connector string!")
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Mail settings.
|
|
|
|
type Mail struct {
|
|
|
|
Enabled bool
|
|
|
|
Host string // localhost
|
|
|
|
Port int // 25
|
|
|
|
From string // noreply@localhost
|
|
|
|
Username string // SMTP credentials
|
|
|
|
Password string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Redis settings.
|
|
|
|
type Redis struct {
|
|
|
|
Host string
|
|
|
|
Port int
|
|
|
|
DB int
|
|
|
|
}
|
|
|
|
|
|
|
|
// Database settings.
|
|
|
|
type Database struct {
|
|
|
|
IsSQLite bool
|
|
|
|
IsPostgres bool
|
|
|
|
SQLite string
|
|
|
|
Postgres string
|
|
|
|
}
|