first commit
This commit is contained in:
		
							
								
								
									
										3
									
								
								.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.env
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
							
								
								
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -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"] | ||||||
							
								
								
									
										18
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -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: . | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										63
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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='::') | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | Flask | ||||||
|  | Flask-WTF | ||||||
|  | pymongo | ||||||
|  | gunicorn | ||||||
		Reference in New Issue
	
	Block a user