Overte C++ Documentation
DomainContentBackupManager.h
1 //
2 // DomainContentBackupManager.h
3 // libraries/domain-server/src
4 //
5 // Created by Ryan Huffman on 1/01/18.
6 // Adapted from OctreePersistThread
7 // Copyright 2018 High Fidelity, Inc.
8 //
9 //
10 //
11 // Distributed under the Apache License, Version 2.0.
12 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
13 //
14 
15 #ifndef hifi_DomainContentBackupManager_h
16 #define hifi_DomainContentBackupManager_h
17 
18 #include <RegisteredMetaTypes.h>
19 
20 #include <QString>
21 #include <QVector>
22 #include <QDateTime>
23 #include <QTimer>
24 
25 #include <mutex>
26 #include <unordered_map>
27 
28 #include <GenericThread.h>
29 
30 #include "BackupHandler.h"
31 #include "DomainServerSettingsManager.h"
32 
33 #include <shared/MiniPromises.h>
34 
35 #include <PortableHighResolutionClock.h>
36 
37 const QString DATETIME_FORMAT_RE { "\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}" };
38 const QString AUTOMATIC_BACKUP_PREFIX { "autobackup-" };
39 const QString MANUAL_BACKUP_PREFIX { "backup-" };
40 const QString INSTALLED_CONTENT = "installed_content";
41 const QString INSTALLED_CONTENT_FILENAME = "filename";
42 const QString INSTALLED_CONTENT_NAME = "name";
43 const QString INSTALLED_CONTENT_CREATION_TIME = "creation_time";
44 const QString INSTALLED_CONTENT_INSTALL_TIME = "install_time";
45 const QString INSTALLED_CONTENT_INSTALLED_BY = "installed_by";
46 
47 struct BackupItemInfo {
48  BackupItemInfo(QString pId, QString pName, QString pAbsolutePath, QDateTime pCreatedAt, bool pIsManualBackup) :
49  id(pId), name(pName), absolutePath(pAbsolutePath), createdAt(pCreatedAt), isManualBackup(pIsManualBackup) { };
50 
51  QString id;
52  QString name;
53  QString absolutePath;
54  QDateTime createdAt;
55  bool isManualBackup;
56 };
57 
58 struct ConsolidatedBackupInfo {
59  enum State {
60  CONSOLIDATING,
61  COMPLETE_WITH_ERROR,
62  COMPLETE_WITH_SUCCESS
63  };
64  State state;
65  QString error;
66  QString absoluteFilePath;
67  std::chrono::system_clock::time_point createdAt;
68 };
69 
70 class DomainContentBackupManager : public GenericThread {
71  Q_OBJECT
72 public:
73  class BackupRule {
74  public:
75  QString name;
76  int intervalSeconds;
77  QString extensionFormat;
78  int maxBackupVersions;
79  qint64 lastBackupSeconds;
80  };
81 
82  static const std::chrono::seconds DEFAULT_PERSIST_INTERVAL;
83 
84  DomainContentBackupManager(const QString& rootBackupDirectory,
85  DomainServerSettingsManager& domainServerSettingsManager,
86  std::chrono::milliseconds persistInterval = DEFAULT_PERSIST_INTERVAL,
87  bool debugTimestampNow = false);
88 
89  std::vector<BackupItemInfo> getAllBackups();
90  void addBackupHandler(BackupHandlerPointer handler);
91  void aboutToFinish();
92  void replaceData(QByteArray data);
93  ConsolidatedBackupInfo consolidateBackup(QString fileName);
94 
95 public slots:
96  void getAllBackupsAndStatus(MiniPromise::Promise promise);
97  void createManualBackup(MiniPromise::Promise promise, const QString& name);
98  void recoverFromBackup(MiniPromise::Promise promise, const QString& backupName, const QString& username);
99  void recoverFromUploadedBackup(MiniPromise::Promise promise, QByteArray uploadedBackup, QString username);
100  void recoverFromUploadedFile(MiniPromise::Promise promise, QString uploadedFilename, QString username, QString sourceFilename);
101  void deleteBackup(MiniPromise::Promise promise, const QString& backupName);
102 
103 signals:
104  void loadCompleted();
105  void recoveryCompleted();
106 
107 protected:
109  virtual void setup() override;
110  virtual bool process() override;
111  virtual void shutdown() override;
112 
113  void backup();
114  void removeOldBackupVersions(const BackupRule& rule);
115  void refreshBackupRules();
116  bool getMostRecentBackup(const QString& format, QString& mostRecentBackupFileName, QDateTime& mostRecentBackupTime);
117  int64_t getMostRecentBackupTimeInSecs(const QString& format);
118  void parseBackupRules(const QVariantList& backupRules);
119 
120  std::pair<bool, QString> createBackup(const QString& prefix, const QString& name);
121 
122  bool recoverFromBackupZip(const QString& backupName, QuaZip& backupZip, const QString& username, const QString& sourceFilename, bool rollingBack = false);
123 
124 private slots:
125  void removeOldConsolidatedBackups();
126  void consolidateBackupInternal(QString fileName);
127 
128 private:
129  DomainServerSettingsManager& _settingsManager;
130 
131  QTimer _consolidatedBackupCleanupTimer;
132 
133  const QString _consolidatedBackupDirectory;
134  const QString _backupDirectory;
135  std::vector<BackupHandlerPointer> _backupHandlers;
136  std::chrono::milliseconds _persistInterval { 0 };
137 
138  std::mutex _consolidatedBackupsMutex;
139  std::unordered_map<QString, ConsolidatedBackupInfo> _consolidatedBackups;
140 
141  std::atomic<bool> _isRecovering { false };
142  QString _recoveryError;
143  QString _recoveryFilename { };
144 
145  p_high_resolution_clock::time_point _lastCheck;
146  std::vector<BackupRule> _backupRules;
147 };
148 
149 #endif // hifi_DomainContentBackupManager_h
Manages the domain-wide settings.
Definition: DomainServerSettingsManager.h:75
Definition: GenericThread.h:23
virtual bool process()=0
Override this function to do whatever your class actually does, return false to exit thread early.