SNMP MIB browser di Perl dan JavaScript

Apa yang harus dilakukan di tempat kerja jika Anda tidak tahu harus berbuat apa lagi? Tentu saja, tulis ke Habr!





Berkat legislator kami yang gagah berani, pengembangan bisnis kami sendiri lebih lanjut tidak menguntungkan dan kami pergi di bawah operator yang lebih besar. Jadi saya memiliki situasi sedemikian rupa sehingga tidak ada gunanya memodifikasi, menulis ulang, dan memperbaiki proyek lama saya - tidak, "orang besar" memiliki semua layanannya. Saya duduk dan merokok . Dan kemudian saya berpikir, mengapa duduk, saya akan menulis kepada Habr . Artikel itu dimoderasi, "Dan kemudian Ostap menderita ...".





Jadi tentang apa artikel ini. Siapapun yang terlibat dalam jaringan, cepat atau lambat akan menemukan MIB . Bagi mereka yang terlalu malas untuk mengikuti tautan, ini adalah basis data yang berisi informasi tentang suatu objek, dalam kasus kami, perangkat jaringan. Ada beberapa artikel tentang Habré yang ditujukan untuk bekerja dengan MIB dan pertanyaan-pertanyaan yang muncul dari sini. Saya menyukai artikel SNMP MIB dan Cara Mempersiapkannya, di mana penulis menggunakan alat dari D-Link - utilitas D-View untuk bekerja dengan MIB. Saya harus segera mengatakan, mengetahui kualitas MIB dari vendor ini - Saya tidak merekomendasikan menggunakan D-View dalam proyek nyata. Namun, itu memberikan gambaran tentang antarmuka khas perangkat lunak tersebut. Anehnya, tidak ada begitu banyak program untuk bekerja secara langsung dengan MIB, fungsinya mirip dengan setidaknya D-View. Saya bahkan akan mengatakan sangat sedikit . Saya tidak akan menjelaskan semua pro dan kontra mereka. Di sini saya ingin menunjukkan implementasi saya, mungkin bukan yang terbaik, tetapi ditulis "untuk saya sendiri" dan fungsionalitasnya ditambahkan sesuai kebutuhan.





Jadi, seluruh sisi server akan didasarkan pada Perl dan perpustakaan SNMP.pm . Mungkin saya akan membagi artikel menjadi dua bagian - yang kedua adalah deskripsi dari sisi klien. Mari kita mulai dengan memuat MIB yang kita butuhkan:





sub load_mibs {
    my ($attr, $Nms) = @_;
    # MIB     ,  
    #(    -   ),   
    my $MIB_search_path = '../modules/Nms/mibs';
    
    #      
    SNMP::addMibDirs($MIB_search_path);
    SNMP::addMibDirs($MIB_search_path . '/private');
    
    #     ,      -
    #    .
    if ( $attr->{ALL} ) {
        SNMP::addMibFiles( glob( $MIB_search_path . '/private' . '/*' ) );
        SNMP::initMib();
    }
    #   DES3200-28
    elsif ( $attr->{SYS_ID} ) {
        my @mods = ('EQUIPMENT-MIB', 'DES3200-28-L3MGMT-MIB', 'CABLE-DIAG-MIB');
        #,     ,    MIB
        SNMP::loadModules(@mods);
        SNMP::initMib();
    }
    
    return 1;
}
      
      



Beberapa penjelasan sekaligus: - pertama, hanya memuat modul yang diperlukan, secara signifikan mempercepat pekerjaan lebih lanjut dengan pohon OID; - kedua, tidak perlu menentukan semua modul yang diperlukan, dalam tautan MIB yang "disiapkan" dengan benar ke modul yang diperlukan digunakan, dan mereka akan dimuat secara otomatis, misalnya:





IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
    OBJECT-IDENTITY, Counter32, Gauge32, Integer32, mib-2
        FROM SNMPv2-SMI
    DisplayString, TimeStamp, TimeInterval, TestAndIncr,
      AutonomousType, TEXTUAL-CONVENTION
        FROM SNMPv2-TC
    MODULE-COMPLIANCE, OBJECT-GROUP
        FROM SNMPv2-CONF;
      
      



yaitu, menentukan apa dan di mana harus mengimpor.





, OID %SNMP::MIB. , , - JS . , - . jsTree, :





sub mibs_tree {

    my ($attr) = @_;

    my %labels;
    my @tree_arr;
    
    foreach my $oid ( sort keys(%SNMP::MIB) ) {
    		#  ,  .
        my $prev_id =
              ( $SNMP::MIB{$oid}{parent} )
              ? $SNMP::MIB{$oid}{parent}{objectID}
              : '#';
        
        #      OID     jsTree
        my $icon = '';        
        my %type;
        if ( $SNMP::MIB{$oid}{children}[0]{indexes}[0] ) {
        	$type{type} = 'table';
        }
        elsif ($SNMP::MIB{$oid}{parent} && $SNMP::MIB{$oid}{parent}{indexes}[0]){
        		$type{type} = 'row';
        }
        elsif ( $SNMP::MIB{$oid}{type} ) {
        		$type{type} = 'scalar';
        }
        elsif ( $SNMP::MIB{$oid}{indexes}[0] ) {
        		$type{type} = 'indexes';
        }
        else {
        		$type{type} = 'folder';
        }
        push @tree_arr,
              (
                {
                    id     => $SNMP::MIB{$oid}{objectID},
                    text   => $SNMP::MIB{$oid}{label},
                    parent => $prev_id,
                    %type
                }
              );
        }
    }

    my %types = (
        table   => { icon => 'fa fa-table' },
        row     => { icon => 'fa fa-columns' },
        scalar  => { icon => 'fa fa-paragraph' },
        indexes => { icon => 'fa fa-list-ul' },
        folder  => { icon => 'fa fa-folder-o' },
    );
    
    return make_tree(
        {
            plugins => [ 'types', 'search', 'contextmenu' ],
            contextmenu => { items => '*customMenu*' },
            types       => \%types,
            core        => { data  => \@tree_arr }
        }
    );
}
      
      



, JS HTML. , :





, , . github. , , Perl, .












All Articles