#!/usr/bin/env python

import os
import re
import sys
import socket
from optparse import OptionParser

from msgdirq import Message, MessageDirQueue
from metric import MetricOutput

dirq_default = '/var/spool/msg-nagios-bridge/outgoing'

def main():
    usage = 'usage: %prog [--dir dirq_directory] [--role ROLE]'
    parser = OptionParser(usage=usage)
    parser.add_option('--dir', dest='dir',
                      default=dirq_default,
                      help="Directory to store messages (default %s)." %
                      dirq_default)
    parser.add_option('--role', dest='role',
                      default='site',
                      help="Role of nagios instance.")
    opts,args = parser.parse_args()
    dirqueue = opts.dir

    if opts.role not in ('site', 'roc', 'project', 'vo'):
        print "role should be either of 'site', 'roc', 'project', 'vo'."
        sys.exit(1)
    role = opts.role

    if not os.environ.has_key('NAGIOS_SERVICEDESC'):
        print "Expected to be run within Nagios - no Environment variables set"
        sys.exit(1)
    # exit on soft state
    try:
        if os.environ['NAGIOS_SERVICESTATETYPE'] == 'SOFT':
            sys.exit()
    except KeyError:
        pass

    check = os.environ['NAGIOS_SERVICEDESC']
    metricName = check
    status = os.environ['NAGIOS_SERVICESTATE']
    summary = os.environ['NAGIOS_SERVICEOUTPUT'].strip()
    host_name = os.environ['NAGIOS_HOSTNAME']
    nagios_host = os.environ.get('NAGIOS__SERVICESERVER','')
    if os.environ.has_key('NAGIOS__SERVICESITE_NAME') and \
        os.environ.has_key('NAGIOS__SERVICEMETRIC_SET') and \
        os.environ.has_key('NAGIOS__SERVICESERVICE_FLAVOUR') and \
        os.environ.has_key('NAGIOS__SERVICESERVICE_URI'):

        site = os.environ['NAGIOS__SERVICESITE_NAME']
        service_flavour = os.environ['NAGIOS__SERVICESERVICE_FLAVOUR']
        service_type = os.environ['NAGIOS__SERVICEMETRIC_SET']
        service_uri = os.environ['NAGIOS__SERVICESERVICE_URI']
        vo = os.environ.get('NAGIOS__SERVICEVO','')
        vo_fqan = os.environ.get('NAGIOS__SERVICEVO_FQAN','')
        roc = os.environ.get('NAGIOS__SERVICEROC','UNDEFINED')
    elif os.environ.has_key('NAGIOS_SERVICENOTES'):
        site, service_flavour, service_uri, vo = \
                    os.environ['NAGIOS_SERVICENOTES'].split(' ')
    else:
        print "Either notes or custom vars (_site_name, _metric_name, _service_uri, _metric_set) must be set"
        sys.exit(1)

    try:
        metricName = os.environ['NAGIOS__SERVICEMETRIC_NAME']
    except KeyError:
        for v in [vo, vo_fqan]:
            if v:
                m = re.match('(.*?)\-%s$'%v, check)
                if m:
                    metricName = m.group(1)
                    break

    metric_res = MetricOutput({'metric':metricName,
               'status':status,
               'summary':unicode(summary, 'utf8', errors='replace'),
               'site':site,
               'service_flavour':service_flavour,
               'service_type':service_type,
               'host_name':host_name,
               'service_uri':service_uri,
               'details':unicode(os.environ.get('NAGIOS_LONGSERVICEOUTPUT',''),
                                 'utf8', errors='replace'),
               'vo':vo,
               'vo_fqan':vo_fqan,
               'nagios_name':check,
               'role':role,
               'encrypted':os.environ.get('NAGIOS__SERVICEENCRYPTED','')})
    header = {'sitename':site,
              'role':role,
              'ROC':roc,
              'nagios_host':nagios_host}

    message = Message(metric_res.wlcg_format(), header)
    message.is_text = True

    mq = MessageDirQueue(dirqueue)
    mq.add_message(message)

if __name__ == "__main__":
    main()
