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  }