Терминальный проект КиберПлат [open source]
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
9.5KB

  1. /* @file Менеджер, загружающий клиенты мониторинга. */
  2. #pragma once
  3. // Qt
  4. #include <Common/QtHeadersBegin.h>
  5. #include <QtCore/QMutex>
  6. #include <QtCore/QTimer>
  7. #include <QtCore/QStringList>
  8. #include <QtCore/QSettings>
  9. #include <QtConcurrent/QtConcurrentRun>
  10. #include <Common/QtHeadersEnd.h>
  11. // Modules
  12. #include <Common/ILogable.h>
  13. // SDK
  14. #include <SDK/PaymentProcessor/Core/Event.h>
  15. #include <SDK/PaymentProcessor/Core/IRemoteClient.h>
  16. #include <SDK/PaymentProcessor/Core/IRemoteService.h>
  17. #include <SDK/PaymentProcessor/Core/IService.h>
  18. // Project
  19. #include "PaymentService.h"
  20. namespace PPSDK = SDK::PaymentProcessor;
  21. class IApplication;
  22. class IHardwareDatabaseUtils;
  23. class QFileSystemWatcher;
  24. //---------------------------------------------------------------------------
  25. class RemoteService : public SDK::PaymentProcessor::IRemoteService, public PPSDK::IService, protected ILogable
  26. {
  27. Q_OBJECT
  28. public:
  29. struct UpdateCommand
  30. {
  31. int ID;
  32. EStatus status;
  33. EUpdateType type;
  34. QUrl configUrl;
  35. QUrl updateUrl;
  36. QStringList parameters;
  37. QDateTime lastUpdate;
  38. UpdateCommand();
  39. bool isValid() const;
  40. /// Команда выполняется внешним updater.exe
  41. bool isExternal() const;
  42. };
  43. public:
  44. RemoteService(IApplication * aApplication);
  45. virtual ~RemoteService();
  46. static RemoteService * instance(IApplication * aApplication);
  47. #pragma region PPSDK::IService interface
  48. /// Инициализация сервиса.
  49. virtual bool initialize();
  50. /// IService: Закончена инициализация всех сервисов.
  51. virtual void finishInitialize();
  52. /// IService: Возвращает false, если сервис не может быть остановлен в текущий момент.
  53. virtual bool canShutdown();
  54. /// Завершение работы сервиса.
  55. virtual bool shutdown();
  56. /// Возвращает имя сервиса.
  57. virtual QString getName() const;
  58. /// Список зависимостей.
  59. virtual const QSet<QString> & getRequiredServices() const;
  60. /// Получить параметры сервиса.
  61. virtual QVariantMap getParameters() const;
  62. /// Сброс служебных параметров.
  63. virtual void resetParameters(const QSet<QString> & aParameters);
  64. #pragma endregion
  65. /// Попытка восстановление конфигурации терминала через один из подключенных клиентов мониторинга.
  66. /// Возращает true, если запрос на обновление конфигурации передан исполнителю.
  67. bool restoreConfiguration();
  68. protected:
  69. #pragma region PPSDK::IRemoteService interface
  70. /// Добавляет в очередь команду на блокировку терминала.
  71. virtual int registerLockCommand();
  72. /// Добавляет в очередь команду на разблокировку терминала.
  73. virtual int registerUnlockCommand();
  74. /// Добавляет в очередь команду на перезагрузку терминала.
  75. virtual int registerRebootCommand();
  76. /// Добавляет в очередь команду на перезапуск ТК.
  77. virtual int registerRestartCommand();
  78. /// Добавляет в очередь команду на выключение терминала.
  79. virtual int registerShutdownCommand();
  80. /// Добавляет в очередь команду на изменение параметров платежа (поиск осуществляется по начальной сессии).
  81. virtual int registerPaymentCommand(EPaymentOperation aOperation, const QString & aInitialSession, const QVariantMap & aParameters);
  82. /// Добавляет в очередь команду на обновление файлов.
  83. virtual int registerUpdateCommand(EUpdateType aType, const QUrl & aConfigUrl, const QUrl & aUpdateUrl, const QString & aComponents);
  84. /// Добавляет в очередь команду на получение скриншота.
  85. virtual int registerScreenshotCommand();
  86. /// Добавляет в очередь команду на перегенерацию ключей
  87. virtual int registerGenerateKeyCommand(const QString & aLogin, const QString & aPassword);
  88. /// Зарегистрировать номер произвольной команды
  89. virtual int registerAnyCommand();
  90. /// Сообщает сервису мониторинга что статус команды успешно отправлен
  91. virtual void commandStatusSent(int aCommandId, int aStatus);
  92. /// Требует от клиентов обновления контента.
  93. virtual void updateContent();
  94. /// Принудительная отправка сигнала heartbeat.
  95. virtual void sendHeartbeat();
  96. #pragma endregion
  97. private:
  98. /// Выполнение команды с помощью делегирования событийной системе.
  99. int executeCommand(PPSDK::EEventType::Enum aEvent);
  100. /// Увеличение номера последней зарегистрированной команды в БД.
  101. int increaseLastCommandID();
  102. protected slots:
  103. /// Обработка выполнения команды на изменения платежа.
  104. void onPaymentCommandComplete(int aID, EPaymentCommandResult::Enum aError);
  105. /// Проверяет наличие обновлённых отчётов от модуля обновления.
  106. void onCheckUpdateReports();
  107. /// Обновление статусов отложенных команд перезагрузки и выключения.
  108. void onCheckQueuedRebootCommands();
  109. /// реальное выполнение команды мониторинга
  110. /// aEvent реально меет тип PPSDK::EEventType::Enum
  111. void doExecuteCommand(int aComandId, int aEvent);
  112. /// Обработка команды снятия скриншота
  113. void doScreenshotCommand();
  114. /// Обработка изменения конфигурации устройств
  115. void onDeviceConfigurationUpdated();
  116. /// Уведомление об изменении в папке update
  117. void onUpdateDirChanged();
  118. /// Обработчик события о закрытии модуля
  119. void onModuleClosed(const QString & aModuleName);
  120. /// Обработчик события об изменении состояния устройства
  121. void onDeviceStatusChanged(const QString & aConfigName);
  122. private:
  123. /// Проверяет наличие обновлённых отчётов от модуля обновления, возвращает кол-во выполненных команд
  124. int checkUpdateReports();
  125. /// Проверка времени жизни команд в очереди
  126. int checkCommandsLifetime();
  127. /// Создание новой пары ключей
  128. static void doGenerateKeyCommand(RemoteService * aMonitoringService, const QString & aLogin, const QString & aPassword);
  129. /// проверка разрешения на создание команды обновления
  130. bool allowUpdateCommand();
  131. /// Запустить команду обновления на выполнение
  132. int startUpdateCommand(UpdateCommand aCommand);
  133. /// Проверка разрешения на выключение/перезагрузку
  134. bool allowRestart();
  135. /// Проверить команду, не пора ли начинать прошивать железку
  136. bool checkFirmwareUpload(int aCommandID);
  137. /// Сохранение списка команд перед выключением
  138. void saveCommandQueue();
  139. /// Восстановление списка команд перед запуском
  140. void restoreCommandQueue();
  141. public:
  142. /// Найти в списке команду с нужным типом
  143. UpdateCommand findUpdateCommand(EUpdateType aType);
  144. private:
  145. /// Обновить список файлов
  146. void restartUpdateWatcher(QFileSystemWatcher * aWatcher = nullptr);
  147. void timerEvent(QTimerEvent * aEvent);
  148. /// Закончить обработку команды
  149. void updateCommandFinish(int aCmdID, EStatus aStatus, QVariantMap aParameters = QVariantMap());
  150. /// Запустить следующую команду обновления из очереди
  151. void startNextUpdateCommand();
  152. private:
  153. IApplication * mApplication;
  154. IHardwareDatabaseUtils * mDatabase;
  155. QList<PPSDK::IRemoteClient *> mMonitoringClients;
  156. /// Синхронизация заполнения очереди команд мониторинга.
  157. QMutex mCommandMutex;
  158. /// Номер последней принятой команды.
  159. int mLastCommand;
  160. /// Платёжные команды, ожидающие выполнения.
  161. QMap<int, int> mPaymentCommands;
  162. /// Выполняющиеся команды обновления.
  163. QMap<int, UpdateCommand> mUpdateCommands;
  164. /// Выполняющиеся команды снятия скриншотов.
  165. QList<int> mScreenShotsCommands;
  166. /// Выполняющаяся команда перегенерации ключей терминала.
  167. int mGenerateKeyCommand;
  168. QFuture<void> mGenerateKeyFuture;
  169. /// Список запланированных команд перезагрузки и выключени.
  170. QStringList mQueuedRebootCommands;
  171. /// Настройки сервиса для сохранения очереди выполняющихся команд
  172. QSettings mSettings;
  173. QTimer mCheckUpdateReportsTimer;
  174. };
  175. //---------------------------------------------------------------------------