60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
|
package setup
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
// systemdUnitList returns all enabled systemd units.
|
||
|
// It needs to parse the table because -o json does not work everywhere.
|
||
|
func systemdUnitList() ([]string, error) {
|
||
|
wrap := func(err error) error {
|
||
|
return fmt.Errorf("running systemctl: %w", err)
|
||
|
}
|
||
|
|
||
|
ret := make([]string, 0)
|
||
|
cmd := ExecCommand("systemctl", "list-unit-files", "--state=enabled,generated,static")
|
||
|
|
||
|
stdout, err := cmd.StdoutPipe()
|
||
|
if err != nil {
|
||
|
return ret, wrap(err)
|
||
|
}
|
||
|
|
||
|
log.Debugf("Running systemctl...")
|
||
|
|
||
|
if err := cmd.Start(); err != nil {
|
||
|
return ret, wrap(err)
|
||
|
}
|
||
|
|
||
|
scanner := bufio.NewScanner(stdout)
|
||
|
header := true // skip the first line
|
||
|
|
||
|
for scanner.Scan() {
|
||
|
line := scanner.Text()
|
||
|
if len(line) == 0 {
|
||
|
break // the rest of the output is footer
|
||
|
}
|
||
|
|
||
|
if !header {
|
||
|
spaceIdx := strings.IndexRune(line, ' ')
|
||
|
if spaceIdx == -1 {
|
||
|
return ret, fmt.Errorf("can't parse systemctl output")
|
||
|
}
|
||
|
|
||
|
line = line[:spaceIdx]
|
||
|
ret = append(ret, line)
|
||
|
}
|
||
|
|
||
|
header = false
|
||
|
}
|
||
|
|
||
|
if err := cmd.Wait(); err != nil {
|
||
|
return ret, wrap(err)
|
||
|
}
|
||
|
|
||
|
return ret, nil
|
||
|
}
|