* feat: implement stricter lint rules git golanci-lint v2 * fix lint issues * fix lint issues
264 lines
6.8 KiB
Go
264 lines
6.8 KiB
Go
package config
|
|
|
|
import (
|
|
"github.com/bakito/adguardhome-sync/pkg/types"
|
|
)
|
|
|
|
func readFlags(cfg *types.Config, flags Flags) error {
|
|
if flags == nil {
|
|
return nil
|
|
}
|
|
|
|
fr := &flagReader{
|
|
cfg: cfg,
|
|
flags: flags,
|
|
}
|
|
|
|
if err := fr.readRootFlags(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := fr.readAPIFlags(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := fr.readFeatureFlags(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := fr.readOriginFlags(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return fr.readReplicaFlags()
|
|
}
|
|
|
|
type flagReader struct {
|
|
cfg *types.Config
|
|
flags Flags
|
|
}
|
|
|
|
func (fr *flagReader) readReplicaFlags() error {
|
|
if err := fr.setStringFlag(FlagReplicaURL, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.URL = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagReplicaWebURL, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.WebURL = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagReplicaAPIPath, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.APIPath = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagReplicaUsername, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.Username = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagReplicaPassword, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.Password = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagReplicaCookie, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.Cookie = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagReplicaISV, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Replica.InsecureSkipVerify = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagReplicaAutoSetup, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Replica.AutoSetup = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return fr.setStringFlag(FlagReplicaInterfaceName, func(cgf *types.Config, value string) {
|
|
fr.cfg.Replica.InterfaceName = value
|
|
})
|
|
}
|
|
|
|
func (fr *flagReader) readOriginFlags() error {
|
|
if err := fr.setStringFlag(FlagOriginURL, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.URL = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagOriginWebURL, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.WebURL = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagOriginAPIPath, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.APIPath = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagOriginUsername, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.Username = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagOriginPassword, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.Password = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagOriginCookie, func(cgf *types.Config, value string) {
|
|
fr.cfg.Origin.Cookie = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return fr.setBoolFlag(FlagOriginISV, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Origin.InsecureSkipVerify = value
|
|
})
|
|
}
|
|
|
|
func (fr *flagReader) readFeatureFlags() error {
|
|
if err := fr.setBoolFlag(FlagFeatureDhcpServerConfig, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.DHCP.ServerConfig = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureDhcpStaticLeases, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.DHCP.StaticLeases = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := fr.setBoolFlag(FlagFeatureDNSServerConfig, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.DNS.ServerConfig = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureDNSAccessLists, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.DNS.AccessLists = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureDNSRewrites, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.DNS.Rewrites = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := fr.setBoolFlag(FlagFeatureGeneral, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.GeneralSettings = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureQueryLog, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.QueryLogConfig = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureStats, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.StatsConfig = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureClient, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.ClientSettings = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagFeatureServices, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.Services = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return fr.setBoolFlag(FlagFeatureFilters, func(cgf *types.Config, value bool) {
|
|
fr.cfg.Features.Filters = value
|
|
})
|
|
}
|
|
|
|
func (fr *flagReader) readAPIFlags() error {
|
|
if err := fr.setIntFlag(FlagAPIPort, func(cgf *types.Config, value int) {
|
|
fr.cfg.API.Port = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagAPIUsername, func(cgf *types.Config, value string) {
|
|
fr.cfg.API.Username = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setStringFlag(FlagAPIPassword, func(cgf *types.Config, value string) {
|
|
fr.cfg.API.Password = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return fr.setBoolFlag(FlagAPIDarkMode, func(cgf *types.Config, value bool) {
|
|
fr.cfg.API.DarkMode = value
|
|
})
|
|
}
|
|
|
|
func (fr *flagReader) readRootFlags() error {
|
|
if err := fr.setStringFlag(FlagCron, func(cgf *types.Config, value string) {
|
|
fr.cfg.Cron = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagRunOnStart, func(cgf *types.Config, value bool) {
|
|
fr.cfg.RunOnStart = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
if err := fr.setBoolFlag(FlagPrintConfigOnly, func(cgf *types.Config, value bool) {
|
|
fr.cfg.PrintConfigOnly = value
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
return fr.setBoolFlag(FlagContinueOnError, func(cgf *types.Config, value bool) {
|
|
fr.cfg.ContinueOnError = value
|
|
})
|
|
}
|
|
|
|
type Flags interface {
|
|
Changed(name string) bool
|
|
GetString(name string) (string, error)
|
|
GetInt(name string) (int, error)
|
|
GetBool(name string) (bool, error)
|
|
}
|
|
|
|
func (fr *flagReader) setStringFlag(name string, cb callback[string]) (err error) {
|
|
if fr.flags.Changed(name) {
|
|
var value string
|
|
if value, err = fr.flags.GetString(name); err != nil {
|
|
return err
|
|
}
|
|
cb(fr.cfg, value)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (fr *flagReader) setBoolFlag(name string, cb callback[bool]) (err error) {
|
|
if fr.flags.Changed(name) {
|
|
var value bool
|
|
if value, err = fr.flags.GetBool(name); err != nil {
|
|
return err
|
|
}
|
|
cb(fr.cfg, value)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (fr *flagReader) setIntFlag(name string, cb callback[int]) (err error) {
|
|
if fr.flags.Changed(name) {
|
|
var value int
|
|
if value, err = fr.flags.GetInt(name); err != nil {
|
|
return err
|
|
}
|
|
cb(fr.cfg, value)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type callback[T any] func(cgf *types.Config, value T)
|