diff options
author | Louis Bouchard <louis.bouchard@canonical.com> | 2016-11-17 15:17:19 +0100 |
---|---|---|
committer | Bryn M. Reeves <bmr@redhat.com> | 2017-01-19 15:12:36 +0000 |
commit | 679b1efe034c918207ed6e84818822cf78c20d53 (patch) | |
tree | 2c3a67746cdd38634aa2178f0b4c663b825dc407 | |
parent | 3ddfe078dbad9acaf6d35aa02892a000d57ae8fb (diff) | |
download | sos-679b1efe034c918207ed6e84818822cf78c20d53.tar.gz |
[archive] Handle error when adding /dev/null as a node
Adding /dev/null as a node will trigger EPERM. This can happen namely
when masking systemd units which symlinks to /dev/null. This fix will
avoid a stacktrace and will generate a INFO message about it.
Test for that situation is also included.
Resolves: #893.
Signed-off-by: Louis Bouchard <louis.bouchard@canonical.com>
Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
-rw-r--r-- | sos/archive.py | 10 | ||||
-rw-r--r-- | tests/archive_tests.py | 6 |
2 files changed, 15 insertions, 1 deletions
diff --git a/sos/archive.py b/sos/archive.py index 4d9a4696..463c23b8 100644 --- a/sos/archive.py +++ b/sos/archive.py @@ -24,6 +24,7 @@ import shlex import re import codecs import sys +import errno # required for compression callout (FIXME: move to policy?) from subprocess import Popen, PIPE @@ -209,7 +210,14 @@ class FileCacheArchive(Archive): dest = self.dest_path(path) self._check_path(dest) if not os.path.exists(dest): - os.mknod(dest, mode, device) + try: + os.mknod(dest, mode, device) + except OSError as e: + if e.errno == errno.EPERM: + msg = "Operation not permitted" + self.log_info("add_node: %s - mknod '%s'" % (msg, dest)) + return + raise e shutil.copystat(path, dest) def _makedirs(self, path, mode=0o700): diff --git a/tests/archive_tests.py b/tests/archive_tests.py index dac02a04..febc96b4 100644 --- a/tests/archive_tests.py +++ b/tests/archive_tests.py @@ -39,6 +39,12 @@ class TarFileArchiveTest(unittest.TestCase): self.check_for_file('test/tests/ziptest') + def test_add_node_dev_null(self): + st = os.lstat('/dev/null') + dev_maj = os.major(st.st_rdev) + dev_min = os.minor(st.st_rdev) + self.tf.add_node('/dev/null', st.st_mode, os.makedev(dev_maj, dev_min)) + # when the string comes from tail() output def test_add_string_from_file(self): self.copy_strings = [] |