48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package iokitregistry
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"howett.net/plist"
|
|
"os/exec"
|
|
)
|
|
|
|
var ErrFailed = errors.New("failed to query I/O Kit registry")
|
|
|
|
type Entry struct {
|
|
IOPlatformUUID string
|
|
}
|
|
|
|
func PlatformUUID() (string, error) {
|
|
ioregPath, err := exec.LookPath("ioreg")
|
|
if err != nil {
|
|
// Fallback since on some systems the PATH
|
|
// variable does not include /usr/sbin
|
|
ioregPath = "/usr/sbin/ioreg"
|
|
}
|
|
|
|
ioregCmd := exec.Command(ioregPath, "-a", "-c", "IOPlatformExpertDevice", "-rd1")
|
|
|
|
ioregOutput, err := ioregCmd.Output()
|
|
if err != nil {
|
|
return "", fmt.Errorf("%w: failed to run ioreg command: %v", ErrFailed, err)
|
|
}
|
|
|
|
var entries []Entry
|
|
|
|
_, err = plist.Unmarshal(ioregOutput, &entries)
|
|
if err != nil {
|
|
return "", fmt.Errorf("%w: failed to unmarshal ioreg command's output: %v",
|
|
ErrFailed, err)
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
if entry.IOPlatformUUID != "" {
|
|
return entry.IOPlatformUUID, nil
|
|
}
|
|
}
|
|
|
|
return "", fmt.Errorf("%w: no platform UUID found in the ioreg command's output",
|
|
ErrFailed)
|
|
}
|