@ps-aux/nodebup 0.9.7 → 0.9.9
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.
@@ -27,7 +27,7 @@ const parseConnectionUrl = url => {
|
|
27
27
|
var _url$match;
|
28
28
|
|
29
29
|
// TODO what if there are query params in the end?
|
30
|
-
const regex = /postgres:\/\/(?<username>.*):(?<password>.*)@(?<host>.*):(?<port>\d*)
|
30
|
+
const regex = /postgres:\/\/(?<username>.*):(?<password>.*)@(?<host>.*):(?<port>\d*)$/;
|
31
31
|
const match = (_url$match = url.match(regex)) === null || _url$match === void 0 ? void 0 : _url$match.groups;
|
32
32
|
if (!match || !match.username || !match.password || !match.host || !match.port) throw new Error(`The Postgres connection URL does not match required regex: ${regex.toString()}`);
|
33
33
|
return {
|
@@ -103,7 +103,7 @@ let PgBackupController = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.m
|
|
103
103
|
const version = this.getVersion(pgVersion);
|
104
104
|
const storage = this.storageBackendProvider.provide(); // To validate
|
105
105
|
|
106
|
-
parseConnectionUrl(pgUrl);
|
106
|
+
const con = parseConnectionUrl(pgUrl);
|
107
107
|
this.log.info(`Restoring Postgres database, version=${version}`);
|
108
108
|
await this.fs.inTmpDir('pg-restore', async dirStr => {
|
109
109
|
const dir = _Path.AbsPath.from(dirStr);
|
@@ -115,10 +115,13 @@ let PgBackupController = (_dec = (0, _inversify.injectable)(), _dec2 = Reflect.m
|
|
115
115
|
await this.zip.unzipDir(zipFile, dir);
|
116
116
|
this.fs.rmFile(zipFile);
|
117
117
|
const outFile = this.fs.listFiles(dir)[0];
|
118
|
-
this.log.debug('Will run psql import from %s', outFile.str()); //
|
118
|
+
this.log.debug('Will run psql import from %s', outFile.str()); // Database is set to 'postgres' so that also users which don't have db created can use db-less URL
|
119
|
+
// Restoring user needs to have the admin access anyway
|
120
|
+
|
121
|
+
const connectionArgs = `-h ${con.host} -p ${con.port} -U ${con.username} -d postgres`; // Don't forget that this itself might be run in docker
|
119
122
|
// therefore volume mounts are not usable (will apply to the location at host)
|
120
123
|
|
121
|
-
this.sh.exec(`docker run --network host -i ` + `postgres:${version} ` + `psql ${
|
124
|
+
this.sh.exec(`docker run --network host -i ` + `-e PGPASSWORD=${con.password} ` + `postgres:${version} ` + `psql ${connectionArgs} -v ON_ERROR_STOP=0 < ${outFile.str()}`);
|
122
125
|
});
|
123
126
|
});
|
124
127
|
}
|
@@ -3,9 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.Zipper = void 0;
|
7
|
-
|
8
|
-
var _admZip = _interopRequireDefault(require("adm-zip"));
|
6
|
+
exports.buildZipFromDirectory = exports.Zipper = void 0;
|
9
7
|
|
10
8
|
var _inversify = require("inversify");
|
11
9
|
|
@@ -15,6 +13,12 @@ var _unzipper = _interopRequireDefault(require("unzipper"));
|
|
15
13
|
|
16
14
|
var _nodeFs = _interopRequireDefault(require("node:fs"));
|
17
15
|
|
16
|
+
var _jszip = _interopRequireDefault(require("jszip"));
|
17
|
+
|
18
|
+
var _path = _interopRequireDefault(require("path"));
|
19
|
+
|
20
|
+
var _promises = _interopRequireDefault(require("stream/promises"));
|
21
|
+
|
18
22
|
var _dec, _class;
|
19
23
|
|
20
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
@@ -25,19 +29,39 @@ let Zipper = (_dec = (0, _inversify.injectable)(), _dec(_class = class Zipper {
|
|
25
29
|
constructor() {
|
26
30
|
_defineProperty(this, "log", (0, _logging.classObjLog)(this));
|
27
31
|
|
28
|
-
_defineProperty(this, "zipDir", async (
|
29
|
-
|
30
|
-
const
|
31
|
-
|
32
|
-
|
32
|
+
_defineProperty(this, "zipDir", async (dirPath, to) => {
|
33
|
+
const srcDir = dirPath.str();
|
34
|
+
const dst = to.str();
|
35
|
+
|
36
|
+
const dstDir = _path.default.dirname(dst);
|
37
|
+
|
38
|
+
this.log.trace(`Zipping %s to %s`, srcDir, dst);
|
39
|
+
const zip = new _jszip.default();
|
40
|
+
buildZipFromDirectory(srcDir, zip);
|
41
|
+
const r = await zip.generateNodeStream();
|
42
|
+
|
43
|
+
if (!_nodeFs.default.existsSync(dstDir)) {
|
44
|
+
_nodeFs.default.mkdirSync(dstDir);
|
45
|
+
}
|
46
|
+
|
47
|
+
const ws = _nodeFs.default.createWriteStream(dst);
|
48
|
+
|
49
|
+
await _promises.default.pipeline(r, ws);
|
33
50
|
});
|
34
51
|
|
35
52
|
_defineProperty(this, "unzipDir", async (zipFile, toDir) => {
|
53
|
+
// TODO can be replaced with JsZip ?
|
36
54
|
this.log.trace(`Unzipping %s to %s`, zipFile.str(), toDir.str());
|
55
|
+
|
56
|
+
const input = _nodeFs.default.createReadStream(zipFile.str());
|
57
|
+
|
58
|
+
const out = _unzipper.default.Extract({
|
59
|
+
path: toDir.str()
|
60
|
+
}); // Cannot use Streams.pipeline bcs it sometimes resolves before the file exists
|
61
|
+
|
62
|
+
|
37
63
|
return new Promise((res, rej) => {
|
38
|
-
|
39
|
-
path: toDir.str()
|
40
|
-
})).on('close', () => {
|
64
|
+
input.pipe(out).on('close', () => {
|
41
65
|
res();
|
42
66
|
}).on('error', rej);
|
43
67
|
});
|
@@ -45,4 +69,26 @@ let Zipper = (_dec = (0, _inversify.injectable)(), _dec(_class = class Zipper {
|
|
45
69
|
}
|
46
70
|
|
47
71
|
}) || _class);
|
48
|
-
exports.Zipper = Zipper;
|
72
|
+
exports.Zipper = Zipper;
|
73
|
+
|
74
|
+
const buildZipFromDirectory = (dir, zip, root = dir) => {
|
75
|
+
const list = _nodeFs.default.readdirSync(dir);
|
76
|
+
|
77
|
+
for (let file of list) {
|
78
|
+
file = _path.default.resolve(dir, file);
|
79
|
+
|
80
|
+
const stat = _nodeFs.default.statSync(file);
|
81
|
+
|
82
|
+
if (stat && stat.isDirectory()) {
|
83
|
+
buildZipFromDirectory(file, zip, root);
|
84
|
+
} else {
|
85
|
+
const filedata = _nodeFs.default.createReadStream(file);
|
86
|
+
|
87
|
+
const p = _path.default.relative(root, file);
|
88
|
+
|
89
|
+
zip.file(p, filedata);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
};
|
93
|
+
|
94
|
+
exports.buildZipFromDirectory = buildZipFromDirectory;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ps-aux/nodebup",
|
3
|
-
"version": "0.9.
|
3
|
+
"version": "0.9.9",
|
4
4
|
"description": "",
|
5
5
|
"module": "lib/index.js",
|
6
6
|
"main": "lib/index.js",
|
@@ -80,12 +80,12 @@
|
|
80
80
|
"@hapi/joi": "^17.1.1",
|
81
81
|
"@ps-aux/nclif": "^0.0.7-alpha.1",
|
82
82
|
"@types/hapi__joi": "^17.1.8",
|
83
|
-
"adm-zip": "^0.5.9",
|
84
83
|
"axios": "^0.24.0",
|
85
84
|
"handlebars": "^4.7.7",
|
86
85
|
"ini": "^2.0.0",
|
87
86
|
"inversify": "^6.0.1",
|
88
87
|
"js-yaml": "^4.1.0",
|
88
|
+
"jszip": "^3.10.1",
|
89
89
|
"pino": "^7.11.0",
|
90
90
|
"pino-pretty": "^9.1.1",
|
91
91
|
"ramda": "^0.27.1",
|