Start implementing backup configurations

add-backup-settings
Simon Stürz 2026-01-07 10:41:28 +01:00
parent 6a84144d66
commit aff27767c1
2 changed files with 123 additions and 47 deletions

View File

@ -24,28 +24,28 @@
#include "nymeaconfiguration.h"
#include "mqttpolicies.h"
#include "mqttpolicy.h"
#include "serverconfiguration.h"
#include "serverconfigurations.h"
#include "mqttpolicy.h"
#include "mqttpolicies.h"
#include "jsonrpc/jsonrpcclient.h"
#include <QUuid>
#include <QJsonDocument>
#include <QUuid>
#include "logging.h"
NYMEA_LOGGING_CATEGORY(dcNymeaConfiguration, "NymeaConfiguration")
NymeaConfiguration::NymeaConfiguration(JsonRpcClient *client, QObject *parent):
QObject(parent),
m_client(client),
m_tcpServerConfigurations(new ServerConfigurations(this)),
m_webSocketServerConfigurations(new ServerConfigurations(this)),
m_webServerConfigurations(new WebServerConfigurations(this)),
m_tunnelProxyServerConfigurations(new TunnelProxyServerConfigurations(this)),
m_mqttServerConfigurations(new ServerConfigurations(this)),
m_mqttPolicies(new MqttPolicies(this))
NymeaConfiguration::NymeaConfiguration(JsonRpcClient *client, QObject *parent)
: QObject(parent)
, m_client(client)
, m_tcpServerConfigurations(new ServerConfigurations(this))
, m_webSocketServerConfigurations(new ServerConfigurations(this))
, m_webServerConfigurations(new WebServerConfigurations(this))
, m_tunnelProxyServerConfigurations(new TunnelProxyServerConfigurations(this))
, m_mqttServerConfigurations(new ServerConfigurations(this))
, m_mqttPolicies(new MqttPolicies(this))
{
client->registerNotificationHandler(this, "Configuration", "notificationReceived");
}
@ -100,6 +100,28 @@ void NymeaConfiguration::setDebugServerEnabled(bool debugServerEnabled)
m_client->sendCommand("Configuration.SetDebugServerEnabled", params, this, "setDebugServerEnabledResponse");
}
QString NymeaConfiguration::backupDestinationDirectory() const
{
return m_backupDestinationDirectory;
}
void NymeaConfiguration::setBackupDestinationDirectory(const QString &backupDestinationDirectory)
{
m_backupDestinationDirectory = backupDestinationDirectory;
emit backupDestinationDirectoryChanged();
}
int NymeaConfiguration::backupMaxCount() const
{
return m_backupMaxCount;
}
void NymeaConfiguration::setBackupMaxCount(int backupMaxCount)
{
m_backupMaxCount = backupMaxCount;
emit backupMaxCountChanged();
}
ServerConfigurations *NymeaConfiguration::tcpServerConfigurations() const
{
return m_tcpServerConfigurations;
@ -285,35 +307,59 @@ void NymeaConfiguration::getConfigurationsResponse(int commandId, const QVariant
emit serverNameChanged();
QVariantMap cloudConfig = params.value("cloud").toMap();
QVariantMap backupConifgurations = params.value("backupConfigurations").toMap();
setBackupDestinationDirectory(backupConifgurations.value("destinationDirectory").toString());
setBackupMaxCount(backupConifgurations.value("maxCount").toInt());
tcpServerConfigurations()->clear();
foreach (const QVariant &tcpServerVariant, params.value("tcpServerConfigurations").toList()) {
QVariantMap tcpConfigMap = tcpServerVariant.toMap();
ServerConfiguration *config = new ServerConfiguration(tcpConfigMap.value("id").toString(), tcpConfigMap.value("address").toString(), tcpConfigMap.value("port").toInt(), tcpConfigMap.value("authenticationEnabled").toBool(), tcpConfigMap.value("sslEnabled").toBool());
ServerConfiguration *config = new ServerConfiguration(tcpConfigMap.value("id").toString(),
tcpConfigMap.value("address").toString(),
tcpConfigMap.value("port").toInt(),
tcpConfigMap.value("authenticationEnabled").toBool(),
tcpConfigMap.value("sslEnabled").toBool());
qCInfo(dcNymeaConfiguration) << "TCP server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled();
m_tcpServerConfigurations->addConfiguration(config);
}
webSocketServerConfigurations()->clear();
foreach (const QVariant &websocketServerVariant, params.value("webSocketServerConfigurations").toList()) {
QVariantMap websocketConfigMap = websocketServerVariant.toMap();
ServerConfiguration *config = new ServerConfiguration(websocketConfigMap.value("id").toString(), websocketConfigMap.value("address").toString(), websocketConfigMap.value("port").toInt(), websocketConfigMap.value("authenticationEnabled").toBool(), websocketConfigMap.value("sslEnabled").toBool());
qCInfo(dcNymeaConfiguration) << "WebSocket server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled();
ServerConfiguration *config = new ServerConfiguration(websocketConfigMap.value("id").toString(),
websocketConfigMap.value("address").toString(),
websocketConfigMap.value("port").toInt(),
websocketConfigMap.value("authenticationEnabled").toBool(),
websocketConfigMap.value("sslEnabled").toBool());
qCInfo(dcNymeaConfiguration) << "WebSocket server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled()
<< config->sslEnabled();
m_webSocketServerConfigurations->addConfiguration(config);
}
webServerConfigurations()->clear();
foreach (const QVariant &webServerVariant, params.value("webServerConfigurations").toList()) {
QVariantMap webServerConfigMap = webServerVariant.toMap();
WebServerConfiguration* config = new WebServerConfiguration(webServerConfigMap.value("id").toString(), webServerConfigMap.value("address").toString(), webServerConfigMap.value("port").toInt(), webServerConfigMap.value("authenticationEnabled").toBool(), webServerConfigMap.value("sslEnabled").toBool());
WebServerConfiguration *config = new WebServerConfiguration(webServerConfigMap.value("id").toString(),
webServerConfigMap.value("address").toString(),
webServerConfigMap.value("port").toInt(),
webServerConfigMap.value("authenticationEnabled").toBool(),
webServerConfigMap.value("sslEnabled").toBool());
config->setPublicFolder(webServerConfigMap.value("publicFolder").toString());
qCInfo(dcNymeaConfiguration) << "WebServer server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled() << config->publicFolder();
qCInfo(dcNymeaConfiguration) << "WebServer server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled()
<< config->publicFolder();
m_webServerConfigurations->addConfiguration(config);
}
tunnelProxyServerConfigurations()->clear();
foreach (const QVariant &tunnelProxyServerVariant, params.value("tunnelProxyServerConfigurations").toList()) {
QVariantMap tunnelProxyServerConfigMap = tunnelProxyServerVariant.toMap();
TunnelProxyServerConfiguration *config = new TunnelProxyServerConfiguration(tunnelProxyServerConfigMap.value("id").toString(), tunnelProxyServerConfigMap.value("address").toString(), tunnelProxyServerConfigMap.value("port").toInt(), tunnelProxyServerConfigMap.value("authenticationEnabled").toBool(), tunnelProxyServerConfigMap.value("sslEnabled").toBool(), tunnelProxyServerConfigMap.value("ignoreSslErrors").toBool());
qCInfo(dcNymeaConfiguration) << "Tunnel server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled() << config->ignoreSslErrors();
TunnelProxyServerConfiguration *config = new TunnelProxyServerConfiguration(tunnelProxyServerConfigMap.value("id").toString(),
tunnelProxyServerConfigMap.value("address").toString(),
tunnelProxyServerConfigMap.value("port").toInt(),
tunnelProxyServerConfigMap.value("authenticationEnabled").toBool(),
tunnelProxyServerConfigMap.value("sslEnabled").toBool(),
tunnelProxyServerConfigMap.value("ignoreSslErrors").toBool());
qCInfo(dcNymeaConfiguration) << "Tunnel server config:" << config->id() << config->address() << config->port() << config->authenticationEnabled() << config->sslEnabled()
<< config->ignoreSslErrors();
m_tunnelProxyServerConfigurations->addConfiguration(config);
}
@ -387,7 +433,11 @@ void NymeaConfiguration::getMqttServerConfigsReply(int commandId, const QVariant
m_mqttServerConfigurations->clear();
foreach (const QVariant &mqttServerVariant, params.value("mqttServerConfigurations").toList()) {
QVariantMap mqttConfigMap = mqttServerVariant.toMap();
ServerConfiguration *config = new ServerConfiguration(mqttConfigMap.value("id").toString(), mqttConfigMap.value("address").toString(), mqttConfigMap.value("port").toInt(), mqttConfigMap.value("authenticationEnabled").toBool(), mqttConfigMap.value("sslEnabled").toBool());
ServerConfiguration *config = new ServerConfiguration(mqttConfigMap.value("id").toString(),
mqttConfigMap.value("address").toString(),
mqttConfigMap.value("port").toInt(),
mqttConfigMap.value("authenticationEnabled").toBool(),
mqttConfigMap.value("sslEnabled").toBool());
m_mqttServerConfigurations->addConfiguration(config);
}
}
@ -405,16 +455,15 @@ void NymeaConfiguration::deleteMqttConfigReply(int commandId, const QVariantMap
void NymeaConfiguration::getMqttPoliciesReply(int commandId, const QVariantMap &params)
{
Q_UNUSED(commandId)
// qCDebug(dcNymeaConfiguration) << "Mqtt polices:" << params;
// qCDebug(dcNymeaConfiguration) << "Mqtt polices:" << params;
m_mqttPolicies->clear();
foreach (const QVariant &policyVariant, params.value("mqttPolicies").toList()) {
QVariantMap policyMap = policyVariant.toMap();
MqttPolicy *policy = new MqttPolicy(
policyMap.value("clientId").toString(),
policyMap.value("username").toString(),
policyMap.value("password").toString(),
policyMap.value("allowedPublishTopicFilters").toStringList(),
policyMap.value("allowedSubscribeTopicFilters").toStringList());
MqttPolicy *policy = new MqttPolicy(policyMap.value("clientId").toString(),
policyMap.value("username").toString(),
policyMap.value("password").toString(),
policyMap.value("allowedPublishTopicFilters").toStringList(),
policyMap.value("allowedSubscribeTopicFilters").toStringList());
m_mqttPolicies->addPolicy(policy);
}
}
@ -437,10 +486,21 @@ void NymeaConfiguration::notificationReceived(const QVariantMap &notification)
if (notif == "Configuration.BasicConfigurationChanged") {
QVariantMap configMap = params.value("basicConfiguration").toMap();
m_debugServerEnabled = configMap.value("debugServerEnabled").toBool();
emit debugServerEnabledChanged();
m_serverName = configMap.value("serverName").toString();
emit serverNameChanged();
QVariantMap backupConfigMap = params.value("backupConfiguration").toMap();
m_backupDestinationDirectory = backupConfigMap.value("destinationDirectory").toString();
emit backupDestinationDirectoryChanged();
m_backupMaxCount = backupConfigMap.value("maxCount").toInt();
emit backupMaxCountChanged();
qCDebug(dcNymeaConfiguration()) << "Basic configuration changed. Server name:" << m_serverName << "Debug server enabled:" << m_debugServerEnabled;
} else if (notif == "Configuration.TcpServerConfigurationChanged") {
QVariantMap configMap = params.value("tcpServerConfiguration").toMap();
@ -493,7 +553,7 @@ void NymeaConfiguration::notificationReceived(const QVariantMap &notification)
bool sslEnabled = configMap.value("sslEnabled").toBool();
bool ignoreSslErrors = configMap.value("ignoreSslErrors").toBool();
TunnelProxyServerConfiguration *config = qobject_cast<TunnelProxyServerConfiguration*>(m_tunnelProxyServerConfigurations->getConfiguration(id));
TunnelProxyServerConfiguration *config = qobject_cast<TunnelProxyServerConfiguration *>(m_tunnelProxyServerConfigurations->getConfiguration(id));
bool existing = true;
if (!config) {
existing = false;
@ -505,7 +565,8 @@ void NymeaConfiguration::notificationReceived(const QVariantMap &notification)
config->setSslEnabled(sslEnabled);
config->setIgnoreSslErrors(ignoreSslErrors);
if (!existing) {
qCInfo(dcNymeaConfiguration()) << "Adding tunnel proxy connection:" << config->id() << config->address() << config->port() << config->sslEnabled() << config->authenticationEnabled() << config->ignoreSslErrors();
qCInfo(dcNymeaConfiguration()) << "Adding tunnel proxy connection:" << config->id() << config->address() << config->port() << config->sslEnabled()
<< config->authenticationEnabled() << config->ignoreSslErrors();
m_tunnelProxyServerConfigurations->addConfiguration(config);
}
} else if (notif == "Configuration.WebServerConfigurationChanged") {
@ -515,9 +576,9 @@ void NymeaConfiguration::notificationReceived(const QVariantMap &notification)
int port = configMap.value("port").toInt();
bool authEnabled = configMap.value("authenticationEnabled").toBool();
bool sslEnabled = configMap.value("sslEnabled").toBool();
QString publicFolder = configMap.value("publicFolder").toString();
QString publicFolder = configMap.value("publicFolder").toString();
WebServerConfiguration *config = qobject_cast<WebServerConfiguration*>(m_webServerConfigurations->getConfiguration(id));
WebServerConfiguration *config = qobject_cast<WebServerConfiguration *>(m_webServerConfigurations->getConfiguration(id));
bool existing = true;
if (!config) {
existing = false;
@ -581,7 +642,7 @@ void NymeaConfiguration::notificationReceived(const QVariantMap &notification)
policy->setAllowedSubscribeTopicFilters(policyMap.value("allowedSubscribeTopicFilters").toStringList());
qCInfo(dcNymeaConfiguration()) << "MQTT policy changed" << policy->clientId() << policy->username() << policy->password();
} else if (notif == "Configuration.MqttPolicyRemoved") {
MqttPolicy* policy = m_mqttPolicies->getPolicy(params.value("clientId").toString());
MqttPolicy *policy = m_mqttPolicies->getPolicy(params.value("clientId").toString());
if (!policy) {
qCWarning(dcNymeaConfiguration()) << "Reveived a policy removed notification for apolicy we don't know";
return;

View File

@ -27,8 +27,8 @@
#include <QObject>
#include "serverconfigurations.h"
#include "mqttpolicies.h"
#include "serverconfigurations.h"
class JsonRpcClient;
class ServerConfiguration;
@ -49,16 +49,19 @@ class NymeaConfiguration : public QObject
Q_PROPERTY(bool debugServerEnabled READ debugServerEnabled WRITE setDebugServerEnabled NOTIFY debugServerEnabledChanged)
Q_PROPERTY(ServerConfigurations* tcpServerConfigurations READ tcpServerConfigurations CONSTANT)
Q_PROPERTY(ServerConfigurations* webSocketServerConfigurations READ webSocketServerConfigurations CONSTANT)
Q_PROPERTY(WebServerConfigurations* webServerConfigurations READ webServerConfigurations CONSTANT)
Q_PROPERTY(TunnelProxyServerConfigurations* tunnelProxyServerConfigurations READ tunnelProxyServerConfigurations CONSTANT)
Q_PROPERTY(ServerConfigurations* mqttServerConfigurations READ mqttServerConfigurations CONSTANT)
Q_PROPERTY(QString backupDestinationDirectory READ backupDestinationDirectory WRITE setBackupDestinationDirectory NOTIFY backupDestinationDirectoryChanged FINAL)
Q_PROPERTY(int backupMaxCount READ backupMaxCount NOTIFY backupMaxCountChanged FINAL)
Q_PROPERTY(MqttPolicies* mqttPolicies READ mqttPolicies CONSTANT)
Q_PROPERTY(ServerConfigurations *tcpServerConfigurations READ tcpServerConfigurations CONSTANT)
Q_PROPERTY(ServerConfigurations *webSocketServerConfigurations READ webSocketServerConfigurations CONSTANT)
Q_PROPERTY(WebServerConfigurations *webServerConfigurations READ webServerConfigurations CONSTANT)
Q_PROPERTY(TunnelProxyServerConfigurations *tunnelProxyServerConfigurations READ tunnelProxyServerConfigurations CONSTANT)
Q_PROPERTY(ServerConfigurations *mqttServerConfigurations READ mqttServerConfigurations CONSTANT)
Q_PROPERTY(MqttPolicies *mqttPolicies READ mqttPolicies CONSTANT)
public:
explicit NymeaConfiguration(JsonRpcClient* client, QObject *parent = nullptr);
explicit NymeaConfiguration(JsonRpcClient *client, QObject *parent = nullptr);
bool fetchingData() const;
@ -76,6 +79,12 @@ public:
bool debugServerEnabled() const;
void setDebugServerEnabled(bool debugServerEnabled);
QString backupDestinationDirectory() const;
void setBackupDestinationDirectory(const QString &backupDestinationDirectory);
int backupMaxCount() const;
void setBackupMaxCount(int backupMaxCount);
ServerConfigurations *tcpServerConfigurations() const;
ServerConfigurations *webSocketServerConfigurations() const;
WebServerConfigurations *webServerConfigurations() const;
@ -83,10 +92,12 @@ public:
ServerConfigurations *mqttServerConfigurations() const;
MqttPolicies *mqttPolicies() const;
Q_INVOKABLE ServerConfiguration* createServerConfiguration(const QString &address = "0.0.0.0", int port = 0, bool authEnabled = false, bool sslEnabled = false);
Q_INVOKABLE WebServerConfiguration* createWebServerConfiguration(const QString &address = "0.0.0.0", int port = 0, bool authEnabled = false, bool sslEnabled = false, const QString &publicFolder = QString());
Q_INVOKABLE TunnelProxyServerConfiguration* createTunnelProxyServerConfiguration(const QString &address, int port, bool authEnabled = true, bool sslEnabled = true, bool ignoreSslErrors = false);
Q_INVOKABLE MqttPolicy* createMqttPolicy() const;
Q_INVOKABLE ServerConfiguration *createServerConfiguration(const QString &address = "0.0.0.0", int port = 0, bool authEnabled = false, bool sslEnabled = false);
Q_INVOKABLE WebServerConfiguration *createWebServerConfiguration(
const QString &address = "0.0.0.0", int port = 0, bool authEnabled = false, bool sslEnabled = false, const QString &publicFolder = QString());
Q_INVOKABLE TunnelProxyServerConfiguration *createTunnelProxyServerConfiguration(
const QString &address, int port, bool authEnabled = true, bool sslEnabled = true, bool ignoreSslErrors = false);
Q_INVOKABLE MqttPolicy *createMqttPolicy() const;
Q_INVOKABLE void setTcpServerConfiguration(ServerConfiguration *configuration);
Q_INVOKABLE void setWebSocketServerConfiguration(ServerConfiguration *configuration);
@ -100,7 +111,7 @@ public:
Q_INVOKABLE void deleteTunnelProxyServerConfiguration(const QString &id);
Q_INVOKABLE void deleteMqttServerConfiguration(const QString &id);
Q_INVOKABLE void updateMqttPolicy(MqttPolicy* policy);
Q_INVOKABLE void updateMqttPolicy(MqttPolicy *policy);
Q_INVOKABLE void deleteMqttPolicy(const QString &clientId);
void init();
@ -131,6 +142,8 @@ signals:
void fetchingDataChanged();
void debugServerEnabledChanged();
void serverNameChanged();
void backupDestinationDirectoryChanged();
void backupMaxCountChanged();
private:
JsonRpcClient *m_client = nullptr;
@ -139,13 +152,15 @@ private:
bool m_debugServerEnabled = false;
QString m_serverName;
QString m_backupDestinationDirectory;
int m_backupMaxCount = 1;
ServerConfigurations *m_tcpServerConfigurations = nullptr;
ServerConfigurations *m_webSocketServerConfigurations = nullptr;
WebServerConfigurations* m_webServerConfigurations = nullptr;
WebServerConfigurations *m_webServerConfigurations = nullptr;
TunnelProxyServerConfigurations *m_tunnelProxyServerConfigurations = nullptr;
ServerConfigurations *m_mqttServerConfigurations = nullptr;
MqttPolicies *m_mqttPolicies = nullptr;
};
#endif // NYMEACONFIGURATION_H