Skip to content

Commit b2b8cbc

Browse files
author
Matthew Fisher
committed
Revert "fix(logger): properly parse incoming syslog messages"
1 parent 7d29445 commit b2b8cbc

23 files changed

Lines changed: 306 additions & 2547 deletions

logger/Dockerfile

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
FROM deis/base:latest
22
MAINTAINER OpDemand <info@opdemand.com>
33

4-
# install go dependencies
5-
RUN apt-get update && apt-get install -yq \
6-
git \
7-
bzr \
8-
mercurial \
9-
--no-install-recommends
10-
114
# install go runtime
125
RUN wget -qO- https://storage.googleapis.com/golang/go1.3.1.linux-amd64.tar.gz | tar -C /usr/local -xz
136

@@ -20,13 +13,12 @@ ENV PATH /usr/local/bin:/usr/bin:/bin:/sbin:/usr/local/go/bin
2013
RUN mkdir -p /var/log/deis
2114

2215
# prepare execution environment
23-
WORKDIR /go/src/github.com/deis/deis/logger
16+
WORKDIR /app
2417
CMD ["/app/bin/boot"]
2518
EXPOSE 514
2619

27-
ADD bin/ /app/bin/
20+
ADD . /app
2821
ADD . /go/src/github.com/deis/deis/logger
2922

30-
# install dependencies
31-
RUN go get ./syslog
32-
RUN go install -v ./syslogd
23+
# compile the binary
24+
RUN cd /go/src/github.com/deis/deis/logger/syslogd && go install -v .

logger/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ test-style:
4242
-golint .
4343

4444
test-unit: test-style
45-
GOPATH=$(CURDIR)/../tests/_vendor:$(GOPATH) go test -v -cover ./syslog
45+
go test -v -cover ./syslog
4646

4747
test-functional:
4848
GOPATH=$(CURDIR)/../tests/_vendor:$(GOPATH) go test -v -timeout 20m ./tests/...

logger/syslog/filehandler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ func (h *FileHandler) checkErr(err error) bool {
8181
if err == nil {
8282
return false
8383
}
84+
if h.l == nil {
85+
log.Print(h.filename, ": ", err)
86+
} else {
87+
h.l.Print(h.filename, ": ", err)
88+
}
8489
return true
8590
}
8691

logger/syslog/filehandler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func TestSetLogger(t *testing.T) {
2929

3030
func TestHandle(t *testing.T) {
3131
fh := NewFileHandler("/tmp/test", 1, func(m *Message) bool { return true }, true)
32-
handle := fh.Handle(&Message{time.Now(), 0, time.Now(), "localhost", "test", "message"})
32+
handle := fh.Handle(&Message{time.Now(), nil, 0, 0, time.Now(), "localhost", "test", "message", "", ""})
3333
if handle == nil {
3434
t.Errorf("expected a handle, got nil")
3535
}

logger/syslog/message.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,46 @@ package syslog
22

33
import (
44
"fmt"
5-
"log/syslog"
5+
"net"
66
"time"
77
)
88

99
// Message defines an RFC 3164 syslog message.
1010
type Message struct {
11-
Time time.Time
12-
Priority syslog.Priority
13-
Timestamp time.Time
14-
Hostname string
15-
Tag string
16-
Content string
11+
Time time.Time // time the message was logged
12+
Source net.Addr // source address of the log message
13+
Facility // facility tag (see type Facility)
14+
Severity // severity tag (see type Severity)
15+
Timestamp time.Time // optional
16+
Hostname string // optional
17+
Tag string // message tag as defined in RFC 3164
18+
Content string // message content as defined in RFC 3164
19+
Tag1 string // alternate message tag (white rune as separator)
20+
Content1 string // alternate message content (white rune as separator)
21+
}
22+
23+
// NetSrc only network part of Source as string (IP for UDP or Name for UDS)
24+
func (m *Message) NetSrc() string {
25+
switch a := m.Source.(type) {
26+
case *net.UDPAddr:
27+
return a.IP.String()
28+
case *net.UnixAddr:
29+
return a.Name
30+
case *net.TCPAddr:
31+
return a.IP.String()
32+
}
33+
// Unknown type
34+
return m.Source.String()
1735
}
1836

1937
// String returns the Message in a string format. This satisfies the fmt.Stringer
2038
// interface.
2139
func (m *Message) String() string {
2240
timeLayout := "2006-01-02 15:04:05"
2341
return fmt.Sprintf(
24-
"%s %s: %s",
42+
"%s %s %s%s",
2543
m.Time.Format(timeLayout),
44+
m.Hostname,
2645
m.Tag,
2746
m.Content,
2847
)

logger/syslog/message_test.go

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,79 @@
11
package syslog
22

33
import (
4+
"net"
45
"testing"
56
"time"
67
)
78

9+
func TestMessageNetSrc(t *testing.T) {
10+
tcpAddress, err := net.ResolveTCPAddr("tcp", "localhost:1234")
11+
12+
if err != nil {
13+
t.Error("could not resolve TCP address")
14+
}
15+
16+
m := &Message{time.Now(), tcpAddress, 0, 0, time.Now(), "", "", "", "", ""}
17+
if m.NetSrc() != "127.0.0.1" {
18+
t.Errorf("expected 127.0.0.1, got %s", m.NetSrc())
19+
}
20+
21+
udpAddress, err := net.ResolveUDPAddr("udp", "localhost:1234")
22+
23+
if err != nil {
24+
t.Error("could not resolve UDP address")
25+
}
26+
27+
m.Source = udpAddress
28+
if m.NetSrc() != "127.0.0.1" {
29+
t.Errorf("expected 127.0.0.1, got %s", m.NetSrc())
30+
}
31+
32+
unixAddress, err := net.ResolveUnixAddr("unix", "/tmp/str")
33+
34+
if err != nil {
35+
t.Error("could not resolve unix address")
36+
}
37+
38+
m.Source = unixAddress
39+
if m.NetSrc() != "/tmp/str" {
40+
t.Errorf("expected /tmp/str, got %s", m.NetSrc())
41+
}
42+
43+
unknownAddress, err := net.ResolveIPAddr("ip4", "localhost")
44+
45+
if err != nil {
46+
t.Error("could not resolve unknown address")
47+
}
48+
49+
m.Source = unknownAddress
50+
if m.NetSrc() != "127.0.0.1" {
51+
t.Errorf("expected 127.0.0.1, got %s", m.NetSrc())
52+
}
53+
}
54+
855
func TestMessageFormat(t *testing.T) {
9-
m := &Message{time.Now(), 34, time.Now(), "localhost", "test", "hello world"}
56+
tcpAddress, err := net.ResolveTCPAddr("tcp", "localhost:1234")
57+
58+
if err != nil {
59+
t.Errorf("could not resolve TCP address")
60+
}
61+
62+
m := &Message{
63+
time.Now(),
64+
tcpAddress,
65+
0,
66+
0,
67+
time.Now(),
68+
"localhost",
69+
"TEST",
70+
"hello world",
71+
"",
72+
"",
73+
}
1074

1175
timeLayout := "2006-01-02 15:04:05"
12-
expectedOutput := m.Time.Format(timeLayout) + " test: hello world"
76+
expectedOutput := m.Time.Format(timeLayout) + " localhost TESThello world"
1377
if m.String() != expectedOutput {
1478
t.Errorf("expected '" + expectedOutput + "', got '" + m.String() + "'.")
1579
}

logger/syslog/priority.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package syslog
2+
3+
// Facility represents a message source as defined by RFC 3164.
4+
type Facility byte
5+
6+
// The following is a list of Facilities as defined by RFC 3164.
7+
const (
8+
Kern Facility = iota // kernel messages
9+
User // user-level messages
10+
Mail // mail system
11+
Daemon // system daemons
12+
Auth // security/authorization messages
13+
Syslog // messages internal to syslogd
14+
Lpr // line printer subsystem
15+
News // newtork news subsystem
16+
Uucp // UUCP subsystem
17+
Cron // cron messages
18+
Authpriv // security/authorization messages
19+
System0 // historically FTP daemon
20+
System1 // historically NTP subsystem
21+
System2 // historically log audit
22+
System3 // historically log alert
23+
System4 // historically clock daemon, some operating systems use this for cron
24+
Local0 // local use 0
25+
Local1 // local use 1
26+
Local2 // local use 2
27+
Local3 // local use 3
28+
Local4 // local use 4
29+
Local5 // local use 5
30+
Local6 // local use 6
31+
Local7 // local use 7
32+
)
33+
34+
var facToStr = [...]string{
35+
"kern",
36+
"user",
37+
"mail",
38+
"daemon",
39+
"auth",
40+
"syslog",
41+
"lpr",
42+
"news",
43+
"uucp",
44+
"cron",
45+
"authpriv",
46+
"system0",
47+
"system1",
48+
"system2",
49+
"system3",
50+
"system4",
51+
"local0",
52+
"local1",
53+
"local2",
54+
"local3",
55+
"local4",
56+
"local5",
57+
"local6",
58+
"local7",
59+
}
60+
61+
// String returns a string representation of the Facility. This satisfies the
62+
// fmt.Stringer interface.
63+
func (f Facility) String() string {
64+
if f > Local7 {
65+
return "unknown"
66+
}
67+
return facToStr[f]
68+
}
69+
70+
// Severity represents a level of messsage importance.
71+
type Severity byte
72+
73+
const (
74+
// Emerg - system is unusable
75+
Emerg Severity = iota
76+
// Alert - immediate action required
77+
Alert
78+
// Crit - critical conditions
79+
Crit
80+
// Err - error conditions
81+
Err
82+
// Warning - warning conditions
83+
Warning
84+
// Notice - normal but significant condition
85+
Notice
86+
// Info - information message
87+
Info
88+
// Debug - debug-level message
89+
Debug
90+
)
91+
92+
var sevToStr = [...]string{
93+
"emerg",
94+
"alert",
95+
"crit",
96+
"err",
97+
"waining",
98+
"notice",
99+
"info",
100+
"debug",
101+
}
102+
103+
// String returns a string representation of the Severity. This satisfies the
104+
// fmt.Stringer interface.
105+
func (s Severity) String() string {
106+
if s > Debug {
107+
return "unknown"
108+
}
109+
return sevToStr[s]
110+
}

logger/syslog/priority_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package syslog
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestFacilityToString(t *testing.T) {
8+
var fac Facility = 100
9+
if fac.String() != "unknown" {
10+
t.Errorf("facility != unknown; got %s", fac.String())
11+
}
12+
fac = 20
13+
if fac.String() != "local4" {
14+
t.Errorf("facility != local4; got %s", fac.String())
15+
}
16+
}
17+
18+
func TestSeverityToString(t *testing.T) {
19+
var sev Severity = 100
20+
if sev.String() != "unknown" {
21+
t.Errorf("severity != unknown; got %s", sev.String())
22+
}
23+
sev = 5
24+
if sev.String() != "notice" {
25+
t.Errorf("severity != local4; got %s", sev.String())
26+
}
27+
}

0 commit comments

Comments
 (0)