#!/usr/bin/python
"""

VM names and contacts, one tuple per line, on stdin.
"""

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

def send_mail(smtp, opts, message, vmandcontact):
    vm = vmandcontact[0]
    contact = vmandcontact[1]
    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__

    vmsandcontacts = sys.stdin.read().split('\n')

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

    messages = []
    for vmandcontact in vmsandcontacts:
	if (vmandcontact.strip().__len__() > 0):
            messages.append(send_mail(s, opts, message, vmandcontact.split()))
    send_summary(s, opts, messages)

    s.close()

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