123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #!/usr/bin/env python
- import os
- os.environ['DJANGO_SETTINGS_MODULE'] = 'mymontools.settings'
- import django
- django.setup()
- ##############################################################################
- import datetime
- import optparse
- import sys
- from django.http import QueryDict
- from django.utils import timezone
- from states.models import *
- from traps.tools import get_filtered_traps_for_querydict
- ##############################################################################
- def get_sub(trap, event):
- sub_varbind = event.state.sub_varbind
- if sub_varbind[-1] == '.':
- try:
- sub = trap.trapvarbind_set.get(oid__startswith=sub_varbind)
- except (trap.DoesNotExist, trap.MultipleObjectsReturned):
- sub = None
- else:
- try:
- sub = trap.trapvarbind_set.get(oid=sub_varbind)
- except (trap.DoesNotExist, trap.MultipleObjectsReturned):
- sub = None
- return sub.value
- ##############################################################################
- parser = optparse.OptionParser()
- parser.add_option('-H', '--hostname', dest='hostname', default='', help='Hostname(s) to act on, separated by ","')
- parser.add_option('-S', '--severity', dest='severity', default=None, help='Filter severity(s), separated by ","')
- parser.add_option('-C', '--category', dest='category', default=None, help='Filter category(s), separated by ","')
- parser.add_option('', '--exclude-hostname', dest='exclude_hostname', default=None, help='Exclude hostname(s), separated by ","')
- parser.add_option('', '--exclude-severity', dest='exclude_severity', default=None, help='Exclude severity(s), separated by ","')
- parser.add_option('', '--exclude-category', dest='exclude_category', default=None, help='Exclude category(s), separated by ","')
- parser.add_option('', '--simulate-maxid', dest='simmaxid', type=long, default=0, help='Simulate remembered maxid')
- parser.add_option('-v', '--verbose', dest='verb', action='count', default=0, help='Be verbose')
- (opts, args) = parser.parse_args()
- if opts.verb >= 3:
- print opts
- ##############################################################################
- query = QueryDict('', mutable=True)
- if opts.hostname:
- [ query.update( {u'hostname': hostname} ) for hostname in opts.hostname.split(',') ]
- if opts.severity:
- [ query.update( {u'severity': severity} ) for severity in opts.severity.split(',') ]
- if opts.category:
- [ query.update( {u'category': category} ) for category in opts.category.split(',') ]
- if opts.exclude_hostname:
- [ query.update( {u'exclude_hostname': hostname} ) for hostname in opts.exclude_hostname.split(',') ]
- if opts.exclude_severity:
- [ query.update( {u'exclude_severity': severity} ) for severity in opts.exclude_severity.split(',') ]
- if opts.exclude_category:
- [ query.update( {u'exclude_category': category} ) for category in opts.exclude_category.split(',') ]
- if opts.verb >= 2:
- print(query)
- traps = get_filtered_traps_for_querydict(query, sortorder='id')
- maxid = 0
- if opts.simmaxid:
- maxid = opts.simmaxid
- else:
- if opts.verb >= 2:
- print u'Hostname (for memory): -%s-' % opts.hostname
- try:
- mem = CorrelatorMemory.objects.get(tag=opts.hostname)
- if opts.verb >= 3:
- print 'Found in DB'
- except CorrelatorMemory.DoesNotExist:
- mem = CorrelatorMemory(tag=opts.hostname)
- print 'Not found in DB, new memory'
- maxid = mem.maxid
- if opts.verb >= 3:
- print 'maxid is %s' % maxid
- traps = traps.filter(id__gt=maxid)
- start = {}
- stop = {}
- for event in CfgStateStartEvent.objects.all():
- start[event.trapoid] = event
- for event in CfgStateStopEvent.objects.all():
- stop[event.trapoid] = event
- for trap in traps:
- if trap.trapoid in start:
- event = start[trap.trapoid]
- if opts.verb >= 2:
- print trap
- print ' +++ Starting %s' % event
- state = State()
- state.hostname = trap.hostname
- state.state = event.state
- # FIXME: "sub" ermitteln
- if event.state.sub_varbind:
- state.sub = get_sub(trap, event)
- # state.sub = None
- state.start = trap
- if type(trap.traptime) == datetime.datetime:
- state.start_time = trap.traptime
- else:
- try:
- state.start_time = timezone.make_aware( datetime.datetime.strptime(trap.traptime, '%a %b %d %H:%M:%S %Y') , timezone.get_current_timezone() )
- except ValueError:
- state.start_time = None
- state.save()
- if opts.verb >= 1:
- print u' (%s) %s' % (state.id, state)
- elif trap.trapoid in stop:
- if opts.verb >= 2:
- print trap
- print ' --- Stopping %s' % stop[trap.trapoid]
- # FIXME: "sub" ermitteln
- if event.state.sub_varbind:
- sub = get_sub(trap, event)
- else:
- sub = None
- state = State.objects.filter(hostname=trap.hostname, state=stop[trap.trapoid].state, sub=sub, stop=None, start_id__lt=trap.id).order_by('id')
- if len(state) == 0:
- state = State()
- state.hostname = trap.hostname
- state.state = stop[trap.trapoid].state
- # state.sub = None
- else:
- state = state[0]
- state.stop = trap
- if type(trap.traptime) == datetime.datetime:
- state.stop_time = trap.traptime
- else:
- try:
- state.stop_time = timezone.make_aware( datetime.datetime.strptime(trap.traptime, '%a %b %d %H:%M:%S %Y') , timezone.get_current_timezone() )
- except ValueError:
- state.start_time = None
- state.save()
- if opts.verb >= 1:
- print u' (%s) %s' % (state.id, state)
- maxid = max(maxid, trap.id)
- if opts.verb >= 2:
- print u'\n\nMax-ID: %s' % maxid
- if not opts.simmaxid:
- mem.maxid = maxid
- mem.save()
|