From a36150d2305e93de9d0f58cb48273ed9909cab05 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 14 Mar 2015 20:27:25 +0100 Subject: GUI: create a second page with a service table --- gui/muxconfig.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ gui/odr-dabmux-gui.py | 91 ++++++++++------------------------------ gui/views/index.tpl | 2 +- gui/views/services.tpl | 31 ++++++++++++++ 4 files changed, 165 insertions(+), 71 deletions(-) create mode 100644 gui/muxconfig.py create mode 100644 gui/views/services.tpl diff --git a/gui/muxconfig.py b/gui/muxconfig.py new file mode 100644 index 0000000..efa4b93 --- /dev/null +++ b/gui/muxconfig.py @@ -0,0 +1,112 @@ +#!/usr/bin/python +# +# Copyright (C) 2015 +# Matthias P. Braendli, matthias.braendli@mpb.li +# +# http://www.opendigitalradio.org +# +# This file is part of ODR-DabMux. +# +# ODR-DabMux is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# ODR-DabMux is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with ODR-DabMux. If not, see . +import socket +import json + +class Service(object): + """Container object for a service""" + def __init__(self, name, ptree): + self.name = name + + for fieldname in ['id', + "label", + "shortlabel", + "pty", + "language" ]: + if fieldname in ptree: + setattr(self, fieldname.replace("-", "_"), ptree[fieldname]) + else: + setattr(self, fieldname.replace("-", "_"), "") + +class Subchannel(object): + """Container object for a subchannel""" + def __init__(self, name, ptree): + self.name = name + for fieldname in ['type', + "inputfile", + "zmq-buffer", + "zmq-prebuffering", + "bitrate", + "id", + "protection", + "encryption", + "secret-key", + "public-key", + "encoder-key"]: + if fieldname in ptree: + setattr(self, fieldname.replace("-", "_"), ptree[fieldname]) + else: + setattr(self, fieldname.replace("-", "_"), "") + +class Component(object): + """Container object for a component""" + def __init__(self, name, ptree): + self.name = name + for fieldname in ['label', 'shortlabel', 'service', + 'subchannel', 'figtype']: + if fieldname in ptree: + setattr(self, fieldname.replace("-", "_"), ptree[fieldname]) + else: + setattr(self, fieldname.replace("-", "_"), "") + +class ConfigurationHandler(object): + """Load and present the configration from ODR-DabMux""" + + def __init__(self, mux_host, mux_port=12720): + self._host = mux_host + self._port = mux_port + + # local copy of the configuration + self._server_version = None + self._config = None + + def load(self): + """Load the configuration from the multiplexer and + save it locally""" + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + s.connect((self._host, self._port)) + s.sendall(b'getptree\n') + server_info = s.recv(32768) + config_info = s.recv(32768) + s.close() + + self._server_version = json.loads(server_info.decode())['service'] + self._config = json.loads(config_info.decode()) + + def get_full_configuration(self): + return self._config + + def get_mux_version(self): + return self._server_version + + def get_services(self): + srv_pt = self._config['services'] + return [Service(name, srv_pt[name]) for name in srv_pt] + + def get_subchannels(self): + sub_pt = self._config['subchannels'] + return [Subchannel(name, sub_pt[name]) for name in sub_pt] + + def get_components(self): + comp_pt = self._config['components'] + return [Component(name, comp_pt[name]) for name in comp_pt] diff --git a/gui/odr-dabmux-gui.py b/gui/odr-dabmux-gui.py index abfd124..2ba61a7 100755 --- a/gui/odr-dabmux-gui.py +++ b/gui/odr-dabmux-gui.py @@ -26,88 +26,39 @@ # You should have received a copy of the GNU General Public License # along with ODR-DabMux. If not, see . +from muxconfig import * from bottle import route, run, template, static_file -import socket import json -import collections -class Service(object): - def __init__(self, name, ptree): - self.name = name - self.label = ptree['label'] - if 'shortlabel' in ptree: - self.shortlabel = ptree['shortlabel'] - else: - self.shortlabel = "" - self.srvid = ptree['id'] - - -class Subchannel(object): - def __init__(self, name, ptree): - self.name = name - for fieldname in ['type', - "inputfile", - "zmq-buffer", - "zmq-prebuffering", - "bitrate", - "id", - "protection", - "encryption", - "secret-key", - "public-key", - "encoder-key"]: - if fieldname in ptree: - setattr(self, fieldname.replace("-", "_"), ptree[fieldname]) - else: - setattr(self, fieldname.replace("-", "_"), "") - -class Component(object): - def __init__(self, name, ptree): - self.name = name - for fieldname in ['label', 'shortlabel', 'service', - 'subchannel', 'figtype']: - if fieldname in ptree: - setattr(self, fieldname.replace("-", "_"), ptree[fieldname]) - else: - setattr(self, fieldname.replace("-", "_"), "") - -def get_mgmt_ptree(): - HOST = 'localhost' - PORT = 12720 - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((HOST, PORT)) - s.sendall(b'getptree\n') - server_info = s.recv(32768) - config_info = s.recv(32768) - s.close() - - server_version = json.loads(server_info.decode())['service'] - config = json.loads(config_info.decode()) - - return {'version': server_version, 'config': config} +conf = ConfigurationHandler('localhost') @route('/config') def config(): - return get_mgmt_ptree() + """Return a application/json containing the full + ptree of the mux""" + + conf.load() + + return {'version': conf.get_mux_version(), + 'config': conf.get_full_configuration()} @route('/') def index(): - ptree = get_mgmt_ptree() - version = ptree['version'] - srv_pt = ptree['config']['services'] - services = [Service(name, srv_pt[name]) for name in srv_pt] + conf.load() - sub_pt = ptree['config']['subchannels'] - subchannels = [Subchannel(name, sub_pt[name]) for name in sub_pt] + return template('index', + version = conf.get_mux_version(), + services = conf.get_services(), + subchannels = conf.get_subchannels(), + components = conf.get_components()) - comp_pt = ptree['config']['components'] - components = [Component(name, comp_pt[name]) for name in comp_pt] +@route('/services') +def index(): + conf.load() - return template('index', - version=version, - services=services, - components=components, - subchannels=subchannels) + return template('services', + version = conf.get_mux_version(), + services = conf.get_services()) @route('/static/') diff --git a/gui/views/index.tpl b/gui/views/index.tpl index c847402..a73d6d2 100644 --- a/gui/views/index.tpl +++ b/gui/views/index.tpl @@ -12,7 +12,7 @@ body {

Services

    % for s in services: -
  • {{s.name}}: {{s.label}} ({{s.shortlabel}}) — id = {{s.srvid}}
  • +
  • {{s.name}}: {{s.label}} ({{s.shortlabel}}) — id = {{s.id}}
  • % end

Subchannels

diff --git a/gui/views/services.tpl b/gui/views/services.tpl new file mode 100644 index 0000000..7ca2f9f --- /dev/null +++ b/gui/views/services.tpl @@ -0,0 +1,31 @@ + + +ODR-DabMux Services + + + +

Services for {{version}}

+ + + + + + + + + % for s in services: + + + + + + + % end + + + + -- cgit v1.2.3
nameidlabelptylanguage
{{s.name}}{{s.id}}{{s.label}} ({{s.shortlabel}}){{s.pty}}{{s.language}}