42 lines
838 B
Go
42 lines
838 B
Go
package parser
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"regexp"
|
|
)
|
|
|
|
func ParseJournald(unit string) (Parser, error) {
|
|
if unit == "" {
|
|
return Parser{}, errors.New("unit name cannot be empty")
|
|
}
|
|
|
|
validUnitName := regexp.MustCompile(`^[a-zA-Z0-9:_\.\-@]+$`)
|
|
if !validUnitName.MatchString(unit) {
|
|
return Parser{}, fmt.Errorf("invalid systemd unit name: %s", unit)
|
|
}
|
|
|
|
cmd := exec.Command("journalctl", "-u", unit, "-f", "-n", "0", "-o", "short", "--no-pager")
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
|
if err != nil {
|
|
return Parser{}, fmt.Errorf("stdout pipe error: %w", err)
|
|
}
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
return Parser{}, fmt.Errorf("failed to start journalctl: %w", err)
|
|
}
|
|
|
|
p := Parser{
|
|
parser: bufio.NewScanner(stdout),
|
|
ch: make(chan string, 100),
|
|
cmd: cmd,
|
|
file: nil,
|
|
}
|
|
|
|
return p, nil
|
|
}
|