123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #!/usr/bin/env python
- from time import time
- start = time()
- import os
- os.environ['DJANGO_SETTINGS_MODULE'] = 'mymontools.settings'
- import django
- django.setup()
- ##############################################################################
- import optparse
- import re
- import sys
- import syslog
- from django.core.validators import validate_ipv46_address, ValidationError
- from django.utils import timezone
- from traps.models import *
- from traps.tools import *
- from traps.translate import translate_trapoid_to_name
- ##############################################################################
- parser = optparse.OptionParser()
- parser.add_option('', '--no-syslog', dest='syslog', action='store_false', default=True, help='Dissable syslog')
- parser.add_option('-v', '--verbose', dest='verb', action='count', default=0, help='Be verbose')
- (opts, args) = parser.parse_args()
- #####
- opts.verb = min( opts.verb, 3 )
- if opts.syslog:
- syslog.openlog(ident='MyMonTools_Traphandler', logoption=syslog.LOG_PID, facility=syslog.LOG_DAEMON)
- ##############################################################################
- verbose2syslog = [syslog.LOG_ERR, syslog.LOG_WARNING, syslog.LOG_NOTICE, syslog.LOG_INFO]
- def logit(prio, msg):
- if prio <= opts.verb:
- if opts.syslog:
- syslog.syslog(verbose2syslog[prio], msg)
- else:
- print u'>>> V%1d: %s' % (prio, msg)
- ##############################################################################
- logit(1, 'Traphandler started')
- lines = sys.stdin.readlines()
- if len(lines) < 3:
- logit(0, 'Trap is incomplete, exiting...')
- sys.exit(1)
- trap = Trap()
- # FIXME: Strip DNS-Domain
- trap.hostname = lines[0].replace('.treuchtlingen.stadt', '').replace('.treuchtlingen.de', '').lstrip().rstrip()
- trap.agent = lines[1].lstrip().rstrip()
- trap.traptime = timezone.make_aware( datetime.datetime.now() , timezone.get_current_timezone() )
- ip = re.search(r'\[([\d\.:a-fA-F]+)\]', trap.agent)
- if ip:
- try:
- ip = ip.groups()[0]
- validate_ipv46_address( ip )
- trap.agentip = ip
- except (ValidationError, IndexError):
- pass
- varbinds = {}
- for line in lines[2:]:
- try:
- (oid, value) = line.split(' ',1)
- except ValueError:
- logit(0, 'Read data is corrupt, exiting...')
- sys.exit(1)
- varbinds[oid] = value
- # SNMPv2-MIB::snmpTrapOID.0
- try:
- trap.trapoid = varbinds.pop('.1.3.6.1.6.3.1.1.4.1.0').lstrip().rstrip()
- except KeyError:
- logit(0, 'Trap does not contain snmpTrapOID, exiting...')
- sys.exit(1)
- # SNMP-COMMUNITY-MIB::snmpTrapAddress.0
- #try:
- # trap.agentip = varbinds.pop('.1.3.6.1.6.3.18.1.3.0').lstrip().rstrip()
- #except KeyError:
- # pass
- # SNMP-COMMUNITY-MIB::snmpTrapCommunity.0
- try:
- trap.community = varbinds.pop('.1.3.6.1.6.3.18.1.4.0').lstrip().rstrip()
- except KeyError:
- logit(3, 'Trap does not contain snmpTrapCommunity (SNMPv1 only - not fatal)')
- # SNMPv2-MIB::snmpTrapEnterprise.0
- try:
- trap.enterprise = varbinds.pop('.1.3.6.1.6.3.1.1.4.3.0').lstrip().rstrip()
- except KeyError:
- logit(3, 'Trap does not contain snmpTrapEnterprise (SNMPv1 only - not fatal)')
- try:
- trap.save()
- except:
- logit(0, u'Could not save trap, exiting...')
- sys.exit(1)
- logit(2, u'Trap saved: %s (runtime: %-.3fs)' % (trap, (time() - start),) )
- # Save VarBindings
- for (oid, value) in varbinds.iteritems():
- tvb = TrapVarbind()
- tvb.trap = trap
- tvb.oid = oid.lstrip().rstrip()
- tvb.value = value.lstrip().rstrip()
- try:
- tvb.save()
- except:
- logit(0, u'Could not save one VarBinding')
- logit(2, u'VarBindings saved (runtime: %-.3fs)' % (time() - start) )
- ##############################################################################
- # Translate TrapOID to TrapName
- oidname = translate_trapoid_to_name(trap.trapoid)
- if oidname:
- trap.trapname = oidname
- trap.save()
- logit(3, u'Trap-OID translated (runtime: %-.3fs)' % (time() - start) )
- else:
- logit(2, u'Trap-OID could not be translated')
- ##############################################################################
- # FIXME:#56 Auch je nach VarBinding unterschiedliche Configs/Category/Severity
- try:
- cfgtrap = CfgTrap.objects.get(trapoid=trap.trapoid)
- except CfgTrap.DoesNotExist:
- cfgtrap = None
- if cfgtrap:
- trap.category = cfgtrap.category
- trap.severity = cfgtrap.severity
- trap.save()
- logit(3, u'Trap config found, trap categorized (runtime: %-.3fs)' % (time() - start) )
- else:
- logit(2, u'No Trap config found for trap %s (runtime: %-.3fs)' % (trap.trapoid, (time() - start),) )
- logit(1, u'Traphandler finished (runtime: %-.3fs)' % (time() - start) )
|