summaryrefslogtreecommitdiff
path: root/vendor/gopkg.in/mcuadros/go-syslog.v2/server.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/gopkg.in/mcuadros/go-syslog.v2/server.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/gopkg.in/mcuadros/go-syslog.v2/server.go')
-rw-r--r--vendor/gopkg.in/mcuadros/go-syslog.v2/server.go378
1 files changed, 0 insertions, 378 deletions
diff --git a/vendor/gopkg.in/mcuadros/go-syslog.v2/server.go b/vendor/gopkg.in/mcuadros/go-syslog.v2/server.go
deleted file mode 100644
index 352597b89..000000000
--- a/vendor/gopkg.in/mcuadros/go-syslog.v2/server.go
+++ /dev/null
@@ -1,378 +0,0 @@
-package syslog
-
-import (
- "bufio"
- "crypto/tls"
- "errors"
- "net"
- "strings"
- "sync"
- "time"
-
- "gopkg.in/mcuadros/go-syslog.v2/format"
-)
-
-var (
- RFC3164 = &format.RFC3164{} // RFC3164: http://www.ietf.org/rfc/rfc3164.txt
- RFC5424 = &format.RFC5424{} // RFC5424: http://www.ietf.org/rfc/rfc5424.txt
- RFC6587 = &format.RFC6587{} // RFC6587: http://www.ietf.org/rfc/rfc6587.txt - octet counting variant
- Automatic = &format.Automatic{} // Automatically identify the format
-)
-
-const (
- datagramChannelBufferSize = 10
- datagramReadBufferSize = 64 * 1024
-)
-
-// A function type which gets the TLS peer name from the connection. Can return
-// ok=false to terminate the connection
-type TlsPeerNameFunc func(tlsConn *tls.Conn) (tlsPeer string, ok bool)
-
-type Server struct {
- listeners []net.Listener
- connections []net.PacketConn
- wait sync.WaitGroup
- doneTcp chan bool
- datagramChannel chan DatagramMessage
- format format.Format
- handler Handler
- lastError error
- readTimeoutMilliseconds int64
- tlsPeerNameFunc TlsPeerNameFunc
- datagramPool sync.Pool
-}
-
-//NewServer returns a new Server
-func NewServer() *Server {
- return &Server{tlsPeerNameFunc: defaultTlsPeerName, datagramPool: sync.Pool{
- New: func() interface{} {
- return make([]byte, 65536)
- },
- }}
-}
-
-//Sets the syslog format (RFC3164 or RFC5424 or RFC6587)
-func (s *Server) SetFormat(f format.Format) {
- s.format = f
-}
-
-//Sets the handler, this handler with receive every syslog entry
-func (s *Server) SetHandler(handler Handler) {
- s.handler = handler
-}
-
-//Sets the connection timeout for TCP connections, in milliseconds
-func (s *Server) SetTimeout(millseconds int64) {
- s.readTimeoutMilliseconds = millseconds
-}
-
-// Set the function that extracts a TLS peer name from the TLS connection
-func (s *Server) SetTlsPeerNameFunc(tlsPeerNameFunc TlsPeerNameFunc) {
- s.tlsPeerNameFunc = tlsPeerNameFunc
-}
-
-// Default TLS peer name function - returns the CN of the certificate
-func defaultTlsPeerName(tlsConn *tls.Conn) (tlsPeer string, ok bool) {
- state := tlsConn.ConnectionState()
- if len(state.PeerCertificates) <= 0 {
- return "", false
- }
- cn := state.PeerCertificates[0].Subject.CommonName
- return cn, true
-}
-
-//Configure the server for listen on an UDP addr
-func (s *Server) ListenUDP(addr string) error {
- udpAddr, err := net.ResolveUDPAddr("udp", addr)
- if err != nil {
- return err
- }
-
- connection, err := net.ListenUDP("udp", udpAddr)
- if err != nil {
- return err
- }
- connection.SetReadBuffer(datagramReadBufferSize)
-
- s.connections = append(s.connections, connection)
- return nil
-}
-
-//Configure the server for listen on an unix socket
-func (s *Server) ListenUnixgram(addr string) error {
- unixAddr, err := net.ResolveUnixAddr("unixgram", addr)
- if err != nil {
- return err
- }
-
- connection, err := net.ListenUnixgram("unixgram", unixAddr)
- if err != nil {
- return err
- }
- connection.SetReadBuffer(datagramReadBufferSize)
-
- s.connections = append(s.connections, connection)
- return nil
-}
-
-//Configure the server for listen on a TCP addr
-func (s *Server) ListenTCP(addr string) error {
- tcpAddr, err := net.ResolveTCPAddr("tcp", addr)
- if err != nil {
- return err
- }
-
- listener, err := net.ListenTCP("tcp", tcpAddr)
- if err != nil {
- return err
- }
-
- s.doneTcp = make(chan bool)
- s.listeners = append(s.listeners, listener)
- return nil
-}
-
-//Configure the server for listen on a TCP addr for TLS
-func (s *Server) ListenTCPTLS(addr string, config *tls.Config) error {
- listener, err := tls.Listen("tcp", addr, config)
- if err != nil {
- return err
- }
-
- s.doneTcp = make(chan bool)
- s.listeners = append(s.listeners, listener)
- return nil
-}
-
-//Starts the server, all the go routines goes to live
-func (s *Server) Boot() error {
- if s.format == nil {
- return errors.New("please set a valid format")
- }
-
- if s.handler == nil {
- return errors.New("please set a valid handler")
- }
-
- for _, listener := range s.listeners {
- s.goAcceptConnection(listener)
- }
-
- if len(s.connections) > 0 {
- s.goParseDatagrams()
- }
-
- for _, connection := range s.connections {
- s.goReceiveDatagrams(connection)
- }
-
- return nil
-}
-
-func (s *Server) goAcceptConnection(listener net.Listener) {
- s.wait.Add(1)
- go func(listener net.Listener) {
- loop:
- for {
- select {
- case <-s.doneTcp:
- break loop
- default:
- }
- connection, err := listener.Accept()
- if err != nil {
- continue
- }
-
- s.goScanConnection(connection)
- }
-
- s.wait.Done()
- }(listener)
-}
-
-func (s *Server) goScanConnection(connection net.Conn) {
- scanner := bufio.NewScanner(connection)
- if sf := s.format.GetSplitFunc(); sf != nil {
- scanner.Split(sf)
- }
-
- remoteAddr := connection.RemoteAddr()
- var client string
- if remoteAddr != nil {
- client = remoteAddr.String()
- }
-
- tlsPeer := ""
- if tlsConn, ok := connection.(*tls.Conn); ok {
- // Handshake now so we get the TLS peer information
- if err := tlsConn.Handshake(); err != nil {
- connection.Close()
- return
- }
- if s.tlsPeerNameFunc != nil {
- var ok bool
- tlsPeer, ok = s.tlsPeerNameFunc(tlsConn)
- if !ok {
- connection.Close()
- return
- }
- }
- }
-
- var scanCloser *ScanCloser
- scanCloser = &ScanCloser{scanner, connection}
-
- s.wait.Add(1)
- go s.scan(scanCloser, client, tlsPeer)
-}
-
-func (s *Server) scan(scanCloser *ScanCloser, client string, tlsPeer string) {
-loop:
- for {
- select {
- case <-s.doneTcp:
- break loop
- default:
- }
- if s.readTimeoutMilliseconds > 0 {
- scanCloser.closer.SetReadDeadline(time.Now().Add(time.Duration(s.readTimeoutMilliseconds) * time.Millisecond))
- }
- if scanCloser.Scan() {
- s.parser([]byte(scanCloser.Text()), client, tlsPeer)
- } else {
- break loop
- }
- }
- scanCloser.closer.Close()
-
- s.wait.Done()
-}
-
-func (s *Server) parser(line []byte, client string, tlsPeer string) {
- parser := s.format.GetParser(line)
- err := parser.Parse()
- if err != nil {
- s.lastError = err
- }
-
- logParts := parser.Dump()
- logParts["client"] = client
- if logParts["hostname"] == "" && (s.format == RFC3164 || s.format == Automatic) {
- if i := strings.Index(client, ":"); i > 1 {
- logParts["hostname"] = client[:i]
- } else {
- logParts["hostname"] = client
- }
- }
- logParts["tls_peer"] = tlsPeer
-
- s.handler.Handle(logParts, int64(len(line)), err)
-}
-
-//Returns the last error
-func (s *Server) GetLastError() error {
- return s.lastError
-}
-
-//Kill the server
-func (s *Server) Kill() error {
- for _, connection := range s.connections {
- err := connection.Close()
- if err != nil {
- return err
- }
- }
-
- for _, listener := range s.listeners {
- err := listener.Close()
- if err != nil {
- return err
- }
- }
- // Only need to close channel once to broadcast to all waiting
- if s.doneTcp != nil {
- close(s.doneTcp)
- }
- if s.datagramChannel != nil {
- close(s.datagramChannel)
- }
- return nil
-}
-
-//Waits until the server stops
-func (s *Server) Wait() {
- s.wait.Wait()
-}
-
-type TimeoutCloser interface {
- Close() error
- SetReadDeadline(t time.Time) error
-}
-
-type ScanCloser struct {
- *bufio.Scanner
- closer TimeoutCloser
-}
-
-type DatagramMessage struct {
- message []byte
- client string
-}
-
-func (s *Server) goReceiveDatagrams(packetconn net.PacketConn) {
- s.wait.Add(1)
- go func() {
- defer s.wait.Done()
- for {
- buf := s.datagramPool.Get().([]byte)
- n, addr, err := packetconn.ReadFrom(buf)
- if err == nil {
- // Ignore trailing control characters and NULs
- for ; (n > 0) && (buf[n-1] < 32); n-- {
- }
- if n > 0 {
- var address string
- if addr != nil {
- address = addr.String()
- }
- s.datagramChannel <- DatagramMessage{buf[:n], address}
- }
- } else {
- // there has been an error. Either the server has been killed
- // or may be getting a transitory error due to (e.g.) the
- // interface being shutdown in which case sleep() to avoid busy wait.
- opError, ok := err.(*net.OpError)
- if (ok) && !opError.Temporary() && !opError.Timeout() {
- return
- }
- time.Sleep(10 * time.Millisecond)
- }
- }
- }()
-}
-
-func (s *Server) goParseDatagrams() {
- s.datagramChannel = make(chan DatagramMessage, datagramChannelBufferSize)
-
- s.wait.Add(1)
- go func() {
- defer s.wait.Done()
- for {
- select {
- case msg, ok := (<-s.datagramChannel):
- if !ok {
- return
- }
- if sf := s.format.GetSplitFunc(); sf != nil {
- if _, token, err := sf(msg.message, true); err == nil {
- s.parser(token, msg.client, "")
- }
- } else {
- s.parser(msg.message, msg.client, "")
- }
- s.datagramPool.Put(msg.message[:cap(msg.message)])
- }
- }
- }()
-}