Skip to content
Snippets Groups Projects
alert.py 2.82 KiB
Newer Older
Brian Moe's avatar
Brian Moe committed

import sys
import time
from subprocess import Popen, PIPE, STDOUT

from django.core.mail import send_mail
from django.conf import settings
Brian Moe's avatar
Brian Moe committed
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse, get_script_prefix

Brian Moe's avatar
Brian Moe committed
def issueAlert(event, location):
    issueXMPPAlert(event, location)
    issueEmailAlert(event, location)

def issueEmailAlert(event, location):
    if event.group.name == 'Test':
        fromaddress = settings.ALERT_TEST_EMAIL_FROM
        toaddress = settings.ALERT_TEST_EMAIL_TO
    else:
        fromaddress = settings.ALERT_EMAIL_FROM
        toaddress = settings.ALERT_EMAIL_TO
    subject = "[gracedb] %s event. ID: %s" % (event.get_analysisType_display(), event.graceid())
    message = """
    New Event
    %s / %s
Brian Moe's avatar
Brian Moe committed
    GRACEID:   %s
    Info:      %s
    Data:      %s
    TWiki:     %s
    Submitter: %s
    Original Data: %s
Brian Moe's avatar
Brian Moe committed
    message %= (event.group.name,
                event.get_analysisType_display(),
                event.graceid(),
                'https://'+Site.objects.get_current().domain+ reverse("view", args=[event.graceid()]),
                event.weburl(),
                event.wikiurl(),
                event.submitter.name,
                location)
    send_mail(subject, message, fromaddress, toaddress)

def issueXMPPAlert(event, location):
Brian Moe's avatar
Brian Moe committed
    # XXX awful!
    # Need a good way to know which things to send out to lvalert.
    # Currently, only Test/* and CBC/MBTAOnline get alerts.
Brian Moe's avatar
Brian Moe committed
    if event.analysisType != 'MBTA' and event.group.name != 'Test':
Brian Moe's avatar
Brian Moe committed
        return

    env = {}
Brian Moe's avatar
Brian Moe committed
    env["PYTHONPATH"] = ":".join(sys.path)

    nodename = "%s_%s"% (event.group.name, event.get_analysisType_display())
    nodename = nodename.lower()
Brian Moe's avatar
Brian Moe committed
    null = open('/dev/null','w')
    p = Popen(
        ["lvalert_send",
         "--username=gracedb",
         "--password=w4k3upal1ve",
         "--file=-",
Brian Moe's avatar
Brian Moe committed
         "--node=%s" % nodename,
Brian Moe's avatar
Brian Moe committed
        ],
        executable="/opt/lscsoft/glue/bin/lvalert_send",
        stdin=PIPE,
        stdout=null,
        stderr=STDOUT,
        env=env)
    msg = createPayload(event.graceid(), location)
Brian Moe's avatar
Brian Moe committed
    p.stdin.write(msg)
    p.stdin.close()
    for i in range(1,10):
        res = p.poll()
        if res == None:
            time.sleep(1)
        else:
            break

def createPayload (uid, filename):
    template = """<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE LIGO_LW SYSTEM "http://ldas-sw.ligo.caltech.edu/doc/ligolwAPI/html/ligolw_dtd.txt">
<LIGO_LW>
        <Table Name="LVAlert:table">
                <Column Type="lstring" Name="LVAlert:uid"/>
                <Column Type="lstring" Name="LVAlert:file"/>
                <Stream Name="LVAlert:table" Type="Local" Delimiter=",">
                        "%(uid)s","%(filename)s"
                </Stream>
        </Table>
</LIGO_LW>
"""
    return template % { 'uid': uid, 'filename': filename }