Home > World Of ICT > Membaca MIB id SNMP menggunakan Python

Membaca MIB id SNMP menggunakan Python


SNMP (Simple Network Management Protocol)  adalah protokol populer untuk menjalankan fungsi network manajemen. SNMP digunakan untuk mengumpulkan informasi dan mengkonfigurasi  peralatan jaringan, seperti router, server, printer, hub, switch, wireless controller pada jaringan berbasis Internet Protocol (IP). SNMP dapat mengumpulkan informasi kondisi CPU, temperatur, memory, traffic, chasis, etc.  Salah satu bagian penting dari SNMP adalah MIB (Management Information Base), merupakan satu set koleksi informasi yang diorganisasi dalam bentuk hirarki. Sebuah file MIB adalah sebuah teks file dalam format ASN.1 yang merepresentasikan struktur hirarki dari informasi yang dapat diperoleh dari sebuah aplikasi atau sistem.

Managed object atau MIB object adalah sebuah atau beberapa karakteristik pada suatu managed device misalnya beban CPU, besar memory yang digunakan. MIB pada dasarnya merupakan hirarki dari managed object. Object identifier atau Object ID (OID) digunakan sebagai indentifikasi yang unik untuk setiap managed object yang ada dalam hirarki MIB. OID dapat direprensentasikan dalam sebuah nama misalnya .iso.org.dod.internet.mgmt.mib-2.interfaces.ifnumber atau nomor yang disebut sebagai object descriptor, misalnya .1.3.6.1.2.1.2.1

Sebuah managed object sebagai contoh ifnumber (number of interface) adalah sebuah ide abstrak, sedangkan representasi real dari informasi itu disebut dengan “instance” yang memiliki nilai dari object tersebut. Misalnya instance dari ifnumber adalah ifnumber.0 yang memiliki nilai 3 yang berarti sistem memiliki 3 network interface. Untuk mendapatkan nilai instance tersebut, NMS harus meminta informasi dengan mendefinisikan OID yaitu .1.3.6.1.2.1.2.1.0 (OID dari object ifnumber dengan ditambahkan .0 dibelakangnya). http://ejlp.blogspot.com/2008/10/snmp-bagian-3.html

Python sebagai salah satu bahasa pemrograman yang handal telah menyediakan library untuk membaca nilai MIB dari suatu manage device, kita akan coba bereksperimen bagaimana python membaca nilai OID dari suatu interface device kemudian menyimpan data traffik interface tadi kedalam database lalu memunculkannya dalam bentuk grafis.

Langkah pertama pastikan library snmp sudah terinstall dengan baik pada server monitoring

root@radius:/home/gigih# apt-get install snmp*
Reading package lists... Done
Building dependency tree
Reading state information... Done
libsnmp-python is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.
root@radius:/home/gigih#

Langkah kedua identifikasi hirarki MIB yang ada pada sebuah device menggunakan query snmpwalk

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c CommunityString 103.3.xxx.xxx | more
iso.3.6.1.2.1.1.1.0 = STRING: "XXX"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.14988.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (19494100) 2 days, 6:09:01.00
iso.3.6.1.2.1.1.4.0 = STRING: "noc@unila.ac.id"
iso.3.6.1.2.1.1.5.0 = STRING: "ASXXX"
iso.3.6.1.2.1.1.6.0 = STRING: "BBS Unilanet"
iso.3.6.1.2.1.1.7.0 = INTEGER: 78
iso.3.6.1.2.1.2.1.0 = INTEGER: 4
iso.3.6.1.2.1.2.2.1.1.13 = INTEGER: 13
iso.3.6.1.2.1.2.2.1.1.14 = INTEGER: 14
iso.3.6.1.2.1.2.2.1.1.15 = INTEGER: 15
iso.3.6.1.2.1.2.2.1.1.16 = INTEGER: 16
iso.3.6.1.2.1.2.2.1.2.13 = STRING: "ether2"
iso.3.6.1.2.1.2.2.1.2.14 = STRING: "ASBR-254"
iso.3.6.1.2.1.2.2.1.2.15 = STRING: "p2p-Internasional"
iso.3.6.1.2.1.2.2.1.2.16 = STRING: "p2p-Domestik"
iso.3.6.1.2.1.2.2.1.4.13 = INTEGER: 1500

Setelah hierarki MIB dapat terbaca sempurna, sekarang coba ambil nilai ID dari Interface lalu baca nilai Inoctet yang akan kita monitor life traffik nya

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c  CommunityString  103.3.xxx.xxx IF-MIB::ifInOctets.15
IF-MIB::ifInOctets.15 = Counter32: 1167579839
root@radius:/home/gigih#

Nilai InOctet yang didapat harus dikonversi untuk mendapatkan nilai utilisasi dalam bentuk bit, saya ambil referensi kalkulasi nilai snmp dari url berikut http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html

How you calculate use depends on how data is presented for what you want to measure. Interface use is the primary measure used for network use. Use this formulas, based on whether the connection you measure is half-duplex or full-duplex. Shared LAN connections tend to be half-duplex, mainly because contention detection requires that a device listen before it transmits. WAN connections are full-duplex because the connection is point-to-point; both devices can transmit and receive at the same time because they know there is only one other device that shares the connection. Because MIB-II variables are stored as counters, you must take two poll cycles and figure the difference between the two (hence, the delta used in the equation).

This explains the variables used in the formulas:

calculate_bandwidth_snmp.gif

Note: ifSpeed does not accurately reflect the speed of a WAN interface.

For half-duplex media, use this formula for interface use:

calculate_bandwidth_snmp1.gif

Langkah terakhir adalah membuat script python  untuk mendapatkan nilai InOctet dan OutOctet lalu mengkonversi ke dalam bit dan menyimpannya kedalam database.

#Script by Gigih Forda Nama, dibuat malam selasa tanggal 10-03-2014 pukul 23:50 WIB
import time
import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb
import os
in1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin=abs(int(in1))
hout = abs(int(out1))
time.sleep (1)
in2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin2=int(in2) 
hout2=int(out2)
deltain = abs(hin2-hin) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
deltaout = abs(hout2-hout) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
bitout = deltaout * 8
mbout = bitout/1000000
bitin = deltain * 8
mbin = bitin/1000000
if mbout < 220:
     hmbout = mbout
if mbin < 220:
     hmbin = mbin
print hmbin, hmbout
conn = MySQLdb.connect(host= "localhost",
     user="root",
     passwd="SukaSukaSaja",
     db="snmp")
x = conn.cursor()
try:
x.execute("""INSERT INTO user_bwintl VALUES (%s,%s,%s)""",(now,hmbin,hmbout))
conn.commit()
except:
conn.rollback()
conn.close()

Setelah data berhasil direkam dan masuk database selanjutnya membuat script program plotting gambar dari database;

##By-Gigih-F
import matplotlib
matplotlib.use('Agg')
import Image
import MySQLdb as mdb
import sys
import matplotlib.pyplot as plt
import datetime
now = datetime.datetime.now()
print now
#Inisialisasi ke Database
conn = mdb.connect('localhost', 'root', 'SukaSukaSaja', 'snmp');
with conn: #Query ke Database MySQL
 cursor = conn.cursor ()
 cursor.execute ("SELECT user_bwintl.waktu, user_bwintl.in, user_bwintl.out FROM user_bwintl WHERE DATE (waktu) = DATE(NOW()) ")
 row = cursor.fetchall()
 print "RESULT:", row[0]
 waktu, ain, aout=zip(*row) #Fetching setiap row
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5,10.5)
ax = plt.subplot(111)
plt.plot(waktu, ain,marker='+',linestyle='-',color='c',label='Total Traffick In',lw=1) #Plotting Traf In
plt.plot(waktu, aout,marker='+',linestyle='-',color='g',label='Total Trafick Out',lw=1)#Plotting Traf Out
plt.fill_between(waktu, ain,color='c',alpha=.3)#Isi warna grafik
plt.fill_between(waktu, aout,color='y',alpha=.7)#Isi warna grafik
plt.legend(loc=10)
plt.ylabel('Total Bandwidth Usage Link Internasional dalam Mbps') #Label pada sumbu Y
plt.xlabel('Waktu') #Label pada sumbu X
plt.grid()
plt.title(' Bandwidth Usage Link Internasional tgl : [%s] (Credit to RaspberryPi+Python+MySQL)'%(now)) #Judul Grafik
plt.savefig('/home/gigih/python/belajar/bwintl.png', dpi=100) #Simpan file dengan judul xxx.png
Image.open('/home/gigih/python/belajar/bwintl.png').save('/home/gigih/python/belajar/bwintl.jpg','JPEG')

Dan hasilnya adalah sebagai berikut

bwintl

lebih lengkapnya dapat dilihat di url berikut, untuk pelaporan live http://noc.unila.ac.id/?page_id=2

Note:

Great Thanks to Bunda Rasya atas inspirasi pemilihan warna grafik

Great Thanks to my beloved son Ahmad Rasya Algifarda yang udah pinjemin meja mainannya😀

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: