Blob Blame History Raw
From 7776566e8325a55712adc16f76e5497ae41a3df6 Mon Sep 17 00:00:00 2001
From: "Bryn M. Reeves" <bmr@redhat.com>
Date: Mon, 26 Jan 2015 14:57:01 +0000
Subject: [PATCH 74/93] [plugin] handle ELOOP in _copy_dir()

A problem with systemd's management of the binfmt_misc automount
point in Atomic environments causes attempts to access this path to
fail with ELOOP:

  >>> import os
  >>> os.listdir("/host/proc/sys/fs/binfmt_misc/")
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  OSError: [Errno 2] No such file or directory: '/host/proc/sys/fs/binfmt_misc/'

For reasons that are not yet clear this causes the entire sos
process to immediately terminate.

For now avoid the problem by enclosing the problem os.listdir in
a try/except block that explicitly handles the one errno value
implicated here.

Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
---
 sos/plugins/__init__.py | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
index 394973d..456bae0 100644
--- a/sos/plugins/__init__.py
+++ b/sos/plugins/__init__.py
@@ -27,6 +27,7 @@ import stat
 from time import time
 import logging
 import fnmatch
+import errno
 
 # PYCOMPAT
 import six
@@ -297,10 +298,17 @@ class Plugin(object):
                                   'pointsto': linkdest})
 
     def _copy_dir(self, srcpath):
-        for afile in os.listdir(srcpath):
-            self._log_debug("recursively adding '%s' from '%s'"
-                            % (afile, srcpath))
-            self._do_copy_path(os.path.join(srcpath, afile), dest=None)
+        try:
+            for afile in os.listdir(srcpath):
+                self._log_debug("recursively adding '%s' from '%s'"
+                                % (afile, srcpath))
+                self._do_copy_path(os.path.join(srcpath, afile), dest=None)
+        except OSError as e:
+            if e.errno == errno.ELOOP:
+                msg = "Too many levels of symbolic links copying"
+                self._log_error("_copy_dir: %s '%s'" % (msg, srcpath))
+                return
+            raise e
 
     def _get_dest_for_srcpath(self, srcpath):
         if self.use_sysroot():
-- 
1.9.3