# This file is part of the sos project: https://github.com/sosreport/sos
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# version 2 of the GNU General Public License.
#
# See the LICENSE file in the source distribution for further information.
import os
import re
import json
from sos_tests import StageTwoReportTest
ARCHIVE = 'sosreport-cleanertest-2021-08-03-qpkxdid'
class ExistingArchiveCleanTest(StageTwoReportTest):
"""Ensure that we can extract an already created archive and clean it the
same as we would an in-line run of `report --clean`.
Note that this copies heavily from the full_report_run test.
:avocado: tags=stagetwo
"""
sos_cmd = '-v tests/test_data/%s.tar.xz' % ARCHIVE
sos_component = 'clean'
def test_obfuscation_log_created(self):
self.assertFileExists(
os.path.join(self.tmpdir, f'{ARCHIVE}-obfuscation.log')
)
def test_archive_type_correct(self):
with open(os.path.join(
self.tmpdir,
f'{ARCHIVE}-obfuscation.log'), 'r') as log:
for line in log:
if "Loaded %s" % ARCHIVE in line:
assert \
'as type sos report archive' in line, \
f"Incorrect archive type detected: {line}"
break
def test_from_cmdline_logged(self):
with open(os.path.join(
self.tmpdir,
f'{ARCHIVE}-obfuscation.log'), 'r') as log:
for line in log:
if 'From cmdline' in line:
assert \
'From cmdline: True' in line, \
"Did not properly log cmdline run"
break
def test_extraction_completed_successfully(self):
with open(os.path.join(
self.tmpdir,
f'{ARCHIVE}-obfuscation.log'), 'r') as log:
for line in log:
if 'Extracted path is' in line:
path = line.split('Extracted path is')[-1].strip()
assert \
path.startswith(self.tmpdir), \
(f"Extracted path appears wrong: {path} "
f"(tmpdir: {self.tmpdir})")
return
self.fail("Extracted path not logged")
def test_private_map_was_generated(self):
self.assertOutputContains(
'A mapping of obfuscated elements is available at'
)
map_file = re.findall(
'/.*sosreport-.*-private_map', self.cmd_output.stdout)[-1]
self.assertFileExists(map_file)
def test_tarball_named_obfuscated(self):
self.assertTrue('obfuscated' in self.archive)
def test_hostname_not_in_any_file(self):
# much faster to just use grep here
content = self.grep_for_content('cleanertest')
if not content:
assert True
else:
self.fail("Hostname appears in files: %s"
% "\n".join(f for f in content))
def test_no_empty_obfuscations(self):
# get the private map file name
map_file = re.findall(
'/.*sosreport-.*-private_map', self.cmd_output.stdout
)[-1]
with open(map_file, 'r') as mf:
map_json = json.load(mf)
for mapping in map_json:
for key, val in map_json[mapping].items():
assert key, "Empty key found in %s" % mapping
assert val, "%s mapping for '%s' empty" % (mapping, key)
def test_ip_not_in_any_file(self):
content = self.grep_for_content('10.0.0.15')
if not content:
assert True
else:
new_content = "\n".join(f for f in content)
self.fail(f'IP appears in files: {new_content}')
def test_user_is_obfuscated(self):
"""Ensure that the 'testuser1' user created at install is obfuscated
"""
self.assertFileNotHasContent(
'var/log/anaconda/journal.log',
'testuser1'
)
class ExistingArchiveCleanTmpTest(StageTwoReportTest):
"""Continuation of above tests which requires cleaning var / tmp keywords
Note that this copies heavily from the full_report_run test.
:avocado: tags=stagetwo
"""
sos_cmd = f'-v --keywords var,tmp,avocado --disable-parsers \
ip,ipv6,mac,username --no-update tests/test_data/{ARCHIVE}.tar.xz'
sos_component = 'clean'
def test_sys_tmp_not_obfuscated(self):
""" Ensure that keywords var, tmp and avocado remains in the final
archive path despite they are parts of the --tmp-dir
"""
self.assertTrue(
self.archive.startswith(os.getenv('AVOCADO_TESTS_COMMON_TMPDIR'))
)