#!/usr/bin/env python

import os
from datetime import datetime, date, timedelta

from seine.whois.client import WhoisClient, WhoisError

from foldback.nagios.plugin import NagiosPlugin, NagiosPluginError
from foldback.nagios.plugin import NAGIOS_STATE_OK, NAGIOS_STATE_WARNING, NAGIOS_STATE_CRITICAL

DESCRIPTION = """
Check DNS domain expiration from whois

"""

WHOIS_REPORT_FIELDS = (
    'created',
    'modified',
    'expires',
    'registrar',
    'whois_servers',
    'nameservers',
    'referrar_url',
    'registrant_address',
    'admin_contact',
    'admin_address',
    'technical_contact',
    'technical_address',
)

class PluginRunner(NagiosPlugin):
    def __init__(self):
        NagiosPlugin.__init__(self, description=DESCRIPTION)
        self.add_argument('-d', '--domain', required=True, help='DNS domain to check')
        self.add_argument('-n', '--nameservers', help='Check nameservers in whois data')
        self.add_argument('-w', '--warning', type=int, help='Warning days before expiration')
        self.add_argument('-c', '--critical', type=int, help='Critical days before expiration')

    def check_plugin_status(self):
        client = WhoisClient()

        self.state = NAGIOS_STATE_OK
        self.message = '{0}'.format(self.args.domain)

        try:
            data = client.query(self.args.domain)
        except WhoisError, emsg:
            self.state = NAGIOS_STATE_CRITICAL
            self.message += ' {0}'.format(emsg)
            return

        if isinstance(data.expires, date):
            today = datetime.now().date()
            expire_days = (data.expires - today).days

            if self.args.critical and expire_days <= self.args.critical:
                self.state = NAGIOS_STATE_CRITICAL

            elif self.args.warning and expire_days <= self.args.warning:
                self.state = NAGIOS_STATE_WARNING

            self.message += ' EXPIRES in {0:d} days'.format(expire_days)

        else:
            self.state = NAGIOS_STATE_CRITICAL
            self.message += ' NO EXPIRATION DATA AVAILABLE'

        if self.args.nameservers:
            nameservers = sorted(x.lower() for x in self.args.nameservers.split(','))
            if not data.nameservers:
                self.state = NAGIOS_STATE_CRITICAL
                self.message += ', NO NAMESERVERS IN WHOIS RESPONSE'

            elif data.nameservers != nameservers:
                self.state = NAGIOS_STATE_CRITICAL
                self.message += ', UNEXPECTED NAMESERVERS: {0}'.format(','.join(nameservers))

            else:
                self.message += ', NAMESERVERS OK'

        for field in WHOIS_REPORT_FIELDS:
            if not field in data:
                continue

            value = data[field]
            if isinstance(value, list):
                value = ','.join(value)
            self.message += '\n{0}: {1}'.format(field, value)

PluginRunner().run()
