package journald import ( "bufio" "fmt" "io" "os/exec" "syscall" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/config" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/logsource" ) var _ logsource.LogSource = new(JournaldLogSource) type JournaldLogSource struct { cmd *exec.Cmd stdout io.ReadCloser stdoutscanner *bufio.Scanner } // ReadLine implements logsource.LogSource. func (j *JournaldLogSource) ReadLine() (string, error) { if j.stdoutscanner.Scan() { return j.stdoutscanner.Text(), nil } else { if j.stdoutscanner.Err() == nil { return "", fmt.Errorf("%w: %s", logsource.ErrDead, io.EOF) } return "", j.stdoutscanner.Err() } } func (j *JournaldLogSource) Close() error { _ = j.cmd.Process.Signal(syscall.SIGTERM) return j.cmd.Wait() } func New(cfg config.ServiceConfig, logdir string) (*JournaldLogSource, error) { args := make([]string, 0) if cfg.Path != nil { args = append(args, "-u", *cfg.Path) } args = append(args, "-f", "-n", "0", "-o", "short", "--no-pager", "--directory", logdir) cmd := exec.Command("journalctl", args...) //nolint:gosec stdout, err := cmd.StdoutPipe() if err != nil { return nil, err } err = cmd.Start() if err != nil { return nil, err } stdoutscanner := bufio.NewScanner(stdout) return &JournaldLogSource{cmd, stdout, stdoutscanner}, nil }