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

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package services
     5  
     6  import (
     7  	"io"
     8  	"regexp"
     9  
    10  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    11  )
    12  
    13  var LAUNCHD_REGEX = regexp.MustCompile(`(?m)^\s*([\d-]*)\s+(\d)\s+(.*)$`)
    14  
    15  // PID: pid of process
    16  // Status: last know exit code
    17  // ^\s*([\d-]*)\s+(\d)\s+(.*)$
    18  func ParseServiceLaunchD(input io.Reader) ([]*Service, error) {
    19  	var services []*Service
    20  	content, err := io.ReadAll(input)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	m := LAUNCHD_REGEX.FindAllStringSubmatch(string(content), -1)
    26  	for i := range m {
    27  		s := &Service{
    28  			Name:      m[i][3],
    29  			Enabled:   true,
    30  			Installed: true,
    31  			Running:   m[i][1] != "-",
    32  			Type:      "launchd",
    33  		}
    34  		services = append(services, s)
    35  	}
    36  	return services, nil
    37  }
    38  
    39  // macOS is using launchd as default service manager
    40  type LaunchDServiceManager struct {
    41  	conn shared.Connection
    42  }
    43  
    44  func (s *LaunchDServiceManager) Name() string {
    45  	return "launchd Service Manager"
    46  }
    47  
    48  func (s *LaunchDServiceManager) List() ([]*Service, error) {
    49  	c, err := s.conn.RunCommand("launchctl list")
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return ParseServiceLaunchD(c.Stdout)
    54  }