agent/util/osutil/osversion_unix.go (49 lines of code) (raw):
//go:build linux || freebsd
// +build linux freebsd
package osutil
import (
"bytes"
"fmt"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/common/fileutil"
"golang.org/x/sys/unix"
)
// getVersion returns OS version string depends on different types of OS
func getVersion() string {
// The linux version concatenated string from Utsname struct, which mimics
// original C++ agent result
var utsn unix.Utsname
err := unix.Uname(&utsn)
if err != nil {
return ""
}
// utsn.Sysname/Version/Machine fields are all [256]byte array, which hold
// zero-terminated C-style string and need extra step to determine real length
// and convert meaningful part to string
sysnameLength := bytes.IndexByte(utsn.Sysname[:], 0)
sysname := string(utsn.Sysname[:sysnameLength])
versionLength := bytes.IndexByte(utsn.Version[:], 0)
version := string(utsn.Version[:versionLength])
machineLength := bytes.IndexByte(utsn.Machine[:], 0)
machine := string(utsn.Machine[:machineLength])
return fmt.Sprintf("%s_%s_%s", sysname, version, machine)
}
func GetUnameMachine() (string, error) {
var utsn unix.Utsname
err := unix.Uname(&utsn)
if err != nil {
return "", err
}
machineLength := bytes.IndexByte(utsn.Machine[:], 0)
machine := string(utsn.Machine[:machineLength])
return machine, nil
}
// getKernelVersion returns linux kernel version, like 2.6.18
func getKernelVersion() string {
var utsn unix.Utsname
err := unix.Uname(&utsn)
if err != nil {
log.GetLogger().Error("get kernel version error: ", err)
return "unknown KernelVersion"
}
releaseLength := bytes.IndexByte(utsn.Release[:], '\u0000')
release := string(utsn.Release[:releaseLength])
return release
}
func GetDistribution() string {
if fileutil.CheckFileIsExist("/default.prop") && fileutil.CheckFileIsExist("/system/bin/app_process64") {
return distributionAndroid
}
return ""
}