fix(darwin): use scutil for provisioning hostname (#485)

macOS Sequoia with Private Wi-Fi Address enabled causes os.Hostname()
to return generic names like "Mac.lan" from DHCP instead of the real
computer name. The /utility provisioning endpoint sends this raw,
resulting in devices named "Mac-lan" in the dashboard.

Fallback chain: ComputerName → LocalHostName → os.Hostname()

LocalHostName can also be affected by DHCP. ComputerName is the
user-set display name from System Settings, fully immune to network state.
This commit is contained in:
Codescribe
2026-02-11 23:19:30 -05:00
committed by Cuong Manh Le
parent a4f0418811
commit 147106f2b9
3 changed files with 38 additions and 2 deletions

View File

@@ -10,7 +10,6 @@ import (
"io"
"net"
"net/http"
"os"
"runtime"
"strings"
"time"
@@ -116,7 +115,8 @@ func FetchResolverUID(req *UtilityOrgRequest, version string, cdDev bool) (*Reso
return nil, errors.New("invalid request")
}
if req.Hostname == "" {
hostname, _ := os.Hostname()
hostname, _ := preferredHostname()
ctrld.ProxyLogger.Load().Debug().Msgf("Using system hostname: %s", hostname)
req.Hostname = hostname
}

View File

@@ -0,0 +1,26 @@
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()
}

View File

@@ -0,0 +1,10 @@
//go:build !darwin
package controld
import "os"
// preferredHostname returns the system hostname on non-Darwin platforms.
func preferredHostname() (string, error) {
return os.Hostname()
}