2015-01-27 22:40:59 +00:00
import json
2016-09-15 10:16:11 +01:00
import logging
2017-09-17 15:56:55 +01:00
import os
import requests
2015-01-27 22:40:59 +00:00
2017-09-17 15:56:55 +01:00
try :
from alerta . plugins import app # alerta >= 5.0
except ImportError :
from alerta . app import app # alerta < 5.0
2015-01-27 22:40:59 +00:00
from alerta . plugins import PluginBase
2016-09-15 10:16:11 +01:00
LOG = logging . getLogger ( ' alerta.plugins.hipchat ' )
2015-01-27 22:40:59 +00:00
2017-09-07 13:48:05 +01:00
HIPCHAT_URL = os . environ . get ( ' HIPCHAT_URL ' ) or app . config . get ( ' HIPCHAT_URL ' , ' https://api.hipchat.com/v2 ' ) # Hipchat URL, change if using privately hosted Hipchat
2015-12-16 09:59:38 +00:00
HIPCHAT_ROOM = os . environ . get ( ' HIPCHAT_ROOM ' ) or app . config [ ' HIPCHAT_ROOM ' ] # Room Name or Room API ID
HIPCHAT_API_KEY = os . environ . get ( ' HIPCHAT_API_KEY ' ) or app . config [ ' HIPCHAT_API_KEY ' ] # Room Notification Token
2016-01-08 17:27:04 -05:00
HIPCHAT_SUMMARY_FMT = os . environ . get ( ' HIPCHAT_SUMMARY_FMT ' ) or app . config . get ( ' HIPCHAT_SUMMARY_FMT ' , None ) # Message summary format
2017-09-07 13:48:05 +01:00
HIPCHAT_VERIFY_SSL = os . environ . get ( ' HIPCHAT_VERIFY_SSL ' ) or app . config . get ( ' HIPCHAT_VERIFY_SSL ' , True ) # Verify SSL cert from Hipchat
2016-11-20 23:10:57 +00:00
DASHBOARD_URL = os . environ . get ( ' DASHBOARD_URL ' ) or app . config . get ( ' DASHBOARD_URL ' , ' ' )
try :
from jinja2 import Template
except Exception as e :
LOG . error ( ' HipChat: ERROR - Jinja template error: %s , template functionality will be unavailable ' , e )
2015-01-27 22:40:59 +00:00
2016-03-07 22:13:52 +10:00
2015-01-27 22:40:59 +00:00
class SendRoomNotification ( PluginBase ) :
def pre_receive ( self , alert ) :
return alert
def post_receive ( self , alert ) :
if alert . repeat :
return
2016-11-20 23:10:57 +00:00
if HIPCHAT_SUMMARY_FMT :
try :
template = Template ( HIPCHAT_SUMMARY_FMT )
except Exception as e :
LOG . error ( ' HipChat: ERROR - Template init failed: %s ' , e )
return
2015-01-27 22:40:59 +00:00
2016-01-08 17:27:04 -05:00
try :
template_vars = {
' alert ' : alert ,
' config ' : app . config
}
2016-11-20 23:10:57 +00:00
summary = template . render ( * * template_vars )
2016-01-08 17:27:04 -05:00
except Exception as e :
2016-11-20 23:10:57 +00:00
LOG . error ( ' HipChat: ERROR - Template render failed: %s ' , e )
return
else :
summary = ( ' <b>[ {status} ] {environment} {service} {severity} - <i> {event} on {resource} </i></b> <a href= " {dashboard} /#/alert/ {alert_id} " > {short_id} </a> ' ) . format (
status = alert . status . capitalize ( ) ,
environment = alert . environment . upper ( ) ,
service = ' , ' . join ( alert . service ) ,
severity = alert . severity . capitalize ( ) ,
event = alert . event ,
resource = alert . resource ,
alert_id = alert . id ,
short_id = alert . get_id ( short = True ) ,
dashboard = DASHBOARD_URL
2016-01-08 17:27:04 -05:00
)
2015-01-27 22:40:59 +00:00
if alert . severity == ' critical ' :
color = " red "
elif alert . severity == ' major ' :
color = " purple "
elif alert . severity == ' minor ' :
color = " yellow "
elif alert . severity == ' warning ' :
color = " gray "
else :
color = " green "
payload = {
" color " : color ,
" message " : summary ,
" notify " : True ,
" message_format " : " html "
}
LOG . debug ( ' HipChat payload: %s ' , payload )
2016-11-20 23:10:57 +00:00
url = ' %s /room/ %s /notification ' % ( HIPCHAT_URL , HIPCHAT_ROOM )
2015-01-27 22:40:59 +00:00
headers = {
' Authorization ' : ' Bearer ' + HIPCHAT_API_KEY ,
' Content-type ' : ' application/json '
}
2016-11-20 23:10:57 +00:00
LOG . debug ( ' HipChat: Notification sent to %s ' , url )
2015-01-27 22:40:59 +00:00
try :
2017-09-07 13:48:05 +01:00
r = requests . post ( url , data = json . dumps ( payload ) , headers = headers , timeout = 2 , verify = HIPCHAT_VERIFY_SSL )
2015-01-27 22:40:59 +00:00
except Exception as e :
2016-11-20 23:10:57 +00:00
raise RuntimeError ( " HipChat: ERROR - %s " , e )
2015-01-27 22:40:59 +00:00
2016-11-20 23:10:57 +00:00
LOG . debug ( ' HipChat: %s - %s ' , r . status_code , r . text )
2016-03-07 22:13:52 +10:00
def status_change ( self , alert , status , text ) :
return