pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/system/info_linux.go (about) 1 //go:build linux 2 // +build linux 3 4 package system 5 6 // ////////////////////////////////////////////////////////////////////////////////// // 7 // // 8 // Copyright (c) 2022 ESSENTIAL KAOS // 9 // Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0> // 10 // // 11 // ////////////////////////////////////////////////////////////////////////////////// // 12 13 import ( 14 "io/ioutil" 15 "strings" 16 "syscall" 17 18 "pkg.re/essentialkaos/ek.v12/strutil" 19 ) 20 21 // ////////////////////////////////////////////////////////////////////////////////// // 22 23 var osReleaseFile = "/etc/os-release" 24 25 // ////////////////////////////////////////////////////////////////////////////////// // 26 27 // GetSystemInfo returns system info 28 func GetSystemInfo() (*SystemInfo, error) { 29 info := &syscall.Utsname{} 30 err := syscall.Uname(info) 31 32 if err != nil { 33 return nil, err 34 } 35 36 osInfo, err := GetOSInfo() 37 38 if err != nil { 39 return nil, err 40 } 41 42 return &SystemInfo{ 43 Hostname: byteSliceToString(info.Nodename), 44 OS: byteSliceToString(info.Sysname), 45 Distribution: formatDistName(osInfo.Name), 46 Version: osInfo.Version, 47 Kernel: byteSliceToString(info.Release), 48 Arch: byteSliceToString(info.Machine), 49 ArchBits: getCPUArchBits(), 50 }, nil 51 } 52 53 // GetOSInfo returns info about OS 54 func GetOSInfo() (*OSInfo, error) { 55 data, err := ioutil.ReadFile(osReleaseFile) 56 57 if err != nil { 58 return nil, err 59 } 60 61 info := &OSInfo{} 62 63 for _, line := range strings.Split(string(data), "\n") { 64 if len(line) == 0 { 65 continue 66 } 67 68 name := strutil.ReadField(line, 0, false, "=") 69 value := strings.Trim(strutil.ReadField(line, 1, false, "="), "\"") 70 71 switch name { 72 case "NAME": 73 info.Name = value 74 case "VERSION": 75 info.Version = value 76 case "ID": 77 info.ID = value 78 case "ID_LIKE": 79 info.IDLike = value 80 case "VERSION_ID": 81 info.VersionID = value 82 case "VERSION_CODENAME": 83 info.VersionCodename = value 84 case "PRETTY_NAME": 85 info.PrettyName = value 86 case "HOME_URL": 87 info.HomeURL = value 88 case "BUG_REPORT_URL": 89 info.BugReportURL = value 90 case "SUPPORT_URL": 91 info.SupportURL = value 92 } 93 } 94 95 return info, nil 96 } 97 98 // ////////////////////////////////////////////////////////////////////////////////// // 99 100 // formatDistName formats distribution name 101 func formatDistName(name string) string { 102 switch strings.ToUpper(name) { 103 case strings.ToUpper(LINUX_ARCH): 104 return LINUX_ARCH 105 case strings.ToUpper(LINUX_CENTOS): 106 return LINUX_CENTOS 107 case strings.ToUpper(LINUX_DEBIAN): 108 return LINUX_DEBIAN 109 case strings.ToUpper(LINUX_FEDORA): 110 return LINUX_FEDORA 111 case strings.ToUpper(LINUX_GENTOO): 112 return LINUX_GENTOO 113 case strings.ToUpper(LINUX_RHEL): 114 return LINUX_RHEL 115 case strings.ToUpper(LINUX_SUSE): 116 return LINUX_SUSE 117 case strings.ToUpper(LINUX_OPEN_SUSE): 118 return LINUX_OPEN_SUSE 119 case strings.ToUpper(LINUX_UBUNTU): 120 return LINUX_UBUNTU 121 } 122 123 return name 124 }