56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
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
|
|
}
|