This repository has been archived on 2021-07-08. You can view files and clone it, but cannot push or open issues or pull requests.
opensend/config.go

95 lines
2.5 KiB
Go

package main
import (
"errors"
"github.com/pelletier/go-toml"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"io/ioutil"
"os"
)
// Struct for unmarshaling of opensend TOML configs
type Config struct {
Receiver ReceiverConfig
Sender SenderConfig
Targets map[string]Target
}
// Config section for receiver
type ReceiverConfig struct {
DestDir string `toml:"destinationDirectory"`
SkipZeroconf bool
WorkDir string `toml:"workingDirectory"`
}
// Config section for sender
type SenderConfig struct {
WorkDir string `toml:"workingDirectory"`
}
type Target struct {
IP string
}
// Attempt to find config path
func GetConfigPath() string {
// Use ConsoleWriter logger
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}).Hook(FatalHook{})
// Possible config locations
configLocations := []string{"~/.config/opensend.toml", "/etc/opensend.toml"}
// For every possible location
for _, configLocation := range configLocations {
// Expand path (~ -> home dir and os.ExpandEnv())
expandedPath := ExpandPath(configLocation)
// If file does not exist
if _, err := os.Stat(expandedPath); errors.Is(err, os.ErrNotExist) {
// Skip
continue
}
// Return path with existing file
return expandedPath
}
// If all else fails, return empty screen
return ""
}
// Create new config object using values from given path
func NewConfig(path string) *Config {
// Use ConsoleWriter logger
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}).Hook(FatalHook{})
// Create new empty config struct
newConfig := &Config{}
// Set config defaults
newConfig.SetDefaults()
// If path is provided
if path != "" {
// Read file at path
confData, err := ioutil.ReadFile(path)
if err != nil {
log.Fatal().Err(err).Msg("Error reading config")
}
// Unmarshal config data
err = toml.Unmarshal(confData, newConfig)
if err != nil {
log.Fatal().Err(err).Msg("Error unmarshalling toml")
}
}
// Return new config struct
return newConfig
}
// Set config defaults
func (config *Config) SetDefaults() {
// Set destination directory to $HOME/Downloads
config.Receiver.DestDir = ExpandPath("~/Downloads")
// Set receiver working directory to $HOME/.opensend
config.Receiver.WorkDir = ExpandPath("~/.opensend")
// Set do not skip zeroconf
config.Receiver.SkipZeroconf = false
// Set sender working directory to $HOME/.opensend
config.Sender.WorkDir = ExpandPath("~/.opensend")
// Set targets to an empty map[string]map[string]string
config.Targets = map[string]Target{}
}