common/linux/uname.go

89 lines
1.9 KiB
Go

//go:build linux
package linux
import (
"strings"
"syscall"
)
// unameFlags are the different uname switches for our uname syscall function.
type unameFlags uint8
var unameMap = map[[1]string]unameFlags{
[1]string{"s"}: UnameOS,
[1]string{"m"}: UnameArch,
[1]string{"r"}: UnameRelease,
[1]string{"d"}: UnameDomain,
[1]string{"n"}: UnameHostname,
[1]string{"v"}: UnameVersion,
}
func unameFlag(flag [1]string) (res unameFlags) {
var ok bool
res, ok = unameMap[flag]
if !ok {
return 0
}
return
}
const (
// UnameNull is a placeholder.
UnameNull unameFlags = iota
// UnameOS is "sysname" or "uname -s".
UnameOS
// UnameArch is "machine" or "uname -m".
UnameArch
// UnameRelease is "release" or "uname -r".
UnameRelease
// UnameDomain is "domainname", the kernel domain name.
UnameDomain
// UnameHostname is "Nodename" or "uname -n"
UnameHostname
// UnameVersion is "version", or "uname -v".
UnameVersion
)
// GetUname uses system calls to retrieve the same values as the uname linux command
func GetUname(unameFlags string) (un string, err error) {
ub := &syscall.Utsname{}
err = syscall.Uname(ub)
if err != nil {
return
}
var targets []*[65]int8
for _, n := range unameFlags {
var flag = [1]string{string(n)}
p := unameFlag(flag)
switch p {
case UnameNull:
continue
case UnameDomain:
targets = append(targets, &ub.Domainname)
case UnameHostname:
targets = append(targets, &ub.Nodename)
case UnameRelease:
targets = append(targets, &ub.Release)
case UnameArch:
targets = append(targets, &ub.Machine)
case UnameOS:
targets = append(targets, &ub.Sysname)
case UnameVersion:
targets = append(targets, &ub.Version)
}
}
var uns []string
for _, target := range targets {
var sub []string
for _, r := range target {
sub = append(sub, string(rune(r)))
}
uns = append(uns, strings.Join(sub, ""))
}
un = strings.Join(uns, " ")
return
}