#!/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()