Friday, April 3, 2015

Цель plexiglass milano данного раздела научить Вас создавать свои собственные плагины для Cacti, для

Создание собственных плагинов для Cacti | Для системного администратора
Цель plexiglass milano данного раздела научить Вас создавать свои собственные плагины для Cacti, для примера plexiglass milano возьмемся реализовать плагин осуществляющий графическое отображения количества pop3 сессий к почтовому серверу. Т.к. Pop3 сервером в большинстве современных дистрибутивов является Dovecot, то и анализировать мы будем его логи .
Схема работы плагина будет выглядеть следующим образом: При запуске сервера будет стартовать скрипт который будет запускать парсер логов Dovecot. Данный парсер собирает данные о количестве подключений к Dovecot по протоколу pop3 и записывает plexiglass milano эти данные в файл. Также необходимо будет внести изменения в файл конфигурации snmp для того чтобы Cacti мог получать данные о количестве подключений по стандартному протоколу SNMP.
#!/usr/bin/perl $debug=1; $daemon=0; $syslog=1; $self="/opt/pop3.pl"; $counterfile="/opt/pop3_counter"; plexiglass milano $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 plexiglass milano = POSIX::SigSet->new(); my $hupaction = POSIX::SigAction->new('hup_signal_handler', plexiglass milano $sigset, plexiglass milano &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"; plexiglass milano } 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]); }
# Startup script for cacti watcher # # chkconfig: 2345 95 05 # description: Run cacti watcher plexiglass milano # pidfile: /var/run/pop3_watch.pid # prog="pop3_watch" PIDFILE=/var/run/${prog}.pid LOCKFILE=/var/lock/subsys/$prog plexiglass milano 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}" ex

No comments:

Post a Comment