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 }