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  }