diff --git a/core/api.go b/core/api.go index 9994e4a4..11c15486 100644 --- a/core/api.go +++ b/core/api.go @@ -7,6 +7,7 @@ import ( "github.com/safing/portbase/log" "github.com/safing/portbase/modules" "github.com/safing/portbase/utils/debug" + "github.com/safing/portmaster/resolver" "github.com/safing/portmaster/status" "github.com/safing/portmaster/updates" ) @@ -84,6 +85,7 @@ func debugInfo(ar *api.Request) (data []byte, err error) { di.AddVersionInfo() di.AddPlatformInfo(ar.Context()) status.AddToDebugInfo(di) + resolver.AddToDebugInfo(di) di.AddLastReportedModuleError() di.AddLastUnexpectedLogs() di.AddGoroutineStack() diff --git a/network/api.go b/network/api.go index 3f52bc8a..f73698d9 100644 --- a/network/api.go +++ b/network/api.go @@ -13,6 +13,7 @@ import ( "github.com/safing/portbase/utils/debug" "github.com/safing/portmaster/network/state" "github.com/safing/portmaster/process" + "github.com/safing/portmaster/resolver" "github.com/safing/portmaster/status" ) @@ -74,6 +75,7 @@ func debugInfo(ar *api.Request) (data []byte, err error) { di.AddVersionInfo() di.AddPlatformInfo(ar.Context()) status.AddToDebugInfo(di) + resolver.AddToDebugInfo(di) AddNetworkDebugData( di, ar.Request.URL.Query().Get("profile"), diff --git a/resolver/main.go b/resolver/main.go index 09c134a2..fa4d93be 100644 --- a/resolver/main.go +++ b/resolver/main.go @@ -2,6 +2,7 @@ package resolver import ( "context" + "fmt" "net" "strings" "sync" @@ -10,6 +11,7 @@ import ( "github.com/safing/portbase/log" "github.com/safing/portbase/modules" "github.com/safing/portbase/notifications" + "github.com/safing/portbase/utils/debug" "github.com/safing/portmaster/intel" "github.com/tevino/abool" @@ -155,3 +157,40 @@ func resetFailingResolversNotification() { failingResolverNotification = nil } } + +// AddToDebugInfo adds the system status to the given debug.Info. +func AddToDebugInfo(di *debug.Info) { + resolversLock.Lock() + defer resolversLock.Unlock() + + content := make([]string, 0, (len(globalResolvers)*4)-1) + var working, total int + for i, resolver := range globalResolvers { + // Count for summary. + total++ + failing := resolver.Conn.IsFailing() + if !failing { + working++ + } + + // Add section. + if resolver.Info.Name != "" { + content = append(content, resolver.Info.Name) + } else { + content = append(content, resolver.Info.IP.String()) + } + content = append(content, fmt.Sprintf(" %s", resolver.Info.ID())) + content = append(content, fmt.Sprintf(" Failing: %v", resolver.Conn.IsFailing())) + + // Add a empty line for all but the last entry. + if i+1 < len(globalResolvers) { + content = append(content, "") + } + } + + di.AddSection( + fmt.Sprintf("Resolvers: %d/%d", working, total), + debug.UseCodeSection|debug.AddContentLineBreaks, + content..., + ) +}