go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/services/openbsdrcctl.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package services 5 6 import ( 7 "bufio" 8 "io" 9 "strings" 10 11 "go.mondoo.com/cnquery/providers/os/connection/shared" 12 ) 13 14 // https://man.openbsd.org/rcctl 15 type OpenBsdRcctlServiceManager struct { 16 conn shared.Connection 17 } 18 19 func (s *OpenBsdRcctlServiceManager) Name() string { 20 return "OpenBSD Service Manager" 21 } 22 23 func (s *OpenBsdRcctlServiceManager) List() ([]*Service, error) { 24 // fetch individual service states 25 c, err := s.conn.RunCommand("rcctl ls started") 26 if err != nil { 27 return nil, err 28 } 29 started := ParseOpenBsdServiceList(c.Stdout) 30 31 c, err = s.conn.RunCommand("rcctl ls stopped") 32 if err != nil { 33 return nil, err 34 } 35 stopped := ParseOpenBsdServiceList(c.Stdout) 36 37 c, err = s.conn.RunCommand("rcctl ls on") 38 if err != nil { 39 return nil, err 40 } 41 enabled := ParseOpenBsdServiceList(c.Stdout) 42 43 c, err = s.conn.RunCommand("rcctl ls off") 44 if err != nil { 45 return nil, err 46 } 47 disabled := ParseOpenBsdServiceList(c.Stdout) 48 49 srvs := map[string]*Service{} 50 51 // compose results 52 for k := range started { 53 srvs[k] = &Service{ 54 Name: k, 55 Installed: true, 56 Running: true, 57 State: ServiceRunning, 58 Type: "openbsd", 59 } 60 } 61 62 for k := range stopped { 63 srvs[k] = &Service{ 64 Name: k, 65 Installed: true, 66 Running: false, 67 State: ServiceStopped, 68 Type: "openbsd", 69 } 70 } 71 72 // now enrich enabled/disabled, enabled/disabled services must have a started or stopped state 73 for k := range enabled { 74 _, ok := srvs[k] 75 if ok { 76 srvs[k].Enabled = true 77 } 78 } 79 for k := range disabled { 80 _, ok := srvs[k] 81 if ok { 82 srvs[k].Enabled = false 83 } 84 } 85 86 list := []*Service{} 87 for k := range srvs { 88 list = append(list, srvs[k]) 89 } 90 return list, nil 91 } 92 93 func ParseOpenBsdServiceList(r io.Reader) map[string]struct{} { 94 res := map[string]struct{}{} 95 scanner := bufio.NewScanner(r) 96 for scanner.Scan() { 97 line := scanner.Text() 98 name := strings.TrimSpace(line) 99 if name != "" { 100 res[name] = struct{}{} 101 } 102 } 103 return res 104 }