@ps-aux/nodebup 0.3.0 → 0.6.0
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.
- package/lib/bup/AggregateBackupController.js +7 -7
- package/lib/bup/BackupController.js +63 -0
- package/lib/cli/InvalidInput.js +10 -0
- package/lib/cli/app.js +55 -15
- package/lib/config/Config.js +2 -10
- package/lib/config/expandAndCreatePath.js +3 -1
- package/lib/{storage/types.d.js → config/index.js} +0 -0
- package/lib/config/validateConfigAgainstSchema.js +3 -16
- package/lib/config/validateConfigAgainstSchema.spec.js +0 -4
- package/lib/ctx/Context.js +12 -2
- package/lib/ctx/ContextSymbols.js +4 -2
- package/lib/fs/Fs.js +11 -2
- package/lib/fs/fssync/FsSync.spec.js +1 -1
- package/lib/log/AppLogger.js +6 -4
- package/lib/storage/BackupClient.js +5 -0
- package/lib/storage/{restic/ResticStorageBackend.js → BackupClientStorageBackend.js} +8 -4
- package/lib/storage/StorageBackendProvider.js +25 -28
- package/lib/storage/StorageConfigProvider.js +89 -0
- package/lib/storage/StoreConfig.js +39 -0
- package/lib/storage/b2/B2CredentialsProvider.js +59 -0
- package/lib/storage/rclone/RCloneClientFactory.js +69 -0
- package/lib/storage/rclone/RcloneClient.js +87 -0
- package/lib/storage/rclone/RcloneClient.spec.js +83 -0
- package/lib/storage/restic/ResticClient.js +6 -15
- package/lib/storage/restic/ResticClient.spec.js +7 -23
- package/lib/storage/restic/ResticClientFactory.js +12 -36
- package/lib/storage/restic/ResticController.js +13 -8
- package/lib/storage/types.js +13 -0
- package/lib/tools/gpg/Gpg.js +8 -1
- package/lib/tools/gpg/Gpg.spec.js +18 -7
- package/lib/tools/shell/Shell.js +1 -1
- package/lib/tools/ssh/SshKeyManager.spec.js +3 -1
- package/package.json +17 -16
- package/lib/storage/local-file/LocalFileStorageBackend.js +0 -22
@@ -7,8 +7,6 @@ exports.AggregateBackupController = void 0;
|
|
7
7
|
|
8
8
|
var _FsSyncer = require("../fs/fssync/FsSyncer");
|
9
9
|
|
10
|
-
var _Config = require("../config/Config");
|
11
|
-
|
12
10
|
var _Gpg = require("../tools/gpg/Gpg");
|
13
11
|
|
14
12
|
var _Fs = require("../fs/Fs");
|
@@ -23,6 +21,8 @@ var _AppLogger = require("../log/AppLogger");
|
|
23
21
|
|
24
22
|
var _Path = require("../fs/path/Path");
|
25
23
|
|
24
|
+
var _config = require("../config");
|
25
|
+
|
26
26
|
var _StorageBackendProvider = require("../storage/StorageBackendProvider");
|
27
27
|
|
28
28
|
var _dec, _dec2, _dec3, _dec4, _class;
|
@@ -31,17 +31,17 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
31
31
|
|
32
32
|
let AggregateBackupController = (_dec = (0, _inversify.injectable)(), _dec2 = function (target, key) {
|
33
33
|
return (0, _inversify.inject)(_ContextSymbols.AppConfig_)(target, undefined, 6);
|
34
|
-
}, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _Gpg.Gpg === "undefined" ? Object : _Gpg.Gpg, typeof _SshKeyManager.SshKeyManager === "undefined" ? Object : _SshKeyManager.SshKeyManager, typeof _Fs.Fs === "undefined" ? Object : _Fs.Fs, typeof _FsSyncer.FsSyncer === "undefined" ? Object : _FsSyncer.FsSyncer, typeof _AppLogger.AppLogger === "undefined" ? Object : _AppLogger.AppLogger, typeof _StorageBackendProvider.StorageBackendProvider === "undefined" ? Object : _StorageBackendProvider.StorageBackendProvider, typeof
|
35
|
-
constructor(gpg, ssh, fs, fsSyncer, log,
|
34
|
+
}, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _Gpg.Gpg === "undefined" ? Object : _Gpg.Gpg, typeof _SshKeyManager.SshKeyManager === "undefined" ? Object : _SshKeyManager.SshKeyManager, typeof _Fs.Fs === "undefined" ? Object : _Fs.Fs, typeof _FsSyncer.FsSyncer === "undefined" ? Object : _FsSyncer.FsSyncer, typeof _AppLogger.AppLogger === "undefined" ? Object : _AppLogger.AppLogger, typeof _StorageBackendProvider.StorageBackendProvider === "undefined" ? Object : _StorageBackendProvider.StorageBackendProvider, typeof _config.Config === "undefined" ? Object : _config.Config]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = class AggregateBackupController {
|
35
|
+
constructor(gpg, ssh, fs, fsSyncer, log, storageProvider, cfg) {
|
36
36
|
this.gpg = gpg;
|
37
37
|
this.ssh = ssh;
|
38
38
|
this.fs = fs;
|
39
39
|
this.fsSyncer = fsSyncer;
|
40
40
|
this.log = log;
|
41
|
-
this.
|
41
|
+
this.storageProvider = storageProvider;
|
42
42
|
this.cfg = cfg;
|
43
43
|
|
44
|
-
_defineProperty(this, "backup", async
|
44
|
+
_defineProperty(this, "backup", async aggrName => {
|
45
45
|
const aggrDir = this.cfg.pwd.resolve('.aggr');
|
46
46
|
const aggr = this.cfg.aggregates.find(a => a.name === aggrName);
|
47
47
|
if (!aggr) throw new Error(`No backup aggregate with name '${aggrName}'`);
|
@@ -56,7 +56,7 @@ let AggregateBackupController = (_dec = (0, _inversify.injectable)(), _dec2 = fu
|
|
56
56
|
file.forEach(f => this.runFileTask(f, aggrDir));
|
57
57
|
sshKey.forEach(k => this.runSshKeyTask(k, aggrDir));
|
58
58
|
gpgKey.forEach(k => this.runGpgKeyTask(k, aggrDir));
|
59
|
-
this.
|
59
|
+
this.storageProvider.provide().store(aggrDir);
|
60
60
|
} finally {
|
61
61
|
this.log.debug();
|
62
62
|
this.fs.rmDir(aggrDir);
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.BackupController = void 0;
|
7
|
+
|
8
|
+
var _FsSyncer = require("../fs/fssync/FsSyncer");
|
9
|
+
|
10
|
+
var _Gpg = require("../tools/gpg/Gpg");
|
11
|
+
|
12
|
+
var _Fs = require("../fs/Fs");
|
13
|
+
|
14
|
+
var _SshKeyManager = require("../tools/ssh/SshKeyManager");
|
15
|
+
|
16
|
+
var _inversify = require("inversify");
|
17
|
+
|
18
|
+
var _ContextSymbols = require("../ctx/ContextSymbols");
|
19
|
+
|
20
|
+
var _AppLogger = require("../log/AppLogger");
|
21
|
+
|
22
|
+
var _Path = require("../fs/path/Path");
|
23
|
+
|
24
|
+
var _StorageBackendProvider = require("../storage/StorageBackendProvider");
|
25
|
+
|
26
|
+
var _config = require("../config");
|
27
|
+
|
28
|
+
var _dec, _dec2, _dec3, _dec4, _class;
|
29
|
+
|
30
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
31
|
+
|
32
|
+
let BackupController = (_dec = (0, _inversify.injectable)(), _dec2 = function (target, key) {
|
33
|
+
return (0, _inversify.inject)(_ContextSymbols.AppConfig_)(target, undefined, 6);
|
34
|
+
}, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _Gpg.Gpg === "undefined" ? Object : _Gpg.Gpg, typeof _SshKeyManager.SshKeyManager === "undefined" ? Object : _SshKeyManager.SshKeyManager, typeof _Fs.Fs === "undefined" ? Object : _Fs.Fs, typeof _FsSyncer.FsSyncer === "undefined" ? Object : _FsSyncer.FsSyncer, typeof _AppLogger.AppLogger === "undefined" ? Object : _AppLogger.AppLogger, typeof _StorageBackendProvider.StorageBackendProvider === "undefined" ? Object : _StorageBackendProvider.StorageBackendProvider, typeof _config.Config === "undefined" ? Object : _config.Config]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = class BackupController {
|
35
|
+
constructor(gpg, ssh, fs, fsSyncer, log, storageBackendProvider, cfg) {
|
36
|
+
this.gpg = gpg;
|
37
|
+
this.ssh = ssh;
|
38
|
+
this.fs = fs;
|
39
|
+
this.fsSyncer = fsSyncer;
|
40
|
+
this.log = log;
|
41
|
+
this.storageBackendProvider = storageBackendProvider;
|
42
|
+
this.cfg = cfg;
|
43
|
+
|
44
|
+
_defineProperty(this, "storage", inp => {
|
45
|
+
const storage = this.storageBackendProvider.provide();
|
46
|
+
|
47
|
+
const path = _Path.AbsPath.from(inp.path);
|
48
|
+
|
49
|
+
return {
|
50
|
+
backup: () => {
|
51
|
+
this.log.info(`Backing up from ${path} to '${storage}'`);
|
52
|
+
storage.store(path);
|
53
|
+
},
|
54
|
+
restore: () => {
|
55
|
+
this.log.info(`Restoring from '${storage}' to ${path}`);
|
56
|
+
storage.restore(path);
|
57
|
+
}
|
58
|
+
};
|
59
|
+
});
|
60
|
+
}
|
61
|
+
|
62
|
+
}) || _class) || _class) || _class) || _class);
|
63
|
+
exports.BackupController = BackupController;
|
package/lib/cli/app.js
CHANGED
@@ -17,16 +17,50 @@ var _AggregateBackupController = require("../bup/AggregateBackupController");
|
|
17
17
|
|
18
18
|
var _ResticController = require("../storage/restic/ResticController");
|
19
19
|
|
20
|
+
var _BackupController = require("../bup/BackupController");
|
21
|
+
|
22
|
+
const storageNameOpt = {
|
23
|
+
name: 'storage-name',
|
24
|
+
convertCase: true,
|
25
|
+
fromConfig: 'storage.name'
|
26
|
+
};
|
27
|
+
|
20
28
|
const createApp = () => _nclif.CliApp.of({
|
21
29
|
commands: {
|
22
|
-
|
30
|
+
data: (0, _nclif.cmdGroup)({
|
31
|
+
options: [storageNameOpt, {
|
32
|
+
name: 'storage-type',
|
33
|
+
convertCase: true,
|
34
|
+
fromConfig: 'storage.type'
|
35
|
+
}, {
|
36
|
+
name: 'storage-repo',
|
37
|
+
convertCase: true,
|
38
|
+
fromConfig: 'storage.repo'
|
39
|
+
}, {
|
40
|
+
name: 'storage-password',
|
41
|
+
convertCase: true,
|
42
|
+
fromConfig: 'storage.password'
|
43
|
+
}, {
|
44
|
+
name: 'storage-credentials',
|
45
|
+
convertCase: true,
|
46
|
+
fromConfig: 'storage.credentials'
|
47
|
+
}],
|
23
48
|
commands: {
|
24
|
-
|
49
|
+
backup: (0, _nclif.cmd)({
|
50
|
+
description: 'Backup a dir to the given storage',
|
51
|
+
positionals: [{
|
52
|
+
name: 'path',
|
53
|
+
required: true
|
54
|
+
}],
|
55
|
+
run: (cmd, c) => c.get(_BackupController.BackupController).storage(cmd).backup()
|
56
|
+
}),
|
57
|
+
restore: (0, _nclif.cmd)({
|
58
|
+
description: 'Restore the storage to the given dir',
|
25
59
|
positionals: [{
|
26
|
-
name: '
|
60
|
+
name: 'path',
|
27
61
|
required: true
|
28
62
|
}],
|
29
|
-
run: (
|
63
|
+
run: (cmd, c) => c.get(_BackupController.BackupController).storage(cmd).restore()
|
30
64
|
})
|
31
65
|
}
|
32
66
|
}),
|
@@ -34,22 +68,28 @@ const createApp = () => _nclif.CliApp.of({
|
|
34
68
|
commands: {
|
35
69
|
backup: (0, _nclif.cmd)({
|
36
70
|
description: 'Run backup',
|
71
|
+
options: [storageNameOpt],
|
37
72
|
positionals: [{
|
38
73
|
name: 'aggregateName',
|
39
|
-
type: 'string',
|
40
|
-
required: true
|
41
|
-
}, {
|
42
|
-
name: 'storageName',
|
43
|
-
type: 'string',
|
44
74
|
required: true
|
45
75
|
}],
|
46
|
-
run: (a, c) => c.get(_AggregateBackupController.AggregateBackupController).backup(a.aggregateName
|
76
|
+
run: (a, c) => c.get(_AggregateBackupController.AggregateBackupController).backup(a.aggregateName)
|
47
77
|
})
|
48
78
|
}
|
49
|
-
})
|
79
|
+
}),
|
80
|
+
restic
|
50
81
|
}
|
51
|
-
}).addObjectConfig(pwd => (0, _Config.readConfig)(pwd)).context(({
|
52
|
-
config
|
53
|
-
|
82
|
+
}).envConfig('NODEBUP').addObjectConfig(pwd => (0, _Config.readConfig)(pwd)).context(({
|
83
|
+
config,
|
84
|
+
inputs
|
85
|
+
}) => (0, _Context.createContext)(config, inputs));
|
54
86
|
|
55
|
-
exports.createApp = createApp;
|
87
|
+
exports.createApp = createApp;
|
88
|
+
const restic = (0, _nclif.cmdGroup)({
|
89
|
+
commands: {
|
90
|
+
'init-repo': (0, _nclif.cmd)({
|
91
|
+
options: [storageNameOpt],
|
92
|
+
run: (arg, c) => c.get(_ResticController.ResticController).initRepo()
|
93
|
+
})
|
94
|
+
}
|
95
|
+
});
|
package/lib/config/Config.js
CHANGED
@@ -13,15 +13,7 @@ var _validateConfigAgainstSchema = require("./validateConfigAgainstSchema");
|
|
13
13
|
|
14
14
|
var _expandAndCreatePath = require("./expandAndCreatePath");
|
15
15
|
|
16
|
-
const expandPaths = (cfg, exp
|
17
|
-
cfg.storage.filter(s => s.type === 'file').map(s => s).forEach(s => {
|
18
|
-
s.path = exp(s.path);
|
19
|
-
});
|
20
|
-
cfg.storage.filter(s => s.type === 'restic').map(s => s).forEach(s => {
|
21
|
-
if (s.credentialsFile) s.credentialsFile = exp(s.credentialsFile);
|
22
|
-
s.passwordFile = exp(s.passwordFile);
|
23
|
-
if (s.repo.startsWith('local:')) s.repo = (0, _expandAndCreatePath.expandStrPath)(s.repo, cwd);
|
24
|
-
});
|
16
|
+
const expandPaths = (cfg, exp) => {
|
25
17
|
cfg.aggregates.forEach(a => {
|
26
18
|
a.sources.file.forEach(f => {
|
27
19
|
f.from = exp(f.from);
|
@@ -57,7 +49,7 @@ const readConfig = pwdStr => {
|
|
57
49
|
return p;
|
58
50
|
};
|
59
51
|
|
60
|
-
expandPaths(cfg, expand
|
52
|
+
expandPaths(cfg, expand);
|
61
53
|
return cfg;
|
62
54
|
};
|
63
55
|
|
@@ -9,12 +9,14 @@ var _Path = require("../fs/path/Path");
|
|
9
9
|
|
10
10
|
var _os = _interopRequireDefault(require("os"));
|
11
11
|
|
12
|
+
var _path = _interopRequireDefault(require("path"));
|
13
|
+
|
12
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
15
|
|
14
16
|
const expandStrPath = (path, pwd) => {
|
15
17
|
path = path.replace('<cwd>', pwd.str());
|
16
18
|
path = path.replace('~', _os.default.homedir());
|
17
|
-
return path;
|
19
|
+
return _path.default.resolve(path);
|
18
20
|
};
|
19
21
|
|
20
22
|
exports.expandStrPath = expandStrPath;
|
File without changes
|
@@ -7,6 +7,8 @@ exports.validateConfigAgainstSchema = void 0;
|
|
7
7
|
|
8
8
|
var _joi = _interopRequireDefault(require("@hapi/joi"));
|
9
9
|
|
10
|
+
var _StoreConfig = require("../storage/StoreConfig");
|
11
|
+
|
10
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
11
13
|
|
12
14
|
const DirTaskSchema = _joi.default.object({
|
@@ -21,21 +23,6 @@ const KeyTaskSchema = _joi.default.object({
|
|
21
23
|
to: _joi.default.string().optional()
|
22
24
|
});
|
23
25
|
|
24
|
-
const createStorageSchema = props => _joi.default.object({
|
25
|
-
name: _joi.default.string(),
|
26
|
-
type: _joi.default.string(),
|
27
|
-
...props
|
28
|
-
});
|
29
|
-
|
30
|
-
const FileStorageSchema = createStorageSchema({
|
31
|
-
path: _joi.default.string()
|
32
|
-
});
|
33
|
-
const ResticStorageSchema = createStorageSchema({
|
34
|
-
repo: _joi.default.string(),
|
35
|
-
credentialsFile: _joi.default.string().optional(),
|
36
|
-
passwordFile: _joi.default.string()
|
37
|
-
});
|
38
|
-
|
39
26
|
const Sources = _joi.default.object({
|
40
27
|
dir: _joi.default.array().items(DirTaskSchema).optional(),
|
41
28
|
file: _joi.default.array().items(FileTaskSchema).optional(),
|
@@ -50,7 +37,7 @@ const Aggregate = _joi.default.object({
|
|
50
37
|
|
51
38
|
const Schema = () => _joi.default.object({
|
52
39
|
// TODO undescriptive error msg. Invalid config."storage[0]" does not match any of the allowed types
|
53
|
-
storage: _joi.default.array().items(
|
40
|
+
storage: _joi.default.array().items((0, _StoreConfig.NamedStorageSchema)()),
|
54
41
|
aggregates: _joi.default.array().items(Aggregate)
|
55
42
|
});
|
56
43
|
|
package/lib/ctx/Context.js
CHANGED
@@ -29,13 +29,23 @@ var _ResticClientFactory = require("../storage/restic/ResticClientFactory");
|
|
29
29
|
|
30
30
|
var _ResticController = require("../storage/restic/ResticController");
|
31
31
|
|
32
|
-
|
32
|
+
var _B2CredentialsProvider = require("../storage/b2/B2CredentialsProvider");
|
33
|
+
|
34
|
+
var _RCloneClientFactory = require("../storage/rclone/RCloneClientFactory");
|
35
|
+
|
36
|
+
var _BackupController = require("../bup/BackupController");
|
37
|
+
|
38
|
+
var _StorageConfigProvider = require("../storage/StorageConfigProvider");
|
39
|
+
|
40
|
+
const createContext = (cfg, inp) => {
|
33
41
|
const c = new _inversify.Container();
|
34
42
|
c.bind(_ContextSymbols.AppConfig_).toConstantValue(cfg);
|
43
|
+
c.bind(_ContextSymbols.Inputs_).toConstantValue(inp);
|
35
44
|
const log = new _AppLogger.AppLogger();
|
36
45
|
c.bind(_ContextSymbols.Log_).toConstantValue(log);
|
37
46
|
c.bind(_AppLogger.AppLogger).toConstantValue(log);
|
38
|
-
|
47
|
+
c.bind(_Fs.Fs).toConstantValue(new _Fs.Fs(cfg.pwd, log));
|
48
|
+
const self = [_Gpg.Gpg, _Shell.Shell, _FsSyncer.FsSyncer, _SshKeyManager.SshKeyManager, _StorageBackendProvider.StorageBackendProvider, _StorageConfigProvider.StorageConfigProvider, _ResticClientFactory.ResticClientFactory, _AggregateBackupController.AggregateBackupController, _ResticController.ResticController, _B2CredentialsProvider.B2CredentialsProvider, _RCloneClientFactory.RCloneClientFactory, _BackupController.BackupController];
|
39
49
|
self.forEach(s => c.bind(s).toSelf());
|
40
50
|
return c;
|
41
51
|
};
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.TaskConfig_ = exports.StorageConfig_ = exports.Log_ = exports.AppConfig_ = void 0;
|
6
|
+
exports.TaskConfig_ = exports.StorageConfig_ = exports.Log_ = exports.Inputs_ = exports.AppConfig_ = void 0;
|
7
7
|
const Log_ = Symbol.for('Log');
|
8
8
|
exports.Log_ = Log_;
|
9
9
|
const TaskConfig_ = Symbol.for('config.Tasks');
|
@@ -11,4 +11,6 @@ exports.TaskConfig_ = TaskConfig_;
|
|
11
11
|
const StorageConfig_ = Symbol.for('config.Storage');
|
12
12
|
exports.StorageConfig_ = StorageConfig_;
|
13
13
|
const AppConfig_ = Symbol.for('config.app');
|
14
|
-
exports.AppConfig_ = AppConfig_;
|
14
|
+
exports.AppConfig_ = AppConfig_;
|
15
|
+
const Inputs_ = Symbol.for('cmd.input');
|
16
|
+
exports.Inputs_ = Inputs_;
|
package/lib/fs/Fs.js
CHANGED
@@ -7,18 +7,23 @@ exports.Fs = void 0;
|
|
7
7
|
|
8
8
|
var _fs = _interopRequireDefault(require("fs"));
|
9
9
|
|
10
|
+
var _Path = require("./path/Path");
|
11
|
+
|
10
12
|
var _inversify = require("inversify");
|
11
13
|
|
12
14
|
var _AppLogger = require("../log/AppLogger");
|
13
15
|
|
16
|
+
var _expandAndCreatePath = require("../config/expandAndCreatePath");
|
17
|
+
|
14
18
|
var _dec, _dec2, _dec3, _class;
|
15
19
|
|
16
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
21
|
|
18
22
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
19
23
|
|
20
|
-
let Fs = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof _AppLogger.AppLogger === "undefined" ? Object : _AppLogger.AppLogger]), _dec(_class = _dec2(_class = _dec3(_class = class Fs {
|
21
|
-
constructor(log) {
|
24
|
+
let Fs = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof _Path.AbsPath === "undefined" ? Object : _Path.AbsPath, typeof _AppLogger.AppLogger === "undefined" ? Object : _AppLogger.AppLogger]), _dec(_class = _dec2(_class = _dec3(_class = class Fs {
|
25
|
+
constructor(cwd, log) {
|
26
|
+
this.cwd = cwd;
|
22
27
|
this.log = log;
|
23
28
|
|
24
29
|
_defineProperty(this, "writeFile", (path, content) => {
|
@@ -75,6 +80,10 @@ let Fs = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.metadata("design:
|
|
75
80
|
});
|
76
81
|
|
77
82
|
_defineProperty(this, "exists", path => _fs.default.existsSync(path.str()));
|
83
|
+
|
84
|
+
_defineProperty(this, "expand", strPath => (0, _expandAndCreatePath.expandAndCreatePath)(strPath, this.cwd));
|
85
|
+
|
86
|
+
_defineProperty(this, "expandStrPath", strPath => (0, _expandAndCreatePath.expandStrPath)(strPath, this.cwd));
|
78
87
|
}
|
79
88
|
|
80
89
|
}) || _class) || _class) || _class);
|
@@ -23,7 +23,7 @@ describe('FsSync', () => {
|
|
23
23
|
|
24
24
|
it('syncs dir', () => {
|
25
25
|
const l = new _AppLogger.AppLogger();
|
26
|
-
const sut = new _FsSyncer.FsSyncer(new _Shell.Shell(l), new _Fs.Fs(l), l);
|
26
|
+
const sut = new _FsSyncer.FsSyncer(new _Shell.Shell(l), new _Fs.Fs(_Path.AbsPath.from(__dirname), l), l);
|
27
27
|
sut.syncDirs(from, to);
|
28
28
|
expect((0, _areDirsSame.areDirsSame)(from, to)).toBe(true);
|
29
29
|
});
|
package/lib/log/AppLogger.js
CHANGED
@@ -9,12 +9,12 @@ var _ConsoleLogger = require("./ConsoleLogger");
|
|
9
9
|
|
10
10
|
var _inversify = require("inversify");
|
11
11
|
|
12
|
-
var _dec, _class;
|
12
|
+
var _dec, _dec2, _dec3, _class;
|
13
13
|
|
14
14
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
15
15
|
|
16
|
-
let AppLogger = (_dec = (0, _inversify.injectable)(), _dec(_class = class AppLogger {
|
17
|
-
constructor() {
|
16
|
+
let AppLogger = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [void 0]), _dec(_class = _dec2(_class = _dec3(_class = class AppLogger {
|
17
|
+
constructor(mute = false) {
|
18
18
|
_defineProperty(this, "log", new _ConsoleLogger.ConsoleLogger());
|
19
19
|
|
20
20
|
_defineProperty(this, "debug", this.log.debug);
|
@@ -22,7 +22,9 @@ let AppLogger = (_dec = (0, _inversify.injectable)(), _dec(_class = class AppLog
|
|
22
22
|
_defineProperty(this, "info", this.log.info);
|
23
23
|
|
24
24
|
_defineProperty(this, "error", this.log.error);
|
25
|
+
|
26
|
+
if (mute) this.log.setEnabled(false);
|
25
27
|
}
|
26
28
|
|
27
|
-
}) || _class);
|
29
|
+
}) || _class) || _class) || _class);
|
28
30
|
exports.AppLogger = AppLogger;
|
@@ -3,21 +3,25 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.
|
6
|
+
exports.BackupClientStorageBackend = void 0;
|
7
7
|
|
8
|
-
var _Path = require("
|
8
|
+
var _Path = require("../fs/path/Path");
|
9
9
|
|
10
10
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
11
11
|
|
12
|
-
class
|
12
|
+
class BackupClientStorageBackend {
|
13
13
|
constructor(client) {
|
14
14
|
this.client = client;
|
15
15
|
|
16
16
|
_defineProperty(this, "store", from => {
|
17
17
|
this.client.backup(from, _Path.RelativePath.from('.'));
|
18
18
|
});
|
19
|
+
|
20
|
+
_defineProperty(this, "restore", to => {
|
21
|
+
this.client.restore(to);
|
22
|
+
});
|
19
23
|
}
|
20
24
|
|
21
25
|
}
|
22
26
|
|
23
|
-
exports.
|
27
|
+
exports.BackupClientStorageBackend = BackupClientStorageBackend;
|
@@ -7,47 +7,44 @@ exports.StorageBackendProvider = void 0;
|
|
7
7
|
|
8
8
|
var _inversify = require("inversify");
|
9
9
|
|
10
|
-
var
|
11
|
-
|
12
|
-
var _LocalFileStorageBackend = require("./local-file/LocalFileStorageBackend");
|
13
|
-
|
14
|
-
var _ContextSymbols = require("../ctx/ContextSymbols");
|
15
|
-
|
16
|
-
var _Config = require("../config/Config");
|
10
|
+
var _types = require("./types");
|
17
11
|
|
18
12
|
var _ResticClientFactory = require("./restic/ResticClientFactory");
|
19
13
|
|
20
|
-
var
|
14
|
+
var _BackupClientStorageBackend = require("./BackupClientStorageBackend");
|
15
|
+
|
16
|
+
var _RCloneClientFactory = require("./rclone/RCloneClientFactory");
|
21
17
|
|
22
|
-
var
|
18
|
+
var _StorageConfigProvider = require("./StorageConfigProvider");
|
23
19
|
|
24
|
-
var _dec, _dec2, _dec3,
|
20
|
+
var _dec, _dec2, _dec3, _class;
|
25
21
|
|
26
22
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
27
23
|
|
28
|
-
let StorageBackendProvider = (_dec = (0, _inversify.injectable)(), _dec2 =
|
29
|
-
|
30
|
-
}, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _FsSyncer.FsSyncer === "undefined" ? Object : _FsSyncer.FsSyncer, typeof _ResticClientFactory.ResticClientFactory === "undefined" ? Object : _ResticClientFactory.ResticClientFactory, typeof _Fs.Fs === "undefined" ? Object : _Fs.Fs, typeof _Config.Config === "undefined" ? Object : _Config.Config]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = class StorageBackendProvider {
|
31
|
-
constructor(fsSyncer, resticFac, fs, cfg) {
|
32
|
-
this.fsSyncer = fsSyncer;
|
24
|
+
let StorageBackendProvider = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof _ResticClientFactory.ResticClientFactory === "undefined" ? Object : _ResticClientFactory.ResticClientFactory, typeof _RCloneClientFactory.RCloneClientFactory === "undefined" ? Object : _RCloneClientFactory.RCloneClientFactory, typeof _StorageConfigProvider.StorageConfigProvider === "undefined" ? Object : _StorageConfigProvider.StorageConfigProvider]), _dec(_class = _dec2(_class = _dec3(_class = class StorageBackendProvider {
|
25
|
+
constructor(resticFac, rcloneFac, cfgProvider) {
|
33
26
|
this.resticFac = resticFac;
|
34
|
-
this.
|
35
|
-
this.
|
27
|
+
this.rcloneFac = rcloneFac;
|
28
|
+
this.cfgProvider = cfgProvider;
|
36
29
|
|
37
|
-
_defineProperty(this, "provide",
|
38
|
-
const s = this.
|
39
|
-
|
40
|
-
if (s.type === 'restic') return this.restic(s);else if (s.type === 'file') return this.localFile(s);else throw new Error(`Unsupported storage type ${s.type}`);
|
41
|
-
});
|
30
|
+
_defineProperty(this, "provide", () => {
|
31
|
+
const s = this.cfgProvider.provide();
|
32
|
+
let b = null;
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
switch (s.type) {
|
35
|
+
case _types.StorageType.Restic:
|
36
|
+
b = this.resticFac.create(s);
|
37
|
+
break;
|
38
|
+
|
39
|
+
case _types.StorageType.RClone:
|
40
|
+
b = this.rcloneFac.create(s);
|
41
|
+
break;
|
42
|
+
}
|
46
43
|
|
47
|
-
|
48
|
-
return new
|
44
|
+
if (!b) throw new Error(`Unsupported storage type ${s.type}`);
|
45
|
+
return new _BackupClientStorageBackend.BackupClientStorageBackend(b);
|
49
46
|
});
|
50
47
|
}
|
51
48
|
|
52
|
-
}) || _class) || _class) || _class)
|
49
|
+
}) || _class) || _class) || _class);
|
53
50
|
exports.StorageBackendProvider = StorageBackendProvider;
|
@@ -0,0 +1,89 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.StorageConfigProvider = void 0;
|
7
|
+
|
8
|
+
var _inversify = require("inversify");
|
9
|
+
|
10
|
+
var _ContextSymbols = require("../ctx/ContextSymbols");
|
11
|
+
|
12
|
+
var _config = require("../config");
|
13
|
+
|
14
|
+
var _Fs = require("../fs/Fs");
|
15
|
+
|
16
|
+
var _InvalidInput = require("../cli/InvalidInput");
|
17
|
+
|
18
|
+
var _StoreConfig = require("./StoreConfig");
|
19
|
+
|
20
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _class;
|
21
|
+
|
22
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
23
|
+
|
24
|
+
let StorageConfigProvider = (_dec = (0, _inversify.injectable)(), _dec2 = function (target, key) {
|
25
|
+
return (0, _inversify.inject)(_ContextSymbols.AppConfig_)(target, undefined, 1);
|
26
|
+
}, _dec3 = function (target, key) {
|
27
|
+
return (0, _inversify.inject)(_ContextSymbols.Inputs_)(target, undefined, 2);
|
28
|
+
}, _dec4 = Reflect.metadata("design:type", Function), _dec5 = Reflect.metadata("design:paramtypes", [typeof _Fs.Fs === "undefined" ? Object : _Fs.Fs, typeof _config.Config === "undefined" ? Object : _config.Config, typeof StorageInputs === "undefined" ? Object : StorageInputs]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = _dec5(_class = class StorageConfigProvider {
|
29
|
+
constructor(fs, cfg, inputs) {
|
30
|
+
this.fs = fs;
|
31
|
+
this.cfg = cfg;
|
32
|
+
this.inputs = inputs;
|
33
|
+
|
34
|
+
_defineProperty(this, "provide", () => {
|
35
|
+
const {
|
36
|
+
storageName,
|
37
|
+
storagePassword,
|
38
|
+
storageRepo,
|
39
|
+
storageType
|
40
|
+
} = this.inputs;
|
41
|
+
let res;
|
42
|
+
|
43
|
+
if (storageName) {
|
44
|
+
if (storageType || storageRepo || storagePassword) throw new _InvalidInput.InvalidInput('Storage config provided. Storage name is therefore invalid input');
|
45
|
+
res = this.getByName(storageName);
|
46
|
+
} else {
|
47
|
+
res = this.getByCliConfig(this.inputs);
|
48
|
+
}
|
49
|
+
|
50
|
+
if (res.repo.startsWith('local:')) {
|
51
|
+
const path = res.repo.split('local:')[1];
|
52
|
+
res.repo = 'local:' + this.fs.expandStrPath(path);
|
53
|
+
}
|
54
|
+
|
55
|
+
return res;
|
56
|
+
});
|
57
|
+
|
58
|
+
_defineProperty(this, "getByCliConfig", inp => {
|
59
|
+
// // TODO unify validation usage
|
60
|
+
const r = (0, _StoreConfig.CliStorageConfigSchema)().validate(inp, {
|
61
|
+
presence: 'required',
|
62
|
+
allowUnknown: true
|
63
|
+
});
|
64
|
+
if (r.error) throw new _InvalidInput.InvalidInput(r.error.toString());
|
65
|
+
const cfg = inp;
|
66
|
+
return {
|
67
|
+
type: cfg.storageType,
|
68
|
+
repo: cfg.storageRepo,
|
69
|
+
encryptionPassword: cfg.storagePassword,
|
70
|
+
credentials: cfg.storageCredentials
|
71
|
+
};
|
72
|
+
});
|
73
|
+
|
74
|
+
_defineProperty(this, "getByName", name => {
|
75
|
+
const cfg = this.cfg.storage.find(s => s.name === name);
|
76
|
+
if (!cfg) throw new Error(`No such storage '${name}'`);
|
77
|
+
const encryptionPassword = cfg.passwordFile ? this.fs.readFile(this.fs.expand(cfg.passwordFile)).trim() : undefined;
|
78
|
+
const credentials = cfg.credentialsFile ? this.fs.readFile(this.fs.expand(cfg.credentialsFile)).trim() : undefined;
|
79
|
+
return {
|
80
|
+
type: cfg.type,
|
81
|
+
repo: cfg.repo,
|
82
|
+
credentials,
|
83
|
+
encryptionPassword
|
84
|
+
};
|
85
|
+
});
|
86
|
+
}
|
87
|
+
|
88
|
+
}) || _class) || _class) || _class) || _class) || _class);
|
89
|
+
exports.StorageConfigProvider = StorageConfigProvider;
|