23 Aralık 2014 Salı

Bir hata durumunda Alarm üreten, email atan script - (Alarm Clear özelliği ile birlikte)

Merhaba,

PERL ile basit bir monitoring uygulaması yazalım.
Bu uygulama linux makineye ssh ile bağlansın. Bir script çalıştırarak bu scriptin çıktısında içinde Alarm geçen satırlar olması durumunda email atsın. Çıktıdaki Alarm kelimeleri yok olduğunda ise hata düzeldi şeklinde email atsın.

Bunun için Perl ün Net::SSH2 kütüphanesini kullanıyoruz.
Linux makineye ssh ile bağlandıktan sonra ilgili scripti çalıştırıp çıktıyı alıyor ve işlemlerimize alttaki scriptteki açıklamalar ile devam ediyoruz.

Burda script kendi makinenizde çalışmakta ve uzaktaki makineye ssh ile bağlanmakta ve komut gönderip çıktısını alıp yine kendi makinenizde çıktıyı işlemektedir.


#!/usr/bin/perl -w
use Net::SSH2;
use warnings;
use strict;
no warnings 'uninitialized';


my $host = "192.168.10.1";
my $user = "myuser";
my $password = "mypassword";
my $ssh = Net::SSH2->new();

### SSH ile yukarıdaki ip adresine bağlanılır
   if(!$ssh->connect($host)){
     print("SSH Baglantisi Saglanamadi - $@ \n");
       exit(1);
   }
   if(!$ssh->auth_password($user,$password)){
     print("Kullanici Otantikasyon Sorunu - $@");
       exit(1);
   }

### Script çıktısı ve alarmları yazmak için Alarms.txt ve output.txt dosyaları oluşturulur.
my $myfilepath = "C:\\Otomasyon\\Alarms.txt";
unlink $myfilepath;
$myfilepath = "C:\\Otomasyon\\output.txt";
unlink $myfilepath;
my $output;

### showlines.pl scripti ssh bağlantısı üzerinden çalıştırılır ve çıktısı output a alınır.
        my $channel = $ssh->channel();
        $channel->shell();
        my @output;
        my $r=0;
        print $channel ("showlines.pl\n");
        @output=$channel->READLINE();
        print @output;
        $channel->close;
        $ssh->disconnect;                              
        print scalar @output;                              
                              
        for($r=0; $r < (scalar @output);$r++){
             print $output[$r]."\n";
        }
       
### Alınan çıktı output.txt dosyasına yazılır
        open (MYFILE, '>> C:\Otomasyon\output.txt');
        for($r=0; $r < (scalar @output);$r++){
              print MYFILE $output[$r]."\n";
        }                     
        close (MYFILE);                              

my $old_alarm_state = 0;                             
my $line="";

### Her kontrolde bir önceki kontrolde alınan alarmların sayıları ToplamAlarmSayisi.txt dosyasında tutulur
### Burada bir önceki kontrolde kaç alarm olduğu çekilir
        open (MYFILE, 'C:\Otomasyon\ToplamAlarmSayisi.txt');
          while (<MYFILE>) {
              chomp;
              $line = $_;                        
              $old_alarm_state = $line;
         }
                              
my $alarm_state = 0;
my $alarms="";                        
      
### Yeni kontrolde kaç alarm olduğu ve hangi satırlarda alarm olduğu çekilir
        open (MYFILE, 'C:\Otomasyon\output.txt');
          while (<MYFILE>) {
              chomp;
              $line = $_;
              if($line=~ m/Alarm/ || $line=~ m/alarm/ || $line=~ m/ALARM/){
                     $alarm_state++;
                     $alarms = $alarms.$line."\n";
              } else { }
          }

### Yeni alarm sayısı ToplamAlarmSayisi.txt dosyasına yazılır. Böylece bir sonraki kontrolde kullanılacak.
         open (MYFILE, '> C:\Otomasyon\ToplamAlarmSayisi.txt');
         print MYFILE $alarm_state;
         close (MYFILE);
               
### Eğer en az 1 alarm alındı ise Alarms.txt dosyasına alarm olan satırlar eklenir.
       if($alarm_state!=0) {
             open (MYFILE, '>> C:\Otomasyon\Alarms.txt');
             print MYFILE $alarms;
             close (MYFILE);
               
             open (MYFILE, '> C:\Otomasyon\ToplamAlarmSayisi.txt');
             print MYFILE $alarm_state;
             close (MYFILE);
       }

### Eski alarm sayısı sıfırdan büyük (yani eskiden alarm vardı). Yeni alarm sayısı sıfır ise alarm temizlendi demektir. Mailler temizlendi şeklinde Clear mesajı atılır.
       if($old_alarm_state!=0 && $alarm_state==0) {
            print "\n\nAlarm Temizlendi - Mail Gonderildi \n\n";
            system("wscript C:\\Otomasyon\\alarmtemizlendi.pl "."\"".$alarms."\"");
       }

### Eski alarm sayısı ve yeni alarm sayısı sıfır ise Alarm yok demektir ve mail atılmaz
### Eski alarm sayısı ve yeni alarm sayısı eşit ise bir değişiklik yok demektir email atılmaz
### Eski alarm sayısı sıfır ve yeni alarm sayısı en az 1 ise yeni alarm geldi demektir mail atılır.
### Eski alarm sayısı sıfırdan fazla ise ve yeni alarm sayısı eski alarmsayısından en az 1 fazla ise yeni bir   ### alarm geldi demektir. Mail atılır.

      if($old_alarm_state==0 && $alarm_state==0) {
            print "\n\nAlarm YOK >>>> Mail Gonderilmedi \n\n";
      } elsif($old_alarm_state==$alarm_state) {
            print "\n\nDurum Degisikligi Yok  >>>> Mail Gonderilmedi \n\n";
      } elsif($old_alarm_state==0 && $alarm_state!=0) {
            print "\n\nYeni Alarm Olustu >>>> Hic Alarm Yoktu -  Yeni Alarm Geldi";
            system("wscript C:\\Otomasyon\\alarmmailigonder.pl "."\"".$alarms."\"");
      } elsif($old_alarm_state!=0 && $alarm_state>$old_alarm_state) {
            print "Daha Once Alarm Vardi >>>> Ek Alarm Satiri Geldi";
            system("wscript C:\\Otomasyon\\alarmmailigonder.pl "."\"".$alarms."\"");
      }


Teşkkürler,
Cem Selmanoğulları

Hiç yorum yok:

Yorum Gönder