diff options
Diffstat (limited to 'deps/npm/lib/doctor')
-rw-r--r-- | deps/npm/lib/doctor/check-files-permission.js | 20 | ||||
-rw-r--r-- | deps/npm/lib/doctor/check-ping.js | 5 | ||||
-rw-r--r-- | deps/npm/lib/doctor/checksum-cached-files.js | 62 | ||||
-rw-r--r-- | deps/npm/lib/doctor/get-latest-npm-version.js | 5 | ||||
-rw-r--r-- | deps/npm/lib/doctor/verify-cached-files.js | 19 |
5 files changed, 36 insertions, 75 deletions
diff --git a/deps/npm/lib/doctor/check-files-permission.js b/deps/npm/lib/doctor/check-files-permission.js index 74393596f6..50014fd232 100644 --- a/deps/npm/lib/doctor/check-files-permission.js +++ b/deps/npm/lib/doctor/check-files-permission.js @@ -9,12 +9,12 @@ var fileCompletion = require('../utils/completion/file-completion.js') function checkFilesPermission (root, mask, cb) { if (process.platform === 'win32') return cb(null, true) getUid(npm.config.get('user'), npm.config.get('group'), function (e, uid, gid) { + var tracker = log.newItem('checkFilePermissions', 1) if (e) { tracker.finish() tracker.warn('checkFilePermissions', 'Error looking up user and group:', e) return cb(e) } - var tracker = log.newItem('checkFilePermissions', 1) tracker.info('checkFilePermissions', 'Building file list of ' + root) fileCompletion(root, '.', Infinity, function (e, files) { if (e) { @@ -38,14 +38,16 @@ function checkFilesPermission (root, mask, cb) { tracker.completeWork(1) if (e) return next(e) if (!stat.isFile()) return next() - var mode = stat.mode - var isGroup = stat.gid ? stat.gid === gid : true - var isUser = stat.uid ? stat.uid === uid : true - if ((mode & parseInt('000' + mask, 8))) return next() - if ((isGroup && mode & parseInt('00' + mask + '0', 8))) return next() - if ((isUser && mode & parseInt('0' + mask + '00', 8))) return next() - tracker.error('checkFilePermissions', 'Missing permissions on (' + isGroup + ', ' + isUser + ', ' + mode + ')', file) - return next(new Error('Missing permissions for ' + file)) + // 6 = fs.constants.R_OK | fs.constants.W_OK + // constants aren't available on v4 + fs.access(file, 6, (err) => { + if (err) { + tracker.error('checkFilePermissions', `Missing permissions on ${file}`) + return next(new Error('Missing permissions for ' + file)) + } else { + return next() + } + }) }) } }) diff --git a/deps/npm/lib/doctor/check-ping.js b/deps/npm/lib/doctor/check-ping.js index 99e4ea2ba2..29a25c2fb7 100644 --- a/deps/npm/lib/doctor/check-ping.js +++ b/deps/npm/lib/doctor/check-ping.js @@ -4,9 +4,10 @@ var ping = require('../ping.js') function checkPing (cb) { var tracker = log.newItem('checkPing', 1) tracker.info('checkPing', 'Pinging registry') - ping({}, true, function (err, pong) { + ping({}, true, function (err, pong, data, res) { + if (err) { return cb(err) } tracker.finish() - cb(err, pong) + cb(null, [res.statusCode, res.statusMessage]) }) } diff --git a/deps/npm/lib/doctor/checksum-cached-files.js b/deps/npm/lib/doctor/checksum-cached-files.js deleted file mode 100644 index d50c326852..0000000000 --- a/deps/npm/lib/doctor/checksum-cached-files.js +++ /dev/null @@ -1,62 +0,0 @@ -var crypto = require('crypto') -var fs = require('fs') -var path = require('path') -var chain = require('slide').chain -var log = require('npmlog') -var npm = require('../npm') -var fileCompletion = require('../utils/completion/file-completion.js') - -function checksum (str) { - return crypto - .createHash('sha1') - .update(str, 'utf8') - .digest('hex') -} - -function checksumCachedFiles (cb) { - var tracker = log.newItem('checksumCachedFiles', 1) - tracker.info('checksumCachedFiles', 'Building file list of ' + npm.cache) - fileCompletion(npm.cache, '.', Infinity, function (e, files) { - if (e) { - tracker.finish() - return cb(e) - } - tracker.addWork(files.length) - tracker.completeWork(1) - chain(files.map(andChecksumFile), function (er) { - tracker.finish() - cb(null, !er) - }) - function andChecksumFile (f) { - return [function (next) { process.nextTick(function () { checksumFile(f, next) }) }] - } - function checksumFile (f, next) { - var file = path.join(npm.cache, f) - tracker.silly('checksumFile', f) - if (!/.tgz$/.test(file)) { - tracker.completeWork(1) - return next() - } - fs.readFile(file, function (err, tgz) { - tracker.completeWork(1) - if (err) return next(err) - try { - var pkgJSON = fs.readFileSync(path.join(path.dirname(file), 'package/package.json')) - } catch (e) { - return next() // no package.json in cche is ok - } - try { - var pkg = JSON.parse(pkgJSON) - var shasum = (pkg.dist && pkg.dist.shasum) || pkg._shasum - var actual = checksum(tgz) - if (actual !== shasum) return next(new Error('Checksum mismatch on ' + file + ', expected: ' + shasum + ', got: ' + shasum)) - return next() - } catch (e) { - return next(new Error('Error parsing JSON in ' + file + ': ' + e)) - } - }) - } - }) -} - -module.exports = checksumCachedFiles diff --git a/deps/npm/lib/doctor/get-latest-npm-version.js b/deps/npm/lib/doctor/get-latest-npm-version.js index aba9b773cd..5a096ab895 100644 --- a/deps/npm/lib/doctor/get-latest-npm-version.js +++ b/deps/npm/lib/doctor/get-latest-npm-version.js @@ -4,9 +4,10 @@ var fetchPackageMetadata = require('../fetch-package-metadata') function getLatestNpmVersion (cb) { var tracker = log.newItem('getLatestNpmVersion', 1) tracker.info('getLatestNpmVersion', 'Getting npm package information') - fetchPackageMetadata('npm@latest', '.', {fullMetadata: true}, function (e, d) { + fetchPackageMetadata('npm@latest', '.', {}, function (err, d) { tracker.finish() - cb(e, d.version) + if (err) { return cb(err) } + cb(null, d.version) }) } diff --git a/deps/npm/lib/doctor/verify-cached-files.js b/deps/npm/lib/doctor/verify-cached-files.js new file mode 100644 index 0000000000..f00dbd6256 --- /dev/null +++ b/deps/npm/lib/doctor/verify-cached-files.js @@ -0,0 +1,19 @@ +'use strict' + +const cacache = require('cacache') +const log = require('npmlog') + +module.exports = verifyCachedFiles +function verifyCachedFiles (cache, cb) { + log.info('verifyCachedFiles', `Verifying cache at ${cache}`) + cacache.verify(cache).then((stats) => { + log.info('verifyCachedFiles', `Verification complete. Stats: ${JSON.stringify(stats, 2)}`) + if (stats.reclaimedCount || stats.badContentCount || stats.missingContent) { + stats.badContentCount && log.warn('verifyCachedFiles', `Corrupted content removed: ${stats.badContentCount}`) + stats.reclaimedCount && log.warn('verifyCachedFiles', `Content garbage-collected: ${stats.reclaimedCount} (${stats.reclaimedSize} bytes)`) + stats.missingContent && log.warn('verifyCachedFiles', `Missing content: ${stats.missingContent}`) + log.warn('verifyCachedFiles', 'Cache issues have been fixed') + } + return stats + }).then((s) => cb(null, s), cb) +} |