from flask import Flask , request
import os
import incident
import datetime
app = Flask ( __name__ )
app . config . from_envvar ( ' FIH_SETTINGS ' )
app . mm = incident . Mattermost ( url = app . config [ ' MATTERMOST_URL ' ] ,
port = app . config [ ' MATTERMOST_PORT ' ] ,
login_id = app . config [ ' MATTERMOST_USER_EMAIL ' ] ,
password = app . config [ ' MATTERMOST_USER_PASSWORD ' ] ,
) . mm
@app.route ( ' /mattermost/incident ' , methods = [ ' POST ' ] )
def mattermost_incident ( ) :
# channel_name: testing
# command: /incident
# channel_id: o3ob1utim3nummoswjyt4174mo
# user_name: marek
# test_domain: faelix
# text: test
# team_id: 3woo8mbjrbb1in53xwdzi4ynqh
# user_id: ko3uxmend7ne8ger4uw9mxkt1o
# token: XXXXXXXXXXXXXXXXXXXXXXXXXX
if request . form [ ' token ' ] in app . config [ ' MATTERMOST_COMMAND_TOKENS ' ] :
incident_number = incident . generate_incident_number ( )
fi_number = " FI# " + incident_number
channel_name = " incident " + incident_number
purpose = request . form [ ' text ' ]
channel = app . mm . channels . create_channel ( options = { " team_id " : request . form [ ' team_id ' ] ,
" name " : channel_name ,
" display_name " : fi_number ,
" purpose " : purpose ,
" header " : " " ,
" type " : " O " ,
} )
# add user to the channel we just created
app . mm . client . make_request ( ' post ' , ' /channels/ ' + channel [ ' id ' ] + ' /members ' , options = { ' user_id ' : request . form [ ' user_id ' ] ,
} )
app . mm . posts . create_post ( options = { ' channel_id ' : channel [ ' id ' ] ,
' message ' : " Incident discussion channel for [ %s ](https://status.faelix.net/incident/ %s ) created by @ %s . " % ( fi_number , incident_number , request . form [ ' user_name ' ] ) ,
} )
now = datetime . datetime . utcnow ( ) . strftime ( " % Y- % m- %d T % H: % M: % S " )
app . mm . posts . create_post ( options = { ' channel_id ' : channel [ ' id ' ] ,
' message ' : """ \
# Incident Response Communication Procedure
The contents of this channel are strictly confidential .
## Public Announcement
1. adjust the name of the incident with * * / purpose * *
2. adjust the description of the incident with * * / header * *
3. choose a front page status ( see below )
4. publish https : / / status . faelix . net / incident / % ( incident_number ) s with * * @FIH PUBLISH * *
## Status Updates
* add an update : * * @FIH TIMELINE * * _text_
* set the incident start : * * @FIH START * * _ % ( now ) s_ ( UTC )
* set the incident ETR : * * @FIH ETR * * _ % ( now ) s_ ( UTC )
* set the incident resolved time : * * @FIH RESOLVED * * _ % ( now ) s_ ( UTC )
* set the incident finished time : * * @FIH CLOSED * * _ % ( now ) s_ ( UTC )
Again , don ' t forget to **@FIH PUBLISH** once making changes.
## Front Page Status
* * * @FIH INCIDENT * *
* * * @FIH DEGRADED * *
* * * @FIH MAINTENANCE * *
* * * @FIH NOTICE * *
* * * @FIH OK * *
Again , after setting the headline status you must : * * @FIH PUBLISH * *
## Good luck, Incident Commander @%(commander_name)s!""" % { "incident_number": incident_number,
" commander_name " : request . form [ ' user_name ' ] ,
" now " : now ,
} ,
} )
app . mm . posts . create_post ( options = { ' channel_id ' : request . form [ ' channel_id ' ] ,
' message ' : ' On behalf of @ %s I have started incident ~ %s . ' % ( request . form [ ' user_name ' ] , channel_name , ) ,
} )
return " "
else :
return " Invalid command token. "
@app.route ( ' /mattermost/fih ' , methods = [ ' POST ' ] )
def mattermost_fig ( ) :
print ( repr ( request . form ) )
return " Whaaat? "
@app.route ( ' / ' )
def hello_world ( ) :
return ' Hello, World! '