go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/reboot/rhel.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package reboot 5 6 import ( 7 "io" 8 "strings" 9 10 "go.mondoo.com/cnquery/providers/core/resources/versions/rpm" 11 "go.mondoo.com/cnquery/providers/os/connection/shared" 12 "go.mondoo.com/cnquery/providers/os/resources/packages" 13 ) 14 15 // RpmNewestKernel works on all machines running rpm 16 type RpmNewestKernel struct { 17 conn shared.Connection 18 } 19 20 func (s *RpmNewestKernel) Name() string { 21 return "RPM Latest Kernel" 22 } 23 24 func (s *RpmNewestKernel) RebootPending() (bool, error) { 25 // if it is a static asset, no reboot is pending 26 if !s.conn.Capabilities().Has(shared.Capability_RunCommand) { 27 return false, nil 28 } 29 30 // get installed kernel version 31 installedKernelCmd, err := s.conn.RunCommand("rpm -q kernel --queryformat '%{NAME} %{EPOCHNUM}:%{VERSION}-%{RELEASE} %{ARCH} %{SUMMARY}\n'") 32 if err != nil { 33 return false, err 34 } 35 36 pkgs := packages.ParseRpmPackages(installedKernelCmd.Stdout) 37 // this case is valid in container 38 if len(pkgs) == 0 { 39 return false, nil 40 } 41 42 // check running kernel version 43 unamerCmd, err := s.conn.RunCommand("uname -r") 44 if err != nil { 45 return false, err 46 } 47 48 unameR, err := io.ReadAll(unamerCmd.Stdout) 49 if err != nil { 50 return false, err 51 } 52 53 // check if any kernel is newer 54 kernelVersion := strings.TrimSpace(string(unameR)) 55 56 var parser rpm.Parser 57 58 for i := range pkgs { 59 cmp, err := parser.Compare(pkgs[i].Version, kernelVersion) 60 if err != nil { 61 return false, err 62 } 63 if cmp >= 1 { 64 return true, nil 65 } 66 } 67 return false, nil 68 }