state_correlator.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 datetime
  8. import optparse
  9. import sys
  10. from django.http import QueryDict
  11. from django.utils import timezone
  12. from states.models import *
  13. from traps.tools import get_filtered_traps_for_querydict
  14. ##############################################################################
  15. def get_sub(trap, event):
  16. sub_varbind = event.state.sub_varbind
  17. if sub_varbind[-1] == '.':
  18. try:
  19. sub = trap.trapvarbind_set.get(oid__startswith=sub_varbind)
  20. except (trap.DoesNotExist, trap.MultipleObjectsReturned):
  21. sub = None
  22. else:
  23. try:
  24. sub = trap.trapvarbind_set.get(oid=sub_varbind)
  25. except (trap.DoesNotExist, trap.MultipleObjectsReturned):
  26. sub = None
  27. return sub.value
  28. ##############################################################################
  29. parser = optparse.OptionParser()
  30. parser.add_option('-H', '--hostname', dest='hostname', default='', help='Hostname(s) to act on, separated by ","')
  31. parser.add_option('-S', '--severity', dest='severity', default=None, help='Filter severity(s), separated by ","')
  32. parser.add_option('-C', '--category', dest='category', default=None, help='Filter category(s), separated by ","')
  33. parser.add_option('', '--exclude-hostname', dest='exclude_hostname', default=None, help='Exclude hostname(s), separated by ","')
  34. parser.add_option('', '--exclude-severity', dest='exclude_severity', default=None, help='Exclude severity(s), separated by ","')
  35. parser.add_option('', '--exclude-category', dest='exclude_category', default=None, help='Exclude category(s), separated by ","')
  36. parser.add_option('', '--simulate-maxid', dest='simmaxid', type=long, default=0, help='Simulate remembered maxid')
  37. parser.add_option('-v', '--verbose', dest='verb', action='count', default=0, help='Be verbose')
  38. (opts, args) = parser.parse_args()
  39. if opts.verb >= 3:
  40. print opts
  41. ##############################################################################
  42. query = QueryDict('', mutable=True)
  43. if opts.hostname:
  44. [ query.update( {u'hostname': hostname} ) for hostname in opts.hostname.split(',') ]
  45. if opts.severity:
  46. [ query.update( {u'severity': severity} ) for severity in opts.severity.split(',') ]
  47. if opts.category:
  48. [ query.update( {u'category': category} ) for category in opts.category.split(',') ]
  49. if opts.exclude_hostname:
  50. [ query.update( {u'exclude_hostname': hostname} ) for hostname in opts.exclude_hostname.split(',') ]
  51. if opts.exclude_severity:
  52. [ query.update( {u'exclude_severity': severity} ) for severity in opts.exclude_severity.split(',') ]
  53. if opts.exclude_category:
  54. [ query.update( {u'exclude_category': category} ) for category in opts.exclude_category.split(',') ]
  55. if opts.verb >= 2:
  56. print(query)
  57. traps = get_filtered_traps_for_querydict(query, sortorder='id')
  58. maxid = 0
  59. if opts.simmaxid:
  60. maxid = opts.simmaxid
  61. else:
  62. if opts.verb >= 2:
  63. print u'Hostname (for memory): -%s-' % opts.hostname
  64. try:
  65. mem = CorrelatorMemory.objects.get(tag=opts.hostname)
  66. if opts.verb >= 3:
  67. print 'Found in DB'
  68. except CorrelatorMemory.DoesNotExist:
  69. mem = CorrelatorMemory(tag=opts.hostname)
  70. print 'Not found in DB, new memory'
  71. maxid = mem.maxid
  72. if opts.verb >= 3:
  73. print 'maxid is %s' % maxid
  74. traps = traps.filter(id__gt=maxid)
  75. start = {}
  76. stop = {}
  77. for event in CfgStateStartEvent.objects.all():
  78. start[event.trapoid] = event
  79. for event in CfgStateStopEvent.objects.all():
  80. stop[event.trapoid] = event
  81. for trap in traps:
  82. if trap.trapoid in start:
  83. event = start[trap.trapoid]
  84. if opts.verb >= 2:
  85. print trap
  86. print ' +++ Starting %s' % event
  87. state = State()
  88. state.hostname = trap.hostname
  89. state.state = event.state
  90. # FIXME: "sub" ermitteln
  91. if event.state.sub_varbind:
  92. state.sub = get_sub(trap, event)
  93. # state.sub = None
  94. state.start = trap
  95. if type(trap.traptime) == datetime.datetime:
  96. state.start_time = trap.traptime
  97. else:
  98. try:
  99. state.start_time = timezone.make_aware( datetime.datetime.strptime(trap.traptime, '%a %b %d %H:%M:%S %Y') , timezone.get_current_timezone() )
  100. except ValueError:
  101. state.start_time = None
  102. state.save()
  103. if opts.verb >= 1:
  104. print u' (%s) %s' % (state.id, state)
  105. elif trap.trapoid in stop:
  106. if opts.verb >= 2:
  107. print trap
  108. print ' --- Stopping %s' % stop[trap.trapoid]
  109. # FIXME: "sub" ermitteln
  110. if event.state.sub_varbind:
  111. sub = get_sub(trap, event)
  112. else:
  113. sub = None
  114. state = State.objects.filter(hostname=trap.hostname, state=stop[trap.trapoid].state, sub=sub, stop=None, start_id__lt=trap.id).order_by('id')
  115. if len(state) == 0:
  116. state = State()
  117. state.hostname = trap.hostname
  118. state.state = stop[trap.trapoid].state
  119. # state.sub = None
  120. else:
  121. state = state[0]
  122. state.stop = trap
  123. if type(trap.traptime) == datetime.datetime:
  124. state.stop_time = trap.traptime
  125. else:
  126. try:
  127. state.stop_time = timezone.make_aware( datetime.datetime.strptime(trap.traptime, '%a %b %d %H:%M:%S %Y') , timezone.get_current_timezone() )
  128. except ValueError:
  129. state.start_time = None
  130. state.save()
  131. if opts.verb >= 1:
  132. print u' (%s) %s' % (state.id, state)
  133. maxid = max(maxid, trap.id)
  134. if opts.verb >= 2:
  135. print u'\n\nMax-ID: %s' % maxid
  136. if not opts.simmaxid:
  137. mem.maxid = maxid
  138. mem.save()