kpsync/app/config.go

113 lines
2.6 KiB
Go

package app
import (
"encoding/json"
"flag"
"fmt"
"os"
"os/user"
"strings"
"git.blackforestbytes.com/BlackForestBytes/goext/langext"
)
type Config struct {
WebDAVURL string `json:"webdav_url"`
WebDAVUser string `json:"webdav_user"`
WebDAVPass string `json:"webdav_pass"`
LocalFallback string `json:"local_fallback"`
WorkDir string `json:"work_dir"`
ForceColors bool `json:"force_colors"`
Debounce int `json:"debounce"`
}
func (app *Application) loadConfig() (Config, string) {
var configPath string
flag.StringVar(&configPath, "config", "~/.config/kpsync.json", "Path to the configuration file")
var webdavURL string
flag.StringVar(&webdavURL, "webdav_url", "", "WebDAV URL")
var webdavUser string
flag.StringVar(&webdavUser, "webdav_user", "", "WebDAV User")
var webdavPass string
flag.StringVar(&webdavPass, "webdav_pass", "", "WebDAV Password")
var localFallback string
flag.StringVar(&localFallback, "local_fallback", "", "Local fallback database")
var workDir string
flag.StringVar(&workDir, "work_dir", "", "Temporary working directory")
var debounce int
flag.IntVar(&debounce, "debounce", 0, "Debounce before sync (in seconds)")
var forceColors bool
flag.BoolVar(&forceColors, "color", false, "Force color-output (default: auto-detect)")
flag.Parse()
if strings.HasPrefix(configPath, "~") {
usr, err := user.Current()
if err != nil {
app.LogFatalErr("Failed to query users home directory", err)
}
fmt.Println(usr.HomeDir)
configPath = strings.TrimPrefix(configPath, "~")
configPath = fmt.Sprintf("%s/%s", usr.HomeDir, configPath)
}
if _, err := os.Stat(configPath); os.IsNotExist(err) && configPath != "" {
_ = os.WriteFile(configPath, langext.Must(json.MarshalIndent(Config{
WebDAVURL: "https://your-nextcloud-domain.example/remote.php/dav/files/keepass.kdbx",
WebDAVUser: "",
WebDAVPass: "",
LocalFallback: "",
WorkDir: "/tmp/kpsync",
Debounce: 3500,
ForceColors: false,
}, "", " ")), 0644)
}
cfgBin, err := os.ReadFile(configPath)
if err != nil {
app.LogFatalErr("Failed to read config file from "+configPath, err)
}
var cfg Config
err = json.Unmarshal(cfgBin, &cfg)
if err != nil {
app.LogFatalErr("Failed to parse config file from "+configPath, err)
}
if webdavURL != "" {
cfg.WebDAVURL = webdavURL
}
if webdavUser != "" {
cfg.WebDAVUser = webdavUser
}
if webdavPass != "" {
cfg.WebDAVPass = webdavPass
}
if localFallback != "" {
cfg.LocalFallback = localFallback
}
if workDir != "" {
cfg.WorkDir = workDir
}
if debounce > 0 {
cfg.Debounce = debounce
}
if forceColors {
cfg.ForceColors = forceColors
}
return cfg, configPath
}