class SendmailParser
Public Class Methods
new(conf)
click to toggle source
# 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
Public Instance Methods
delay_parser(delay)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# File lib/fluent/plugin/sendmailparser.rb, line 98 def trim_bracket(val) val[1..-2] end