mirror of
https://github.com/outbackdingo/sysadm.git
synced 2026-01-27 10:20:26 +00:00
121 lines
4.6 KiB
C++
121 lines
4.6 KiB
C++
// ===============================
|
|
// PC-BSD REST/JSON API Server
|
|
// Available under the 3-clause BSD License
|
|
// Written by: Ken Moore <ken@pcbsd.org> July 2015
|
|
// =================================
|
|
#ifndef _PCBSD_REST_WEB_SOCKET_H
|
|
#define _PCBSD_REST_WEB_SOCKET_H
|
|
|
|
#include "globals.h"
|
|
|
|
#include "RestStructs.h"
|
|
#include "AuthorizationManager.h"
|
|
|
|
struct bridge_data{
|
|
QString enc_key, auth_tok;
|
|
};
|
|
|
|
class WebSocket : public QObject{
|
|
Q_OBJECT
|
|
public:
|
|
WebSocket(QWebSocket*, QString ID, AuthorizationManager *auth);
|
|
WebSocket(QSslSocket*, QString ID, AuthorizationManager *auth);
|
|
WebSocket(QUrl, QString ID, AuthorizationManager *auth); //sets up a bridge connection (websocket only)
|
|
~WebSocket();
|
|
|
|
QString ID();
|
|
|
|
private:
|
|
QTimer *idletimer;
|
|
QWebSocket *SOCKET;
|
|
QSslSocket *TSOCKET;
|
|
QString SockID, SockAuthToken, SockPeerIP;
|
|
AuthorizationManager *AUTHSYSTEM;
|
|
QList<EventWatcher::EVENT_TYPE> ForwardEvents;
|
|
|
|
//Data handling for bridged connections (1 connection for multiple clients)
|
|
QHash<QString, bridge_data> BRIDGE; //ID/data
|
|
bool isBridge;
|
|
|
|
// Where we store incoming Tcp data
|
|
QString incomingbuffer;
|
|
void ParseIncoming();
|
|
|
|
//Main connection communications procedure
|
|
void EvaluateREST(QString); //STAGE 1 response: Text -> Rest/JSON struct
|
|
void EvaluateRequest(const RestInputStruct&); //STAGE 2 response: Parse Rest/JSON (does auth/events)
|
|
//Response handling
|
|
void EvaluateResponse(const RestInputStruct&);
|
|
|
|
//Simplification functions
|
|
QString JsonValueToString(QJsonValue);
|
|
QStringList JsonArrayToStringList(QJsonArray);
|
|
|
|
//Backend request/reply functions (contained in WebBackend.cpp)
|
|
// -- Subsystem listing routine
|
|
RestOutputStruct::ExitCode AvailableSubsystems(bool fullaccess, QJsonObject *out);
|
|
// -- Main subsystem parser
|
|
RestOutputStruct::ExitCode EvaluateBackendRequest(const RestInputStruct&, QJsonObject *out);
|
|
|
|
|
|
// -- Individual subsystems
|
|
// -- Server Settings Modification API
|
|
RestOutputStruct::ExitCode EvaluateSysadmSettingsRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- Server Log retrieval system
|
|
RestOutputStruct::ExitCode EvaluateSysadmLogsRequest(bool allaccess, const QJsonValue in_args, QJsonObject *out);
|
|
// -- rpc dispatcher API
|
|
RestOutputStruct::ExitCode EvaluateDispatcherRequest(bool allaccess, const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm beadm API
|
|
RestOutputStruct::ExitCode EvaluateSysadmBEADMRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm FS API
|
|
RestOutputStruct::ExitCode EvaluateSysadmFSRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm iocage API
|
|
RestOutputStruct::ExitCode EvaluateSysadmIocageRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm iohyve API
|
|
RestOutputStruct::ExitCode EvaluateSysadmIohyveRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm Network API
|
|
RestOutputStruct::ExitCode EvaluateSysadmNetworkRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm LifePreserver API
|
|
RestOutputStruct::ExitCode EvaluateSysadmLifePreserverRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm info API
|
|
RestOutputStruct::ExitCode EvaluateSysadmSystemMgmtRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm Update API
|
|
RestOutputStruct::ExitCode EvaluateSysadmUpdateRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm ZFS API
|
|
RestOutputStruct::ExitCode EvaluateSysadmZfsRequest(const QJsonValue in_args, QJsonObject *out);
|
|
// -- sysadm PKG API
|
|
RestOutputStruct::ExitCode EvaluateSysadmPkgRequest(const QJsonValue in_args, QJsonObject *out);
|
|
|
|
private slots:
|
|
void sendReply(QString msg);
|
|
void checkIdle(); //see if the currently-connected client is idle
|
|
void checkAuth(); //see if the currently-connected client has authed yet
|
|
void SocketClosing();
|
|
|
|
//Currently connected socket signal/slot connections
|
|
void EvaluateMessage(const QByteArray&); //initial message input (raw bytes - WebSocket)
|
|
void EvaluateMessage(const QString&); //initial message input (text - WebSocket)
|
|
void EvaluateTcpMessage(); //initial message input (text - REST)
|
|
|
|
//SSL signal handling
|
|
void nowEncrypted(); //the socket/connection is now encrypted
|
|
void peerError(const QSslError&); //peerVerifyError() signal
|
|
void SslError(const QList<QSslError>&); //sslErrors() signal
|
|
|
|
// Library Slots
|
|
void slotIohyveFetchDone(QString, int, QString);
|
|
void slotIohyveFetchProcessOutput(QString);
|
|
|
|
//Bridge Connection Handling
|
|
void startBridgeAuth();
|
|
|
|
public slots:
|
|
void EventUpdate(EventWatcher::EVENT_TYPE, QJsonValue = QJsonValue() );
|
|
|
|
signals:
|
|
void SocketClosed(QString); //ID
|
|
void SendMessage(QString); //Internal - connected to sendReply(QString)
|
|
};
|
|
|
|
#endif
|