File indexing completed on 2024-05-12 17:11:43

0001 #include "rolisteamdaemon.h"
0002 #include <QDebug>
0003 #include <QFile>
0004 #include <QTime>
0005 
0006 #include <QCoreApplication>
0007 #include <QFileInfo>
0008 #include <QSettings>
0009 
0010 RolisteamDaemon::RolisteamDaemon(QObject* parent)
0011     : QObject(parent), m_server(m_parameters, false), m_logController(new LogController(true, this))
0012 {
0013     qRegisterMetaType<RServer::ServerState>();
0014 }
0015 
0016 bool RolisteamDaemon::readConfigFile(QString filepath)
0017 {
0018     if(!QFileInfo::exists(filepath))
0019         return false;
0020 
0021     QSettings settings(filepath, QSettings::IniFormat);
0022 
0023     int port= settings.value("port").toInt();
0024     auto password= QByteArray::fromBase64(settings.value("ServerPassword").toByteArray());
0025     QString range= settings.value("IpRange").toString();
0026     QString ipBan= settings.value("IpBan").toString();
0027     QString connectionMax= settings.value("ConnectionMax").toString();
0028     QString timeStart= settings.value("TimeStart").toString();
0029     QString timeEnd= settings.value("TimeEnd").toString();
0030     QString ipMode= settings.value("IpMode").toString();
0031     auto adminPassword= QByteArray::fromBase64(settings.value("AdminPassword").toByteArray());
0032     int threadCount= settings.value("ThreadCount").toInt();
0033     int channelCount= settings.value("ChannelCount").toInt();
0034     int timeToRetry= settings.value("TimeToRetry").toInt();
0035     int tryCount= settings.value("TryCount").toInt();
0036     int logLevel= settings.value("LogLevel").toInt();
0037     QString maxMemorySize= settings.value("MaxMemorySize").toString();
0038     bool deepInspectionLog= settings.value("DeepInspectionLog").toBool();
0039 
0040     if(threadCount <= 0)
0041         return false;
0042 
0043     QString pathToLog= settings.value("LogFile").toString();
0044 
0045     quint64 memorySize= 0;
0046     quint64 factor= 0;
0047     if(maxMemorySize.endsWith("G"))
0048     {
0049         factor= 1024 * 1024 * 1024;
0050     }
0051     else if(maxMemorySize.endsWith("M"))
0052     {
0053         factor= 1024 * 1024;
0054     }
0055     maxMemorySize= maxMemorySize.remove(maxMemorySize.length() - 1, 1);
0056 
0057     memorySize= factor * maxMemorySize.toULongLong();
0058 
0059     auto listIpBan= ipBan.split(",", Qt::SkipEmptyParts);
0060 
0061     if(deepInspectionLog)
0062     {
0063         m_logController->listenObjects(&m_server);
0064     }
0065     m_logController->setLogLevel(static_cast<LogController::LogLevel>(logLevel));
0066 
0067     LogController::StorageModes modes= LogController::Console;
0068 
0069     if(!pathToLog.isEmpty())
0070     {
0071         m_logController->setCurrentPath(pathToLog);
0072         modes|= LogController::File;
0073     }
0074 
0075     m_logController->setCurrentModes(modes);
0076 
0077     m_parameters.insert("port", port);
0078     m_parameters.insert("ServerPassword", password);
0079     m_parameters.insert("IpRange", range);
0080     m_parameters.insert("IpBan", listIpBan);
0081     m_parameters.insert("ConnectionMax", connectionMax);
0082     m_parameters.insert("TimeStart", timeStart);
0083     m_parameters.insert("TimeEnd", timeEnd);
0084     m_parameters.insert("AdminPassword", adminPassword);
0085     m_parameters.insert("IpMode", ipMode);                       // v4 v6 any
0086     m_parameters.insert("ThreadCount", threadCount);             // thread count
0087     m_parameters.insert("ChannelCount", channelCount);           // channel count
0088     m_parameters.insert("TimeToRetry", timeToRetry);             // TimeToRetry
0089     m_parameters.insert("TryCount", tryCount);                   // TimeToRetry
0090     m_parameters.insert("LogLevel", logLevel);                   // loglevel
0091     m_parameters.insert("LogFile", pathToLog);                   // logpath
0092     m_parameters.insert("DeepInspectionLog", deepInspectionLog); // logpath
0093     m_parameters.insert("MemorySize", memorySize);               // max memory size
0094 
0095     return true;
0096 }
0097 
0098 void RolisteamDaemon::start()
0099 {
0100     connect(&m_thread, &QThread::started, &m_server, &RServer::listen);
0101     connect(&m_server, &RServer::eventOccured, m_logController, [this](const QString& msg,  LogController::LogLevel type){
0102         m_logController->manageMessage(msg, QStringLiteral("Server"), type);
0103     }, Qt::QueuedConnection);
0104     connect(&m_server, &RServer::completed, &m_thread, &QThread::quit);
0105     connect(&m_server, &RServer::stateChanged, this, [this]() {
0106         if(m_server.state() == RServer::Stopped)
0107             m_thread.quit();
0108     });
0109     connect(&m_thread, &QThread::finished, this, [this]() {
0110         if(m_restart)
0111         {
0112             qApp->exit(0);
0113         }
0114         m_restart= false;
0115     });
0116 
0117     m_server.moveToThread(&m_thread);
0118 
0119     m_thread.start();
0120 }
0121 
0122 void RolisteamDaemon::createEmptyConfigFile(QString filepath)
0123 {
0124     QSettings settings(filepath, QSettings::IniFormat);
0125 
0126     settings.setValue("port", 6660);
0127     settings.setValue("ServerPassword", QStringLiteral(""));
0128     settings.setValue("IpRange", QStringLiteral(""));
0129     settings.setValue("IpBan", QStringLiteral(""));
0130     settings.setValue("ConnectionMax", 50);
0131     settings.setValue("TimeStart", QStringLiteral(""));
0132     settings.setValue("TimeEnd", QStringLiteral(""));
0133     settings.setValue("IpMode", QStringLiteral(""));
0134     settings.setValue("ThreadCount", 1);
0135     settings.setValue("ChannelCount", 1);
0136     settings.setValue("TimeToRetry", 100);
0137     settings.setValue("TryCount", 10);
0138     settings.setValue("LogLevel", 1);
0139     settings.setValue("LogFile", QStringLiteral(""));
0140     settings.setValue("DeepInspectionLog", false);
0141     settings.setValue("AdminPassword", QStringLiteral(""));
0142     settings.setValue("MaxMemorySize", QStringLiteral(""));
0143 
0144     settings.sync();
0145 }
0146 
0147 void RolisteamDaemon::restart()
0148 {
0149     m_restart= true;
0150     QMetaObject::invokeMethod(&m_server, &RServer::close, Qt::QueuedConnection);
0151 }
0152 
0153 void RolisteamDaemon::stop()
0154 {
0155     QMetaObject::invokeMethod(&m_server, &RServer::close, Qt::QueuedConnection);
0156 }