traphandler.py 4.1 KB

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