Class: SendmailParser

Inherits:
Object
  • Object
show all
Defined in:
lib/fluent/plugin/sendmailparser.rb

Instance Method Summary collapse

Constructor Details

#initialize(conf) ⇒ SendmailParser

Returns a new instance of SendmailParser.



2
3
4
# File 'lib/fluent/plugin/sendmailparser.rb', line 2

def initialize(conf)
  @base_regexp = /^(?<time>\w+\s+\w+\s+\d+:\d+:\d+) (?<mta>[^ ]+) (?<procowner>[^\[]+)\[(?<procid>\d+)\]: (?<qid>[^ ]+): (?<entry>(?<type>[^=]+).+)$/;
end

Instance Method Details

#delay_parser(delay) ⇒ Object



91
92
93
94
95
96
# File 'lib/fluent/plugin/sendmailparser.rb', line 91

def delay_parser(delay)
  /((?<day>[0-9]*)\+)?(?<hms>[0-9]{2,2}:[0-9]{2,2}:[0-9]{2,2})/ =~ delay
  day = day.to_i
  dtime = Time.parse(hms)
  delay = (day * 24 * 60 * 60) + (dtime.hour * 60 * 60) + (dtime.min * 60) + (dtime.sec)
end

#from_line(entry) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fluent/plugin/sendmailparser.rb', line 49

def from_line(entry)
  record = {}
  entry.split(", ").each {|param|
    key, val = param.split("=")
    record[key] = val
  }
  if record.has_key?("relay")
    record["relay_from"] = relay_parser(record["relay"])
    record.delete("relay")
  end
  return record
end

#parse(value) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/fluent/plugin/sendmailparser.rb', line 6

def parse(value)
  m = @base_regexp.match(value)
  unless m
    # $log.warn "sendmail: pattern not match: #{value.inspect}"
    return nil
  end
  time = Time.parse(m["time"]).to_i || Fluent::Engine.now.to_i
  record = {
    "time" => time,
    "mta" => m["mta"],
    "qid" => m["qid"],
    "type" => m["type"],
  }
  case m["type"]
  when "from"
    fromline = self.from_line(m["entry"])
    record.merge!(fromline)
  when "to"
    toline = self.to_line(m["entry"])
    record.merge!(toline)
  else # not match
    m =  nil
  end
  record
end

#relay_parser(relays) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/fluent/plugin/sendmailparser.rb', line 62

def relay_parser(relays)
  relay_host = nil
  relay_ip   = nil
  relays.split(" ").each {|relay|
    if relay.index("[") == 0
      return {"ip" => trim_bracket(relay), "host" => relay_host}
    else
      relay_host = relay
    end
  }
  return {"ip" => relay_ip, "host" => relay_host}
end

#status_parser(entry) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/fluent/plugin/sendmailparser.rb', line 75

def status_parser(entry)
  if entry.include?("stat=Sent")
    if entry.include?("mailer=local,")
      return "sent_local"
    else
      return "sent"
    end
  elsif entry.include?("dsn=5.")
    return "bounced"
  elsif entry.include?("stat=Deferred")
    return "deferred"
  else
    return "other"
  end
end

#to_line(entry) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/fluent/plugin/sendmailparser.rb', line 32

def to_line(entry)
  record = {}
  status = nil
  record["status_canonical"] = status_parser(entry)
  entry.split(", ").each {|param|
    key, val = param.split("=")
    record[key] = val
  }
  record["to"] = record["to"].split(",")
  if record.has_key?("relay")
    record["relay_to"] = relay_parser(record["relay"])
    record.delete("relay")
  end
  record["delay_in_sec"] = delay_parser(record["delay"])
  return record
end

#trim_bracket(val) ⇒ Object



98
99
100
# File 'lib/fluent/plugin/sendmailparser.rb', line 98

def trim_bracket(val)
  val[1..-2]
end