mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-08-23 01:27:13 +02:00
feat: enhance configuration and network management logging
Add comprehensive logging to configuration management and network operations across all supported platforms to improve visibility into system setup and network configuration processes. Key improvements: - Configuration initialization and validation logging - CLI flag processing visibility (listen, log, cache flags) - IP allocation/deallocation tracking across platforms - DNS configuration operations logging (Linux, macOS, FreeBSD) - Upstream bootstrap and fallback operation tracking - Listener configuration initialization logging This provides complete visibility into configuration management and network setup operations, helping identify configuration issues and network setup problems across different platforms.
This commit is contained in:
@@ -761,6 +761,8 @@ func processListenFlag() {
|
|||||||
if listenAddress == "" {
|
if listenAddress == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("listen_address", listenAddress).Msg("Processing listen flag")
|
||||||
|
|
||||||
host, portStr, err := net.SplitHostPort(listenAddress)
|
host, portStr, err := net.SplitHostPort(listenAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mainLog.Load().Fatal().Msgf("invalid listener address: %v", err)
|
mainLog.Load().Fatal().Msgf("invalid listener address: %v", err)
|
||||||
@@ -776,22 +778,31 @@ func processListenFlag() {
|
|||||||
v.Set("listener", map[string]*ctrld.ListenerConfig{
|
v.Set("listener", map[string]*ctrld.ListenerConfig{
|
||||||
"0": lc,
|
"0": lc,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("host", host).Int("port", port).Msg("Listen flag processed successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
// processLogAndCacheFlags processes log and cache related flags
|
// processLogAndCacheFlags processes log and cache related flags
|
||||||
func processLogAndCacheFlags() {
|
func processLogAndCacheFlags() {
|
||||||
|
mainLog.Load().Debug().Msg("Processing log and cache flags")
|
||||||
|
|
||||||
if logPath != "" {
|
if logPath != "" {
|
||||||
cfg.Service.LogPath = logPath
|
cfg.Service.LogPath = logPath
|
||||||
|
mainLog.Load().Debug().Str("log_path", logPath).Msg("Log path flag processed")
|
||||||
}
|
}
|
||||||
if logPath != "" && cfg.Service.LogLevel == "" {
|
if logPath != "" && cfg.Service.LogLevel == "" {
|
||||||
cfg.Service.LogLevel = "debug"
|
cfg.Service.LogLevel = "debug"
|
||||||
|
mainLog.Load().Debug().Msg("Log level set to debug")
|
||||||
}
|
}
|
||||||
|
|
||||||
if cacheSize != 0 {
|
if cacheSize != 0 {
|
||||||
cfg.Service.CacheEnable = true
|
cfg.Service.CacheEnable = true
|
||||||
cfg.Service.CacheSize = cacheSize
|
cfg.Service.CacheSize = cacheSize
|
||||||
|
mainLog.Load().Debug().Int("cache_size", cacheSize).Msg("Cache flag processed")
|
||||||
}
|
}
|
||||||
v.Set("service", cfg.Service)
|
v.Set("service", cfg.Service)
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Msg("Log and cache flags processed successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
// netInterface returns the network interface by name
|
// netInterface returns the network interface by name
|
||||||
@@ -1075,6 +1086,8 @@ func uninstall(p *prog, s service.Service) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func validateConfig(cfg *ctrld.Config) error {
|
func validateConfig(cfg *ctrld.Config) error {
|
||||||
|
mainLog.Load().Debug().Msg("Validating configuration")
|
||||||
|
|
||||||
if err := ctrld.ValidateConfig(validator.New(), cfg); err != nil {
|
if err := ctrld.ValidateConfig(validator.New(), cfg); err != nil {
|
||||||
var ve validator.ValidationErrors
|
var ve validator.ValidationErrors
|
||||||
if errors.As(err, &ve) {
|
if errors.As(err, &ve) {
|
||||||
@@ -1082,8 +1095,11 @@ func validateConfig(cfg *ctrld.Config) error {
|
|||||||
mainLog.Load().Error().Msgf("invalid config: %s: %s", fe.Namespace(), fieldErrorMsg(fe))
|
mainLog.Load().Error().Msgf("invalid config: %s: %s", fe.Namespace(), fieldErrorMsg(fe))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Error().Err(err).Msg("Configuration validation failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Msg("Configuration validation completed successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,21 +14,25 @@ import (
|
|||||||
// allocateIP allocates an IP address on the specified interface
|
// allocateIP allocates an IP address on the specified interface
|
||||||
// sudo ifconfig lo0 alias 127.0.0.2 up
|
// sudo ifconfig lo0 alias 127.0.0.2 up
|
||||||
func allocateIP(ip string) error {
|
func allocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Allocating IP address")
|
||||||
cmd := exec.Command("ifconfig", "lo0", "alias", ip, "up")
|
cmd := exec.Command("ifconfig", "lo0", "alias", ip, "up")
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("allocateIP failed")
|
mainLog.Load().Error().Err(err).Msg("allocateIP failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address allocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deAllocateIP deallocates an IP address from the specified interface
|
// deAllocateIP deallocates an IP address from the specified interface
|
||||||
func deAllocateIP(ip string) error {
|
func deAllocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Deallocating IP address")
|
||||||
cmd := exec.Command("ifconfig", "lo0", "-alias", ip)
|
cmd := exec.Command("ifconfig", "lo0", "-alias", ip)
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address deallocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +52,8 @@ func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) e
|
|||||||
// networksetup -setdnsservers Wi-Fi 8.8.8.8 1.1.1.1
|
// networksetup -setdnsservers Wi-Fi 8.8.8.8 1.1.1.1
|
||||||
// TODO(cuonglm): use system API
|
// TODO(cuonglm): use system API
|
||||||
func setDNS(iface *net.Interface, nameservers []string) error {
|
func setDNS(iface *net.Interface, nameservers []string) error {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Strs("nameservers", nameservers).Msg("Setting DNS configuration")
|
||||||
|
|
||||||
// Note that networksetup won't modify search domains settings,
|
// Note that networksetup won't modify search domains settings,
|
||||||
// This assignment is just a placeholder to silent linter.
|
// This assignment is just a placeholder to silent linter.
|
||||||
_ = searchDomains
|
_ = searchDomains
|
||||||
@@ -57,6 +63,8 @@ func setDNS(iface *net.Interface, nameservers []string) error {
|
|||||||
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
||||||
return fmt.Errorf("%v: %w", string(out), err)
|
return fmt.Errorf("%v: %w", string(out), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("DNS configuration set successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,11 +82,15 @@ func resetDnsIgnoreUnusableInterface(iface *net.Interface) error {
|
|||||||
|
|
||||||
// TODO(cuonglm): use system API
|
// TODO(cuonglm): use system API
|
||||||
func resetDNS(iface *net.Interface) error {
|
func resetDNS(iface *net.Interface) error {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("Resetting DNS configuration")
|
||||||
|
|
||||||
cmd := "networksetup"
|
cmd := "networksetup"
|
||||||
args := []string{"-setdnsservers", iface.Name, "empty"}
|
args := []string{"-setdnsservers", iface.Name, "empty"}
|
||||||
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
if out, err := exec.Command(cmd, args...).CombinedOutput(); err != nil {
|
||||||
return fmt.Errorf("%v: %w", string(out), err)
|
return fmt.Errorf("%v: %w", string(out), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("DNS configuration reset successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,21 +16,25 @@ import (
|
|||||||
// allocateIP allocates an IP address on the specified interface
|
// allocateIP allocates an IP address on the specified interface
|
||||||
// sudo ifconfig lo0 127.0.0.53 alias
|
// sudo ifconfig lo0 127.0.0.53 alias
|
||||||
func allocateIP(ip string) error {
|
func allocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Allocating IP address")
|
||||||
cmd := exec.Command("ifconfig", "lo0", ip, "alias")
|
cmd := exec.Command("ifconfig", "lo0", ip, "alias")
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("allocateIP failed")
|
mainLog.Load().Error().Err(err).Msg("allocateIP failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address allocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deAllocateIP deallocates an IP address from the specified interface
|
// deAllocateIP deallocates an IP address from the specified interface
|
||||||
func deAllocateIP(ip string) error {
|
func deAllocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Deallocating IP address")
|
||||||
cmd := exec.Command("ifconfig", "lo0", ip, "-alias")
|
cmd := exec.Command("ifconfig", "lo0", ip, "-alias")
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address deallocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +45,8 @@ func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) e
|
|||||||
|
|
||||||
// set the dns server for the provided network interface
|
// set the dns server for the provided network interface
|
||||||
func setDNS(iface *net.Interface, nameservers []string) error {
|
func setDNS(iface *net.Interface, nameservers []string) error {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Strs("nameservers", nameservers).Msg("Setting DNS configuration")
|
||||||
|
|
||||||
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
||||||
@@ -66,6 +72,8 @@ func setDNS(iface *net.Interface, nameservers []string) error {
|
|||||||
mainLog.Load().Error().Err(err).Msg("failed to set DNS")
|
mainLog.Load().Error().Err(err).Msg("failed to set DNS")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("DNS configuration set successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,6 +84,8 @@ func resetDnsIgnoreUnusableInterface(iface *net.Interface) error {
|
|||||||
|
|
||||||
// resetDNS resets DNS servers for the specified interface
|
// resetDNS resets DNS servers for the specified interface
|
||||||
func resetDNS(iface *net.Interface) error {
|
func resetDNS(iface *net.Interface) error {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("Resetting DNS configuration")
|
||||||
|
|
||||||
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
||||||
@@ -86,6 +96,8 @@ func resetDNS(iface *net.Interface) error {
|
|||||||
mainLog.Load().Error().Err(err).Msg("failed to rollback DNS setting")
|
mainLog.Load().Error().Err(err).Msg("failed to rollback DNS setting")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("DNS configuration reset successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,20 +33,24 @@ type getDNS func(iface string) []string
|
|||||||
// allocate loopback ip
|
// allocate loopback ip
|
||||||
// sudo ip a add 127.0.0.2/24 dev lo
|
// sudo ip a add 127.0.0.2/24 dev lo
|
||||||
func allocateIP(ip string) error {
|
func allocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Allocating IP address")
|
||||||
cmd := exec.Command("ip", "a", "add", ip+"/24", "dev", "lo")
|
cmd := exec.Command("ip", "a", "add", ip+"/24", "dev", "lo")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msgf("allocateIP failed: %s", string(out))
|
mainLog.Load().Error().Err(err).Msgf("allocateIP failed: %s", string(out))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address allocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func deAllocateIP(ip string) error {
|
func deAllocateIP(ip string) error {
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("Deallocating IP address")
|
||||||
cmd := exec.Command("ip", "a", "del", ip+"/24", "dev", "lo")
|
cmd := exec.Command("ip", "a", "del", ip+"/24", "dev", "lo")
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
mainLog.Load().Error().Err(err).Msg("deAllocateIP failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
mainLog.Load().Debug().Str("ip", ip).Msg("IP address deallocated successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,6 +62,8 @@ func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) e
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setDNS(iface *net.Interface, nameservers []string) error {
|
func setDNS(iface *net.Interface, nameservers []string) error {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Strs("nameservers", nameservers).Msg("Setting DNS configuration")
|
||||||
|
|
||||||
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
r, err := dns.NewOSConfigurator(logf, &health.Tracker{}, &controlknobs.Knobs{}, iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
mainLog.Load().Error().Err(err).Msg("failed to create DNS OS configurator")
|
||||||
@@ -119,6 +125,8 @@ systemdResolve:
|
|||||||
}
|
}
|
||||||
mainLog.Load().Debug().Msg("DNS was not set for some reason")
|
mainLog.Load().Debug().Msg("DNS was not set for some reason")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("DNS configuration set successfully")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,6 +136,8 @@ func resetDnsIgnoreUnusableInterface(iface *net.Interface) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func resetDNS(iface *net.Interface) (err error) {
|
func resetDNS(iface *net.Interface) (err error) {
|
||||||
|
mainLog.Load().Debug().Str("interface", iface.Name).Msg("Resetting DNS configuration")
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -114,6 +114,9 @@ func SetConfigNameWithPath(v *viper.Viper, name, configPath string) {
|
|||||||
|
|
||||||
// InitConfig initializes default config values for given *viper.Viper instance.
|
// InitConfig initializes default config values for given *viper.Viper instance.
|
||||||
func InitConfig(v *viper.Viper, name string) {
|
func InitConfig(v *viper.Viper, name string) {
|
||||||
|
logger := LoggerFromCtx(context.Background())
|
||||||
|
Log(context.Background(), logger.Debug(), "Config initialization started")
|
||||||
|
|
||||||
v.SetDefault("listener", map[string]*ListenerConfig{
|
v.SetDefault("listener", map[string]*ListenerConfig{
|
||||||
"0": {
|
"0": {
|
||||||
IP: "",
|
IP: "",
|
||||||
@@ -152,6 +155,8 @@ func InitConfig(v *viper.Viper, name string) {
|
|||||||
Timeout: 3000,
|
Timeout: 3000,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Log(context.Background(), logger.Debug(), "Config initialization completed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config represents ctrld supported configuration.
|
// Config represents ctrld supported configuration.
|
||||||
@@ -499,7 +504,7 @@ func (uc *UpstreamConfig) ReBootstrap(ctx context.Context) {
|
|||||||
_, _, _ = uc.g.Do("ReBootstrap", func() (any, error) {
|
_, _, _ = uc.g.Do("ReBootstrap", func() (any, error) {
|
||||||
if uc.rebootstrap.CompareAndSwap(false, true) {
|
if uc.rebootstrap.CompareAndSwap(false, true) {
|
||||||
logger := LoggerFromCtx(ctx)
|
logger := LoggerFromCtx(ctx)
|
||||||
logger.Debug().Msgf("re-bootstrapping upstream ip for %v", uc)
|
Log(ctx, logger.Debug(), "Re-bootstrapping upstream: %s", uc.Name)
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
@@ -823,7 +828,7 @@ func (uc *UpstreamConfig) FallbackToDirectIP(ctx context.Context) bool {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
logger := LoggerFromCtx(ctx)
|
logger := LoggerFromCtx(ctx)
|
||||||
logger.Warn().Msgf("using direct IP for %q: %s", uc.Endpoint, ip)
|
Log(ctx, logger.Warn(), "Using direct IP for %q: %s", uc.Endpoint, ip)
|
||||||
uc.u.Host = ip
|
uc.u.Host = ip
|
||||||
done = true
|
done = true
|
||||||
})
|
})
|
||||||
@@ -832,12 +837,18 @@ func (uc *UpstreamConfig) FallbackToDirectIP(ctx context.Context) bool {
|
|||||||
|
|
||||||
// Init initialized necessary values for an ListenerConfig.
|
// Init initialized necessary values for an ListenerConfig.
|
||||||
func (lc *ListenerConfig) Init() {
|
func (lc *ListenerConfig) Init() {
|
||||||
|
logger := LoggerFromCtx(context.Background())
|
||||||
|
Log(context.Background(), logger.Debug(), "Initializing listener config")
|
||||||
|
|
||||||
if lc.Policy != nil {
|
if lc.Policy != nil {
|
||||||
lc.Policy.FailoverRcodeNumbers = make([]int, len(lc.Policy.FailoverRcodes))
|
lc.Policy.FailoverRcodeNumbers = make([]int, len(lc.Policy.FailoverRcodes))
|
||||||
for i, rcode := range lc.Policy.FailoverRcodes {
|
for i, rcode := range lc.Policy.FailoverRcodes {
|
||||||
lc.Policy.FailoverRcodeNumbers[i] = dnsrcode.FromString(rcode)
|
lc.Policy.FailoverRcodeNumbers[i] = dnsrcode.FromString(rcode)
|
||||||
}
|
}
|
||||||
|
Log(context.Background(), logger.Debug(), "Listener policy initialized with %d failover rcodes", len(lc.Policy.FailoverRcodes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log(context.Background(), logger.Debug(), "Listener config initialization completed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateConfig validates the given config.
|
// ValidateConfig validates the given config.
|
||||||
|
|||||||
Reference in New Issue
Block a user