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