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  }