Starting Panopticon implementation
This commit is contained in:
parent
30b2f9e8af
commit
f5f08fc103
5 changed files with 118 additions and 11 deletions
|
@ -3,24 +3,20 @@
|
||||||
This server controls all hugveys and the processing of their narratives. It exposes itself for control to the panopticon server.
|
This server controls all hugveys and the processing of their narratives. It exposes itself for control to the panopticon server.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from pandas.conftest import ip
|
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
import yaml
|
import yaml
|
||||||
import zmq
|
import zmq
|
||||||
from zmq.asyncio import Context
|
from zmq.asyncio import Context
|
||||||
|
|
||||||
from hugvey import panopticon
|
|
||||||
from hugvey.communication import getTopic, zmqSend, zmqReceive
|
from hugvey.communication import getTopic, zmqSend, zmqReceive
|
||||||
|
from hugvey.panopticon import Panopticon
|
||||||
|
from hugvey.story import Story
|
||||||
from hugvey.voice.google import GoogleVoiceClient
|
from hugvey.voice.google import GoogleVoiceClient
|
||||||
from hugvey.voice.player import Player
|
from hugvey.voice.player import Player
|
||||||
from hugvey.voice.streamer import AudioStreamer
|
from hugvey.voice.streamer import AudioStreamer
|
||||||
import uuid
|
|
||||||
from hugvey.story import Story
|
|
||||||
import time
|
|
||||||
from _ast import Await
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger("command")
|
logger = logging.getLogger("command")
|
||||||
|
@ -38,6 +34,9 @@ class CentralCommand(object):
|
||||||
|
|
||||||
|
|
||||||
def loadConfig(self, filename):
|
def loadConfig(self, filename):
|
||||||
|
if hasattr(self, 'config'):
|
||||||
|
raise Exception("Overriding config not supported yet")
|
||||||
|
|
||||||
with open(filename, 'r') as fp:
|
with open(filename, 'r') as fp:
|
||||||
logger.debug('Load config from {}'.format(filename))
|
logger.debug('Load config from {}'.format(filename))
|
||||||
self.config = yaml.safe_load(fp)
|
self.config = yaml.safe_load(fp)
|
||||||
|
@ -51,6 +50,8 @@ class CentralCommand(object):
|
||||||
with open(lang['file'], 'r') as fp:
|
with open(lang['file'], 'r') as fp:
|
||||||
self.languages[lang['code']] = yaml.load(fp)
|
self.languages[lang['code']] = yaml.load(fp)
|
||||||
|
|
||||||
|
self.panopticon = Panopticon(self, self.config)
|
||||||
|
|
||||||
|
|
||||||
def commandHugvey(self, hv_id, msg):
|
def commandHugvey(self, hv_id, msg):
|
||||||
"""
|
"""
|
||||||
|
@ -149,13 +150,24 @@ class CentralCommand(object):
|
||||||
await self.hugveys[hugvey_id].eventQueue.put(msg)
|
await self.hugveys[hugvey_id].eventQueue.put(msg)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# def getPanopticon(self):
|
||||||
|
# self.panopticon =
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.isRunning.set()
|
self.isRunning.set()
|
||||||
self.loop = asyncio.get_event_loop()
|
self.loop = asyncio.get_event_loop()
|
||||||
|
# self.panopticon_loop = asyncio.new_event_loop()
|
||||||
|
|
||||||
self.tasks = {} # collect tasks so we can cancel in case of error
|
self.tasks = {} # collect tasks so we can cancel in case of error
|
||||||
self.tasks['eventListener'] = self.loop.create_task(self.eventListener())
|
self.tasks['eventListener'] = self.loop.create_task(self.eventListener())
|
||||||
self.tasks['commandSender'] = self.loop.create_task(self.commandSender())
|
self.tasks['commandSender'] = self.loop.create_task(self.commandSender())
|
||||||
# self.tasks['commandSender'] = self.loop.create_task(self.commandSender())
|
|
||||||
|
print(threading.current_thread())
|
||||||
|
# we want the web interface in a separate thread
|
||||||
|
self.panopticon_thread = threading.Thread(target=self.panopticon.start, name="Panopticon")
|
||||||
|
self.panopticon_thread.start()
|
||||||
|
print(threading.current_thread())
|
||||||
|
|
||||||
self.loop.run_forever()
|
self.loop.run_forever()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
|
@ -5,9 +5,57 @@ The panopticon provides a way to observe (& control) all running Hugveys trough
|
||||||
import logging
|
import logging
|
||||||
import tornado
|
import tornado
|
||||||
|
|
||||||
|
import tornado.websocket
|
||||||
|
import tornado.web
|
||||||
|
import tornado.ioloop
|
||||||
|
import os
|
||||||
|
from pytz.reference import Central
|
||||||
|
import asyncio
|
||||||
|
|
||||||
logger = logging.getLogger("panopticon")
|
logger = logging.getLogger("panopticon")
|
||||||
|
|
||||||
|
web_dir = os.path.join(os.path.split(__file__)[0], '..','www')
|
||||||
|
print(web_dir)
|
||||||
|
|
||||||
|
class WebSocketHandler(tornado.websocket.WebSocketHandler):
|
||||||
|
connections = set()
|
||||||
|
|
||||||
|
# the client connected
|
||||||
|
def open(self):
|
||||||
|
self.connections.add(self)
|
||||||
|
print("New client connected")
|
||||||
|
|
||||||
|
# the client sent the message
|
||||||
|
def on_message(self, message):
|
||||||
|
[con.write_message(message) for con in self.connections]
|
||||||
|
|
||||||
|
# client disconnected
|
||||||
|
def on_close(self):
|
||||||
|
self.connections.remove(self)
|
||||||
|
print("Client disconnected")
|
||||||
|
|
||||||
|
|
||||||
class Panopticon(object):
|
class Panopticon(object):
|
||||||
def __init__(self, config, command):
|
def __init__(self, central_command, config):
|
||||||
pass
|
self.command = central_command
|
||||||
|
self.config = config
|
||||||
|
self.application = tornado.web.Application([
|
||||||
|
(r"/ws", WebSocketHandler),
|
||||||
|
(r"/uploads/(.*)", tornado.web.StaticFileHandler, {"path": config['web']['files_dir']}),
|
||||||
|
(r"/(.*)", tornado.web.StaticFileHandler, {"path": web_dir, "default_filename": 'index.html'}),
|
||||||
|
], debug=True)
|
||||||
|
|
||||||
|
|
||||||
|
self.application.listen(config['web']['port'])
|
||||||
|
# self.loop.configure(evt_loop)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
evt_loop = asyncio.new_event_loop()
|
||||||
|
asyncio.set_event_loop(evt_loop)
|
||||||
|
|
||||||
|
self.loop = tornado.ioloop.IOLoop.current()
|
||||||
|
logger.info(f"Start Panopticon on port {self.config['web']['port']}")
|
||||||
|
self.loop.start()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.loop.stop()
|
||||||
|
|
|
@ -15,4 +15,6 @@ languages:
|
||||||
file: story_de.json
|
file: story_de.json
|
||||||
- code: fr-FR
|
- code: fr-FR
|
||||||
file: story_fr.json
|
file: story_fr.json
|
||||||
|
web:
|
||||||
|
port: 8888
|
||||||
|
files_dir: "/home/ruben/Documents/Projecten/2018/Hugvey/hugvey/local/"
|
28
tsconfig.json
Normal file
28
tsconfig.json
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"emitDecoratorMetadata": false,
|
||||||
|
"experimentalDecorators": false,
|
||||||
|
"module": "es2015",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"noFallthroughCasesInSwitch": false,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"noImplicitReturns": false,
|
||||||
|
"outDir": "www/js",
|
||||||
|
"removeComments": false,
|
||||||
|
"sourceMap": true,
|
||||||
|
"strictNullChecks": false,
|
||||||
|
"target": "es2015",
|
||||||
|
"watch": true,
|
||||||
|
// this enables stricter inference for data properties on `this`
|
||||||
|
"strict": true,
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "tslint-language-service"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rootDir": "www"
|
||||||
|
},
|
||||||
|
"compileOnSave": true,
|
||||||
|
"buildOnSave": true
|
||||||
|
}
|
17
www/index.html
Normal file
17
www/index.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Pillow Talk Control Interface</title>
|
||||||
|
<!-- development version, includes helpful console warnings -->
|
||||||
|
<script src="/vue.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id='status'>
|
||||||
|
</div>
|
||||||
|
<div id='story'>
|
||||||
|
</div>
|
||||||
|
<div id='hugvey'>
|
||||||
|
</div>
|
||||||
|
<div id='app'>{{message}}</div>
|
||||||
|
<script src="/hugvey_console.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue