Простой Ruby скрипт для получения текущего кол-ва писем в exim и postfix


В одном из проектов необходимо было на Ruby написать скрипт который получал бы кол-во писем из exim/postfix и по SNMP отправлял бы данные. Ввиду того что парк серверов состоял из freebsd и linux, необходимо было сделать скрипт универсальным.

Ruby Exim Postfix

Собственно сам скрипт выглядит вот так:

#!/usr/bin/env ruby
#
# Additional usage:
# Set this in your /path/to/snmpd.conf
# ------output ommited------
# extend .1.3.6.1.4.1.xxxx.xx snmpspool /path/to/this_script.rb
# ------output ommited------
#
# example:
# exim -bpc
# >350
# snmpwalk -v 2c -c secret localhost .110.109.112.115.112.111.111.108.1
# >UCD-SNMP-MIB::ucdavis.110.109.112.115.112.111.111.108.1 = STRING: "350"
# Find OS
if File.file?('/usr/bin/uname')
        exe = `/usr/bin/uname`
else
        exe = `/bin/uname`
end
os = exe.chomp

# Select OS,MTA and check their spool
case os
   when "Linux"
      if File.file?('/usr/sbin/exim')
         mta = `/usr/sbin/exim -bpc`
         out_spool = mta.chomp
      elsif File.file?('/usr/sbin/postqueue')
     mta = `/usr/sbin/postqueue -p | awk '{print $1}' | grep -i '[0-9][A-Z]'`
     out_spool = mta.split("\n").count.to_i
      else
         puts "Cannot find MTA. Make sure you have one and it's running"
      end

   when "FreeBSD"
      if File.file?('/usr/local/sbin/exim')
         mta = `/usr/local/sbin/exim -bpc`
         out_spool = mta.chomp
      elsif File.file?('/usr/local/sbin/postqueue')
         mta = `/usr/local/sbin/postqueue -p | awk '{print $1}' | grep -i '[0-9][A-Z]'`
         out_spool = mta.split("\n").count.to_i
      else
         puts "Cannot find MTA. Make sure you have one and it's running"
   end
end

# OUT

puts out_spool

Таким образом работать мы получаем кол-во текущих писем в postfix или exim. Далее добавим в snmpd.conf новый MIB:

extend .1.3.6.1.4.1.xxxx.xx snmpspool /path/to/this_script.rb

Вместо xxxx.xx необходимо найти свободный MIB, как это сделать можно найти вот ТУТ

Вот и все!

P.S

Конечно не стоило усложнять задачу и писать на bash, но конкретно в данном случае мне был необходим именно ruby, можно было и проще написать но увы, не хватало времени. Да и скрипт то не тяжелый :)


Наверх