test / test (push) Canceled after 0s
M17: the supervisord control socket is root:supervisor 0770, a group whose one member is the panel; OpenDKIM and Postfix keep `selfpost` for the files under /data and no longer reach the socket. L30, read in OpenDKIM 2.11.0~beta2's source first: it logs through syslog(3) only and has no Logfile option, and nothing in the container served /dev/log. internal/syslogrelay (the panel binary with -syslog-relay=/run/syslog/log, program syslog-relay before OpenDKIM, /dev/log a link to its socket) passes the datagrams to stdout, error and worse marked. opendkim.conf: Syslog yes, Canonicalization relaxed/simple, OversignHeaders From (RFC 6376 § 3.4, § 8.15). e2e: OpenDKIM's start line reaches the container log; every program RUNNING; DKIM verifies. Tested on the test server: go vet + go test of 26 packages, make e2e (all pass, 626 s) on this tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package syslogrelay
|
|
|
|
import (
|
|
"bytes"
|
|
"net"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestLine(t *testing.T) {
|
|
for in, want := range map[string]string{
|
|
"<22>Oct 15 09:00:00 opendkim[45]: 3A2B: DKIM-Signature field added (s=sp, d=example.com)\n": "opendkim[45]: 3A2B: DKIM-Signature field added (s=sp, d=example.com)",
|
|
"<19>Oct 5 09:00:00 opendkim[45]: key retrieval failed": "error: opendkim[45]: key retrieval failed",
|
|
"<20>opendkim[45]: no timestamp": "opendkim[45]: no timestamp",
|
|
"not syslog at all": "not syslog at all",
|
|
"<x>Oct 15 09:00:00 odd": "<x>Oct 15 09:00:00 odd",
|
|
} {
|
|
if got := Line([]byte(in)); got != want {
|
|
t.Errorf("Line(%q) = %q, want %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// syncBuffer is a bytes.Buffer the relay and the test may share.
|
|
type syncBuffer struct {
|
|
mu sync.Mutex
|
|
b bytes.Buffer
|
|
}
|
|
|
|
func (s *syncBuffer) Write(p []byte) (int, error) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
return s.b.Write(p)
|
|
}
|
|
|
|
func (s *syncBuffer) String() string {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
return s.b.String()
|
|
}
|
|
|
|
// What a program sends to the socket comes out as a line.
|
|
func TestRunRelaysADatagram(t *testing.T) {
|
|
if runtime.GOOS == "windows" {
|
|
t.Skip("no unixgram sockets on Windows; the container is Linux")
|
|
}
|
|
path := filepath.Join(t.TempDir(), "log")
|
|
out := &syncBuffer{}
|
|
go Run(path, out)
|
|
var conn net.Conn
|
|
var err error
|
|
for i := 0; i < 50; i++ {
|
|
if conn, err = net.Dial("unixgram", path); err == nil {
|
|
break
|
|
}
|
|
time.Sleep(20 * time.Millisecond)
|
|
}
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer conn.Close()
|
|
if _, err := conn.Write([]byte("<19>Oct 15 09:00:00 opendkim[7]: can't load key")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
deadline := time.Now().Add(2 * time.Second)
|
|
for time.Now().Before(deadline) && !strings.Contains(out.String(), "\n") {
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
if got := out.String(); got != "error: opendkim[7]: can't load key\n" {
|
|
t.Errorf("relayed %q", got)
|
|
}
|
|
}
|