import: validate and create transient mount point

fixes #788
This commit is contained in:
Girish Ramakrishnan
2021-09-29 20:16:06 -07:00
parent 9729d4adb8
commit 653496f96f
2 changed files with 41 additions and 7 deletions

View File

@@ -27,6 +27,7 @@ const apps = require('./apps.js'),
fs = require('fs'),
iputils = require('./iputils.js'),
manifestFormat = require('cloudron-manifestformat'),
mounts = require('./mounts.js'),
os = require('os'),
path = require('path'),
paths = require('./paths.js'),
@@ -341,23 +342,41 @@ async function install(app, args, progressCallback) {
await progressCallback({ percent: 50, message: 'Creating app data directory' });
await createAppDir(app);
// restore from backup
if (!restoreConfig) {
if (!restoreConfig) { // install
await progressCallback({ percent: 60, message: 'Setting up addons' });
await services.setupAddons(app, app.manifest.addons);
} else if (!restoreConfig.backupId) { // in-place import
} else if (app.installationState === apps.ISTATE_PENDING_IMPORT && !restoreConfig.backupId) { // in-place import
await progressCallback({ percent: 60, message: 'Importing addons in-place' });
await services.setupAddons(app, app.manifest.addons);
await services.clearAddons(app, _.omit(app.manifest.addons, 'localstorage'));
await apps.restoreConfig(app);
await services.restoreAddons(app, app.manifest.addons);
} else {
await progressCallback({ percent: 65, message: 'Download backup and restoring addons' });
} else if (app.installationState === apps.ISTATE_PENDING_IMPORT) { // import
await progressCallback({ percent: 65, message: 'Downloading backup and restoring addons' });
await services.setupAddons(app, app.manifest.addons);
await services.clearAddons(app, app.manifest.addons);
const backupConfig = restoreConfig.backupConfig; // can be null
let mountObject = null;
if (backupConfig && mounts.isMountProvider(backupConfig.provider)) {
await progressCallback({ percent: 70, message: 'Setting up mount for importing' });
mountObject = { // keep this in sync with importApp in apps.js
name: `appimport-${app.id}`,
hostPath: `/mnt/appimport-${app.id}`,
mountType: backupConfig.provider,
mountOptions: backupConfig.mountOptions
};
await mounts.tryAddMount(mountObject, { timeout: 10 });
}
await backuptask.downloadApp(app, restoreConfig, (progress) => { progressCallback({ percent: 75, message: progress.message }); });
await apps.restoreConfig(app);
if (mountObject) await mounts.removeMount(mountObject);
await progressCallback({ percent: 75, message: 'Restoring addons' });
await services.restoreAddons(app, app.manifest.addons);
} else { // clone and restore
await progressCallback({ percent: 65, message: 'Downloading backup and restoring addons' });
await services.setupAddons(app, app.manifest.addons);
await services.clearAddons(app, app.manifest.addons);
await backuptask.downloadApp(app, restoreConfig, (progress) => { progressCallback({ percent: 65, message: progress.message }); });
if (app.installationState === apps.ISTATE_PENDING_IMPORT) await apps.restoreConfig(app);
await progressCallback({ percent: 70, message: 'Restoring addons' });
await services.restoreAddons(app, app.manifest.addons);
}