You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.3 KiB
Python
106 lines
4.3 KiB
Python
|
|
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-%dT%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!'
|