traphandler.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/usr/bin/env python
  2. from time import time
  3. start = time()
  4. import os
  5. os.environ['DJANGO_SETTINGS_MODULE'] = 'mymontools.settings'
  6. import django
  7. django.setup()
  8. ##############################################################################
  9. import optparse
  10. import re
  11. import sys
  12. import syslog
  13. from django.core.validators import validate_ipv46_address, ValidationError
  14. from django.utils import timezone
  15. from traps.models import *
  16. from traps.tools import *
  17. from traps.translate import translate_trapoid_to_name
  18. ##############################################################################
  19. parser = optparse.OptionParser()
  20. parser.add_option('', '--no-syslog', dest='syslog', action='store_false', default=True, help='Dissable syslog')
  21. parser.add_option('-v', '--verbose', dest='verb', action='count', default=0, help='Be verbose')
  22. (opts, args) = parser.parse_args()
  23. #####
  24. opts.verb = min( opts.verb, 3 )
  25. if opts.syslog:
  26. syslog.openlog(ident='MyMonTools_Traphandler', logoption=syslog.LOG_PID, facility=syslog.LOG_DAEMON)
  27. ##############################################################################
  28. verbose2syslog = [syslog.LOG_ERR, syslog.LOG_WARNING, syslog.LOG_NOTICE, syslog.LOG_INFO]
  29. def logit(prio, msg):
  30. if prio <= opts.verb:
  31. if opts.syslog:
  32. syslog.syslog(verbose2syslog[prio], msg)
  33. else:
  34. print u'>>> V%1d: %s' % (prio, msg)
  35. ##############################################################################
  36. logit(1, 'Traphandler started')
  37. lines = sys.stdin.readlines()
  38. if len(lines) < 3:
  39. logit(0, 'Trap is incomplete, exiting...')
  40. sys.exit(1)
  41. trap = Trap()
  42. # FIXME: Strip DNS-Domain
  43. trap.hostname = lines[0].replace('.treuchtlingen.stadt', '').replace('.treuchtlingen.de', '').lstrip().rstrip()
  44. trap.agent = lines[1].lstrip().rstrip()
  45. trap.traptime = timezone.make_aware( datetime.datetime.now() , timezone.get_current_timezone() )
  46. ip = re.search(r'\[([\d\.:a-fA-F]+)\]', trap.agent)
  47. if ip:
  48. try:
  49. ip = ip.groups()[0]
  50. validate_ipv46_address( ip )
  51. trap.agentip = ip
  52. except (ValidationError, IndexError):
  53. pass
  54. varbinds = {}
  55. for line in lines[2:]:
  56. try:
  57. (oid, value) = line.split(' ',1)
  58. except ValueError:
  59. logit(0, 'Read data is corrupt, exiting...')
  60. sys.exit(1)
  61. varbinds[oid] = value
  62. # SNMPv2-MIB::snmpTrapOID.0
  63. try:
  64. trap.trapoid = varbinds.pop('.1.3.6.1.6.3.1.1.4.1.0').lstrip().rstrip()
  65. except KeyError:
  66. logit(0, 'Trap does not contain snmpTrapOID, exiting...')
  67. sys.exit(1)
  68. # SNMP-COMMUNITY-MIB::snmpTrapAddress.0
  69. #try:
  70. # trap.agentip = varbinds.pop('.1.3.6.1.6.3.18.1.3.0').lstrip().rstrip()
  71. #except KeyError:
  72. # pass
  73. # SNMP-COMMUNITY-MIB::snmpTrapCommunity.0
  74. try:
  75. trap.community = varbinds.pop('.1.3.6.1.6.3.18.1.4.0').lstrip().rstrip()
  76. except KeyError:
  77. logit(3, 'Trap does not contain snmpTrapCommunity (SNMPv1 only - not fatal)')
  78. # SNMPv2-MIB::snmpTrapEnterprise.0
  79. try:
  80. trap.enterprise = varbinds.pop('.1.3.6.1.6.3.1.1.4.3.0').lstrip().rstrip()
  81. except KeyError:
  82. logit(3, 'Trap does not contain snmpTrapEnterprise (SNMPv1 only - not fatal)')
  83. try:
  84. trap.save()
  85. except:
  86. logit(0, u'Could not save trap, exiting...')
  87. sys.exit(1)
  88. logit(2, u'Trap saved: %s (runtime: %-.3fs)' % (trap, (time() - start),) )
  89. # Save VarBindings
  90. for (oid, value) in varbinds.iteritems():
  91. tvb = TrapVarbind()
  92. tvb.trap = trap
  93. tvb.oid = oid.lstrip().rstrip()
  94. tvb.value = value.lstrip().rstrip()
  95. try:
  96. tvb.save()
  97. except:
  98. logit(0, u'Could not save one VarBinding')
  99. logit(2, u'VarBindings saved (runtime: %-.3fs)' % (time() - start) )
  100. ##############################################################################
  101. # Translate TrapOID to TrapName
  102. oidname = translate_trapoid_to_name(trap.trapoid)
  103. if oidname:
  104. trap.trapname = oidname
  105. trap.save()
  106. logit(3, u'Trap-OID translated (runtime: %-.3fs)' % (time() - start) )
  107. else:
  108. logit(2, u'Trap-OID could not be translated')
  109. ##############################################################################
  110. # FIXME:#56 Auch je nach VarBinding unterschiedliche Configs/Category/Severity
  111. try:
  112. cfgtrap = CfgTrap.objects.get(trapoid=trap.trapoid)
  113. except CfgTrap.DoesNotExist:
  114. cfgtrap = None
  115. if cfgtrap:
  116. trap.category = cfgtrap.category
  117. trap.severity = cfgtrap.severity
  118. trap.save()
  119. logit(3, u'Trap config found, trap categorized (runtime: %-.3fs)' % (time() - start) )
  120. else:
  121. logit(2, u'No Trap config found for trap %s (runtime: %-.3fs)' % (trap.trapoid, (time() - start),) )
  122. logit(1, u'Traphandler finished (runtime: %-.3fs)' % (time() - start) )