From 22862a27952dcd8c11d98b478e770ccbeeacb46f Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 29 Jul 2025 23:01:33 +0200 Subject: [PATCH] Add support for redis with password, introduced new arguments with - --- Dockerfile | 5 ++-- main.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++--------- webserver.cpp | 22 +++++---------- webserver.h | 8 +++--- 4 files changed, 76 insertions(+), 33 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6152d55..cf1a552 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,7 @@ COPY ./ /less_shitty_proxyjs RUN mkdir -pv /build \ && cd /build \ && qmake6 /less_shitty_proxyjs \ - && make -j4 \ - && ls -lah + && make -j4 FROM registry.brunner.ninja/library/ubuntu:devel AS runtime @@ -24,6 +23,6 @@ RUN apt update \ COPY --from=build /build/less_shitty_proxyjs /less_shitty_proxyjs -ENTRYPOINT [ "/less_shitty_proxyjs", "Any", "1234" ] +ENTRYPOINT [ "/less_shitty_proxyjs", "-l", "Any", "-p", "1234" ] EXPOSE 1234 diff --git a/main.cpp b/main.cpp index 5ce90f2..81a93d3 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,10 @@ #include #include "webserver.h" +#ifdef FEATURE_REDIS +#include +#include "redisqtadapter.h" +#endif #include #include @@ -26,21 +30,39 @@ int main(int argc, char *argv[]) QHostAddress listenAddress = QHostAddress::Any; uint16_t port = 8000; QString identity = "test"; + QString redisPassword; { QCommandLineParser parser; parser.setApplicationDescription("Test helper"); parser.addHelpOption(); parser.addVersionOption(); - parser.addPositionalArgument("listenAddr", QCoreApplication::translate("main", "The address to listen on (Can be \"Any\" \"Localhost\" or any valid ip address).")); - parser.addPositionalArgument("port", QCoreApplication::translate("main", "The port to listen on (will only listen on localhost).")); - parser.addPositionalArgument("identiy", QCoreApplication::translate("main", "The name of this service instance")); + + QCommandLineOption listenAddrOption{QStringList{ "l", "listenAddress" }, + QCoreApplication::translate("main", "The address to listen on (Can be \"Any\" \"Localhost\" or any valid ip address)."), + QCoreApplication::translate("main", "listenAddress")}; + parser.addOption(listenAddrOption); + + QCommandLineOption portOption{QStringList{ "p", "port" }, + QCoreApplication::translate("main", "The port to listen on (will only listen on localhost)."), + QCoreApplication::translate("main", "port")}; + parser.addOption(portOption); + + QCommandLineOption identityOption{QStringList{ "i", "identity" }, + QCoreApplication::translate("main", "The name of this service instance"), + QCoreApplication::translate("main", "identity")}; + parser.addOption(identityOption); + + QCommandLineOption redisPasswordOption{QStringList{ "r", "redisPassword" }, + QCoreApplication::translate("main", "The redis password"), + QCoreApplication::translate("main", "redisPassword")}; + parser.addOption(redisPasswordOption); + parser.process(app); - const auto &args = parser.positionalArguments(); - if (args.size() > 0) + if (parser.isSet(listenAddrOption)) { - if (const auto &str = args.first(); str == "Any") + if (const auto &str = parser.value(listenAddrOption); str == "Any") listenAddress = QHostAddress::Any; else if (str == "AnyIPv4") listenAddress = QHostAddress::AnyIPv4; @@ -53,18 +75,21 @@ int main(int argc, char *argv[]) else listenAddress = QHostAddress{str}; } - if (args.size() > 1) + if (parser.isSet(portOption)) { + const auto &str = parser.value(portOption); bool ok; - port = args.at(1).toInt(&ok); + port = str.toInt(&ok); if (!ok) { - qCritical("could not parse port: %s", qPrintable(args.at(1))); + qCritical("could not parse port: %s", qPrintable(str)); return -1; } } - if (args.size() > 2) - identity = args.at(2); + if (parser.isSet(identityOption)) + identity = parser.value(identityOption); + if (parser.isSet(redisPasswordOption)) + redisPassword = parser.value(redisPasswordOption); } qSetMessagePattern(QString{"%{time dd.MM.yyyy HH:mm:ss.zzz} %0 " @@ -78,7 +103,32 @@ int main(int argc, char *argv[]) "%{function}(): " "%{message}"}.arg(identity)); - WebServer server{identity, QString{"http://localhost:%0"}.arg(port)}; +#ifdef FEATURE_REDIS + redisAsyncContext * const redis = redisAsyncConnect("localhost", 6379); + + if (redis->err) + qFatal("error with redis connection: %s", redis->errstr); + + RedisQtAdapter redisAdapter; + redisAdapter.setContext(redis); + + qDebug() << "redis AUTH" << redisPassword; + + redisAsyncCommand(redis, NULL, NULL, "AUTH %s", + redisPassword.toUtf8().constData()); + + redisAsyncCommand(redis, NULL, NULL, "SET %s %s", + QString{"traefik/http/services/proxyjs_%0/loadbalancer/servers/0/url"}.arg(identity).toUtf8().constData(), + QString{"http://localhost:%0"}.arg(port).toUtf8().constData()); + + qDebug() << "redis connected"; +#endif + + WebServer server{identity +#ifdef FEATURE_REDIS + , redis +#endif + }; QTcpServer tcpServer; if (!tcpServer.listen(listenAddress, port)) diff --git a/webserver.cpp b/webserver.cpp index 11c9a35..a051b4a 100644 --- a/webserver.cpp +++ b/webserver.cpp @@ -10,25 +10,17 @@ namespace { QHttpServerResponse serveHtmlWithPlaceholders(const QString &filePath, const QMap &placeholders); } // namespace -WebServer::WebServer(const QString &identity, const QString &url, QObject *parent) : +WebServer::WebServer(const QString &identity, +#ifdef FEATURE_REDIS + redisAsyncContext *redis, +#endif + QObject *parent) : QObject{parent}, m_identity{identity} -{ #ifdef FEATURE_REDIS - m_redis = redisAsyncConnect("localhost", 6379); - - if (m_redis->err) - qFatal("error with redis: %s", m_redis->errstr); - - m_redisAdapter.setContext(m_redis); - - redisAsyncCommand(m_redis, NULL, NULL, "SET %s %s", - QString{"traefik/http/services/proxyjs_%0/loadbalancer/servers/0/url"}.arg(m_identity).toUtf8().constData(), - url.toUtf8().constData()); - - qDebug() << "redis connected"; + , m_redis{redis} #endif - +{ m_server.route("/", [&]() { return serveHtmlWithPlaceholders(":/lspjs/index.html", { {"identity", identity} diff --git a/webserver.h b/webserver.h index b71ec9e..329c9b2 100644 --- a/webserver.h +++ b/webserver.h @@ -9,7 +9,6 @@ #ifdef FEATURE_REDIS #include -#include "redisqtadapter.h" #endif class QWebSocket; @@ -21,7 +20,11 @@ class WebServer : public QObject friend class Client; public: - explicit WebServer(const QString &identity, const QString &url, QObject *parent = nullptr); + explicit WebServer(const QString &identity, +#ifdef FEATURE_REDIS + redisAsyncContext *redis, +#endif + QObject *parent = nullptr); ~WebServer() override; bool bind(QTcpServer *server); @@ -46,6 +49,5 @@ private: #ifdef FEATURE_REDIS redisAsyncContext *m_redis; - RedisQtAdapter m_redisAdapter; #endif };