mirror of
				https://github.com/siderolabs/talos.git
				synced 2025-10-31 08:21:25 +01:00 
			
		
		
		
	Add a basic syslog listening on `/dev/log`. Fixes: #8087 Signed-off-by: Noel Georgi <git@frezbo.dev>
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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()
 | |
| }
 |