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 }