github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/status/log_send_desktop.go (about) 1 // Copyright 2019 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 //go:build !ios && !android 5 // +build !ios,!android 6 7 package status 8 9 import ( 10 "fmt" 11 "os" 12 "os/exec" 13 "regexp" 14 "runtime" 15 "time" 16 17 context "golang.org/x/net/context" 18 19 ps "github.com/keybase/go-ps" 20 ) 21 22 func keybaseProcessList() string { 23 ret := "" 24 osinfo, err := getOSInfo() 25 if err == nil { 26 ret += osinfo + "\n\n" 27 } else { 28 ret += fmt.Sprintf("could not get OS info for platform %s: %s\n\n", runtime.GOOS, err) 29 } 30 31 processes, err := pgrep(keybaseProcessRegexp) 32 if err != nil { 33 return fmt.Sprintf("error getting processes: %s", err) 34 } 35 for _, process := range processes { 36 path, err := process.Path() 37 if err != nil { 38 path = "unable to get process path" 39 } 40 ret += fmt.Sprintf("%s (%+v)\n", path, process) 41 } 42 return ret 43 } 44 45 func getOSInfo() (string, error) { 46 switch runtime.GOOS { 47 case "linux": 48 osinfo, err := os.ReadFile("/etc/os-release") 49 return string(osinfo), err 50 case "darwin": // no ios 51 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 52 defer cancel() 53 osinfo, err := exec.CommandContext(ctx, "/usr/bin/sw_vers").CombinedOutput() 54 return string(osinfo), err 55 case "windows": 56 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 57 defer cancel() 58 osinfo, err := exec.CommandContext(ctx, "cmd", "/c", "ver").CombinedOutput() 59 return string(osinfo), err 60 default: 61 return "", fmt.Errorf("no OS info for platform %s", runtime.GOOS) 62 } 63 } 64 65 var keybaseProcessRegexp = regexp.MustCompile(`(?i:kbfs|keybase|upd.exe)`) 66 67 func pgrep(matcher *regexp.Regexp) ([]ps.Process, error) { 68 processes, err := ps.Processes() 69 if err != nil { 70 return nil, err 71 } 72 var filteredProcesses []ps.Process 73 for _, process := range processes { 74 if matcher.MatchString(process.Executable()) { 75 filteredProcesses = append(filteredProcesses, process) 76 } 77 } 78 return filteredProcesses, nil 79 }