Files
ctrld/internal/controld/hostname_darwin.go
Codescribe 12715e6f24 fix: include hostname hints in metadata for API-side fallback
Send all available hostname sources (ComputerName, LocalHostName,
HostName, os.Hostname) in the metadata map when provisioning.
This allows the API to detect and repair generic hostnames like
'Mac' by picking the best available source server-side.

Belt and suspenders: preferredHostname() picks the right one
client-side, but metadata gives the API a second chance.
2026-03-03 14:25:53 +07:00

45 lines
1.4 KiB
Go

package controld
import (
"os"
"os/exec"
"strings"
)
// preferredHostname returns the best available hostname on macOS.
// It prefers scutil --get ComputerName which is the user-configured name
// from System Settings → General → About → Name. This is immune to
// DHCP/network state that can cause os.Hostname() and even LocalHostName
// to return generic names like "Mac.lan" on Sequoia with Private Wi-Fi
// Address enabled.
//
// Fallback chain: ComputerName → LocalHostName → os.Hostname()
func preferredHostname() (string, error) {
for _, key := range []string{"ComputerName", "LocalHostName"} {
if out, err := exec.Command("scutil", "--get", key).Output(); err == nil {
if name := strings.TrimSpace(string(out)); name != "" {
return name, nil
}
}
}
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
}