headermask image
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Создание собственных плагинов для Cacti

Цель данного раздела научить Вас создавать свои собственные плагины для Cacti, для примера возьмемся реализовать плагин осуществляющий графическое отображения количества pop3 сессий к почтовому серверу. Т.к. Pop3 сервером в большинстве современных дистрибутивов является Dovecot, то и анализировать мы будем его «логи».

Схема работы плагина будет выглядеть следующим образом: При запуске сервера будет стартовать скрипт который будет запускать парсер логов Dovecot. Данный парсер собирает данные о количестве подключений к Dovecot по протоколу pop3 и записывает эти данные в файл. Также необходимо будет внести изменения в файл конфигурации snmp для того чтобы Cacti мог получать данные о количестве подключений по стандартному протоколу SNMP.

Ниже приведенный скрипт который «парсит» лог файл Dovecot, создан на основе Perl скрипта написанного Jason Warnes для анализа логов Sendmail.

Создайте в каталоге /opt файл pop3.pl следующего содержания:

#!/usr/bin/perl$debug=1;

$daemon=0;

$syslog=1;

$self="/opt/pop3.pl";

$counterfile="/opt/pop3_counter";

$resetfile="/opt/pop3_reset";

$pidfile="/var/run/pop3_watch.pid";

use Sys::Syslog;

use POSIX;

use Time::HiRes qw( gettimeofday tv_interval );

$|=1;

my $sigset = POSIX::SigSet->new();

my $hupaction = POSIX::SigAction->new('hup_signal_handler',

                                     $sigset,

                                     &POSIX::SA_NODEFER);

my $osigaction = POSIX::SigAction->new('signal_handler',

                                     $sigset,

                                     &POSIX::SA_NODEFER);

POSIX::sigaction(&POSIX::SIGHUP, $hupaction);

POSIX::sigaction(&POSIX::SIGINT, $osigaction);

POSIX::sigaction(&POSIX::SIGTERM, $osigaction);

if($daemon){

       $pid=fork;

       if($pid) {

               open(PID,">".$pidfile) or die "Cannot open PID file: $!.";

                       print PID ("$pid\n");

               close(PID);

       }

       exit if $pid;

       die "Couldn't fork : $!" unless defined($pid);

       setsid() or die "Can't start a new session: $!";

       $time_to_die=0;

}

sub signal_handler {

       $time_to_die=1;

}

sub hup_signal_handler {

     if($debug){print "got SIGHUP\n";}

     exec($self) or die "Couldn't restart: $!\n";

}

if($syslog){openlog("pop3_log","pid","daemon");}

if($syslog){syslog("notice","Starting.");}

if($debug){print("pop3log is starting.\n");}

# Main part of the program

open(MAILLOG, "tail -n 0 -f /var/log/maillog|") or die "Cannot open maillog: $!.";

while(!$time_to_die){

       $line=<MAILLOG>;

       if($line=~/pop3-login:/){

               $item="pop3";

               &readcounterfile;

               $counter{$item}++;

               if($debug){print("Found pop3 login to $counter{$item}.\n");}

               &writecounterfile;

       }

}close(SYSLOG);

if($debug){print("pop3log is ending.\n");}

if($syslog){syslog("notice","Ending.");}

unlink($pidfile);

# Subroutine to read the contents of the counter file

sub readcounterfile {

       # Read the counter values from the file

       if($debug){print("Reading contents of counter file.\n");}

       open(COUNTER,$counterfile);

       while($line=<COUNTER>){

               @line=split(/\:/,$line);

               chop($line[1]); # Drop the trailing LF off the value

               # Check for reset counter flag file

               if(-e $resetfile."_".$line[0]){

                       if($debug){print("Reset counter flag file found for counter $line[0], resetting  counter value to 0.\n");}

                       $counter{$line[0]}=0;

                       unlink($resetfile."_".$line[0]);

               } else {

                       $counter{$line[0]}=$line[1];

               }

               if($debug){print("Counter $line[0] = $counter{$line[0]}.\n");}

       }

       close(COUNTER);

}

sub writecounterfile {

       if($debug){print("Writing counter values to counter file.\n");}

       open(COUNTER,">".$counterfile);

       # Write each counter item out to the counter file

       foreach $item (sort keys(%counter)) {

               print COUNTER ($item."\:".$counter{$item}."\n");

       }

       close(COUNTER);

       chmod(0666,$counterfile);

}

В каталоге /opt создайте файл snmp-pop3.pl следующего содержания: Данный файл считывает данные из файла созданного pop3.pl, создает файл pop3_reset по наличию которого pop3.pl производит обнуление счетчиков.

$counterfile="/opt/pop3_counter";$resetfile="/opt/pop3_reset";

$oid{"pop3"}=".1.3.6.1.4.100.1";

&readcounterfile;

if($counter{$ARGV[0]}==""){$counter{$ARGV[0]}=0;}

if(-e $resetfile."_".$ARGV[0]){$counter{$ARGV[0]}=0;}

print "$oid{$ARGV[0]}\ngauge\n$counter{$ARGV[0]}\n";

&createresetflagfile;

sub readcounterfile {

   open(COUNTER,$counterfile);

   while($line=<COUNTER>)

   {

           @line=split(/\:/,$line);

           chop($line[1]); # Drop the trailing LF off the value

           $counter{$line[0]}=$line[1];

   }

close(COUNTER);

}

sub createresetflagfile {

   open(RESET,">".$resetfile."_".$ARGV[0]);

   close(RESET);

   chmod(0666,$resetfile."_".$ARGV[0]);

}

Теперь создадим стартовый скрипт который будет запускать pop3.pl при запуске сервера. В каталоге /etc/init.d создайте файл cactiwatcher следующего содержания:

# Startup script for cacti watcher#

# chkconfig: 2345 95 05

# description: Run cacti watcher

# pidfile: /var/run/pop3_watch.pid

#

prog="pop3_watch"

PIDFILE=/var/run/${prog}.pid

LOCKFILE=/var/lock/subsys/$prog

start() {

   echo -n $"Starting $prog: "

   daemon /opt/pop3.pl

   RETVAL=$?

   if [ $RETVAL -ne 0 ]; then

       failure;

   fi;

   echo

   return $RETVAL

}

stop() {

   echo -n $"Stopping $prog: "

   if [ -f $PIDFILE ]; then

       killproc pop3.pl

       RETVAL=$?

       if [ $RETVAL -ne 0 ]; then

           failure;

       fi;

   else

       RETVAL=1

       failure;

   fi

   echo

   return $RETVAL

}

case "$1" in

       start)

           start

           ;;

       stop)

           stop

           ;;

       status)

           status pop3.pl

           ;;

       restart)

           stop

           start

           ;;

       condrestart)

           if [ -f $LOCKFILE ]; then

               stop

               start

           fi

           ;;

       *)

           echo $"Usage: $0 {start|stop|restart|condrestart|status}"

           exit 1

esac

exit $RETVAL

  • Добавьте cactiwatcher в автоматический запуск.

chkconfig –add  cactiwatcherchkconfig –level 3 cactiwatcher on

Осталось внести изменения в файл /etc/snmp/snmpd.conf для того чтобы Cacti мог получать данные о количестве pop3 сессий через стандартный протокол SNMP.

В файл /etc/snmp/snmpd.conf последней строкой добавьте следующую

pass .1.3.6.1.4.100.1 /opt/snmp-pop3.pl pop3

Перезапустите демон snmpd:

service snmpd restart

Дело осталось за малым. Зайдите в интерфейс cacti, перейдите в раздел «Data Templates» нажмите «Add».

cacti44.png

Заполните поля: Раздел: Data Templates. Name: «Get pop3 counter» – имя шаблона данных.

Раздел: Data Source. Name: «Get pop3 counters» Data Input Method: Get SNMP Data

Раздел: Data Source Item Internal Data Source Name: pop3 Data Source Type: GAUGE

Нажмите «Save», откроется окно с дополнительными опциями «Custom Data» в котором в поле «OID» Вам необходимо ввести .1.3.6.1.4.100.1

cacti45.png

Нажмите «Save» и убедитесь, что Ваш шаблон данных «Data Templates» с именем «Get pop3 counter» присутствует в общем списке шаблонов.

cacti46.png

Перейдите в пункт «Graph Templates»

cacti47.png

и нажмите «Add».

Перед Вами откроется окно в котором Вам необходимо создать графический шаблон «Graph Templates» на основе только что созданного шаблона данных «Data Templates».

cacti48.png

Заполните поля:

Раздел: Template Name: Dovecot counter

Раздел: Graph Template Title: Pop3 Session counter

Остальные поля оставьте в значениях «По умолчанию».

Нажмите «Create», откроется окно с дополнительными настройками создаваемого графического шаблона.

cacti49.png

В разделе «Graph Template Items» нажмите «Add». В появившемся окне в меню «Data Source» выберите уже созданный шаблон данных «Data Templates» с именем «Get pop3 counter». В разделе «Color» выберите цвет создаваемого графика В разделе «Graph Item Type» укажите тип графика, «AREA» – значит закрашенная область. В разделе «Consolidation Function» выберите тип «AVERAGE». В разделе CDEF Function выберите «None».

cacti50.png

Нажмите «Create»

cacti51.png

  • Теперь нам необходимо назначить созданный графический шаблон «Graph Template» хосту с которого мы будем снимать информацию.

Перейдите в раздел «Devices».

cacti52.png

Выберите Ваш почтовый сервер (Предполагается, что Вы уже добавили этот хост в Cacti).

Перейдите в раздел «Associated Graph Templates» и в выпадающем списке «Add Graph Template:» выберите «Dovecot counter» (т.е. То имя которое мы присвоили нашему графическому шаблону).

cacti53.png

После этого наш графический шаблон должен быть в общем списке шаблонов присвоенных данному хосту.

cacti54.png

Теперь нажмите ссылку «Create Graphs for this Host» в верхней части настроек хоста

cacti55.png

В появившемся списке отметьте галочкой пункт «Dovecot counter»

cacti56.png

Настройка закончена. Через некоторое время данные начнут отображаться на графике.

cacti57.png

cacti58.png

 

Автор: Денис Фролов

Постовой

Если вам хоть в какой то степени интересна такая тема, как рыбалка, тогда портал www.rybalka.com это настоящая находка для вас. Можно завести свой личный блог на поддомене и писать туда свои басни :) Отличный форум, и девушки там отличные ..

Качественное устройство для усиления сигнала сотовой связи поможет вам избежать помех во время разговора и различных сбоев. Особо рекомендуется в местах с очень низким уровнем сигнала.