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 }