pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/system/info_darwin.go (about)

     1  // Package system provides methods for working with system data (metrics/users)
     2  package system
     3  
     4  // ////////////////////////////////////////////////////////////////////////////////// //
     5  //                                                                                    //
     6  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     7  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     8  //                                                                                    //
     9  // ////////////////////////////////////////////////////////////////////////////////// //
    10  
    11  import (
    12  	"errors"
    13  	"os/exec"
    14  	"strings"
    15  	"syscall"
    16  )
    17  
    18  // ////////////////////////////////////////////////////////////////////////////////// //
    19  
    20  // GetSystemInfo returns system info
    21  func GetSystemInfo() (*SystemInfo, error) {
    22  	hostname, err := syscall.Sysctl("kern.hostname")
    23  
    24  	if err != nil || hostname == "" {
    25  		return nil, errors.New("Can't read hostname info")
    26  	}
    27  
    28  	os, err := syscall.Sysctl("kern.ostype")
    29  
    30  	if err != nil || os == "" {
    31  		return nil, errors.New("Can't read os info")
    32  	}
    33  
    34  	kernel, err := syscall.Sysctl("kern.osrelease")
    35  
    36  	if err != nil || kernel == "" {
    37  		return nil, errors.New("Can't read kernel info")
    38  	}
    39  
    40  	arch, err := syscall.Sysctl("kern.version")
    41  
    42  	if err != nil || arch == "" {
    43  		return nil, errors.New("Can't read arch info")
    44  	}
    45  
    46  	return &SystemInfo{
    47  		Hostname:     hostname,
    48  		OS:           os,
    49  		Distribution: DARWIN_OSX,
    50  		Version:      getMacOSVersion(),
    51  		Kernel:       kernel,
    52  		Arch:         getMacOSArch(arch),
    53  		ArchBits:     64,
    54  	}, nil
    55  }
    56  
    57  // ////////////////////////////////////////////////////////////////////////////////// //
    58  
    59  func getMacOSArch(archInfo string) string {
    60  	switch {
    61  	case strings.Contains(archInfo, "X86_64"):
    62  		return "x86_64"
    63  	case strings.Contains(archInfo, "ARM64"):
    64  		return "arm64"
    65  	}
    66  
    67  	return "unknown"
    68  }
    69  
    70  func getMacOSVersion() string {
    71  	cmd := exec.Command("sw_vers", "-productVersion")
    72  
    73  	versionData, err := cmd.Output()
    74  
    75  	if err != nil {
    76  		return ""
    77  	}
    78  
    79  	return strings.Trim(string(versionData), "\r\n")
    80  }