Changeset 3f101f068925bb2945f43579b29a13d33088a227

Show
Ignore:
Timestamp:
01/27/12 21:17:16 (2 years ago)
Author:
Philip Maddox <pmaddox@circonus.com>
git-committer:
Philip Maddox <pmaddox@circonus.com> 1327699036 -0500
git-parent:

[92ea84fba40e491c2a29a0f6a1c94b6af12146d9]

git-author:
Philip Maddox <pmaddox@circonus.com> 1327699036 -0500
Message:

Added support for reporting SASL responses for PLAIN and LOGIN commands

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules-lua/noit/module/smtp.lua

    rde30ea9 r3f101f0  
    6464               required="optional" 
    6565               allowed=".+">A list of ciphers to be used in the SSL protocol (for SSL checks).</parameter> 
     66    <parameter name="sasl_authentication" 
     67               required="optional" 
     68               default="off" 
     69               allowed="(?:off|login|plain)">Specifies the type of SASL Authentication to use</parameter> 
     70    <parameter name="sasl_user" 
     71               required="optional" 
     72               default="" 
     73               allowed=".+">The SASL Authentication username</parameter> 
     74    <parameter name="sasl_password" 
     75               required="optional" 
     76               default="" 
     77               allowed=".+">The SASL Authentication password</parameter> 
     78    <parameter name="sasl_auth_id" 
     79               required="optional" 
     80               default="" 
     81               allowed=".+">The SASL Authorization Identity</parameter> 
    6682  </checkconfig> 
    6783  <examples> 
     
    177193end 
    178194 
     195local function mk_sasllogin(e, check) 
     196  return function (username, password)  
     197    local start_time = noit.timeval.now() 
     198    local actual_code = 0 
     199    local message = "" 
     200    local success = "true" 
     201    write_cmd(e, "AUTH LOGIN") 
     202    actual_code, message = read_cmd(e) 
     203    if actual_code ~= 334 then 
     204      success = "false" 
     205    end 
     206    if success == "true" then 
     207      write_cmd(e, username) 
     208      actual_code, message = read_cmd(e) 
     209      if actual_code ~= 334 then 
     210        success = "false" 
     211      end 
     212    end 
     213    if success == "true" then 
     214      write_cmd(e, password) 
     215      actual_code, message = read_cmd(e) 
     216      if actual_code ~= 235 then 
     217        success = "false" 
     218      end 
     219    end 
     220    local elapsed = noit.timeval.now() - start_time 
     221    local elapsed_ms = math.floor(tostring(elapsed) * 1000) 
     222    check.metric("sasl_login_time",  elapsed_ms) 
     223    check.metric("sasl_login_success", success) 
     224    check.metric("sasl_login_response", message) 
     225    return success 
     226  end 
     227end 
     228 
     229local function mk_saslplain(e, check) 
     230  return function (cmd_string) 
     231    local start_time = noit.timeval.now() 
     232    local actual_code = 0 
     233    local message = "" 
     234    local success = "true" 
     235    write_cmd(e, "AUTH PLAIN") 
     236    actual_code, message = read_cmd(e) 
     237    if actual_code ~= 334 then 
     238      success = "false" 
     239    end 
     240    if success == "true" then 
     241      write_cmd(e, cmd_string) 
     242      actual_code, message = read_cmd(e) 
     243      if actual_code ~= 235 then 
     244        success = "false" 
     245      end 
     246    end 
     247    local elapsed = noit.timeval.now() - start_time 
     248    local elapsed_ms = math.floor(tostring(elapsed) * 1000) 
     249    check.metric("sasl_plain_time",  elapsed_ms) 
     250    check.metric("sasl_plain_success", success) 
     251    check.metric("sasl_plain_response", message) 
     252    return success 
     253  end 
     254end 
     255 
    179256function initiate(module, check) 
    180257  local starttime = noit.timeval.now() 
     
    198275  local status = 'connected' 
    199276  local action = mkaction(e, check) 
     277  local sasl_login = mk_sasllogin(e, check) 
     278  local sasl_plain = mk_saslplain(e, check) 
    200279 
    201280  if     not action("banner", nil, 220) 
     
    225304  end 
    226305 
     306  if check.config.sasl_authentication ~= nil then 
     307    if check.config.sasl_authentication == "login" then 
     308      sasl_login(noit.base64_encode(check.config.sasl_user or ""), noit.base64_encode(check.config.sasl_password or "")) 
     309    elseif check.config.sasl_authentication == "plain" then 
     310      sasl_plain(noit.base64_encode((check.config.sasl_auth_id or "") .. "\0" .. (check.config.sasl_user or "") .. "\0" .. (check.config.sasl_password or ""))) 
     311    end 
     312  end 
     313 
    227314  if     action("mailfrom", mailfrom, 250) 
    228315     and action("rcptto", rcptto, 250)