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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudron",
3
- "version": "5.14.10",
3
+ "version": "5.15.0",
4
4
  "license": "MIT",
5
5
  "description": "Cloudron Commandline Tool",
6
6
  "main": "main.js",
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
@@ -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 encryptedFilePath = path.join(cur, entry.name);
283
-
284
- const { error, decryptedFilePath } = decryptFilePath(encryptedFilePath, encryption);
285
- if (error) throw error;
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 ${decryptedFilePath}`);
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, decryptedFilePath)), { recursive: true });
292
- const outfile = path.join(outDirAbs, decryptedFilePath);
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
- throw new Error(`Could not decrypt ${infile}: ${decryptError.message}`);
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) {