beerlog-srv.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env python
  2. import asyncio
  3. import websockets
  4. import ssl
  5. import json
  6. import sys
  7. import os
  8. from routes import Routes
  9. routes = Routes()
  10. class UserInfoProtocol(websockets.BasicAuthWebSocketServerProtocol):
  11. async def check_credentials(self, username, password):
  12. all_users = routes.users()
  13. self.user = all_users.get(username, None)
  14. return self.user != None
  15. async def handle(websocket):
  16. try:
  17. await routes.add_connection(websocket)
  18. async for message in websocket:
  19. event = json.loads(message)
  20. print(event, file=sys.stderr)
  21. await routes.call(event["action"], websocket, event)
  22. finally:
  23. await routes.remove_connection(websocket)
  24. async def main():
  25. ssl_context = None
  26. pem = "/cert/live/beerlog.ddns.net/fullchain.pem"
  27. key = "/cert/live/beerlog.ddns.net/privkey.pem"
  28. if os.path.exists(pem):
  29. print(f"Start with {pem}", file=sys.stderr)
  30. ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
  31. ssl_context.load_cert_chain(pem, keyfile=key)
  32. port = os.environ.get("BEERLOG_PORT", 8000)
  33. host = os.environ.get("BEERLOG_HOST", "0.0.0.0")
  34. print(f"Start on {host}:{port}", file=sys.stderr)
  35. async with websockets.serve(handle, host, port, ssl=ssl_context, create_protocol=UserInfoProtocol):
  36. await asyncio.Future()
  37. asyncio.run(main())