@futo-org/backups-orchestrator-api 0.1.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/LICENSE +41 -0
  2. package/dist/backends/backend.d.ts +23 -0
  3. package/dist/backends/backend.js +31 -0
  4. package/dist/backends/backend.js.map +1 -0
  5. package/dist/backends/local.backend.d.ts +24 -0
  6. package/dist/backends/local.backend.js +92 -0
  7. package/dist/backends/local.backend.js.map +1 -0
  8. package/dist/backends/s3.backend.d.ts +24 -0
  9. package/dist/backends/s3.backend.js +47 -0
  10. package/dist/backends/s3.backend.js.map +1 -0
  11. package/dist/backends/yucca.backend.d.ts +27 -0
  12. package/dist/backends/yucca.backend.js +63 -0
  13. package/dist/backends/yucca.backend.js.map +1 -0
  14. package/dist/const.d.ts +2 -0
  15. package/dist/const.js +6 -0
  16. package/dist/const.js.map +1 -0
  17. package/dist/controllers/auth.controller.d.ts +7 -0
  18. package/dist/controllers/auth.controller.js +38 -0
  19. package/dist/controllers/auth.controller.js.map +1 -0
  20. package/dist/controllers/backend.controller.d.ts +8 -0
  21. package/dist/controllers/backend.controller.js +52 -0
  22. package/dist/controllers/backend.controller.js.map +1 -0
  23. package/dist/controllers/development.controller.d.ts +6 -0
  24. package/dist/controllers/development.controller.js +35 -0
  25. package/dist/controllers/development.controller.js.map +1 -0
  26. package/dist/controllers/filesystem.controller.d.ts +7 -0
  27. package/dist/controllers/filesystem.controller.js +43 -0
  28. package/dist/controllers/filesystem.controller.js.map +1 -0
  29. package/dist/controllers/integrations.controller.d.ts +8 -0
  30. package/dist/controllers/integrations.controller.js +51 -0
  31. package/dist/controllers/integrations.controller.js.map +1 -0
  32. package/dist/controllers/onboarding.controller.d.ts +11 -0
  33. package/dist/controllers/onboarding.controller.js +80 -0
  34. package/dist/controllers/onboarding.controller.js.map +1 -0
  35. package/dist/controllers/repository.controller.d.ts +22 -0
  36. package/dist/controllers/repository.controller.js +227 -0
  37. package/dist/controllers/repository.controller.js.map +1 -0
  38. package/dist/controllers/runHistory.controller.d.ts +9 -0
  39. package/dist/controllers/runHistory.controller.js +55 -0
  40. package/dist/controllers/runHistory.controller.js.map +1 -0
  41. package/dist/controllers/runningTasks.controller.d.ts +8 -0
  42. package/dist/controllers/runningTasks.controller.js +52 -0
  43. package/dist/controllers/runningTasks.controller.js.map +1 -0
  44. package/dist/controllers/schedule.controller.d.ts +10 -0
  45. package/dist/controllers/schedule.controller.js +76 -0
  46. package/dist/controllers/schedule.controller.js.map +1 -0
  47. package/dist/dto/auth.dto.d.ts +4 -0
  48. package/dist/dto/auth.dto.js +27 -0
  49. package/dist/dto/auth.dto.js.map +1 -0
  50. package/dist/dto/backend.dto.d.ts +16 -0
  51. package/dist/dto/backend.dto.js +64 -0
  52. package/dist/dto/backend.dto.js.map +1 -0
  53. package/dist/dto/filesystem.dto.d.ts +12 -0
  54. package/dist/dto/filesystem.dto.js +56 -0
  55. package/dist/dto/filesystem.dto.js.map +1 -0
  56. package/dist/dto/integrations.dto.d.ts +35 -0
  57. package/dist/dto/integrations.dto.js +163 -0
  58. package/dist/dto/integrations.dto.js.map +1 -0
  59. package/dist/dto/onboarding.dto.d.ts +13 -0
  60. package/dist/dto/onboarding.dto.js +60 -0
  61. package/dist/dto/onboarding.dto.js.map +1 -0
  62. package/dist/dto/repository.dto.d.ts +113 -0
  63. package/dist/dto/repository.dto.js +421 -0
  64. package/dist/dto/repository.dto.js.map +1 -0
  65. package/dist/dto/runningTasks.dto.d.ts +14 -0
  66. package/dist/dto/runningTasks.dto.js +59 -0
  67. package/dist/dto/runningTasks.dto.js.map +1 -0
  68. package/dist/dto/schedule.dto.d.ts +29 -0
  69. package/dist/dto/schedule.dto.js +149 -0
  70. package/dist/dto/schedule.dto.js.map +1 -0
  71. package/dist/enum.d.ts +32 -0
  72. package/dist/enum.js +42 -0
  73. package/dist/enum.js.map +1 -0
  74. package/dist/events/events.gateway.d.ts +73 -0
  75. package/dist/events/events.gateway.js +79 -0
  76. package/dist/events/events.gateway.js.map +1 -0
  77. package/dist/index.d.ts +4 -0
  78. package/dist/index.js +24 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/moduleConfig.d.ts +20 -0
  81. package/dist/moduleConfig.js +5 -0
  82. package/dist/moduleConfig.js.map +1 -0
  83. package/dist/orchestrationApi.module.d.ts +5 -0
  84. package/dist/orchestrationApi.module.js +134 -0
  85. package/dist/orchestrationApi.module.js.map +1 -0
  86. package/dist/repositories/backend.repository.d.ts +19 -0
  87. package/dist/repositories/backend.repository.js +60 -0
  88. package/dist/repositories/backend.repository.js.map +1 -0
  89. package/dist/repositories/config.repository.d.ts +18 -0
  90. package/dist/repositories/config.repository.js +93 -0
  91. package/dist/repositories/config.repository.js.map +1 -0
  92. package/dist/repositories/database.repository.d.ts +11 -0
  93. package/dist/repositories/database.repository.js +85 -0
  94. package/dist/repositories/database.repository.js.map +1 -0
  95. package/dist/repositories/moduleConfig.repository.d.ts +12 -0
  96. package/dist/repositories/moduleConfig.repository.js +48 -0
  97. package/dist/repositories/moduleConfig.repository.js.map +1 -0
  98. package/dist/repositories/repository.repository.d.ts +18 -0
  99. package/dist/repositories/repository.repository.js +81 -0
  100. package/dist/repositories/repository.repository.js.map +1 -0
  101. package/dist/repositories/repositoryIntegrationImmich.repository.d.ts +14 -0
  102. package/dist/repositories/repositoryIntegrationImmich.repository.js +57 -0
  103. package/dist/repositories/repositoryIntegrationImmich.repository.js.map +1 -0
  104. package/dist/repositories/repositoryLocalMetrics.repository.d.ts +23 -0
  105. package/dist/repositories/repositoryLocalMetrics.repository.js +55 -0
  106. package/dist/repositories/repositoryLocalMetrics.repository.js.map +1 -0
  107. package/dist/repositories/repositoryPath.repository.d.ts +17 -0
  108. package/dist/repositories/repositoryPath.repository.js +48 -0
  109. package/dist/repositories/repositoryPath.repository.js.map +1 -0
  110. package/dist/repositories/restic.repository.d.ts +207 -0
  111. package/dist/repositories/restic.repository.js +96 -0
  112. package/dist/repositories/restic.repository.js.map +1 -0
  113. package/dist/repositories/runHistory.repository.d.ts +44 -0
  114. package/dist/repositories/runHistory.repository.js +191 -0
  115. package/dist/repositories/runHistory.repository.js.map +1 -0
  116. package/dist/repositories/runningTasks.repository.d.ts +14 -0
  117. package/dist/repositories/runningTasks.repository.js +77 -0
  118. package/dist/repositories/runningTasks.repository.js.map +1 -0
  119. package/dist/repositories/schedule.repository.d.ts +47 -0
  120. package/dist/repositories/schedule.repository.js +99 -0
  121. package/dist/repositories/schedule.repository.js.map +1 -0
  122. package/dist/repositories/storage.repository.d.ts +9 -0
  123. package/dist/repositories/storage.repository.js +39 -0
  124. package/dist/repositories/storage.repository.js.map +1 -0
  125. package/dist/schema/index.d.ts +20 -0
  126. package/dist/schema/index.js +3 -0
  127. package/dist/schema/index.js.map +1 -0
  128. package/dist/schema/migrations/20260218105210-InitialMigration.d.ts +3 -0
  129. package/dist/schema/migrations/20260218105210-InitialMigration.js +15 -0
  130. package/dist/schema/migrations/20260218105210-InitialMigration.js.map +1 -0
  131. package/dist/schema/migrations/20260218122600-AddRepositories.d.ts +3 -0
  132. package/dist/schema/migrations/20260218122600-AddRepositories.js +21 -0
  133. package/dist/schema/migrations/20260218122600-AddRepositories.js.map +1 -0
  134. package/dist/schema/migrations/20260224112323-RepositoryPathTable.d.ts +3 -0
  135. package/dist/schema/migrations/20260224112323-RepositoryPathTable.js +16 -0
  136. package/dist/schema/migrations/20260224112323-RepositoryPathTable.js.map +1 -0
  137. package/dist/schema/migrations/20260224123344-RunHistoryTable.d.ts +3 -0
  138. package/dist/schema/migrations/20260224123344-RunHistoryTable.js +20 -0
  139. package/dist/schema/migrations/20260224123344-RunHistoryTable.js.map +1 -0
  140. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.d.ts +3 -0
  141. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.js +16 -0
  142. package/dist/schema/migrations/20260224125102-RepositoryMetricsTable.js.map +1 -0
  143. package/dist/schema/migrations/20260304162353-ScheduleTable.d.ts +3 -0
  144. package/dist/schema/migrations/20260304162353-ScheduleTable.js +27 -0
  145. package/dist/schema/migrations/20260304162353-ScheduleTable.js.map +1 -0
  146. package/dist/schema/migrations/20260313222211-AddMetricsColumns.d.ts +3 -0
  147. package/dist/schema/migrations/20260313222211-AddMetricsColumns.js +13 -0
  148. package/dist/schema/migrations/20260313222211-AddMetricsColumns.js.map +1 -0
  149. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.d.ts +3 -0
  150. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.js +15 -0
  151. package/dist/schema/migrations/20260330120000-RepositoryIntegrationImmichTable.js.map +1 -0
  152. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.d.ts +3 -0
  153. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.js +14 -0
  154. package/dist/schema/migrations/20260330130000-AddScheduleIdToImmichIntegration.js.map +1 -0
  155. package/dist/schema/migrations/20260507120000-AddRunHistoryType.d.ts +3 -0
  156. package/dist/schema/migrations/20260507120000-AddRunHistoryType.js +18 -0
  157. package/dist/schema/migrations/20260507120000-AddRunHistoryType.js.map +1 -0
  158. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.d.ts +3 -0
  159. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.js +11 -0
  160. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPolicy.js.map +1 -0
  161. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.d.ts +3 -0
  162. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.js +18 -0
  163. package/dist/schema/migrations/20260512120000-AddRepositoryRetentionPreset.js.map +1 -0
  164. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.d.ts +3 -0
  165. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.js +47 -0
  166. package/dist/schema/migrations/20260512130000-AllowForgetRunHistoryType.js.map +1 -0
  167. package/dist/schema/tables/backend.table.d.ts +20 -0
  168. package/dist/schema/tables/backend.table.js +9 -0
  169. package/dist/schema/tables/backend.table.js.map +1 -0
  170. package/dist/schema/tables/config.table.d.ts +4 -0
  171. package/dist/schema/tables/config.table.js +9 -0
  172. package/dist/schema/tables/config.table.js.map +1 -0
  173. package/dist/schema/tables/repository.table.d.ts +5 -0
  174. package/dist/schema/tables/repository.table.js +10 -0
  175. package/dist/schema/tables/repository.table.js.map +1 -0
  176. package/dist/schema/tables/repositoryIntegrationImmich.table.d.ts +10 -0
  177. package/dist/schema/tables/repositoryIntegrationImmich.table.js +10 -0
  178. package/dist/schema/tables/repositoryIntegrationImmich.table.js.map +1 -0
  179. package/dist/schema/tables/repositoryLocalMetrics.table.d.ts +7 -0
  180. package/dist/schema/tables/repositoryLocalMetrics.table.js +12 -0
  181. package/dist/schema/tables/repositoryLocalMetrics.table.js.map +1 -0
  182. package/dist/schema/tables/repositoryPath.table.d.ts +4 -0
  183. package/dist/schema/tables/repositoryPath.table.js +9 -0
  184. package/dist/schema/tables/repositoryPath.table.js.map +1 -0
  185. package/dist/schema/tables/repositorySchedule.table.d.ts +4 -0
  186. package/dist/schema/tables/repositorySchedule.table.js +9 -0
  187. package/dist/schema/tables/repositorySchedule.table.js.map +1 -0
  188. package/dist/schema/tables/runHistory.table.d.ts +11 -0
  189. package/dist/schema/tables/runHistory.table.js +14 -0
  190. package/dist/schema/tables/runHistory.table.js.map +1 -0
  191. package/dist/schema/tables/schedule.table.d.ts +9 -0
  192. package/dist/schema/tables/schedule.table.js +14 -0
  193. package/dist/schema/tables/schedule.table.js.map +1 -0
  194. package/dist/services/auth.service.d.ts +16 -0
  195. package/dist/services/auth.service.js +85 -0
  196. package/dist/services/auth.service.js.map +1 -0
  197. package/dist/services/backend.service.d.ts +12 -0
  198. package/dist/services/backend.service.js +68 -0
  199. package/dist/services/backend.service.js.map +1 -0
  200. package/dist/services/bootstrap.service.d.ts +13 -0
  201. package/dist/services/bootstrap.service.js +44 -0
  202. package/dist/services/bootstrap.service.js.map +1 -0
  203. package/dist/services/database.service.d.ts +11 -0
  204. package/dist/services/database.service.js +39 -0
  205. package/dist/services/database.service.js.map +1 -0
  206. package/dist/services/development.service.d.ts +11 -0
  207. package/dist/services/development.service.js +59 -0
  208. package/dist/services/development.service.js.map +1 -0
  209. package/dist/services/filesystem.service.d.ts +7 -0
  210. package/dist/services/filesystem.service.js +43 -0
  211. package/dist/services/filesystem.service.js.map +1 -0
  212. package/dist/services/integrations.service.d.ts +22 -0
  213. package/dist/services/integrations.service.js +158 -0
  214. package/dist/services/integrations.service.js.map +1 -0
  215. package/dist/services/onboarding.service.d.ts +17 -0
  216. package/dist/services/onboarding.service.js +65 -0
  217. package/dist/services/onboarding.service.js.map +1 -0
  218. package/dist/services/repository.service.d.ts +65 -0
  219. package/dist/services/repository.service.js +623 -0
  220. package/dist/services/repository.service.js.map +1 -0
  221. package/dist/services/runHistory.service.d.ts +7 -0
  222. package/dist/services/runHistory.service.js +29 -0
  223. package/dist/services/runHistory.service.js.map +1 -0
  224. package/dist/services/runningTasks.service.d.ts +8 -0
  225. package/dist/services/runningTasks.service.js +34 -0
  226. package/dist/services/runningTasks.service.js.map +1 -0
  227. package/dist/services/schedule.service.d.ts +27 -0
  228. package/dist/services/schedule.service.js +197 -0
  229. package/dist/services/schedule.service.js.map +1 -0
  230. package/dist/utils/restic.d.ts +17 -0
  231. package/dist/utils/restic.js +26 -0
  232. package/dist/utils/restic.js.map +1 -0
  233. package/package.json +79 -0
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RepositoryPathRepository = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const kysely_1 = require("kysely");
18
+ const nestjs_kysely_1 = require("nestjs-kysely");
19
+ let RepositoryPathRepository = class RepositoryPathRepository {
20
+ db;
21
+ constructor(db) {
22
+ this.db = db;
23
+ }
24
+ create(entry) {
25
+ return this.db.insertInto('repositoryPaths').values(entry).returningAll().executeTakeFirstOrThrow();
26
+ }
27
+ async get(id) {
28
+ const result = await this.db.selectFrom('repositoryPaths').select('path').where('id', '=', id).execute();
29
+ return result.map(({ path }) => path);
30
+ }
31
+ getAll() {
32
+ return this.db.selectFrom('repositoryPaths').selectAll().execute();
33
+ }
34
+ delete(id, path) {
35
+ return this.db
36
+ .deleteFrom('repositoryPaths')
37
+ .where('id', '=', id)
38
+ .where('path', '=', path)
39
+ .executeTakeFirstOrThrow();
40
+ }
41
+ };
42
+ exports.RepositoryPathRepository = RepositoryPathRepository;
43
+ exports.RepositoryPathRepository = RepositoryPathRepository = __decorate([
44
+ (0, common_1.Injectable)(),
45
+ __param(0, (0, nestjs_kysely_1.InjectKysely)('orchestrator')),
46
+ __metadata("design:paramtypes", [kysely_1.Kysely])
47
+ ], RepositoryPathRepository);
48
+ //# sourceMappingURL=repositoryPath.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryPath.repository.js","sourceRoot":"","sources":["../../src/repositories/repositoryPath.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,mCAA4C;AAC5C,iDAA6C;AAKtC,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACe;IAAlD,YAAkD,EAAc;QAAd,OAAE,GAAF,EAAE,CAAY;IAAG,CAAC;IAEpE,MAAM,CAAC,KAAsC;QAC3C,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,uBAAuB,EAAE,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACzG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,IAAY;QAC7B,OAAO,IAAI,CAAC,EAAE;aACX,UAAU,CAAC,iBAAiB,CAAC;aAC7B,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;aACpB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;aACxB,uBAAuB,EAAE,CAAC;IAC/B,CAAC;CACF,CAAA;AAvBY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,4BAAY,EAAC,cAAc,CAAC,CAAA;qCAAa,eAAM;GADjD,wBAAwB,CAuBpC"}
@@ -0,0 +1,207 @@
1
+ import { Writable } from 'node:stream';
2
+ import { RepositorySnapshotRestoreRequestDto } from '../dto/repository.dto';
3
+ import { RetentionPolicy } from '../utils/restic';
4
+ export declare class ResticRepository {
5
+ init(repository: string, key: Uint8Array): Promise<void>;
6
+ backup(repository: string, key: Uint8Array, paths: string[], logStream?: Writable, signal?: AbortSignal): Promise<void>;
7
+ restore(repository: string, key: Uint8Array, snapshotId: string, { include, target }: RepositorySnapshotRestoreRequestDto, logStream?: Writable, signal?: AbortSignal): Promise<void>;
8
+ ls(repository: string, key: Uint8Array, snapshotId: string, path: string): Promise<({
9
+ time: Date;
10
+ tree: string;
11
+ paths: string[];
12
+ id: string;
13
+ short_id: string;
14
+ message_type: "snapshot";
15
+ struct_type: "snapshot";
16
+ parent?: string | undefined;
17
+ hostname?: string | undefined;
18
+ username?: string | undefined;
19
+ uid?: number | undefined;
20
+ gid?: number | undefined;
21
+ excludes?: string[] | undefined;
22
+ tags?: string[] | undefined;
23
+ program_version?: string | undefined;
24
+ summary?: {
25
+ backup_start: Date;
26
+ backup_end: Date;
27
+ files_new: number;
28
+ files_changed: number;
29
+ files_unmodified: number;
30
+ dirs_new: number;
31
+ dirs_changed: number;
32
+ dirs_unmodified: number;
33
+ data_blobs: number;
34
+ tree_blobs: number;
35
+ data_added: number;
36
+ data_added_packed: number;
37
+ total_files_processed: number;
38
+ total_bytes_processed: number;
39
+ } | undefined;
40
+ } | {
41
+ message_type: "node";
42
+ struct_type: "node";
43
+ name: string;
44
+ type: string;
45
+ path: string;
46
+ uid: number;
47
+ gid: number;
48
+ size?: number | undefined;
49
+ mode?: number | undefined;
50
+ permissions?: string | undefined;
51
+ atime?: Date | undefined;
52
+ mtime?: Date | undefined;
53
+ ctime?: Date | undefined;
54
+ inode?: number | undefined;
55
+ })[]>;
56
+ stats(repository: string, key: Uint8Array): Promise<{
57
+ snapshots_count: number;
58
+ total_size: number;
59
+ compression_progress?: number | undefined;
60
+ compression_ratio?: number | undefined;
61
+ compression_space_saving?: number | undefined;
62
+ total_blob_count?: number | undefined;
63
+ total_uncompressed_size?: number | undefined;
64
+ }>;
65
+ snapshots(repository: string, key: Uint8Array): Promise<{
66
+ time: Date;
67
+ tree: string;
68
+ paths: string[];
69
+ id: string;
70
+ short_id: string;
71
+ parent?: string | undefined;
72
+ hostname?: string | undefined;
73
+ username?: string | undefined;
74
+ uid?: number | undefined;
75
+ gid?: number | undefined;
76
+ excludes?: string[] | undefined;
77
+ tags?: string[] | undefined;
78
+ program_version?: string | undefined;
79
+ summary?: {
80
+ backup_start: Date;
81
+ backup_end: Date;
82
+ files_new: number;
83
+ files_changed: number;
84
+ files_unmodified: number;
85
+ dirs_new: number;
86
+ dirs_changed: number;
87
+ dirs_unmodified: number;
88
+ data_blobs: number;
89
+ tree_blobs: number;
90
+ data_added: number;
91
+ data_added_packed: number;
92
+ total_files_processed: number;
93
+ total_bytes_processed: number;
94
+ } | undefined;
95
+ }[]>;
96
+ forget(repository: string, key: Uint8Array, snapshotId: string, prune?: boolean, signal?: AbortSignal): Promise<void>;
97
+ forgetByPolicy(repository: string, key: Uint8Array, policy: RetentionPolicy, signal?: AbortSignal): Promise<{
98
+ tags: string[] | null;
99
+ host: string;
100
+ paths: string[] | null;
101
+ keep: {
102
+ time: Date;
103
+ tree: string;
104
+ paths: string[];
105
+ id: string;
106
+ short_id: string;
107
+ parent?: string | undefined;
108
+ hostname?: string | undefined;
109
+ username?: string | undefined;
110
+ uid?: number | undefined;
111
+ gid?: number | undefined;
112
+ excludes?: string[] | undefined;
113
+ tags?: string[] | undefined;
114
+ program_version?: string | undefined;
115
+ summary?: {
116
+ backup_start: Date;
117
+ backup_end: Date;
118
+ files_new: number;
119
+ files_changed: number;
120
+ files_unmodified: number;
121
+ dirs_new: number;
122
+ dirs_changed: number;
123
+ dirs_unmodified: number;
124
+ data_blobs: number;
125
+ tree_blobs: number;
126
+ data_added: number;
127
+ data_added_packed: number;
128
+ total_files_processed: number;
129
+ total_bytes_processed: number;
130
+ } | undefined;
131
+ }[] | null;
132
+ remove: {
133
+ time: Date;
134
+ tree: string;
135
+ paths: string[];
136
+ id: string;
137
+ short_id: string;
138
+ parent?: string | undefined;
139
+ hostname?: string | undefined;
140
+ username?: string | undefined;
141
+ uid?: number | undefined;
142
+ gid?: number | undefined;
143
+ excludes?: string[] | undefined;
144
+ tags?: string[] | undefined;
145
+ program_version?: string | undefined;
146
+ summary?: {
147
+ backup_start: Date;
148
+ backup_end: Date;
149
+ files_new: number;
150
+ files_changed: number;
151
+ files_unmodified: number;
152
+ dirs_new: number;
153
+ dirs_changed: number;
154
+ dirs_unmodified: number;
155
+ data_blobs: number;
156
+ tree_blobs: number;
157
+ data_added: number;
158
+ data_added_packed: number;
159
+ total_files_processed: number;
160
+ total_bytes_processed: number;
161
+ } | undefined;
162
+ }[] | null;
163
+ reasons: {
164
+ snapshot: {
165
+ time: Date;
166
+ tree: string;
167
+ paths: string[];
168
+ id: string;
169
+ short_id: string;
170
+ parent?: string | undefined;
171
+ hostname?: string | undefined;
172
+ username?: string | undefined;
173
+ uid?: number | undefined;
174
+ gid?: number | undefined;
175
+ excludes?: string[] | undefined;
176
+ tags?: string[] | undefined;
177
+ program_version?: string | undefined;
178
+ summary?: {
179
+ backup_start: Date;
180
+ backup_end: Date;
181
+ files_new: number;
182
+ files_changed: number;
183
+ files_unmodified: number;
184
+ dirs_new: number;
185
+ dirs_changed: number;
186
+ dirs_unmodified: number;
187
+ data_blobs: number;
188
+ tree_blobs: number;
189
+ data_added: number;
190
+ data_added_packed: number;
191
+ total_files_processed: number;
192
+ total_bytes_processed: number;
193
+ } | undefined;
194
+ };
195
+ matches: string[] | null;
196
+ }[] | null;
197
+ }[]>;
198
+ prune(repository: string, key: Uint8Array, signal?: AbortSignal): Promise<string>;
199
+ keyList(repository: string, key: Uint8Array): Promise<{
200
+ current: boolean;
201
+ id: string;
202
+ userName: string;
203
+ hostName: string;
204
+ created: Date;
205
+ }[]>;
206
+ unlockAll(repository: string, key: Uint8Array): Promise<any>;
207
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ResticRepository = void 0;
10
+ const restic_wrapper_1 = require("@futo-org/restic-wrapper");
11
+ const common_1 = require("@nestjs/common");
12
+ const restic_1 = require("../utils/restic");
13
+ let ResticRepository = class ResticRepository {
14
+ async init(repository, key) {
15
+ await (0, restic_wrapper_1.init)().repository(repository).password(Buffer.from(key).toString('hex')).run();
16
+ }
17
+ async backup(repository, key, paths, logStream, signal) {
18
+ const write = (0, restic_1.createSampledLogWriter)(logStream);
19
+ await (0, restic_wrapper_1.backup)()
20
+ .repository(repository)
21
+ .password(Buffer.from(key).toString('hex'))
22
+ .addFile(...paths)
23
+ .signal(signal)
24
+ .on('event', write)
25
+ .run();
26
+ }
27
+ async restore(repository, key, snapshotId, { include, target }, logStream, signal) {
28
+ const write = (0, restic_1.createSampledLogWriter)(logStream);
29
+ let command = (0, restic_wrapper_1.restore)()
30
+ .repository(repository)
31
+ .password(Buffer.from(key).toString('hex'))
32
+ .snapshot(snapshotId)
33
+ .target(target ?? '/')
34
+ .signal(signal)
35
+ .on('event', write);
36
+ if (include) {
37
+ command = command.include(...include);
38
+ }
39
+ await command.run();
40
+ }
41
+ async ls(repository, key, snapshotId, path) {
42
+ return await (0, restic_wrapper_1.ls)()
43
+ .repository(repository)
44
+ .password(Buffer.from(key).toString('hex'))
45
+ .snapshot(snapshotId)
46
+ .directory(path)
47
+ .run();
48
+ }
49
+ async stats(repository, key) {
50
+ return await (0, restic_wrapper_1.stats)().repository(repository).password(Buffer.from(key).toString('hex')).modeRawData().run();
51
+ }
52
+ async snapshots(repository, key) {
53
+ return await (0, restic_wrapper_1.snapshots)().repository(repository).password(Buffer.from(key).toString('hex')).run();
54
+ }
55
+ async forget(repository, key, snapshotId, prune = true, signal) {
56
+ return await (0, restic_wrapper_1.forget)()
57
+ .repository(repository)
58
+ .password(Buffer.from(key).toString('hex'))
59
+ .snapshot(snapshotId)
60
+ .prune(prune)
61
+ .signal(signal)
62
+ .run();
63
+ }
64
+ async forgetByPolicy(repository, key, policy, signal) {
65
+ return await (0, restic_wrapper_1.forget)()
66
+ .repository(repository)
67
+ .password(Buffer.from(key).toString('hex'))
68
+ .signal(signal)
69
+ .keepLast(policy.keepLast)
70
+ .keepWithin(policy.keepWithin)
71
+ .keepWithinHourly(policy.keepWithinHourly)
72
+ .keepWithinDaily(policy.keepWithinDaily)
73
+ .keepWithinWeekly(policy.keepWithinWeekly)
74
+ .keepWithinMonthly(policy.keepWithinMonthly)
75
+ .keepWithinYearly(policy.keepWithinYearly)
76
+ .run();
77
+ }
78
+ prune(repository, key, signal) {
79
+ return (0, restic_wrapper_1.prune)().repository(repository).password(Buffer.from(key).toString('hex')).signal(signal).run();
80
+ }
81
+ async keyList(repository, key) {
82
+ return await (0, restic_wrapper_1.keyList)().repository(repository).password(Buffer.from(key).toString('hex')).run();
83
+ }
84
+ async unlockAll(repository, key) {
85
+ return await (0, restic_wrapper_1.unlock)()
86
+ .removeAll()
87
+ .repository(repository)
88
+ .password(Buffer.from(key).toString('hex'))
89
+ .run();
90
+ }
91
+ };
92
+ exports.ResticRepository = ResticRepository;
93
+ exports.ResticRepository = ResticRepository = __decorate([
94
+ (0, common_1.Injectable)()
95
+ ], ResticRepository);
96
+ //# sourceMappingURL=restic.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restic.repository.js","sourceRoot":"","sources":["../../src/repositories/restic.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { Kysely } from 'kysely';
2
+ import { type WriteStream } from 'node:fs';
3
+ import { TaskStatus } from '../enum';
4
+ import { EventsGateway } from '../events/events.gateway';
5
+ import { DB } from '../schema';
6
+ import { type RunType } from '../schema/tables/runHistory.table';
7
+ import { ModuleConfigRepository } from './moduleConfig.repository';
8
+ import { StorageRepository } from './storage.repository';
9
+ export declare class RunHistoryRepository {
10
+ private db;
11
+ private readonly moduleConfig;
12
+ private readonly storage;
13
+ private readonly events;
14
+ constructor(db: Kysely<DB>, moduleConfig: ModuleConfigRepository, storage: StorageRepository, events: EventsGateway);
15
+ private writeError;
16
+ createLog(repositoryId: string, type: RunType, fn: (log: WriteStream, logId: string) => Promise<void>, callback: (error?: unknown) => unknown): Promise<{
17
+ logId: `${string}-${string}-${string}-${string}-${string}`;
18
+ }>;
19
+ createEphemeralLog(fn: (log: WriteStream, logId: string) => Promise<void>, callback: (error?: unknown) => void): Promise<{
20
+ logId: `${string}-${string}-${string}-${string}-${string}`;
21
+ }>;
22
+ private ephemeralLogs;
23
+ createLogAsync(repositoryId: string, type: RunType, fn: (log: WriteStream, logId: string) => Promise<void>): Promise<void>;
24
+ get(id: string): Promise<{
25
+ id: string;
26
+ repositoryId: string;
27
+ start: string;
28
+ end: string | undefined;
29
+ logFilePath: string;
30
+ status: TaskStatus;
31
+ type: RunType;
32
+ }>;
33
+ getAll(repositoryId: string): Promise<{
34
+ id: string;
35
+ repositoryId: string;
36
+ start: string;
37
+ end: string | undefined;
38
+ logFilePath: string;
39
+ status: TaskStatus;
40
+ type: RunType;
41
+ }[]>;
42
+ getObservable(id: string): import("rxjs").Observable<MessageEvent<any>>;
43
+ markIncompleteAsFailed(): Promise<void>;
44
+ }
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.RunHistoryRepository = void 0;
19
+ const common_1 = require("@nestjs/common");
20
+ const event_iterator_1 = __importDefault(require("event-iterator"));
21
+ const kysely_1 = require("kysely");
22
+ const nestjs_kysely_1 = require("nestjs-kysely");
23
+ const node_crypto_1 = require("node:crypto");
24
+ const node_path_1 = require("node:path");
25
+ const rxjs_1 = require("rxjs");
26
+ const tail_1 = require("tail");
27
+ const enum_1 = require("../enum");
28
+ const events_gateway_1 = require("../events/events.gateway");
29
+ const moduleConfig_repository_1 = require("./moduleConfig.repository");
30
+ const storage_repository_1 = require("./storage.repository");
31
+ let RunHistoryRepository = class RunHistoryRepository {
32
+ db;
33
+ moduleConfig;
34
+ storage;
35
+ events;
36
+ constructor(db, moduleConfig, storage, events) {
37
+ this.db = db;
38
+ this.moduleConfig = moduleConfig;
39
+ this.storage = storage;
40
+ this.events = events;
41
+ }
42
+ writeError(log, error) {
43
+ const events = Array.isArray(error?.error)
44
+ ? error.error
45
+ : [{ message_type: 'error', error: `${error}` }];
46
+ for (const event of events) {
47
+ log.write(JSON.stringify(event) + '\n');
48
+ }
49
+ }
50
+ async createLog(repositoryId, type, fn, callback) {
51
+ const logId = (0, node_crypto_1.randomUUID)();
52
+ try {
53
+ const start = new Date().toISOString();
54
+ const logFilePath = (0, node_path_1.resolve)(this.moduleConfig.get().statePath, 'logs', repositoryId, start + '.jsonl');
55
+ await this.storage.mkdir((0, node_path_1.dirname)(logFilePath), {
56
+ recursive: true,
57
+ });
58
+ const log = this.storage.createWriteStream(logFilePath);
59
+ const run = await this.db
60
+ .insertInto('runHistory')
61
+ .values({
62
+ id: logId,
63
+ repositoryId,
64
+ type,
65
+ start,
66
+ logFilePath,
67
+ status: enum_1.TaskStatus.Incomplete,
68
+ })
69
+ .returningAll()
70
+ .executeTakeFirstOrThrow();
71
+ this.events.publish({ type: 'RunCreate', run });
72
+ const finalize = async (status) => {
73
+ const end = new Date().toISOString();
74
+ await this.db.updateTable('runHistory').where('id', '=', logId).set('status', status).set('end', end).execute();
75
+ this.events.publish({
76
+ type: 'RunUpdate',
77
+ runId: logId,
78
+ repositoryId,
79
+ run: { status, end },
80
+ });
81
+ };
82
+ fn(log, logId)
83
+ .then(async () => {
84
+ callback();
85
+ log.close();
86
+ await finalize(enum_1.TaskStatus.Complete);
87
+ })
88
+ .catch(async (error) => {
89
+ callback(error);
90
+ this.writeError(log, error);
91
+ log.close();
92
+ await finalize(enum_1.TaskStatus.Failed);
93
+ });
94
+ }
95
+ catch (error) {
96
+ callback(error);
97
+ }
98
+ return { logId };
99
+ }
100
+ async createEphemeralLog(fn, callback) {
101
+ const logId = (0, node_crypto_1.randomUUID)();
102
+ try {
103
+ const logFilePath = (0, node_path_1.resolve)(this.moduleConfig.get().statePath, 'logs', 'ephemeral', logId + '.jsonl');
104
+ await this.storage.mkdir((0, node_path_1.dirname)(logFilePath), {
105
+ recursive: true,
106
+ });
107
+ const log = this.storage.createWriteStream(logFilePath);
108
+ this.ephemeralLogs.set(logId, logFilePath);
109
+ fn(log, logId)
110
+ .then(() => {
111
+ callback();
112
+ log.close();
113
+ })
114
+ .catch((error) => {
115
+ callback(error);
116
+ this.writeError(log, error);
117
+ log.close();
118
+ });
119
+ }
120
+ catch (error) {
121
+ callback(error);
122
+ }
123
+ return { logId };
124
+ }
125
+ ephemeralLogs = new Map();
126
+ createLogAsync(repositoryId, type, fn) {
127
+ return new Promise((resolve, reject) => void this.createLog(repositoryId, type, fn, (error) => {
128
+ if (error) {
129
+ reject(error);
130
+ }
131
+ else {
132
+ resolve();
133
+ }
134
+ }));
135
+ }
136
+ async get(id) {
137
+ return this.db.selectFrom('runHistory').selectAll('runHistory').where('id', '=', id).executeTakeFirstOrThrow();
138
+ }
139
+ async getAll(repositoryId) {
140
+ return this.db.selectFrom('runHistory').selectAll('runHistory').where('repositoryId', '=', repositoryId).execute();
141
+ }
142
+ getObservable(id) {
143
+ const db = this.db;
144
+ const ephemeralPath = this.ephemeralLogs.get(id);
145
+ return (0, rxjs_1.from)(new event_iterator_1.default((queue) => {
146
+ let tail;
147
+ const startTail = (logFilePath) => {
148
+ tail = new tail_1.Tail(logFilePath, {
149
+ fromBeginning: true,
150
+ nLines: 50,
151
+ });
152
+ tail.on('line', (data) => queue.push({ data }));
153
+ tail.on('error', (error) => {
154
+ console.warn(`tail ${logFilePath} stopped:`, error);
155
+ tail?.unwatch();
156
+ });
157
+ };
158
+ if (ephemeralPath) {
159
+ startTail(ephemeralPath);
160
+ }
161
+ else {
162
+ db.selectFrom('runHistory')
163
+ .select('logFilePath')
164
+ .where('id', '=', id)
165
+ .executeTakeFirstOrThrow()
166
+ .then(({ logFilePath }) => startTail(logFilePath))
167
+ .catch(queue.fail);
168
+ }
169
+ return () => {
170
+ tail?.unwatch();
171
+ };
172
+ }));
173
+ }
174
+ async markIncompleteAsFailed() {
175
+ await this.db
176
+ .updateTable('runHistory')
177
+ .set('status', enum_1.TaskStatus.Failed)
178
+ .where('status', '=', enum_1.TaskStatus.Incomplete)
179
+ .execute();
180
+ }
181
+ };
182
+ exports.RunHistoryRepository = RunHistoryRepository;
183
+ exports.RunHistoryRepository = RunHistoryRepository = __decorate([
184
+ (0, common_1.Injectable)(),
185
+ __param(0, (0, nestjs_kysely_1.InjectKysely)('orchestrator')),
186
+ __metadata("design:paramtypes", [kysely_1.Kysely,
187
+ moduleConfig_repository_1.ModuleConfigRepository,
188
+ storage_repository_1.StorageRepository,
189
+ events_gateway_1.EventsGateway])
190
+ ], RunHistoryRepository);
191
+ //# sourceMappingURL=runHistory.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runHistory.repository.js","sourceRoot":"","sources":["../../src/repositories/runHistory.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { RunningTaskDto } from '../dto/runningTasks.dto';
2
+ import { TaskType } from '../enum';
3
+ import { EventsGateway } from '../events/events.gateway';
4
+ export declare class RunningTasksRepository {
5
+ private readonly events;
6
+ activeTasks: Map<string, RunningTaskDto>;
7
+ private controllers;
8
+ constructor(events: EventsGateway);
9
+ canStart(parentId: string): boolean;
10
+ startTask(parentId: string, type: TaskType, logId?: string, signal?: AbortSignal): AbortSignal;
11
+ updateTask(parentId: string, data: Partial<RunningTaskDto>): void;
12
+ endTask(parentId: string): void;
13
+ cancelTask(parentId: string): void;
14
+ }