#ifndef INSTALLCONTROLLER_H #define INSTALLCONTROLLER_H #include #include #include #include #include #include "core/utils/containerEnum.h" #include "core/utils/containers/containerUtils.h" #include "core/utils/protocolEnum.h" #include "core/utils/errorCodes.h" #include "core/utils/routeModes.h" #include "core/utils/commonStructs.h" #include "core/models/containerConfig.h" #include "core/repositories/secureServersRepository.h" #include "core/repositories/secureAppSettingsRepository.h" class SshSession; class InstallerBase; using namespace amnezia; class InstallController : public QObject { Q_OBJECT public: explicit InstallController(SecureServersRepository* serversRepository, SecureAppSettingsRepository* appSettingsRepository, QObject *parent = nullptr); ~InstallController(); ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, ContainerConfig &config, bool isUpdate = false); ErrorCode updateContainer(int serverIndex, DockerContainer container, const ContainerConfig &oldConfig, ContainerConfig &newConfig); ErrorCode rebootServer(int serverIndex); ErrorCode removeAllContainers(int serverIndex); ErrorCode removeContainer(int serverIndex, DockerContainer container); ContainerConfig generateConfig(DockerContainer container, int port, TransportProto transportProto); ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers, SshSession &sshSession); ErrorCode scanServerForInstalledContainers(int serverIndex); ErrorCode installContainer(const ServerCredentials &credentials, DockerContainer container, int port, TransportProto transportProto, ContainerConfig &config); ErrorCode installServer(const ServerCredentials &credentials, DockerContainer container, int port, TransportProto transportProto, bool &wasContainerInstalled); ErrorCode installContainer(int serverIndex, DockerContainer container, int port, TransportProto transportProto, bool &wasContainerInstalled); bool isUpdateDockerContainerRequired(DockerContainer container, const ContainerConfig &oldConfig, const ContainerConfig &newConfig); ErrorCode checkSshConnection(const ServerCredentials &credentials, QString &output, std::function passphraseCallback = nullptr); bool isServerAlreadyExists(const ServerCredentials &credentials, int &existingServerIndex); ErrorCode mountSftpDrive(const ServerCredentials &credentials, const QString &port, const QString &password, const QString &username); void stopAllSftpMounts(); void cancelInstallation(); void clearCachedProfile(int serverIndex, DockerContainer container); ErrorCode validateAndPrepareConfig(int serverIndex); void validateConfig(int serverIndex); signals: void configValidated(bool isValid); void validationErrorOccurred(ErrorCode errorCode); void serverIsBusy(const bool isBusy); void cancelInstallationRequested(); void clientRevocationRequested(int serverIndex, const ContainerConfig &containerConfig, DockerContainer container); void clientAppendRequested(int serverIndex, const QString &clientId, const QString &clientName, DockerContainer container); private: ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container, SshSession &sshSession); ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, SshSession &sshSession); ErrorCode buildContainerWorker(const ServerCredentials &credentials, DockerContainer container, const ContainerConfig &config, SshSession &sshSession); ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, ContainerConfig &config, SshSession &sshSession); ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, ContainerConfig &config, SshSession &sshSession); ErrorCode startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const ContainerConfig &config, SshSession &sshSession); ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const ContainerConfig &config, SshSession &sshSession); ErrorCode isUserInSudo(const ServerCredentials &credentials, SshSession &sshSession); ErrorCode isServerDpkgBusy(const ServerCredentials &credentials, SshSession &sshSession); ErrorCode setupServerFirewall(const ServerCredentials &credentials, SshSession &sshSession); bool isReinstallContainerRequired(DockerContainer container, const ContainerConfig &oldConfig, const ContainerConfig &newConfig); ErrorCode prepareContainerConfig(DockerContainer container, const ServerCredentials &credentials, ContainerConfig &containerConfig, SshSession &sshSession); ErrorCode processContainerForAdmin(DockerContainer container, ContainerConfig &containerConfig, const ServerCredentials &credentials, SshSession &sshSession, int serverIndex, const QString &clientName); void adminAppendRequested(int serverIndex, DockerContainer container, const ContainerConfig &containerConfig, const QString &clientName); static void updateContainerConfigAfterInstallation(DockerContainer container, ContainerConfig &containerConfig, const QString &stdOut); QScopedPointer createInstaller(DockerContainer container); SecureServersRepository* m_serversRepository; SecureAppSettingsRepository* m_appSettingsRepository; bool m_cancelInstallation = false; #ifndef Q_OS_IOS QList> m_sftpMountProcesses; #endif }; #endif // INSTALLCONTROLLER_H