go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/processes/manager.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package processes
     5  
     6  import (
     7  	"errors"
     8  
     9  	"go.mondoo.com/cnquery/providers/os/connection"
    10  	"go.mondoo.com/cnquery/providers/os/connection/mock"
    11  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    12  )
    13  
    14  type OSProcess struct {
    15  	Pid               int64
    16  	Command           string
    17  	Executable        string
    18  	State             string
    19  	Uid               int64
    20  	SocketInodes      []int64
    21  	SocketInodesError error
    22  }
    23  
    24  type OSProcessManager interface {
    25  	Name() string
    26  	Exists(pid int64) (bool, error)
    27  	Process(pid int64) (*OSProcess, error)
    28  	List() ([]*OSProcess, error)
    29  }
    30  
    31  func ResolveManager(conn shared.Connection) (OSProcessManager, error) {
    32  	var pm OSProcessManager
    33  
    34  	asset := conn.Asset()
    35  	if asset == nil || asset.Platform == nil {
    36  		return nil, errors.New("cannot find OS information for package detection")
    37  	}
    38  
    39  	// procfs over ssh is super slow, lets deactivate until we have a faster approach
    40  	disableProcFs := false
    41  	switch conn.(type) {
    42  	case *connection.SshConnection:
    43  		disableProcFs = true
    44  	case *mock.Connection:
    45  		disableProcFs = true
    46  	}
    47  
    48  	pf := asset.Platform
    49  	switch {
    50  	case pf.Runtime == "docker container":
    51  		pm = &DockerTopManager{conn: conn}
    52  	case pf.IsFamily("linux") && !disableProcFs:
    53  		pm = &LinuxProcManager{conn: conn}
    54  	case pf.IsFamily("unix"):
    55  		pm = &UnixProcessManager{conn: conn, platform: pf}
    56  	case pf.IsFamily("windows"):
    57  		pm = &WindowsProcessManager{conn: conn}
    58  	default:
    59  		return nil, errors.New("could not detect suitable process manager for platform: " + pf.Name)
    60  	}
    61  
    62  	return pm, nil
    63  }