monitoring script etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
monitoring script etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

23 Aralık 2014 Salı

NOC için Dashboard geliştirmesi - PHP - Perl - RestAPI

Merhaba,

Telekom hatları, şubeleri ve backbone cihazlarını tek sayfada izlemek isteyen bir müşterim için hazırladığım Dashboard'ı sizlerle paylaşmak isterim. Tamamen canlı bir dashboard ve arkasında ayrıca bir alarm mekanizmasına da sahip.

Uzun yıllar monitoring ve otomasyon işi yapmış biri olarak müşterilerin aldıkları ürünlerden hiçbir zaman tam performans alamadıklarını gördüm. Yüzbinlerce dolarlık ürünler yüzlerce karmaşık işi yapıyor fakat müşterinin istediği bazı şeyleri yapamıyordu. Müşteri hayalinde bir dashboard canlandırıyor ve networkünü bu şekilde izlemek istiyordu. Fakat ürünler bunu sağlayamadığı için hem müşteri tarafında memnuniyetsizlik oluşuyor, hem de projeyi yapan firmanın yetkinliği sorgulanıyordu.

Enterprise seviyede bir monitoring ürününü entegre ederken büyük bir firmada yine benzer bir sorunla karşılaştım. Müşteri büyük paralar karşılığında aldığı ürünü ile gelen dashboardları beğenmiyor ve istediği şekilde bir dashboard oluşturamamamıza anlam veremiyordu.

Müşteriden tam olarak istediği Dashboard ı kağıt kalem alıp çizmesini ve bana birkaç gün müsade etmesini istedim. Çizime göre bunu sadece elimdeki ürünle yapamayacağım aşikardı. İşte bu benim için yeni bir meydan okumaydı. Öncelikle monitoring ürününün API sini araştırdım. Ürün RestAPI interface ine sahipti ve istediğim pekçok veriyi (up-down, cpu high, interface down) gibi alarm verilerini bu arayüzden almam mümkündü. Tüm şube routerları ve backbone cihazları ile ilgili pek çok bilgiyi RestAPI ile alabilecektim.

Telekom hatları ile ilgili ise kendim bir pinger uygulaması yazmayı planladım. Dashboard ın yayınlanacağı sunucuda ayrıca birçok pinger uygulaması çalışacak ve telekom hatlarının ucundaki çeşitli cihazları pingleyerek hatların durumunu kontrol edecekti. Ayrıca gerekli durumlarda email ve sms atacaktı. Bunları da Perl ile yazmaya karar verdim.

Sıra Dashboard ekranın hazırlanmasına gelmişti. Bunu ise PHP ve HTML ile dizayn etmek çocuk oyuncağı idi. Sonuç itibari ile Perl, PHP, Html, Javascript, RestAPI birleşimi ile müşterinin hayallerinin de üstünde herşeyi izleyebileceği bir dashboard geliştirilmişti.

Dashboard, hem monitoring uygulamasından hem de perl ile yazdığım scriptlerden besleniyor ve 30 ar saniyelik aralıklarla kendini güncelliyordu.

Fikir olması açısından 4 ekrandan oluşan Dashboard ekranlarından birini paylaşmak isterim.

Alttaki ekran sıfırdan geliştirilmiş olup monitoring uygulamasından herhangi bir ekran yada görsel alınmamıştır.





Teşekkürler,
Cem Selmanoğulları


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ı

19 Aralık 2014 Cuma

Üzerinde SNMP agent bulunduran tüm cihazlardan snmp verisi çekmek için basit bir script...

Merhaba,

Network cihazları, sunucular ve üzerinde SNMP agent bulunduran tüm cihazlardan snmp verisi çekmek için basit bir script paylaşmak istiyorum.

Perl Net::SNMP kütüphanesini kullandığımız bu scriptte SNMP bağlantısı kurup belirlediğimiz bir OID ye karşılık gelen değer için istekte bulunuyor ve elde ettiğimiz sonucu ekrana bastırıyoruz.

IP, Community String ve istenen OID değerini scripte arguman olarak dışarıdan veriyoruz.

Bu scripti geliştirerek basit bir monitoring uygulaması yazmak mümkün olacaktır.


use Net::SNMP;

# SNMP OID değeri arguman olarak disaridan alinir
my $OID => $ARGV[2]

# IP adresi ve SNMP community string disaridan arguman olarak alinir
($session,$error) = Net::SNMP->session(IP => $ARGV[0],Community => $ARGV[1]);
die "SNMP Baglanti Hatasi: $error" unless ($session);

# Alinan SNMP OID degeri ile SNMP istegi yapilarak sonuc degiskenine atanir
$sonuc = $session->get_request($OID);

die "SNMP Istegi Hatasi: ".$session->error unless (defined $sonuc);

$session->close;

# SNMP OID degerine karsilik gelen deger ekrana bastirilir
print "SNMP OID Degeri: ".$sonuc->{".$OID."}";