#!/usr/bin/env python

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mymontools.settings'

import django
django.setup()

##############################################################################

import re
import sys
import syslog

from django.core.validators import validate_ipv46_address, ValidationError
from django.utils import timezone

from traps.models import *
from traps.tools import *
from traps.translate import translate_trapoid_to_name

##############################################################################

syslog.openlog(ident='MyMonTools Traphandler', logoption=syslog.LOG_PID, facility=syslog.LOG_DAEMON)
syslog.syslog(syslog.LOG_INFO, 'MyMonTools Traphandler started')

lines = sys.stdin.readlines()

if len(lines) < 3:
	sys.exit(1)

trap = Trap()
# FIXME: Strip DNS-Domain
trap.hostname = lines[0].replace('.treuchtlingen.stadt', '').replace('.treuchtlingen.de', '').lstrip().rstrip()
trap.agent = lines[1].lstrip().rstrip()
trap.traptime = timezone.make_aware( datetime.datetime.now() , timezone.get_current_timezone() )

ip = re.search(r'\[([\d\.:a-fA-F]+)\]', trap.agent)
if ip:
	try:
		ip = ip.groups()[0]
		validate_ipv46_address( ip )
		trap.agentip = ip
	except (ValidationError, IndexError):
		pass

varbinds = {}
for line in lines[2:]:
	(oid, value) = line.split(' ',1)
	varbinds[oid] = value


# SNMPv2-MIB::snmpTrapOID.0
try:
	trap.trapoid = varbinds.pop('.1.3.6.1.6.3.1.1.4.1.0').lstrip().rstrip()
except KeyError:
	sys.exit(2)

# SNMP-COMMUNITY-MIB::snmpTrapAddress.0
#try:
#	trap.agentip = varbinds.pop('.1.3.6.1.6.3.18.1.3.0').lstrip().rstrip()
#except KeyError:
#	pass

# SNMP-COMMUNITY-MIB::snmpTrapCommunity.0
try:
	trap.community = varbinds.pop('.1.3.6.1.6.3.18.1.4.0').lstrip().rstrip()
except KeyError:
	pass

# SNMPv2-MIB::snmpTrapEnterprise.0
try:
	trap.enterprise = varbinds.pop('.1.3.6.1.6.3.1.1.4.3.0').lstrip().rstrip()
except KeyError:
	pass

trap.save()
syslog.syslog(syslog.LOG_NOTICE, u'MyMonTools Trap saved: %s' % trap)

for (oid, value) in varbinds.iteritems():
	tvb = TrapVarbind()
	tvb.trap = trap
	tvb.oid = oid.lstrip().rstrip()
	tvb.value = value.lstrip().rstrip()
	tvb.save()
syslog.syslog(syslog.LOG_INFO, u'MyMonTools VarBindings saved')

##############################################################################

oidname = translate_trapoid_to_name(trap.trapoid)
if oidname:
	trap.trapname = oidname
	trap.save()
syslog.syslog(syslog.LOG_INFO, u'MyMonTools Trap-OID translated')

##############################################################################

# FIXME:#56 Auch je nach VarBinding unterschiedliche Configs/Category/Severity
try:
	cfgtrap = CfgTrap.objects.get(trapoid=trap.trapoid)
except CfgTrap.DoesNotExist:
	cfgtrap = None

if cfgtrap:
	trap.category = cfgtrap.category
	trap.severity = cfgtrap.severity
	trap.save()
	syslog.syslog(syslog.LOG_INFO, u'MyMonTools Trap categorized')
else:
	syslog.syslog(syslog.LOG_INFO, u'MyMonTools No trap configuration found')