#!/usr/bin/env python
#Developed by: Yancy Ribbens (yribbens@nagios.com)
#Version 0.1

from optparse import OptionParser, OptionGroup
import sys
import urllib2
from xml.dom import minidom
import re

class NagiosReturn(Exception):
    def __init__(self, message, code):
        self.message = message
        self.code = code

def Nagios_Return(short_message="",long_message="",return_code=3):
    if long_message != "":
        output = short_message + " | " + "\n" + long_message
    else:
        output = short_message
        
    if return_code == 0:
        print "OK: " + output
        sys.exit(return_code)
    elif return_code == 1:
        print "Warning: " + output
        sys.exit(return_code)
    elif return_code == 2:
        print "Critical: " + output
        sys.exit(return_code)
    else:
        sys.stdout.write("Plugin Error: ")
        print output
        sys.exit(return_code)
        
def return_cap_event(url):
    request = urllib2.Request(url)
    request.add_header('User-Agent', 'check_cap_alerts/0.1 by Yancy Ribbens')
    #~ #~#request.add_header('If-Modified-Since', datetime.datetime.now() - datetime.timedelta(minutes=5))
    opener = urllib2.build_opener()
    feed = opener.open(request)
    xmldoc = minidom.parse(feed)
    x = xmldoc.getElementsByTagName('cap:event')
    eve = x[0].firstChild.nodeValue
    return eve

def return_raw( url ):
    print "raw"
    request = urllib2.Request(url)
    request.add_header('User-Agent', 'check_cap_alerts/0.1 by Yancy Ribbens')
    #~ #~#request.add_header('If-Modified-Since', datetime.datetime.now() - datetime.timedelta(minutes=5))
    opener = urllib2.build_opener()
    feed = opener.open(request)
    print feed.read()
    
def return_events(url):
    event_list = []
    response = urllib2.urlopen(url)
    events = response.read()
    events = events.rsplit('|')
    clean_spaces = [x.strip() for x in events]
    for i in clean_spaces:
        if i != '':
            if not "+" in i:
                event_list.append(i)
    return event_list
                
def parse():
    usage = 'usage: %prog -s US state -c County Code -z Zone Code [-e] [-a] [-h]'
    example = 'Example: check_cap_alerts.py -s "MN"'
    parser = OptionParser(usage=usage)
    parser = OptionParser(epilog=example)
        
    required = OptionGroup(parser, "Coordinate systems")
    required.add_option("-s", "--state",
                  action="store", type="string", dest="us_state",
                  help="US state location")
                  
    required.add_option("-c", "--county_code",
                  action="store", type="string", dest="county_code",
                  help="County code. for complete list, http://alerts.weather.gov/#a ")
                  
    required.add_option("-z", "--zone_code",
                  action="store", type="string", dest="zone_code",
                  help="Zone code. for complete list, http://alerts.weather.gov/#a")
    parser.add_option_group(required)


    parser.add_option("-e", "--events", action="store_true", dest="events", help="list possible events")
    
    parser.add_option("-a", "--alerts", action="store", type="string", dest="alerts", help="comma seperated list of events")
        
    if len(sys.argv)==1:
        parser.print_help()
        exit(0)
            
    (options, args) = parser.parse_args()
        
    return options

if __name__ == '__main__':
    options = parse()
    events_url = "http://alerts.weather.gov/cap/product_list.txt"
        
    try:
        events = return_events(events_url)
    except IOError, e:
        print e
        print events_url
        Nagios_Return()
    except:
        e = sys.exc_info()[0]
        Nagios_Return(e,'',3)
    
    if options.events is not None:
        for i in events:
            print i
        sys.exit(0)
    
    if options.us_state is not None:
        loc = options.us_state
        url = 'http://www.weather.gov/alerts-beta/'+ options.us_state +'.php?x=0'
    elif options.zone_code is not None:
        loc = options.zone_code
        url = 'http://alerts.weather.gov/cap/wwaatmget.php?x=' + options.zone_code + '&y=0'
    elif options.county_code is not None:
        loc = options.county_code
        url = 'http://alerts.weather.gov/cap/wwaatmget.php?x=' + options.county_code + '&y=0'
    
    #~ return_raw(url)
    try:
        event_status = return_cap_event(url)
    except IndexError:
        msg = 'No CAP Warnings - ' + loc
        Nagios_Return(msg,'',0)
    except IOError, e:
        print e
        print url
        Nagios_Return()
    except:
        e = sys.exc_info()[0]
        Nagios_Return(e,'',3)
    
    if options.alerts is not None:
        list_of_alerts = re.split(",", options.alerts)
        for alert in list_of_alerts:
            if alert == event_status:
                Nagios_Return(event_status,"",1)
        msg = 'No CAP Warnings - ' + loc
        Nagios_Return(msg,'',0)
    Nagios_Return(event_status,'',1)
