Skip to content

Instantly share code, notes, and snippets.

@cecton
Created August 31, 2017 09:08
Show Gist options
  • Save cecton/2bd6948825804587908eb93949cd0029 to your computer and use it in GitHub Desktop.
Save cecton/2bd6948825804587908eb93949cd0029 to your computer and use it in GitHub Desktop.
docker_listener.py
import asyncio
import logging
import aiohttp
from aiohttp import web
import aiodocker
from aiodocker.docker import Docker
from aiodocker.exceptions import DockerError
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger(__name__)
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
#request.app['websockets'][user_id].add(ws)
task = request.app.loop.create_task(
listen_to_docker(ws))
try:
async for msg in ws:
# handle incoming messages
if msg.type == aiohttp.WSMsgType.close:
log.debug('websocket connection closed')
await ws.close()
break
elif msg.type == aiohttp.WSMsgType.error:
log.debug('ws connection closed with exception %s' % ws.exception())
break
elif msg.type == aiohttp.WSMsgType.text:
log.debug(msg)
await ws.send_str('ECHO')
else:
print('ws connection received unknown message type %s' % msg.type)
except asyncio.CancelledError:
log.debug('websocket cancelled')
#finally:
# request.app['websockets'][user_id].remove(ws)
await ws.close()
return ws
async def listen_to_docker(ws):
log.debug("Running Listening Docker")
docker = Docker()
subscriber = docker.events.subscribe()
try:
while True:
event = await subscriber.get()
log.debug(event)
# Forward message to all connected websockets:
if event['Type'] == 'container':
log.debug(ws)
await ws.send_str('Message from docker')
log.debug("Message sent")
except asyncio.CancelledError:
pass
finally:
await docker.close()
log.debug("Outside the loop!")
app = web.Application()
app.router.add_get('/', websocket_handler)
web.run_app(app, port=5000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment