Skip to content

Commit 4bce424

Browse files
committed
separate the actor into two
1 parent abe1e7c commit 4bce424

File tree

9 files changed

+367
-197
lines changed

9 files changed

+367
-197
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from leapp.actors import Actor
2+
from leapp.libraries.actor.checkdynamiclinkerconfiguration import check_dynamic_linker_configuration
3+
from leapp.models import DynamicLinkerConfiguration, Report
4+
from leapp.tags import ChecksPhaseTag, IPUWorkflowTag
5+
6+
7+
class CheckDynamicLinkerConfiguration(Actor):
8+
"""
9+
Check for customization of dynamic linker configuration.
10+
11+
The in-place upgrade could potentionally be impacted in a negative way due
12+
to the customization of dynamic linker configuration by user. This actor creates high
13+
severity report upon detecting such customization.
14+
"""
15+
16+
name = 'check_dynamic_linker_configuration'
17+
consumes = (DynamicLinkerConfiguration,)
18+
produces = (Report,)
19+
tags = (ChecksPhaseTag, IPUWorkflowTag)
20+
21+
def process(self):
22+
check_dynamic_linker_configuration()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from leapp import reporting
2+
from leapp.libraries.stdlib import api
3+
from leapp.models import DynamicLinkerConfiguration
4+
5+
LD_SO_CONF_DIR = '/etc/ld.so.conf.d'
6+
LD_SO_CONF_MAIN = '/etc/ld.so.conf'
7+
LD_LIBRARY_PATH_VAR = 'LD_LIBRARY_PATH'
8+
LD_PRELOAD_VAR = 'LD_PRELOAD'
9+
FMT_LIST_SEPARATOR_1 = '\n- '
10+
FMT_LIST_SEPARATOR_2 = '\n - '
11+
12+
13+
def _report_custom_dynamic_linker_configuration(summary):
14+
reporting.create_report([
15+
reporting.Title(
16+
'Detected customized configuration for dynamic linker.'
17+
),
18+
reporting.Summary(summary),
19+
reporting.Remediation(hint=('Remove or revert the custom dynamic linker configurations and apply the changes '
20+
'using the ldconfig command. In case of possible active software collections we '
21+
'suggest disabling them persistently.')),
22+
reporting.RelatedResource('file', '/etc/ld.so.conf'),
23+
reporting.RelatedResource('directory', '/etc/ld.so.conf.d'),
24+
reporting.Severity(reporting.Severity.HIGH),
25+
reporting.Groups([reporting.Groups.OS_FACTS]),
26+
])
27+
28+
29+
def check_dynamic_linker_configuration():
30+
configuration = next(api.consume(DynamicLinkerConfiguration), None)
31+
if not configuration:
32+
return
33+
34+
custom_configurations = ''
35+
if configuration.main_config.modified:
36+
custom_configurations += (
37+
'{}The {} file has unexpected contents:{}{}'
38+
.format(FMT_LIST_SEPARATOR_1, LD_SO_CONF_MAIN,
39+
FMT_LIST_SEPARATOR_2, FMT_LIST_SEPARATOR_2.join(configuration.main_config.modified_lines))
40+
)
41+
42+
custom_configs = []
43+
for config in configuration.included_configs:
44+
if config.modified:
45+
custom_configs.append(config.path)
46+
47+
if custom_configs:
48+
custom_configurations += (
49+
'{}The following drop in config files were marked as custom:{}{}'
50+
.format(FMT_LIST_SEPARATOR_1, FMT_LIST_SEPARATOR_2, FMT_LIST_SEPARATOR_2.join(custom_configs))
51+
)
52+
53+
if configuration.used_variables:
54+
custom_configurations += (
55+
'{}The following variables contain unexpected dynamic linker configuration:{}{}'
56+
.format(FMT_LIST_SEPARATOR_1, FMT_LIST_SEPARATOR_2,
57+
FMT_LIST_SEPARATOR_2.join(configuration.used_variables))
58+
)
59+
60+
if custom_configurations:
61+
summary = (
62+
'Custom configurations to the dynamic linker could potentially impact the upgrade in a negative '
63+
'way. The custom configuration includes modifications to {}, custom or modified drop in config '
64+
'files in the {} directory and additional entries in the {} or {} variables. These modifications '
65+
'configure the dynamic linker to use different libraries that might not be provided by Red Hat '
66+
'products or might not be present during the whole upgrade process. The following custom '
67+
'configurations were detected by leapp:{}'
68+
.format(LD_SO_CONF_MAIN, LD_SO_CONF_DIR, LD_LIBRARY_PATH_VAR, LD_PRELOAD_VAR, custom_configurations)
69+
)
70+
_report_custom_dynamic_linker_configuration(summary)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import pytest
2+
3+
from leapp import reporting
4+
from leapp.libraries.actor.checkdynamiclinkerconfiguration import (
5+
check_dynamic_linker_configuration,
6+
LD_LIBRARY_PATH_VAR,
7+
LD_PRELOAD_VAR
8+
)
9+
from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked
10+
from leapp.libraries.stdlib import api
11+
from leapp.models import ConfigFile, DynamicLinkerConfiguration, MainConfigFile
12+
13+
INCLUDED_CONFIG_PATHS = ['/etc/ld.so.conf.d/dyninst-x86_64.conf',
14+
'/etc/ld.so.conf.d/mariadb-x86_64.conf',
15+
'/custom/path/custom1.conf']
16+
17+
18+
@pytest.mark.parametrize(('included_configs_modifications', 'used_variables', 'modified_lines'),
19+
[
20+
([False, False, False], [], []),
21+
([True, True, True], [], []),
22+
([False, False, False], [LD_LIBRARY_PATH_VAR], []),
23+
([False, False, False], [], ['modified line 1', 'midified line 2']),
24+
([True, False, True], [LD_LIBRARY_PATH_VAR, LD_PRELOAD_VAR], ['modified line']),
25+
])
26+
def test_check_ld_so_configuration(monkeypatch, included_configs_modifications, used_variables, modified_lines):
27+
assert len(INCLUDED_CONFIG_PATHS) == len(included_configs_modifications)
28+
29+
main_config = MainConfigFile(path="/etc/ld.so.conf", modified=any(modified_lines), modified_lines=modified_lines)
30+
included_configs = []
31+
for path, modified in zip(INCLUDED_CONFIG_PATHS, included_configs_modifications):
32+
included_configs.append(ConfigFile(path=path, modified=modified))
33+
34+
configuration = DynamicLinkerConfiguration(main_config=main_config,
35+
included_configs=included_configs,
36+
used_variables=used_variables)
37+
38+
monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[configuration]))
39+
monkeypatch.setattr(reporting, 'create_report', create_report_mocked())
40+
41+
check_dynamic_linker_configuration()
42+
43+
report_expected = any(included_configs_modifications) or modified_lines or used_variables
44+
if not report_expected:
45+
assert reporting.create_report.called == 0
46+
return
47+
48+
assert reporting.create_report.called == 1
49+
assert 'configuration for dynamic linker' in reporting.create_report.reports[0]['title']
50+
summary = reporting.create_report.reports[0]['summary']
51+
52+
if any(included_configs_modifications):
53+
assert 'The following drop in config files were marked as custom:' in summary
54+
for config, modified in zip(INCLUDED_CONFIG_PATHS, included_configs_modifications):
55+
assert modified == (config in summary)
56+
57+
if modified_lines:
58+
assert 'The /etc/ld.so.conf file has unexpected contents' in summary
59+
for line in modified_lines:
60+
assert line in summary
61+
62+
if used_variables:
63+
assert 'The following variables contain unexpected dynamic linker configuration:' in summary
64+
for var in used_variables:
65+
assert '- {}'.format(var) in summary

repos/system_upgrade/common/actors/checkldsoconf/actor.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

repos/system_upgrade/common/actors/checkldsoconf/libraries/checkldsoconfiguration.py

Lines changed: 0 additions & 133 deletions
This file was deleted.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from leapp.actors import Actor
2+
from leapp.libraries.actor.scandynamiclinkerconfiguration import scan_dynamic_linker_configuration
3+
from leapp.models import DynamicLinkerConfiguration, InstalledRedHatSignedRPM
4+
from leapp.tags import FactsPhaseTag, IPUWorkflowTag
5+
6+
7+
class ScanDynamicLinkerConfiguration(Actor):
8+
"""
9+
Scan the dynamoc linker configuration and find modifications.
10+
11+
The dynamic linker configuration files can be used to replace standard libraries
12+
with different custom libraries. The in-place upgrade does not support customization
13+
of this configuration by user. This actor produces information about detected
14+
modifications.
15+
"""
16+
17+
name = 'scan_dynamic_linker_configuration'
18+
consumes = (InstalledRedHatSignedRPM,)
19+
produces = (DynamicLinkerConfiguration,)
20+
tags = (FactsPhaseTag, IPUWorkflowTag)
21+
22+
def process(self):
23+
scan_dynamic_linker_configuration()

0 commit comments

Comments
 (0)