summaryrefslogtreecommitdiff
path: root/vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go')
-rw-r--r--vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go292
1 files changed, 0 insertions, 292 deletions
diff --git a/vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go b/vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go
deleted file mode 100644
index 486a0cb54..000000000
--- a/vendor/gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser/rfc3164/rfc3164.go
+++ /dev/null
@@ -1,292 +0,0 @@
-package rfc3164
-
-import (
- "bytes"
- "os"
- "time"
-
- "gopkg.in/mcuadros/go-syslog.v2/internal/syslogparser"
-)
-
-type Parser struct {
- buff []byte
- cursor int
- l int
- priority syslogparser.Priority
- version int
- header header
- message rfc3164message
- location *time.Location
- skipTag bool
-}
-
-type header struct {
- timestamp time.Time
- hostname string
-}
-
-type rfc3164message struct {
- tag string
- content string
-}
-
-func NewParser(buff []byte) *Parser {
- return &Parser{
- buff: buff,
- cursor: 0,
- l: len(buff),
- location: time.UTC,
- }
-}
-
-func (p *Parser) Location(location *time.Location) {
- p.location = location
-}
-
-func (p *Parser) Parse() error {
- tcursor := p.cursor
- pri, err := p.parsePriority()
- if err != nil {
- // RFC3164 sec 4.3.3
- p.priority = syslogparser.Priority{13, syslogparser.Facility{Value: 1}, syslogparser.Severity{Value: 5}}
- p.cursor = tcursor
- content, err := p.parseContent()
- p.header.timestamp = time.Now().Round(time.Second)
- if err != syslogparser.ErrEOL {
- return err
- }
- p.message = rfc3164message{content: content}
- return nil
- }
-
- tcursor = p.cursor
- hdr, err := p.parseHeader()
- if err == syslogparser.ErrTimestampUnknownFormat {
- // RFC3164 sec 4.3.2.
- hdr.timestamp = time.Now().Round(time.Second)
- // No tag processing should be done
- p.skipTag = true
- // Reset cursor for content read
- p.cursor = tcursor
- } else if err != nil {
- return err
- } else {
- p.cursor++
- }
-
- msg, err := p.parsemessage()
- if err != syslogparser.ErrEOL {
- return err
- }
-
- p.priority = pri
- p.version = syslogparser.NO_VERSION
- p.header = hdr
- p.message = msg
-
- return nil
-}
-
-func (p *Parser) Dump() syslogparser.LogParts {
- return syslogparser.LogParts{
- "timestamp": p.header.timestamp,
- "hostname": p.header.hostname,
- "tag": p.message.tag,
- "content": p.message.content,
- "priority": p.priority.P,
- "facility": p.priority.F.Value,
- "severity": p.priority.S.Value,
- }
-}
-
-func (p *Parser) parsePriority() (syslogparser.Priority, error) {
- return syslogparser.ParsePriority(p.buff, &p.cursor, p.l)
-}
-
-func (p *Parser) parseHeader() (header, error) {
- hdr := header{}
- var err error
-
- ts, err := p.parseTimestamp()
- if err != nil {
- return hdr, err
- }
-
- hostname, err := p.parseHostname()
- if err != nil {
- return hdr, err
- }
-
- hdr.timestamp = ts
- hdr.hostname = hostname
-
- return hdr, nil
-}
-
-func (p *Parser) parsemessage() (rfc3164message, error) {
- msg := rfc3164message{}
- var err error
-
- if !p.skipTag {
- tag, err := p.parseTag()
- if err != nil {
- return msg, err
- }
- msg.tag = tag
- }
-
- content, err := p.parseContent()
- if err != syslogparser.ErrEOL {
- return msg, err
- }
-
- msg.content = content
-
- return msg, err
-}
-
-// https://tools.ietf.org/html/rfc3164#section-4.1.2
-func (p *Parser) parseTimestamp() (time.Time, error) {
- var ts time.Time
- var err error
- var tsFmtLen int
- var sub []byte
-
- tsFmts := []string{
- time.Stamp,
- time.RFC3339,
- }
- // if timestamps starts with numeric try formats with different order
- // it is more likely that timestamp is in RFC3339 format then
- if c := p.buff[p.cursor]; c > '0' && c < '9' {
- tsFmts = []string{
- time.RFC3339,
- time.Stamp,
- }
- }
-
- found := false
- for _, tsFmt := range tsFmts {
- tsFmtLen = len(tsFmt)
-
- if p.cursor+tsFmtLen > p.l {
- continue
- }
-
- sub = p.buff[p.cursor : tsFmtLen+p.cursor]
- ts, err = time.ParseInLocation(tsFmt, string(sub), p.location)
- if err == nil {
- found = true
- break
- }
- }
-
- if !found {
- p.cursor = len(time.Stamp)
-
- // XXX : If the timestamp is invalid we try to push the cursor one byte
- // XXX : further, in case it is a space
- if (p.cursor < p.l) && (p.buff[p.cursor] == ' ') {
- p.cursor++
- }
-
- return ts, syslogparser.ErrTimestampUnknownFormat
- }
-
- fixTimestampIfNeeded(&ts)
-
- p.cursor += tsFmtLen
-
- if (p.cursor < p.l) && (p.buff[p.cursor] == ' ') {
- p.cursor++
- }
-
- return ts, nil
-}
-
-func (p *Parser) parseHostname() (string, error) {
- oldcursor := p.cursor
- hostname, err := syslogparser.ParseHostname(p.buff, &p.cursor, p.l)
- if err == nil && len(hostname) > 0 && string(hostname[len(hostname)-1]) == ":" { // not an hostname! we found a GNU implementation of syslog()
- p.cursor = oldcursor - 1
- myhostname, err := os.Hostname()
- if err == nil {
- return myhostname, nil
- }
- return "", nil
- }
- return hostname, err
-}
-
-// http://tools.ietf.org/html/rfc3164#section-4.1.3
-func (p *Parser) parseTag() (string, error) {
- var b byte
- var endOfTag bool
- var bracketOpen bool
- var tag []byte
- var err error
- var found bool
-
- from := p.cursor
-
- for {
- if p.cursor == p.l {
- // no tag found, reset cursor for content
- p.cursor = from
- return "", nil
- }
-
- b = p.buff[p.cursor]
- bracketOpen = (b == '[')
- endOfTag = (b == ':' || b == ' ')
-
- // XXX : parse PID ?
- if bracketOpen {
- tag = p.buff[from:p.cursor]
- found = true
- }
-
- if endOfTag {
- if !found {
- tag = p.buff[from:p.cursor]
- found = true
- }
-
- p.cursor++
- break
- }
-
- p.cursor++
- }
-
- if (p.cursor < p.l) && (p.buff[p.cursor] == ' ') {
- p.cursor++
- }
-
- return string(tag), err
-}
-
-func (p *Parser) parseContent() (string, error) {
- if p.cursor > p.l {
- return "", syslogparser.ErrEOL
- }
-
- content := bytes.Trim(p.buff[p.cursor:p.l], " ")
- p.cursor += len(content)
-
- return string(content), syslogparser.ErrEOL
-}
-
-func fixTimestampIfNeeded(ts *time.Time) {
- now := time.Now()
- y := ts.Year()
-
- if ts.Year() == 0 {
- y = now.Year()
- }
-
- newTs := time.Date(y, ts.Month(), ts.Day(), ts.Hour(), ts.Minute(),
- ts.Second(), ts.Nanosecond(), ts.Location())
-
- *ts = newTs
-}