aboutsummaryrefslogtreecommitdiffstats
path: root/tests/cleaner_tests/existing_archive.py
blob: 57bae713eed7aae055e744fb47e0d6bd16ee496c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# 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'))
        )