#!/usr/bin/python3 import asyncio import websockets import ssl from time import sleep import os import subprocess import sys import json VIEWERS = set() CAMERAS = set() async def server(websocket, path): recv = await websocket.recv() if recv.startswith("STREAM UPLOAD"): await websocket.send("OK") name = await websocket.recv() print(f"STREAM UPLOADER {name} ADDED") CAMERAS.add(websocket) try: while True: frame = await websocket.recv() if VIEWERS: await asyncio.wait([viewer.send(frame) for viewer in VIEWERS]) finally: CAMERAS.remove(websocket) print(f"STREAM UPLOADER {name} REMOVED") elif recv == "STREAM DOWNLOAD": await websocket.send("QUERY") # test if user is signed in and has permission to view the camera stream sessionID = await websocket.recv() process = subprocess.run(["php", "/var/www/html/backend/user.php", f"x={{\"type\": \"auth\", \"sessionID\": \"{sessionID}\"}}"], universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) #sys.stdout.buffer data = json.loads(process.stdout) if "data" in data and "VIEW_STREAM" in data["data"]["permissions"].split("|"): await websocket.send("ACCEPT") print(f"STREAM DOWNLOADER {sessionID} ADDED") VIEWERS.add(websocket) await websocket.wait_closed() print(f"STREAM DOWNLOADER {sessionID} REMOVED") VIEWERS.remove(websocket) else: await websocket.send("REJECT") print(f"STREAM DOWNLOADER {sessionID} REJECTED") else: await websocket.send("INVALID") ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context.load_cert_chain(certfile="/etc/letsencrypt/archive/westley.digital/fullchain1.pem", keyfile="/etc/letsencrypt/archive/westley.digital/privkey1.pem") start_server = websockets.serve(server, "westley.digital", 8765, ssl=ssl_context, ping_interval=None, ping_timeout=None) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()