move slack_listen to doorboy-proxy
This commit is contained in:
@@ -1,73 +0,0 @@
|
|||||||
import threading
|
|
||||||
import time
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import const
|
|
||||||
from flask import Blueprint, g, request
|
|
||||||
from pymongo import MongoClient
|
|
||||||
|
|
||||||
page_api = Blueprint("api", __name__)
|
|
||||||
db = MongoClient(const.MONGO_URI).get_default_database()
|
|
||||||
|
|
||||||
@page_api.route("/api/slack/doorboy", methods=['POST'])
|
|
||||||
def view_slack_doorboy():
|
|
||||||
begin_time = time.perf_counter()
|
|
||||||
if request.form.get("token") != const.SLACK_VERIFICATION_TOKEN:
|
|
||||||
return "Invalid token was supplied"
|
|
||||||
if request.form.get("channel_id") not in ("C01CWPF5H8W", "CDL9H8Q9W"):
|
|
||||||
return "Invalid channel was supplied"
|
|
||||||
command = request.form.get("command")
|
|
||||||
try:
|
|
||||||
door = {
|
|
||||||
"/open-all-doors": "outsidedoors",
|
|
||||||
"/open-back-door": "backdoor",
|
|
||||||
"/open-front-door": "frontdoor",
|
|
||||||
"/open-ground-door": "grounddoor",
|
|
||||||
"/open-workshop-door": "workshopdoor"
|
|
||||||
}[command]
|
|
||||||
except KeyError:
|
|
||||||
return "Invalid command was supplied"
|
|
||||||
|
|
||||||
member = None
|
|
||||||
for user in g.users:
|
|
||||||
if user.slack_id == request.form.get("user_id"):
|
|
||||||
member = user
|
|
||||||
|
|
||||||
if door == "workshopdoor":
|
|
||||||
access_group = "k-space:workshop"
|
|
||||||
else:
|
|
||||||
access_group = "k-space:floor"
|
|
||||||
approved = access_group in member.groups
|
|
||||||
|
|
||||||
doors = [door]
|
|
||||||
if door == "outsidedoors":
|
|
||||||
doors = ["backdoor", "frontdoor", "grounddoor"]
|
|
||||||
|
|
||||||
status = "Permitted" if approved else "Denied"
|
|
||||||
subject = member.display_name
|
|
||||||
|
|
||||||
threading.Thread(target=handle_slack_door_event, args=(doors, approved, member, door, status, subject)).start()
|
|
||||||
|
|
||||||
end_time = time.perf_counter()
|
|
||||||
print(f"view_slack_doorboy done in {end_time - begin_time:.4f} seconds")
|
|
||||||
|
|
||||||
return_message = "Opening %s for %s" % (door, subject) if approved else "Permission denied"
|
|
||||||
return return_message
|
|
||||||
|
|
||||||
def handle_slack_door_event(doors, approved, member, door, status, subject):
|
|
||||||
begin_time = time.perf_counter()
|
|
||||||
for d in doors:
|
|
||||||
db.eventlog.insert_one({
|
|
||||||
"component": "doorboy",
|
|
||||||
"method": "slack",
|
|
||||||
"timestamp": datetime.utcnow(),
|
|
||||||
"door": d,
|
|
||||||
"approved": approved,
|
|
||||||
"user": {
|
|
||||||
"id": member.username,
|
|
||||||
"name": member.display_name,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
end_time = time.perf_counter()
|
|
||||||
print(f"handle_slack_door_event done in {end_time - begin_time:.4f} seconds")
|
|
@@ -17,5 +17,4 @@ AWS_S3_ENDPOINT_URL = os.environ["AWS_S3_ENDPOINT_URL"]
|
|||||||
BUCKET_NAME = os.environ["BUCKET_NAME"]
|
BUCKET_NAME = os.environ["BUCKET_NAME"]
|
||||||
INVENTORY_ASSETS_BASE_URL = os.environ["INVENTORY_ASSETS_BASE_URL"]
|
INVENTORY_ASSETS_BASE_URL = os.environ["INVENTORY_ASSETS_BASE_URL"]
|
||||||
MONGO_URI = os.environ["MONGO_URI"]
|
MONGO_URI = os.environ["MONGO_URI"]
|
||||||
SLACK_VERIFICATION_TOKEN = os.environ["SLACK_VERIFICATION_TOKEN"] # used to verify (deprecated) incoming requests from slack
|
|
||||||
MACADDRESS_OUTLINK_BASEURL = os.environ["MACADDRESS_OUTLINK_BASEURL"]
|
MACADDRESS_OUTLINK_BASEURL = os.environ["MACADDRESS_OUTLINK_BASEURL"]
|
||||||
|
@@ -25,9 +25,8 @@ from wtforms import (
|
|||||||
import const
|
import const
|
||||||
from common import devenv, format_name, get_users, User
|
from common import devenv, format_name, get_users, User
|
||||||
from inventory import page_inventory
|
from inventory import page_inventory
|
||||||
from oidc import page_oidc, login_required, read_user
|
from oidc import page_oidc, login_required
|
||||||
from doorboy import page_doorboy
|
from doorboy import page_doorboy
|
||||||
from api import page_api
|
|
||||||
|
|
||||||
def check_foreign_key_format(item):
|
def check_foreign_key_format(item):
|
||||||
owner = item.get("inventory", {}).get("owner", {})
|
owner = item.get("inventory", {}).get("owner", {})
|
||||||
@@ -124,7 +123,6 @@ app = Flask(__name__)
|
|||||||
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
||||||
app.register_blueprint(page_inventory)
|
app.register_blueprint(page_inventory)
|
||||||
app.register_blueprint(page_oidc)
|
app.register_blueprint(page_oidc)
|
||||||
app.register_blueprint(page_api)
|
|
||||||
app.register_blueprint(page_doorboy)
|
app.register_blueprint(page_doorboy)
|
||||||
metrics = PrometheusMetrics(app, group_by="path")
|
metrics = PrometheusMetrics(app, group_by="path")
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user