Kamis, 02 Maret 2023

Mengambil data snmp menggunakan python pysnmp

 Instal pysnmp

pip install pysnmp

Buat file receiver snmp (file ini hanya dapat menerima snmp versi 1 dan versi 2c)

snmp_receiver.py

from pysnmp.hlapi import *
from pysnmp.entity.rfc3413 import ntfrcv
from pysnmp.entity import engine, config
from pysnmp.carrier.asyncore.dgram import udp
import time
import os


# Fungsi untuk menangani notifikasi SNMP Trap
def handle_trap(snmp_engine, state_reference, context_engine_id, context_name, var_binds, cb_ctx):
# Loop melalui semua variable bindings
# open file snmp_trap.txt
with open('snmp_trap.txt', 'a') as f:
for var_bind in var_binds:
oid, value = var_bind
timestamp = int(time.time())

# simpan file snmp ke log snmp_trap.txt
f.write(f"OID: {oid.prettyPrint()}, value: {value.prettyPrint()}\n")

print(f"OID: {oid.prettyPrint()}, value: {value.prettyPrint()}")


def main():
# jika file snmp_trap.txt tidak ada, maka buat
if not os.path.isfile('snmp_trap.txt'):
open('snmp_trap.txt', 'w').close()

# Inisialisasi engine SNMP
snmp_engine = SnmpEngine()
community_name = 'my-community'
# 0.0.0.0 untuk mengambil data dari semua device
device_ip = '0.0.0.0'

# Inisialisasi handler SNMP Trap
trap_receiver = ntfrcv.NotificationReceiver(snmp_engine, handle_trap)

# Konfigurasi handler SNMP Trap
# 162 merupakan port default snmp
config.addTransport(
snmp_engine,
udp.domainName + (1,),
udp.UdpTransport().openServerMode((device_ip, 162))
)
config.addV1System(snmp_engine, community_name, community_name)


# Jalankan modul penerima SNMP Trap
snmp_engine.transportDispatcher.jobStarted(1)

try:
snmp_engine.transportDispatcher.runDispatcher()
finally:
snmp_engine.transportDispatcher.closeDispatcher()


if __name__ == '__main__':
main()

Buat kode untuk testing mengirim snmp

from pysnmp.hlapi import *

# membuat varbind untuk SNMP trap
# set oid = 1.3.6.1.2.1.31.1.1.1.6
# set string value yang berisi Traps
var_binds = [
('1.3.6.1.2.1.31.1.1.1.6', OctetString('Traps')),
]

# sesuaikan dengan server agent kalian
server_ip = 'localhost'

# mengirimkan SNMP trap
errorIndication, errorStatus, errorIndex, varBinds = next(
sendNotification(
SnmpEngine(),
CommunityData('my-community', mpModel=0),
UdpTransportTarget((server_ip, 162)),
ContextData(),
'trap',
NotificationType(
ObjectIdentity('SNMPv2-MIB', 'coldStart')
).addVarBinds(*var_binds)
)
)

# menampilkan hasil
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1] or '?'))
else:
print('SNMP trap berhasil dikirim')

Jika ingin menjalankan background service file receiver di linux bisa menggunakan nohup:

nohup python3 snmp_receiver.py &

jika ingin melihat id dari service snmp_receiver, bisa menggunakan perintah:

ps aux | grep snmp_receiver.py

Jika ingin menghentikan background service bisa menggunakan:

kill 54626

54626 adalah pid dari service, yang didapatkan melalui ps aux diatas.

0 komentar:

Posting Komentar