cloudron 5.14.10 → 5.15.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/bin/cloudron +3 -1
- package/package.json +1 -1
- package/src/actions.js +12 -1
- package/src/backup-tools.js +22 -8
package/bin/cloudron
CHANGED
|
@@ -56,6 +56,7 @@ backupCommand.command('decrypt <infile> <outfile>')
|
|
|
56
56
|
backupCommand.command('decrypt-dir <indir> <outdir>')
|
|
57
57
|
.description('Decrypt an encrypted directory')
|
|
58
58
|
.option('--password <password>', 'password')
|
|
59
|
+
.option('--no-decrypt-filenames', 'Decrypt filenames [false]')
|
|
59
60
|
.action(backupTools.decryptDir);
|
|
60
61
|
|
|
61
62
|
backupCommand.command('decrypt-filename <path>')
|
|
@@ -111,7 +112,7 @@ envCommand.command('list')
|
|
|
111
112
|
.action(actions.envList);
|
|
112
113
|
|
|
113
114
|
envCommand.command('set <KEY=value...>')
|
|
114
|
-
.description('Set environment variables')
|
|
115
|
+
.description('Set environment variables. e.g X=1 Y=2')
|
|
115
116
|
.option('--app <id>', 'App id')
|
|
116
117
|
.action(actions.envSet);
|
|
117
118
|
|
|
@@ -173,6 +174,7 @@ program.command('install')
|
|
|
173
174
|
.option('--no-sso', 'Disable Cloudron SSO [false]')
|
|
174
175
|
.option('--debug [cmd...]', 'Enable debug mode', false)
|
|
175
176
|
.option('--readonly', 'Mount filesystem readonly. Default is read/write in debug mode.')
|
|
177
|
+
.option('--env <KEY=value...>', 'Set environment variables. e.g X=1 Y=2')
|
|
176
178
|
.action(actions.install);
|
|
177
179
|
|
|
178
180
|
program.command('list')
|
package/package.json
CHANGED
package/src/actions.js
CHANGED
|
@@ -643,6 +643,16 @@ async function install(localOptions, cmd) {
|
|
|
643
643
|
|
|
644
644
|
for (const port in ports) console.log(`Port ${port}: ${ports[port]}`);
|
|
645
645
|
|
|
646
|
+
// environment variables
|
|
647
|
+
const env = {};
|
|
648
|
+
if (options.env) {
|
|
649
|
+
options.env.forEach(envVar => {
|
|
650
|
+
const m = envVar.match(/(.*?)=(.*)/);
|
|
651
|
+
if (!m) return exit(`Expecting KEY=VALUE pattern. Got ${envVar}`);
|
|
652
|
+
env[m[1]] = m[2];
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
|
|
646
656
|
const memoryLimit = options.memoryLimit ? parseMemoryLimit(options.memoryLimit) : 0;
|
|
647
657
|
|
|
648
658
|
const data = {
|
|
@@ -655,7 +665,8 @@ async function install(localOptions, cmd) {
|
|
|
655
665
|
aliasDomains,
|
|
656
666
|
ports,
|
|
657
667
|
accessRestriction: null,
|
|
658
|
-
memoryLimit
|
|
668
|
+
memoryLimit,
|
|
669
|
+
env
|
|
659
670
|
};
|
|
660
671
|
|
|
661
672
|
// the sso only applies for apps which allow optional sso
|
package/src/backup-tools.js
CHANGED
|
@@ -262,11 +262,13 @@ async function decryptDir(inDir, outDir, options) {
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
264
|
const encryption = aesKeysFromPassword(options.password);
|
|
265
|
+
const decryptFilenames = options.decryptFilenames;
|
|
265
266
|
|
|
266
267
|
const inDirAbs = path.resolve(process.cwd(), inDir);
|
|
267
268
|
const outDirAbs = path.resolve(process.cwd(), outDir);
|
|
268
269
|
|
|
269
270
|
const tbd = [ '' ]; // only has paths relative to inDirAbs
|
|
271
|
+
let errorCount = 0;
|
|
270
272
|
while (true) {
|
|
271
273
|
const cur = tbd.pop();
|
|
272
274
|
const entries = fs.readdirSync(path.join(inDirAbs, cur), { withFileTypes: true });
|
|
@@ -279,29 +281,41 @@ async function decryptDir(inDir, outDir, options) {
|
|
|
279
281
|
continue;
|
|
280
282
|
}
|
|
281
283
|
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
if (
|
|
284
|
+
const fullPath = path.join(cur, entry.name);
|
|
285
|
+
|
|
286
|
+
let destPath = fullPath;
|
|
287
|
+
if (decryptFilenames) {
|
|
288
|
+
const { error, decryptedFilePath } = decryptFilePath(fullPath, encryption);
|
|
289
|
+
if (error) {
|
|
290
|
+
console.warn(`Could not decrypt filename: ${error.message}`);
|
|
291
|
+
errorCount++;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
destPath = decryptedFilePath;
|
|
295
|
+
}
|
|
286
296
|
|
|
287
|
-
console.log(`Decrypting ${
|
|
297
|
+
console.log(`Decrypting ${destPath}`);
|
|
288
298
|
|
|
289
299
|
const infile = path.join(inDirAbs, cur, entry.name);
|
|
290
300
|
const inStream = fs.createReadStream(infile);
|
|
291
|
-
fs.mkdirSync(path.dirname(path.join(outDirAbs,
|
|
292
|
-
const outfile = path.join(outDirAbs,
|
|
301
|
+
fs.mkdirSync(path.dirname(path.join(outDirAbs, destPath)), { recursive: true });
|
|
302
|
+
const outfile = path.join(outDirAbs, destPath);
|
|
293
303
|
const outStream = fs.createWriteStream(outfile);
|
|
294
304
|
const decryptStream = new DecryptStream(encryption);
|
|
295
305
|
|
|
296
306
|
const [decryptError] = await safe(stream.pipeline(inStream, decryptStream, outStream));
|
|
297
307
|
if (decryptError) {
|
|
298
308
|
safe.fs.rmSync(outfile);
|
|
299
|
-
|
|
309
|
+
console.warn(`Could not decrypt ${infile}: ${decryptError.message}`);
|
|
310
|
+
++errorCount;
|
|
300
311
|
}
|
|
301
312
|
}
|
|
302
313
|
|
|
303
314
|
if (tbd.length === 0) break;
|
|
304
315
|
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
if (errorCount) exit(`Failed to decrypt ${errorCount} files`);
|
|
305
319
|
}
|
|
306
320
|
|
|
307
321
|
async function decryptFilename(filePath, options) {
|