github.com/crowdsecurity/crowdsec@v1.6.1/pkg/setup/units.go (about)

     1  package setup
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strings"
     7  
     8  	log "github.com/sirupsen/logrus"
     9  )
    10  
    11  // systemdUnitList returns all enabled systemd units.
    12  // It needs to parse the table because -o json does not work everywhere.
    13  func systemdUnitList() ([]string, error) {
    14  	wrap := func(err error) error {
    15  		return fmt.Errorf("running systemctl: %w", err)
    16  	}
    17  
    18  	ret := make([]string, 0)
    19  	cmd := ExecCommand("systemctl", "list-unit-files", "--state=enabled,generated,static")
    20  
    21  	stdout, err := cmd.StdoutPipe()
    22  	if err != nil {
    23  		return ret, wrap(err)
    24  	}
    25  
    26  	log.Debugf("Running systemctl...")
    27  
    28  	if err := cmd.Start(); err != nil {
    29  		return ret, wrap(err)
    30  	}
    31  
    32  	scanner := bufio.NewScanner(stdout)
    33  	header := true // skip the first line
    34  
    35  	for scanner.Scan() {
    36  		line := scanner.Text()
    37  		if len(line) == 0 {
    38  			break // the rest of the output is footer
    39  		}
    40  
    41  		if !header {
    42  			spaceIdx := strings.IndexRune(line, ' ')
    43  			if spaceIdx == -1 {
    44  				return ret, fmt.Errorf("can't parse systemctl output")
    45  			}
    46  
    47  			line = line[:spaceIdx]
    48  			ret = append(ret, line)
    49  		}
    50  
    51  		header = false
    52  	}
    53  
    54  	if err := cmd.Wait(); err != nil {
    55  		return ret, wrap(err)
    56  	}
    57  
    58  	return ret, nil
    59  }