diff --git a/internal/controld/config.go b/internal/controld/config.go index d2451eb..765706e 100644 --- a/internal/controld/config.go +++ b/internal/controld/config.go @@ -133,6 +133,15 @@ func FetchResolverUID(ctx context.Context, req *UtilityOrgRequest, version strin ctrld.Log(ctx, logger.Debug(), "Using provided hostname: %s", hostname) } + // Include all hostname sources in metadata so the API can pick the + // best one if the primary looks generic (e.g., "Mac", "Mac.lan"). + if req.Metadata == nil { + req.Metadata = make(map[string]string) + } + for k, v := range hostnameHints() { + req.Metadata["hostname_"+k] = v + } + ctrld.Log(ctx, logger.Debug(), "Sending UID request to ControlD API") body, _ := json.Marshal(req) return postUtilityAPI(ctx, version, cdDev, false, bytes.NewReader(body)) diff --git a/internal/controld/hostname_darwin.go b/internal/controld/hostname_darwin.go index 107b4cd..0b8eb52 100644 --- a/internal/controld/hostname_darwin.go +++ b/internal/controld/hostname_darwin.go @@ -24,3 +24,21 @@ func preferredHostname() (string, error) { } return os.Hostname() } + +// hostnameHints returns all available hostname sources on macOS for +// diagnostic/fallback purposes. The API can use these to pick the +// best hostname if the primary one looks generic (e.g., "Mac"). +func hostnameHints() map[string]string { + hints := make(map[string]string) + for _, key := range []string{"ComputerName", "LocalHostName", "HostName"} { + if out, err := exec.Command("scutil", "--get", key).Output(); err == nil { + if name := strings.TrimSpace(string(out)); name != "" { + hints[key] = name + } + } + } + if h, err := os.Hostname(); err == nil { + hints["os.Hostname"] = h + } + return hints +} diff --git a/internal/controld/hostname_others.go b/internal/controld/hostname_others.go index 9ae1026..8aa03bc 100644 --- a/internal/controld/hostname_others.go +++ b/internal/controld/hostname_others.go @@ -8,3 +8,12 @@ import "os" func preferredHostname() (string, error) { return os.Hostname() } + +// hostnameHints returns available hostname sources for diagnostic purposes. +func hostnameHints() map[string]string { + hints := make(map[string]string) + if h, err := os.Hostname(); err == nil { + hints["os.Hostname"] = h + } + return hints +}