webui fix and serverinfo (#699)

* initial commit of webconfig

* update example config with webconfig and fix format of file
update debian postinst script for install example config

* fix compiling
add new web server command "serverinfo" to use in webapp to retrieve json port

* change web default port to 8099
This commit is contained in:
redPanther 2016-06-13 22:54:08 +02:00 committed by brindosch
parent f0884ec25b
commit eb64e7e528
7 changed files with 74 additions and 46 deletions

View File

@ -187,7 +187,7 @@
{ {
"enable" : true, "enable" : true,
"document_root" : "/usr/share/hyperion/webconfig", "document_root" : "/usr/share/hyperion/webconfig",
"port" : 8080 "port" : 8099
}, },
/// The configuration of the Json/Proto forwarder. Forward messages to multiple instances of Hyperion on same and/or other hosts /// The configuration of the Json/Proto forwarder. Forward messages to multiple instances of Hyperion on same and/or other hosts

View File

@ -2,7 +2,9 @@
#define WEBCONFIG_H #define WEBCONFIG_H
#include <QObject> #include <QObject>
#include <QString>
#include <string> #include <string>
#include <utils/jsonschema/JsonFactory.h>
class StaticFileServing; class StaticFileServing;
@ -10,17 +12,23 @@ class WebConfig : public QObject {
Q_OBJECT Q_OBJECT
public: public:
explicit WebConfig (std::string baseUrl, quint16 port, QObject * parent = NULL); WebConfig (std::string baseUrl, quint16 port, quint16 jsonPort, QObject * parent = NULL);
WebConfig (const Json::Value &config, QObject * parent = NULL);
virtual ~WebConfig (void); virtual ~WebConfig (void);
void start(); void start();
void stop(); void stop();
private: private:
QObject * _parent; QObject* _parent;
QString _baseUrl; QString _baseUrl;
quint16 _port; quint16 _port;
StaticFileServing * _server; quint16 _jsonPort;
StaticFileServing* _server;
const std::string WEBCONFIG_DEFAULT_PATH = "/usr/share/hyperion/webconfig";
const quint16 WEBCONFIG_DEFAULT_PORT = 8099;
}; };
#endif // WEBCONFIG_H #endif // WEBCONFIG_H

View File

@ -46,7 +46,7 @@ Logger::Logger ( std::string name, LogLevel minLevel ):
_syslogEnabled(true), _syslogEnabled(true),
_loggerId(loggerId++) _loggerId(loggerId++)
{ {
#ifdef GLIBC #ifdef __linux__
_appname = std::string(program_invocation_short_name); _appname = std::string(program_invocation_short_name);
#else #else
_appname = std::string(getprogname()); _appname = std::string(getprogname());

View File

@ -8,35 +8,36 @@
#include <QPair> #include <QPair>
#include <QFile> #include <QFile>
StaticFileServing::StaticFileServing (QString baseUrl, quint16 port, QObject * parent) StaticFileServing::StaticFileServing (QString baseUrl, quint16 port, quint16 jsonPort, QObject * parent)
: QObject (parent) : QObject (parent)
, m_baseUrl (baseUrl) , m_baseUrl (baseUrl)
, _jsonPort (jsonPort)
{ {
m_mimeDb = new QMimeDatabase; m_mimeDb = new QMimeDatabase;
m_server = new QtHttpServer (this); _server = new QtHttpServer (this);
m_server->setServerName (QStringLiteral ("Qt Static HTTP File Server")); _server->setServerName (QStringLiteral ("Qt Static HTTP File Server"));
connect (m_server, &QtHttpServer::started, this, &StaticFileServing::onServerStarted); connect (_server, &QtHttpServer::started, this, &StaticFileServing::onServerStarted);
connect (m_server, &QtHttpServer::stopped, this, &StaticFileServing::onServerStopped); connect (_server, &QtHttpServer::stopped, this, &StaticFileServing::onServerStopped);
connect (m_server, &QtHttpServer::error, this, &StaticFileServing::onServerError); connect (_server, &QtHttpServer::error, this, &StaticFileServing::onServerError);
connect (m_server, &QtHttpServer::requestNeedsReply, this, &StaticFileServing::onRequestNeedsReply); connect (_server, &QtHttpServer::requestNeedsReply, this, &StaticFileServing::onRequestNeedsReply);
m_server->start (port); _server->start (port);
} }
StaticFileServing::~StaticFileServing () StaticFileServing::~StaticFileServing ()
{ {
m_server->stop (); _server->stop ();
} }
void StaticFileServing::onServerStarted (quint16 port) void StaticFileServing::onServerStarted (quint16 port)
{ {
qDebug () << "QtHttpServer started on port" << port << m_server->getServerName (); qDebug () << "QtHttpServer started on port" << port << _server->getServerName ();
} }
void StaticFileServing::onServerStopped () { void StaticFileServing::onServerStopped () {
qDebug () << "QtHttpServer stopped" << m_server->getServerName (); qDebug () << "QtHttpServer stopped" << _server->getServerName ();
} }
void StaticFileServing::onServerError (QString msg) void StaticFileServing::onServerError (QString msg)
@ -56,6 +57,16 @@ void StaticFileServing::onRequestNeedsReply (QtHttpRequest * request, QtHttpRepl
if (command == QStringLiteral ("GET")) if (command == QStringLiteral ("GET"))
{ {
QString path = request->getUrl ().path (); QString path = request->getUrl ().path ();
// special uri handling for server commands
if ( path == "/serverinfo" )
{
reply->addHeader ("Content-Type", "text/plain" );
reply->appendRawData (QByteArrayLiteral(":") % QString::number(_jsonPort).toUtf8() );
return;
}
// get static files
if ( path == "/" || path.isEmpty() || ! QFile::exists(m_baseUrl % "/" % path) ) if ( path == "/" || path.isEmpty() || ! QFile::exists(m_baseUrl % "/" % path) )
path = "index.html"; path = "index.html";

View File

@ -13,7 +13,7 @@ class StaticFileServing : public QObject {
Q_OBJECT Q_OBJECT
public: public:
explicit StaticFileServing (QString baseUrl, quint16 port, QObject * parent = NULL); explicit StaticFileServing (QString baseUrl, quint16 port, quint16 jsonPort, QObject * parent = NULL);
virtual ~StaticFileServing (void); virtual ~StaticFileServing (void);
public slots: public slots:
@ -24,8 +24,9 @@ public slots:
private: private:
QString m_baseUrl; QString m_baseUrl;
QtHttpServer * m_server; QtHttpServer * _server;
QMimeDatabase * m_mimeDb; QMimeDatabase * m_mimeDb;
quint16 _jsonPort;
}; };
#endif // STATICFILESERVING_H #endif // STATICFILESERVING_H

View File

@ -1,14 +1,45 @@
#include "webconfig/webconfig.h" #include "webconfig/webconfig.h"
#include "StaticFileServing.h" #include "StaticFileServing.h"
WebConfig::WebConfig(std::string baseUrl, quint16 port, QObject * parent) :
WebConfig::WebConfig(std::string baseUrl, quint16 port, quint16 jsonPort, QObject * parent) :
_parent(parent), _parent(parent),
_baseUrl(QString::fromStdString(baseUrl)), _baseUrl(QString::fromStdString(baseUrl)),
_port(port), _port(port),
_jsonPort(jsonPort),
_server(nullptr) _server(nullptr)
{ {
} }
WebConfig::WebConfig(const Json::Value &config, QObject * parent) :
_parent(parent),
_port(WEBCONFIG_DEFAULT_PORT),
_server(nullptr)
{
_baseUrl = QString::fromStdString(WEBCONFIG_DEFAULT_PATH);
_jsonPort = 19444;
bool webconfigEnable = true;
if (config.isMember("webConfig"))
{
const Json::Value & webconfigConfig = config["webConfig"];
webconfigEnable = webconfigConfig.get("enable", true).asBool();
_port = webconfigConfig.get("port", WEBCONFIG_DEFAULT_PORT).asUInt();
_baseUrl = QString::fromStdString( webconfigConfig.get("document_root", WEBCONFIG_DEFAULT_PATH).asString() );
}
if (config.isMember("jsonServer"))
{
const Json::Value & jsonConfig = config["jsonServer"];
_jsonPort = jsonConfig.get("port", 19444).asUInt();
}
if ( webconfigEnable )
start();
}
WebConfig::~WebConfig() WebConfig::~WebConfig()
{ {
stop(); stop();
@ -18,7 +49,7 @@ WebConfig::~WebConfig()
void WebConfig::start() void WebConfig::start()
{ {
if ( _server == nullptr ) if ( _server == nullptr )
_server = new StaticFileServing (_baseUrl, _port, this); _server = new StaticFileServing (_baseUrl, _port, _jsonPort, this);
} }
void WebConfig::stop() void WebConfig::stop()

View File

@ -195,11 +195,7 @@ void startXBMCVideoChecker(const Json::Value &config, XBMCVideoChecker* &xbmcVid
} }
} }
#ifdef ENABLE_QT5
void startNetworkServices(const Json::Value &config, Hyperion &hyperion, JsonServer* &jsonServer, ProtoServer* &protoServer, BoblightServer* &boblightServer, WebConfig* &webConfig, XBMCVideoChecker* &xbmcVideoChecker, QObject* parent)
#else
void startNetworkServices(const Json::Value &config, Hyperion &hyperion, JsonServer* &jsonServer, ProtoServer* &protoServer, BoblightServer* &boblightServer, XBMCVideoChecker* &xbmcVideoChecker) void startNetworkServices(const Json::Value &config, Hyperion &hyperion, JsonServer* &jsonServer, ProtoServer* &protoServer, BoblightServer* &boblightServer, XBMCVideoChecker* &xbmcVideoChecker)
#endif
{ {
// Create Json server if configuration is present // Create Json server if configuration is present
unsigned int jsonPort = 19444; unsigned int jsonPort = 19444;
@ -230,24 +226,6 @@ void startNetworkServices(const Json::Value &config, Hyperion &hyperion, JsonSer
} }
std::cout << "INFO: Proto server created and started on port " << protoServer->getPort() << std::endl; std::cout << "INFO: Proto server created and started on port " << protoServer->getPort() << std::endl;
#ifdef ENABLE_QT5
// webconfig server
std::string webconfigPath = "/usr/share/hyperion/webconfig";
quint16 webconfigPort = 80;
bool webconfigEnable = true;
if (config.isMember("webConfig"))
{
const Json::Value & webconfigConfig = config["webConfig"];
webconfigEnable = webconfigConfig.get("enable", true).asBool();
webconfigPort = webconfigConfig.get("port", 80).asUInt();
webconfigPath = webconfigConfig.get("document_root", "/usr/share/hyperion/webconfig").asString();
}
webConfig = new WebConfig(webconfigPath, webconfigPort, parent);
if ( webconfigEnable )
webConfig->start();
#endif
#ifdef ENABLE_ZEROCONF #ifdef ENABLE_ZEROCONF
const Json::Value & deviceConfig = config["device"]; const Json::Value & deviceConfig = config["device"];
const std::string deviceName = deviceConfig.get("name", "").asString(); const std::string deviceName = deviceConfig.get("name", "").asString();
@ -522,11 +500,10 @@ int main(int argc, char** argv)
JsonServer * jsonServer = nullptr; JsonServer * jsonServer = nullptr;
ProtoServer * protoServer = nullptr; ProtoServer * protoServer = nullptr;
BoblightServer * boblightServer = nullptr; BoblightServer * boblightServer = nullptr;
#ifdef ENABLE_QT5
WebConfig * webConfig = nullptr;
startNetworkServices(config, hyperion, jsonServer, protoServer, boblightServer, webConfig, xbmcVideoChecker, &app);
#else
startNetworkServices(config, hyperion, jsonServer, protoServer, boblightServer, xbmcVideoChecker); startNetworkServices(config, hyperion, jsonServer, protoServer, boblightServer, xbmcVideoChecker);
#ifdef ENABLE_QT5
WebConfig webConfig(config, &app);
#endif #endif
// ---- grabber ----- // ---- grabber -----