github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/nodeagent/dep/system.go (about)

     1  //go:generate stringer -type=Packages
     2  
     3  package dep
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"os/exec"
     9  	"strings"
    10  )
    11  
    12  type Packages int
    13  
    14  const (
    15  	UnknownPkg Packages = iota
    16  	DebianBased
    17  	REMBased
    18  )
    19  
    20  type OperatingSystem struct {
    21  	Packages Packages
    22  }
    23  
    24  func (o OperatingSystem) String() string {
    25  	var os string
    26  	switch o {
    27  	case Ubuntu:
    28  		os = "Ubuntu"
    29  	case CentOS:
    30  		os = "CentOS"
    31  	}
    32  	return os
    33  }
    34  
    35  var (
    36  	UnknownOS = OperatingSystem{}
    37  	Ubuntu    = OperatingSystem{DebianBased}
    38  	CentOS    = OperatingSystem{REMBased}
    39  )
    40  
    41  type OperatingSystemMajor struct {
    42  	OperatingSystem OperatingSystem
    43  	Version         string
    44  }
    45  
    46  func (o OperatingSystemMajor) String() string {
    47  	var versionName string
    48  	switch o {
    49  	case Bionic:
    50  		versionName = "18.04 LTS Bionic Beaver"
    51  	case CentOS7:
    52  		versionName = "7"
    53  	}
    54  
    55  	return fmt.Sprintf("%s %s", o.OperatingSystem, versionName)
    56  }
    57  
    58  var (
    59  	Unknown = OperatingSystemMajor{UnknownOS, ""}
    60  	Bionic  = OperatingSystemMajor{Ubuntu, "bionic"}
    61  	CentOS7 = OperatingSystemMajor{CentOS, "7"}
    62  
    63  	//	Debian OperatingSystem = OperatingSystem{DebianBased}
    64  )
    65  
    66  func GetOperatingSystem() (OperatingSystemMajor, error) {
    67  	buf := new(bytes.Buffer)
    68  	defer buf.Reset()
    69  
    70  	hostnamectl := exec.Command("hostnamectl")
    71  	hostnamectl.Stdout = buf
    72  
    73  	if err := hostnamectl.Run(); err != nil {
    74  		return Unknown, fmt.Errorf("running hostnamectl in order to get operating system information failed: %w", err)
    75  	}
    76  
    77  	var (
    78  		osLine string
    79  		err    error
    80  	)
    81  	for err == nil {
    82  		osLine, err = buf.ReadString('\n')
    83  		if strings.Contains(osLine, "Operating System") {
    84  			break
    85  		}
    86  	}
    87  
    88  	if err != nil {
    89  		return Unknown, fmt.Errorf("finding line containing \"Operating System\" in hostnamectl output failed: %w", err)
    90  	}
    91  
    92  	os := strings.Fields(osLine)[2]
    93  	switch os {
    94  	case "Ubuntu":
    95  		version := strings.Fields(osLine)[3]
    96  		if strings.HasPrefix(version, "18.04") {
    97  			return Bionic, nil
    98  		}
    99  		return Unknown, fmt.Errorf("unsupported ubuntu version %s", version)
   100  	case "CentOS":
   101  		version := strings.Fields(osLine)[4]
   102  		if version == "7" {
   103  			return CentOS7, nil
   104  		}
   105  		return Unknown, fmt.Errorf("unsupported centOS version %s", version)
   106  	}
   107  	return Unknown, fmt.Errorf("unknown operating system %s", os)
   108  }