diff options
author | Jiri Popelka <jpopelka@redhat.com> | 2016-12-05 14:36:04 +0100 |
---|---|---|
committer | Bryn M. Reeves <bmr@redhat.com> | 2016-12-07 12:11:01 +0000 |
commit | 6a43d9a5ab2aef180c4a760a7b6f67c1db9ea9ed (patch) | |
tree | a954b523276ab53f1a33dd7226f91a3d138fecc8 | |
parent | 32ef6e6e9d4ead11cc6356fd357591f7eb91e7a7 (diff) | |
download | sos-6a43d9a5ab2aef180c4a760a7b6f67c1db9ea9ed.tar.gz |
[npm] inspect cache of the current user only
Use 'npm cache ls' instead of parsing ~/.npm/
Signed-off-by: Jiri Popelka <jpopelka@redhat.com>
Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
Closes: #899.
-rw-r--r-- | sos/plugins/npm.py | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/sos/plugins/npm.py b/sos/plugins/npm.py index f76bafee..634325fa 100644 --- a/sos/plugins/npm.py +++ b/sos/plugins/npm.py @@ -14,7 +14,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import os -import pwd import json from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, \ @@ -48,36 +47,40 @@ class Npm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, SuSEPlugin): def _find_modules_in_npm_cache(self): """ - since format of `~/.npm` is changing with newer npm releases, let's do - the easiest thing and don't predict nor expect anything, the structure - is suppose to be: - - ~/.npm - |-- asap - | `-- 2.0.4 - |-- dezalgo - | |-- 1.0.2 - | `-- 1.0.3 + Example 'npm cache ls' output + ~/.npm + ~/.npm/acorn + ~/.npm/acorn/1.2.2 + ~/.npm/acorn/1.2.2/package.tgz + ~/.npm/acorn/1.2.2/package + ~/.npm/acorn/1.2.2/package/package.json + ~/.npm/acorn/4.0.3 + ~/.npm/acorn/4.0.3/package.tgz + ~/.npm/acorn/4.0.3/package + ~/.npm/acorn/4.0.3/package/package.json + ~/.npm/registry.npmjs.org + ~/.npm/registry.npmjs.org/acorn + ~/.npm/registry.npmjs.org/acorn/.cache.json + + https://docs.npmjs.com/cli/cache """ - output = [] - - for p in pwd.getpwall(): - user_cache = os.path.join(p.pw_dir, ".npm") - try: - # most of these stand for names of modules - module_names = os.listdir(user_cache) - except OSError: - self._log_debug("Skipping directory %s" % user_cache) - continue - else: - for m in module_names: - module_path = os.path.join(user_cache, m) - try: - versions = os.listdir(module_path) - except OSError: - continue - else: - output.append({m: versions}) + output = {} + # with chroot=True (default) the command fails when run as non-root + user_cache = self.get_command_output("npm cache ls", chroot=False) + if user_cache['status'] == 0: + # filter out dirs with .cache.json ('registry.npmjs.org') + for package in [l for l in user_cache['output'].splitlines() + if l.endswith('package.tgz')]: + five_tuple = package.split(os.path.sep) + if len(five_tuple) != 5: # sanity check + continue + home, cache, name, version, package_tgz = five_tuple + if name not in output: + output[name] = [version] + else: + output[name].append(version) + self._log_debug("modules in cache: %s" % output) + outfn = self._make_command_filename("npm-cache-modules") self.archive.add_string(json.dumps(output), outfn) |