93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
package conf
|
|
|
|
import (
|
|
`encoding/json`
|
|
|
|
"github.com/BurntSushi/toml"
|
|
"github.com/creasty/defaults"
|
|
"github.com/goccy/go-yaml"
|
|
"r00t2.io/sysutils/paths"
|
|
)
|
|
|
|
// NewConfig returns a conf.Config from filepath path.
|
|
func NewConfig(path string) (cfg *Config, err error) {
|
|
|
|
var b []byte
|
|
|
|
if err = paths.RealPath(&path); err != nil {
|
|
return
|
|
}
|
|
|
|
if cfg, err = NewConfigFromBytes(b); err != nil {
|
|
return
|
|
}
|
|
cfg.confPath = new(string)
|
|
*cfg.confPath = path
|
|
|
|
return
|
|
}
|
|
|
|
// NewConfigFromBytes returns a conf.Config from bytes b. b may be a JSON, TOML, XML, or YAML representation.
|
|
func NewConfigFromBytes(b []byte) (cfg *Config, err error) {
|
|
|
|
if err = json.Unmarshal(b, &cfg); err != nil {
|
|
if err = yaml.Unmarshal(b, &cfg); err != nil {
|
|
if err = toml.Unmarshal(b, &cfg); err != nil {
|
|
if err = toml.Unmarshal(b, &cfg); err != nil {
|
|
err = ErrUnkownSyntax
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if err = defaults.Set(cfg); err != nil {
|
|
return
|
|
}
|
|
|
|
if cfg.CacheDB != ":memory:" {
|
|
if err = paths.RealPath(&cfg.CacheDB); err != nil {
|
|
return
|
|
}
|
|
if cfg.CacheDbPerms == nil {
|
|
cfg.CacheDbPerms = new(Perms)
|
|
}
|
|
if err = cfg.CacheDbPerms.SetMissing(); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
if err = validate.Struct(cfg); err != nil {
|
|
return
|
|
}
|
|
|
|
for _, t := range cfg.Tunnels {
|
|
t.cfg = cfg
|
|
if t.Username == nil {
|
|
if cfg.Username == nil {
|
|
err = ErrMissingUser
|
|
return
|
|
} else {
|
|
t.Username = cfg.Username
|
|
}
|
|
}
|
|
if t.TemplateConfigs != nil && len(t.TemplateConfigs) > 0 {
|
|
for _, tpl := range t.TemplateConfigs {
|
|
if err = paths.RealPath(&tpl.Template); err != nil {
|
|
return
|
|
}
|
|
if err = paths.RealPath(&tpl.Dest); err != nil {
|
|
return
|
|
}
|
|
if tpl.Perms != nil {
|
|
if err = tpl.Perms.SetMissing(); err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|