talos/internal/app/syslogd/syslogd.go
Noel Georgi 9dbc33972a
feat: add basic syslog implementation
Add a basic syslog listening on `/dev/log`.

Fixes: #8087

Signed-off-by: Noel Georgi <git@frezbo.dev>
2024-02-20 15:02:06 +05:30

62 lines
1.5 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Package syslogd provides a syslogd service that listens on a unix socket
package syslogd
import (
"context"
"fmt"
"io"
"net"
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime"
"github.com/siderolabs/talos/internal/app/syslogd/internal/parser"
"github.com/siderolabs/talos/pkg/machinery/constants"
)
// Main is an entrypoint to the API service.
func Main(ctx context.Context, _ runtime.Runtime, logWriter io.Writer) error {
return Run(ctx, logWriter, constants.SyslogListenSocketPath)
}
// Run starts the syslogd service.
func Run(ctx context.Context, logWriter io.Writer, listenSocketPath string) error {
unixAddr, err := net.ResolveUnixAddr("unixgram", listenSocketPath)
if err != nil {
return err
}
connection, err := net.ListenUnixgram("unixgram", unixAddr)
if err != nil {
return err
}
if err = connection.SetReadBuffer(65536); err != nil {
return fmt.Errorf("failed to set read buffer: %w", err)
}
buf := make([]byte, 1024)
go func(con *net.UnixConn) {
for {
n, err := con.Read(buf)
if err != nil {
continue
}
syslogJSON, err := parser.Parse(buf[:n])
if err != nil { // if the message is not a valid syslog message, skip it
continue
}
fmt.Fprintln(logWriter, syslogJSON)
}
}(connection)
<-ctx.Done()
return connection.Close()
}