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 }