diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 4b158a95b..8912b4056 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -54,6 +54,11 @@ function checkPreconditions(apiConfig, dataLayout, callback) { assert.strictEqual(typeof callback, 'function'); // TODO check filesystem is mounted for sshfs and cifs so we don't write into the actual folder on disk + if (apiConfig.provider === PROVIDER_SSHFS || apiConfig.provider === PROVIDER_CIFS) { + const mounts = safe.fs.readFileSync('/proc/mounts', 'utf8'); + const mountInfo = mounts.split('\n').filter(function (l) { return l.indexOf(apiConfig.mountPoint) !== -1; })[0]; + if (!mountInfo) return callback(new BoxError(BoxError.FS_ERROR, `${apiConfig.mountPoint} is not mounted`)); + } let used = 0; for (let localPath of dataLayout.localPaths()) { @@ -231,8 +236,12 @@ function testConfig(apiConfig, callback) { if (!apiConfig.mountPoint || typeof apiConfig.mountPoint !== 'string') return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint must be non-empty string', { field: 'mountPoint' })); if (typeof apiConfig.prefix !== 'string') return callback(new BoxError(BoxError.BAD_FIELD, 'prefix must be a string', { field: 'prefix' })); - // TODO check fstab entry - // TODO check mountpoint + const mounts = safe.fs.readFileSync('/proc/mounts', 'utf8'); + const mountInfo = mounts.split('\n').filter(function (l) { return l.indexOf(apiConfig.mountPoint) !== -1; })[0]; + if (!mountInfo) return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint is not mounted', { field: 'mountPoint' })); + + if (apiConfig.provider === PROVIDER_SSHFS && !mountInfo.split(' ').find(i => i === 'fuse.sshfs')) return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint must be a "fuse.sshfs" filesystem', { field: 'mountPoint' })); + if (apiConfig.provider === PROVIDER_CIFS && !mountInfo.split(' ').find(i => i === 'cifs')) return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint must be a "cifs" filesystem', { field: 'mountPoint' })); } // common checks