forked from verlock/verlock-doorboy-proxy
commit
8ece59267e
@ -0,0 +1,3 @@ |
||||
# MONGO_URI=mongodb://root:salakala@localhost:27017/?replicaSet=kspace-mongo-set |
||||
MONGO_URI=mongodb://root:salakala@localhost:27017 |
||||
DOORBOY_SECRET=doorboy_secret |
@ -0,0 +1,8 @@ |
||||
FROM python:3 |
||||
WORKDIR /app |
||||
|
||||
COPY requirements.txt ./ |
||||
RUN pip install -r requirements.txt |
||||
|
||||
COPY *.py ./ |
||||
CMD ["gunicorn", "--workers", "10", "--bind", "[::]:5000", "main:app", "--timeout", "90"] |
@ -0,0 +1,18 @@ |
||||
version: '3.7' |
||||
|
||||
networks: |
||||
infra: |
||||
external: true |
||||
|
||||
services: |
||||
doorboy_proxy: |
||||
hostname: doorboy.infra.k-space.ee |
||||
restart: unless-stopped |
||||
env_file: .env |
||||
networks: |
||||
infra: |
||||
ipv4_address: 172.21.99.97 |
||||
build: |
||||
context: . |
||||
|
||||
|
@ -0,0 +1,63 @@ |
||||
from datetime import datetime |
||||
from flask import Flask, request, redirect, render_template, Blueprint, make_response, jsonify |
||||
from pymongo import MongoClient |
||||
import flask |
||||
import hashlib |
||||
import jinja2 |
||||
import json |
||||
import os |
||||
import pymongo |
||||
import smtplib |
||||
|
||||
app = Flask(__name__) |
||||
mongodb = MongoClient('mongodb://172.21.27.1,172.21.27.2,172.21.27.3:27017/', replicaSet="kspace-mongo-set").kspace_accounting |
||||
mongodb.authenticate("kspace_accounting", os.environ["MONGO_PASSWORD"]) |
||||
|
||||
DOORBOY_SECRET = os.environ["DOORBOY_SECRET"] |
||||
|
||||
assert len(DOORBOY_SECRET) > 10 |
||||
|
||||
@app.route("/allowed") |
||||
def view_doorboy_uids(): |
||||
if request.headers.get('KEY') != DOORBOY_SECRET: |
||||
return "how about no" |
||||
allowed_names = [o["_id"] for o in mongodb.member.find({"enabled": True})] |
||||
allowed_uids = [] |
||||
for obj in mongodb.inventory.find({"token.uid_hash": {"$exists":True}, "inventory.owner_id": {"$exists":True}, "token.enabled": True}, {"inventory.owner_id": True, "token.uid_hash": True }): |
||||
if obj["inventory"].pop("owner_id") in allowed_names: |
||||
obj.pop("_id") |
||||
obj.pop("inventory") |
||||
allowed_uids.append(obj) |
||||
return jsonify(allowed_uids=allowed_uids) |
||||
|
||||
|
||||
@app.route("/longpoll") |
||||
def view_longpoll(): |
||||
if request.headers.get('KEY') != DOORBOY_SECRET: |
||||
return "how about no" |
||||
|
||||
def g(): |
||||
yield "data: response-generator-started\n\n" |
||||
pipeline = [ |
||||
{ |
||||
'$match': { |
||||
'operationType': "insert", |
||||
# 'component': 'doorboy', |
||||
# 'type': 'open-door' |
||||
} |
||||
} |
||||
] |
||||
try: |
||||
with mongodb.eventlog.watch(pipeline) as stream: |
||||
yield "data: watch-stream-opened\n\n" |
||||
for event in stream: |
||||
if event["fullDocument"].get("type") == "open-door": |
||||
yield "data: %s\n\n" % event["fullDocument"]["door"] |
||||
except pymongo.errors.PyMongoError: |
||||
return "urror" |
||||
return flask.Response(g(), |
||||
mimetype="text/event-stream") |
||||
|
||||
if __name__ == '__main__': |
||||
app.run(debug=False, host='::') |
||||
|
@ -0,0 +1,4 @@ |
||||
Flask |
||||
Flask-WTF |
||||
pymongo |
||||
gunicorn |
Loading…
Reference in new issue