95 lines
2.5 KiB
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{}
|
|
}
|