#!/usr/bin/python
"""

VM names on stdin.
"""

import smtplib
import optparse
import sys
from email.mime.text import MIMEText

from invirt import database

def send_mail(smtp, opts, message, vm):
    contact = database.Machine.query.filter_by(name=vm).first().contact
    if '@' not in contact:
        contact += '@mit.edu'
    msg = MIMEText(message % vm)
    msg['To'] = contact
    msg['From'] = opts.from_addr
    msg['Reply-To'] = 'XVM <xvm@mit.edu>'
    msg['Subject'] = opts.subject % vm
    smtp.sendmail(opts.from_addr,
        [contact],
        msg.as_string())
    return msg.as_string()

def send_summary(smtp, opts, messages):
    msg = MIMEText('\n\n\n'.join(messages))
    msg['To'] = 'xvm-team@mit.edu'
    msg['From'] = opts.from_addr
    msg['Subject'] = ("xvm outage-mail summary (%d): %s"
                      % (len(messages), opts.subject))
    smtp.sendmail(opts.from_addr,
        ['xvm-team@mit.edu'],
        msg.as_string())

def main(argv):
    parser = optparse.OptionParser(
        usage = '%prog {-m message, -f from} [options] <vm-list',
        description = __doc__.strip())
    parser.add_option('-m', '--message',
            type = 'string',
            dest = 'message',
            help = 'filename with body of message')
    parser.add_option('-s', '--subject',
            type = 'string',
            dest = 'subject',
            default = '[xvm] Unexpected reboot of your VM %s',
            help = 'subject line of message; %s for VM name')
    parser.add_option('-f', '--from',
            type = 'string',
            dest = 'from_addr',
            help = 'for From: and envelope-from; first word is %(sig)s')
    parser.add_option('--host',
            type = 'string',
            dest = 'host',
            help = 'host that failed; %(host)s in message')
    parser.add_option('--time',
            type = 'string',
            dest = 'time',
            help = 'time of failure; %(time)s in message')
    opts, args = parser.parse_args()

    if len(args) or not opts.message or not opts.from_addr:
        parser.print_help(sys.stderr)
        return 2

    opts.sig = opts.from_addr.split()[0]
    message = file(opts.message).read() % opts.__dict__

    vms = sys.stdin.read().split()

    database.connect()
    s = smtplib.SMTP()
    s.connect()

    messages = []
    for vm in vms:
        messages.append(send_mail(s, opts, message, vm))
    send_summary(s, opts, messages)

    s.close()

if __name__ == '__main__':
    sys.exit(main(sys.argv))