From a70a34247e95f63b10d353d4984727f79e45ddd8 Mon Sep 17 00:00:00 2001 From: Mathias Laurin Date: Thu, 6 Jul 2023 16:23:04 +0200 Subject: [PATCH] Fix a few implicit reexports Were over 4000 warnings, now less than 1000. Transient reexports are a major pain point when moving/splitting modules. Let's reduce that or, at least, make it explicit. Change-Id: I701e747645bd7886c29b98642739b64273d8d7cb --- .pylintrc | 3 + cmk/base/check_api.py | 12 +- cmk/ec/export.py | 75 +++--- cmk/gui/fields/utils.py | 2 +- cmk/gui/plugins/wato/utils/__init__.py | 322 ++++++++++++++----------- cmk/gui/sidebar/__init__.py | 32 ++- cmk/utils/log/console.py | 2 +- cmk/utils/packaging/__init__.py | 39 ++- pyproject.toml | 2 +- tests/unit/cmk/gui/test_backup_unit.py | 6 +- tests/unit/cmk/gui/test_userdb.py | 58 +++-- 11 files changed, 294 insertions(+), 259 deletions(-) diff --git a/.pylintrc b/.pylintrc index 4cabce55d26..0c20ff34b7c 100644 --- a/.pylintrc +++ b/.pylintrc @@ -25,6 +25,9 @@ signature-mutators=cmk.utils.store.with_lock_dict [MESSAGES CONTROL] disable= + # Not useless if that's exporting a type as done often enough + # in the standard library. + useless-import-alias, # Use local suppressions or (even better) refactor the code. import-outside-toplevel, #--------------------------------------------------------------------------- diff --git a/cmk/base/check_api.py b/cmk/base/check_api.py index d40232a3872..f92dd29e531 100644 --- a/cmk/base/check_api.py +++ b/cmk/base/check_api.py @@ -29,9 +29,9 @@ from cmk.utils.hostaddress import HostName from cmk.utils.http_proxy_config import HTTPProxyConfig from cmk.utils.metrics import MetricName -from cmk.utils.regex import regex # noqa: F401 # pylint: disable=unused-import +from cmk.utils.regex import regex as regex # pylint: disable=unused-import -from cmk.checkengine.checkresults import state_markers +from cmk.checkengine.checkresults import state_markers as state_markers from cmk.checkengine.plugin_contexts import host_name as _internal_host_name from cmk.checkengine.plugin_contexts import service_description from cmk.checkengine.submitters import ServiceDetails, ServiceState @@ -40,10 +40,14 @@ import cmk.base.item_state as _item_state import cmk.base.prediction as _prediction from cmk.base.api.agent_based import render as _render -from cmk.base.api.agent_based.register.utils_legacy import ( # noqa: F401 # pylint: disable=unused-import - LegacyCheckDefinition, + +# pylint: disable=unused-import +from cmk.base.api.agent_based.register.utils_legacy import ( + LegacyCheckDefinition as LegacyCheckDefinition, ) +# pylint: enable=unused-import + Warn = Union[None, int, float] Crit = Union[None, int, float] _Bound = Union[None, int, float] diff --git a/cmk/ec/export.py b/cmk/ec/export.py index 4fa1f01df83..4f461cfb736 100644 --- a/cmk/ec/export.py +++ b/cmk/ec/export.py @@ -6,42 +6,43 @@ # flake8: noqa # pylint: disable=unused-import -from .config import ( - ConfigFromWATO, - ECRulePack, - ECRulePackSpec, - MatchGroups, - MkpRulePackProxy, - Rule, - TextMatchResult, - TextPattern, -) -from .defaults import default_config, default_rule_pack -from .event import Event -from .forward import SyslogForwarderUnixSocket, SyslogMessage -from .main import SyslogFacility, SyslogPriority, TimePeriods +from .config import ConfigFromWATO as ConfigFromWATO +from .config import ECRulePack as ECRulePack +from .config import ECRulePackSpec as ECRulePackSpec +from .config import MatchGroups as MatchGroups +from .config import MkpRulePackProxy as MkpRulePackProxy +from .config import Rule as Rule +from .config import TextMatchResult as TextMatchResult +from .config import TextPattern as TextPattern +from .defaults import default_config as default_config +from .defaults import default_rule_pack as default_rule_pack +from .event import Event as Event +from .forward import SyslogForwarderUnixSocket as SyslogForwarderUnixSocket +from .forward import SyslogMessage as SyslogMessage +from .main import SyslogFacility as SyslogFacility +from .main import SyslogPriority as SyslogPriority +from .main import TimePeriods as TimePeriods # TODO remove match_ipv4_network when the GUI uses the EC logic. -from .rule_matcher import ( - compile_rule, - match_ip_network, - MatchFailure, - MatchResult, - MatchSuccess, - RuleMatcher, -) -from .rule_packs import ( - export_rule_pack, - install_packaged_rule_packs, - load_config, - load_rule_packs, - mkp_rule_pack_dir, - override_rule_pack_proxy, - release_packaged_rule_packs, - remove_exported_rule_pack, - rule_pack_dir, - RulePackType, - save_rule_packs, - uninstall_packaged_rule_packs, -) -from .settings import FileDescriptor, PortNumber, Settings, settings +from .rule_matcher import compile_rule as compile_rule +from .rule_matcher import match_ip_network as match_ip_network +from .rule_matcher import MatchFailure as MatchFailure +from .rule_matcher import MatchResult as MatchResult +from .rule_matcher import MatchSuccess as MatchSuccess +from .rule_matcher import RuleMatcher as RuleMatcher +from .rule_packs import export_rule_pack as export_rule_pack +from .rule_packs import install_packaged_rule_packs as install_packaged_rule_packs +from .rule_packs import load_config as load_config +from .rule_packs import load_rule_packs as load_rule_packs +from .rule_packs import mkp_rule_pack_dir as mkp_rule_pack_dir +from .rule_packs import override_rule_pack_proxy as override_rule_pack_proxy +from .rule_packs import release_packaged_rule_packs as release_packaged_rule_packs +from .rule_packs import remove_exported_rule_pack as remove_exported_rule_pack +from .rule_packs import rule_pack_dir as rule_pack_dir +from .rule_packs import RulePackType as RulePackType +from .rule_packs import save_rule_packs as save_rule_packs +from .rule_packs import uninstall_packaged_rule_packs as uninstall_packaged_rule_packs +from .settings import FileDescriptor as FileDescriptor +from .settings import PortNumber as PortNumber +from .settings import Settings as Settings +from .settings import settings as settings diff --git a/cmk/gui/fields/utils.py b/cmk/gui/fields/utils.py index 2e8ebf45261..ddc5fc7a420 100644 --- a/cmk/gui/fields/utils.py +++ b/cmk/gui/fields/utils.py @@ -28,7 +28,7 @@ from cmk.utils.tags import BuiltinTagConfig, TagGroup, TagID from cmk.gui import site_config -from cmk.gui.fields.base import BaseSchema +from cmk.gui.fields.base import BaseSchema as BaseSchema from cmk.gui.utils.escaping import strip_tags from cmk.gui.watolib.host_attributes import ( get_sorted_host_attribute_topics, diff --git a/cmk/gui/plugins/wato/utils/__init__.py b/cmk/gui/plugins/wato/utils/__init__.py index ae2617893e2..ec8e7d22440 100644 --- a/cmk/gui/plugins/wato/utils/__init__.py +++ b/cmk/gui/plugins/wato/utils/__init__.py @@ -47,168 +47,200 @@ from cmk.gui.logged_in import user from cmk.gui.pages import page_registry from cmk.gui.permissions import permission_section_registry, PermissionSection -from cmk.gui.plugins.wato.utils.base_modes import ( # noqa: F401 # pylint: disable=unused-import - mode_registry, - mode_url, - redirect, - WatoMode, +from cmk.gui.plugins.wato.utils.base_modes import mode_registry as mode_registry +from cmk.gui.plugins.wato.utils.base_modes import mode_url as mode_url +from cmk.gui.plugins.wato.utils.base_modes import redirect as redirect +from cmk.gui.plugins.wato.utils.base_modes import WatoMode as WatoMode +from cmk.gui.plugins.wato.utils.html_elements import search_form as search_form +from cmk.gui.plugins.wato.utils.main_menu import ABCMainModule as ABCMainModule +from cmk.gui.plugins.wato.utils.main_menu import main_module_registry as main_module_registry +from cmk.gui.plugins.wato.utils.main_menu import MainMenu as MainMenu +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopic as MainModuleTopic +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicAgents as MainModuleTopicAgents +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicBI as MainModuleTopicBI +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicEvents as MainModuleTopicEvents +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicExporter as MainModuleTopicExporter +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicGeneral as MainModuleTopicGeneral +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicHosts as MainModuleTopicHosts +from cmk.gui.plugins.wato.utils.main_menu import ( + MainModuleTopicMaintenance as MainModuleTopicMaintenance, ) -from cmk.gui.plugins.wato.utils.html_elements import ( # noqa: F401 # pylint: disable=unused-import - search_form, +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicServices as MainModuleTopicServices +from cmk.gui.plugins.wato.utils.main_menu import MainModuleTopicUsers as MainModuleTopicUsers +from cmk.gui.plugins.wato.utils.main_menu import MenuItem as MenuItem +from cmk.gui.plugins.wato.utils.main_menu import register_modules as register_modules +from cmk.gui.plugins.wato.utils.main_menu import WatoModule as WatoModule +from cmk.gui.plugins.wato.utils.simple_modes import SimpleEditMode as SimpleEditMode +from cmk.gui.plugins.wato.utils.simple_modes import SimpleListMode as SimpleListMode +from cmk.gui.plugins.wato.utils.simple_modes import SimpleModeType as SimpleModeType +from cmk.gui.site_config import get_site_config as get_site_config +from cmk.gui.site_config import is_wato_slave_site as is_wato_slave_site +from cmk.gui.type_defs import Choices as Choices +from cmk.gui.type_defs import ChoiceText as ChoiceText +from cmk.gui.user_sites import get_activation_site_choices, get_configured_site_choices +from cmk.gui.utils.escaping import escape_to_html +from cmk.gui.utils.flashed_messages import flash as flash +from cmk.gui.utils.html import HTML as HTML +from cmk.gui.utils.transaction_manager import transactions as transactions +from cmk.gui.utils.urls import make_confirm_delete_link as make_confirm_delete_link +from cmk.gui.utils.urls import make_confirm_link as make_confirm_link +from cmk.gui.valuespec import ABCPageListOfMultipleGetChoice as ABCPageListOfMultipleGetChoice +from cmk.gui.valuespec import Alternative as Alternative +from cmk.gui.valuespec import CascadingDropdown as CascadingDropdown +from cmk.gui.valuespec import Dictionary as Dictionary +from cmk.gui.valuespec import DictionaryEntry as DictionaryEntry +from cmk.gui.valuespec import DropdownChoice as DropdownChoice +from cmk.gui.valuespec import DropdownChoiceEntries as DropdownChoiceEntries +from cmk.gui.valuespec import DualListChoice as DualListChoice +from cmk.gui.valuespec import ElementSelection as ElementSelection +from cmk.gui.valuespec import FixedValue as FixedValue +from cmk.gui.valuespec import Float as Float +from cmk.gui.valuespec import Integer as Integer +from cmk.gui.valuespec import JSONValue as JSONValue +from cmk.gui.valuespec import Labels as Labels +from cmk.gui.valuespec import ListChoice as ListChoice +from cmk.gui.valuespec import ListOf as ListOf +from cmk.gui.valuespec import ListOfMultiple as ListOfMultiple +from cmk.gui.valuespec import ListOfStrings as ListOfStrings +from cmk.gui.valuespec import Migrate as Migrate +from cmk.gui.valuespec import MigrateNotUpdated as MigrateNotUpdated +from cmk.gui.valuespec import MonitoredHostname as MonitoredHostname +from cmk.gui.valuespec import Password as Password +from cmk.gui.valuespec import Percentage as Percentage +from cmk.gui.valuespec import RegExp as RegExp +from cmk.gui.valuespec import SingleLabel as SingleLabel +from cmk.gui.valuespec import TextInput as TextInput +from cmk.gui.valuespec import Transform as Transform +from cmk.gui.valuespec import Tuple as Tuple +from cmk.gui.valuespec import Url as Url +from cmk.gui.valuespec import ValueSpec as ValueSpec +from cmk.gui.valuespec import ValueSpecHelp as ValueSpecHelp +from cmk.gui.valuespec import ValueSpecText as ValueSpecText +from cmk.gui.watolib.attributes import IPMIParameters as IPMIParameters +from cmk.gui.watolib.attributes import SNMPCredentials as SNMPCredentials +from cmk.gui.watolib.check_mk_automations import get_check_information_cached +from cmk.gui.watolib.check_mk_automations import ( + get_section_information as get_section_information_automation, ) -from cmk.gui.plugins.wato.utils.main_menu import ( # noqa: F401 # pylint: disable=unused-import - ABCMainModule, - main_module_registry, - MainMenu, - MainModuleTopic, - MainModuleTopicAgents, - MainModuleTopicBI, - MainModuleTopicEvents, - MainModuleTopicExporter, - MainModuleTopicGeneral, - MainModuleTopicHosts, - MainModuleTopicMaintenance, - MainModuleTopicServices, - MainModuleTopicUsers, - MenuItem, - register_modules, - WatoModule, +from cmk.gui.watolib.config_domains import ConfigDomainCore as _ConfigDomainCore +from cmk.gui.watolib.config_hostname import ConfigHostname as ConfigHostname +from cmk.gui.watolib.config_sync import ReplicationPath as ReplicationPath +from cmk.gui.watolib.config_variable_groups import ( + ConfigVariableGroupNotifications as ConfigVariableGroupNotifications, ) -from cmk.gui.plugins.wato.utils.simple_modes import ( # noqa: F401 # pylint: disable=unused-import - SimpleEditMode, - SimpleListMode, - SimpleModeType, +from cmk.gui.watolib.config_variable_groups import ( + ConfigVariableGroupSiteManagement as ConfigVariableGroupSiteManagement, ) -from cmk.gui.site_config import ( # noqa: F401 # pylint: disable=unused-import - get_site_config, - is_wato_slave_site, +from cmk.gui.watolib.config_variable_groups import ( + ConfigVariableGroupUserInterface as ConfigVariableGroupUserInterface, ) -from cmk.gui.type_defs import Choices, ChoiceText -from cmk.gui.user_sites import get_activation_site_choices, get_configured_site_choices -from cmk.gui.utils.escaping import escape_to_html -from cmk.gui.utils.flashed_messages import flash # noqa: F401 # pylint: disable=unused-import -from cmk.gui.utils.html import HTML -from cmk.gui.utils.transaction_manager import transactions -from cmk.gui.utils.urls import ( # noqa: F401 # pylint: disable=unused-import - make_confirm_delete_link, - make_confirm_link, +from cmk.gui.watolib.config_variable_groups import ( + ConfigVariableGroupWATO as ConfigVariableGroupWATO, ) -from cmk.gui.valuespec import ( - ABCPageListOfMultipleGetChoice, - Alternative, - CascadingDropdown, - Dictionary, - DictionaryEntry, - DropdownChoice, - DropdownChoiceEntries, - DualListChoice, - ElementSelection, - FixedValue, - Float, - Integer, - JSONValue, - Labels, - ListChoice, - ListOf, - ListOfMultiple, - ListOfStrings, - Migrate, - MigrateNotUpdated, - MonitoredHostname, - Password, - Percentage, - RegExp, - SingleLabel, - TextInput, - Transform, - Tuple, - Url, - ValueSpec, - ValueSpecHelp, - ValueSpecText, +from cmk.gui.watolib.host_attributes import ABCHostAttributeNagiosText as ABCHostAttributeNagiosText +from cmk.gui.watolib.host_attributes import ( + ABCHostAttributeNagiosValueSpec as ABCHostAttributeNagiosValueSpec, ) -from cmk.gui.watolib.attributes import ( # noqa: F401 # pylint: disable=unused-import - IPMIParameters, - SNMPCredentials, +from cmk.gui.watolib.host_attributes import ABCHostAttributeValueSpec as ABCHostAttributeValueSpec +from cmk.gui.watolib.host_attributes import ( + host_attribute_topic_registry as host_attribute_topic_registry, ) -from cmk.gui.watolib.check_mk_automations import get_check_information_cached -from cmk.gui.watolib.check_mk_automations import ( - get_section_information as get_section_information_automation, +from cmk.gui.watolib.host_attributes import HostAttributeTopicAddress as HostAttributeTopicAddress +from cmk.gui.watolib.host_attributes import ( + HostAttributeTopicBasicSettings as HostAttributeTopicBasicSettings, ) -from cmk.gui.watolib.config_domains import ConfigDomainCore as _ConfigDomainCore -from cmk.gui.watolib.config_hostname import ( # noqa: F401 # pylint: disable=unused-import - ConfigHostname, +from cmk.gui.watolib.host_attributes import ( + HostAttributeTopicCustomAttributes as HostAttributeTopicCustomAttributes, +) +from cmk.gui.watolib.host_attributes import ( + HostAttributeTopicDataSources as HostAttributeTopicDataSources, +) +from cmk.gui.watolib.host_attributes import HostAttributeTopicHostTags as HostAttributeTopicHostTags +from cmk.gui.watolib.host_attributes import ( + HostAttributeTopicManagementBoard as HostAttributeTopicManagementBoard, +) +from cmk.gui.watolib.host_attributes import HostAttributeTopicMetaData as HostAttributeTopicMetaData +from cmk.gui.watolib.host_attributes import ( + HostAttributeTopicNetworkScan as HostAttributeTopicNetworkScan, +) +from cmk.gui.watolib.hosts_and_folders import CREFolder as CREFolder +from cmk.gui.watolib.hosts_and_folders import CREHost as CREHost +from cmk.gui.watolib.hosts_and_folders import folder_from_request as folder_from_request +from cmk.gui.watolib.hosts_and_folders import folder_tree as folder_tree +from cmk.gui.watolib.hosts_and_folders import SearchFolder as SearchFolder +from cmk.gui.watolib.password_store import PasswordStore as PasswordStore +from cmk.gui.watolib.password_store import passwordstore_choices as passwordstore_choices +from cmk.gui.watolib.rulespec_groups import RulespecGroupAgentSNMP as RulespecGroupAgentSNMP +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesApplications as RulespecGroupEnforcedServicesApplications, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesEnvironment as RulespecGroupEnforcedServicesEnvironment, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesHardware as RulespecGroupEnforcedServicesHardware, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesNetworking as RulespecGroupEnforcedServicesNetworking, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesOperatingSystem as RulespecGroupEnforcedServicesOperatingSystem, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesStorage as RulespecGroupEnforcedServicesStorage, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupEnforcedServicesVirtualization as RulespecGroupEnforcedServicesVirtualization, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupHostsMonitoringRulesHostChecks as RulespecGroupHostsMonitoringRulesHostChecks, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupHostsMonitoringRulesNotifications as RulespecGroupHostsMonitoringRulesNotifications, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupHostsMonitoringRulesVarious as RulespecGroupHostsMonitoringRulesVarious, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringAgents as RulespecGroupMonitoringAgents, +) +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringAgentsGenericOptions as RulespecGroupMonitoringAgentsGenericOptions, ) -from cmk.gui.watolib.config_sync import ( # noqa: F401 # pylint: disable=unused-import - ReplicationPath, +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringConfiguration as RulespecGroupMonitoringConfiguration, ) -from cmk.gui.watolib.config_variable_groups import ( # noqa: F401 # pylint: disable=unused-import - ConfigVariableGroupNotifications, - ConfigVariableGroupSiteManagement, - ConfigVariableGroupUserInterface, - ConfigVariableGroupWATO, +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringConfigurationNotifications as RulespecGroupMonitoringConfigurationNotifications, ) -from cmk.gui.watolib.host_attributes import ( # noqa: F401 # pylint: disable=unused-import - ABCHostAttributeNagiosText, - ABCHostAttributeNagiosValueSpec, - ABCHostAttributeValueSpec, - host_attribute_topic_registry, - HostAttributeTopicAddress, - HostAttributeTopicBasicSettings, - HostAttributeTopicCustomAttributes, - HostAttributeTopicDataSources, - HostAttributeTopicHostTags, - HostAttributeTopicManagementBoard, - HostAttributeTopicMetaData, - HostAttributeTopicNetworkScan, +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringConfigurationServiceChecks as RulespecGroupMonitoringConfigurationServiceChecks, ) -from cmk.gui.watolib.hosts_and_folders import ( - CREFolder, - CREHost, - folder_from_request, - folder_tree, - SearchFolder, +from cmk.gui.watolib.rulespec_groups import ( + RulespecGroupMonitoringConfigurationVarious as RulespecGroupMonitoringConfigurationVarious, ) -from cmk.gui.watolib.password_store import PasswordStore, passwordstore_choices -from cmk.gui.watolib.rulespec_groups import ( # noqa: F401 # pylint: disable=unused-import - RulespecGroupAgentSNMP, - RulespecGroupEnforcedServicesApplications, - RulespecGroupEnforcedServicesEnvironment, - RulespecGroupEnforcedServicesHardware, - RulespecGroupEnforcedServicesNetworking, - RulespecGroupEnforcedServicesOperatingSystem, - RulespecGroupEnforcedServicesStorage, - RulespecGroupEnforcedServicesVirtualization, - RulespecGroupHostsMonitoringRulesHostChecks, - RulespecGroupHostsMonitoringRulesNotifications, - RulespecGroupHostsMonitoringRulesVarious, - RulespecGroupMonitoringAgents, - RulespecGroupMonitoringAgentsGenericOptions, - RulespecGroupMonitoringConfiguration, - RulespecGroupMonitoringConfigurationNotifications, - RulespecGroupMonitoringConfigurationServiceChecks, - RulespecGroupMonitoringConfigurationVarious, +from cmk.gui.watolib.rulespecs import BinaryHostRulespec as BinaryHostRulespec +from cmk.gui.watolib.rulespecs import BinaryServiceRulespec as BinaryServiceRulespec +from cmk.gui.watolib.rulespecs import ( + CheckParameterRulespecWithItem as CheckParameterRulespecWithItem, ) -from cmk.gui.watolib.rulespecs import ( # noqa: F401 # pylint: disable=unused-import - BinaryHostRulespec, - BinaryServiceRulespec, - CheckParameterRulespecWithItem, - CheckParameterRulespecWithoutItem, - HostRulespec, - ManualCheckParameterRulespec, - Rulespec, - rulespec_group_registry, - rulespec_registry, - RulespecGroup, - RulespecSubGroup, - ServiceRulespec, - TimeperiodValuespec, +from cmk.gui.watolib.rulespecs import ( + CheckParameterRulespecWithoutItem as CheckParameterRulespecWithoutItem, ) -from cmk.gui.watolib.translation import ( # noqa: F401 # pylint: disable=unused-import - HostnameTranslation, - ServiceDescriptionTranslation, - translation_elements, +from cmk.gui.watolib.rulespecs import HostRulespec as HostRulespec +from cmk.gui.watolib.rulespecs import ManualCheckParameterRulespec as ManualCheckParameterRulespec +from cmk.gui.watolib.rulespecs import Rulespec as Rulespec +from cmk.gui.watolib.rulespecs import rulespec_group_registry as rulespec_group_registry +from cmk.gui.watolib.rulespecs import rulespec_registry as rulespec_registry +from cmk.gui.watolib.rulespecs import RulespecGroup as RulespecGroup +from cmk.gui.watolib.rulespecs import RulespecSubGroup as RulespecSubGroup +from cmk.gui.watolib.rulespecs import ServiceRulespec as ServiceRulespec +from cmk.gui.watolib.rulespecs import TimeperiodValuespec as TimeperiodValuespec +from cmk.gui.watolib.translation import HostnameTranslation as HostnameTranslation +from cmk.gui.watolib.translation import ( + ServiceDescriptionTranslation as ServiceDescriptionTranslation, ) +from cmk.gui.watolib.translation import translation_elements as translation_elements from cmk.gui.watolib.users import notification_script_title diff --git a/cmk/gui/sidebar/__init__.py b/cmk/gui/sidebar/__init__.py index 06bbea30104..13541de29e2 100644 --- a/cmk/gui/sidebar/__init__.py +++ b/cmk/gui/sidebar/__init__.py @@ -18,6 +18,7 @@ import cmk.utils.paths import cmk.utils.version as cmk_version +from cmk.utils.exceptions import MKGeneralException import cmk.gui.pages import cmk.gui.pagetypes as pagetypes @@ -37,22 +38,20 @@ # Kept for compatibility with legacy plugins # TODO: Drop once we don't support legacy snapins anymore -from cmk.gui.plugins.sidebar.utils import ( # noqa: F401 # pylint: disable=unused-import - begin_footnote_links, - bulletlink, - end_footnote_links, - footnotelinks, - heading, - iconlink, - link, - render_link, - SidebarSnapin, - snapin_registry, - snapin_site_choice, - snapin_width, - write_snapin_exception, -) -from cmk.gui.type_defs import Icon +from cmk.gui.plugins.sidebar.utils import begin_footnote_links as begin_footnote_links +from cmk.gui.plugins.sidebar.utils import bulletlink as bulletlink +from cmk.gui.plugins.sidebar.utils import end_footnote_links as end_footnote_links +from cmk.gui.plugins.sidebar.utils import footnotelinks as footnotelinks +from cmk.gui.plugins.sidebar.utils import heading as heading +from cmk.gui.plugins.sidebar.utils import iconlink as iconlink +from cmk.gui.plugins.sidebar.utils import link as link +from cmk.gui.plugins.sidebar.utils import render_link as render_link +from cmk.gui.plugins.sidebar.utils import SidebarSnapin as SidebarSnapin +from cmk.gui.plugins.sidebar.utils import snapin_registry as snapin_registry +from cmk.gui.plugins.sidebar.utils import snapin_site_choice as snapin_site_choice +from cmk.gui.plugins.sidebar.utils import snapin_width as snapin_width +from cmk.gui.plugins.sidebar.utils import write_snapin_exception as write_snapin_exception +from cmk.gui.type_defs import Icon as Icon from cmk.gui.user_sites import get_configured_site_choices from cmk.gui.utils import load_web_plugins from cmk.gui.utils.csrf_token import check_csrf_token @@ -63,7 +62,6 @@ from cmk.gui.valuespec import CascadingDropdown, CascadingDropdownChoice, Dictionary, ValueSpec from cmk.gui.werks import may_acknowledge -from ...utils.exceptions import MKGeneralException from .main_menu import MainMenuRenderer # TODO: Kept for pre 1.6 plugin compatibility diff --git a/cmk/utils/log/console.py b/cmk/utils/log/console.py index 4e9eb285183..0b8b49cad95 100644 --- a/cmk/utils/log/console.py +++ b/cmk/utils/log/console.py @@ -13,7 +13,7 @@ import cmk.utils.tty as tty -from ._level import VERBOSE +from ._level import VERBOSE as VERBOSE # For StreamHandler.setStream() diff --git a/cmk/utils/packaging/__init__.py b/cmk/utils/packaging/__init__.py index 62df10b3061..7c9fb2bcfd9 100644 --- a/cmk/utils/packaging/__init__.py +++ b/cmk/utils/packaging/__init__.py @@ -18,27 +18,26 @@ from cmk.utils.setup_search_index import request_index_rebuild from cmk.utils.version import is_daily_build_of_master, parse_check_mk_version -from ._installed import Installer -from ._mkp import ( # noqa: F401 - create_mkp, - extract_manifest, - extract_manifest_optionally, - extract_manifests, - extract_mkp, - Manifest, - manifest_template, - PackagePart, - read_manifest_optionally, -) -from ._parts import ( # noqa: F401 - CONFIG_PARTS, - PackageOperationCallbacks, - PathConfig, - permissions, - ui_title, -) +from ._installed import Installer as Installer +from ._mkp import create_mkp as create_mkp +from ._mkp import extract_manifest as extract_manifest +from ._mkp import extract_manifest_optionally as extract_manifest_optionally +from ._mkp import extract_manifests as extract_manifests +from ._mkp import extract_mkp as extract_mkp +from ._mkp import Manifest as Manifest +from ._mkp import manifest_template as manifest_template +from ._mkp import PackagePart as PackagePart +from ._mkp import read_manifest_optionally as read_manifest_optionally +from ._parts import CONFIG_PARTS as CONFIG_PARTS +from ._parts import PackageOperationCallbacks as PackageOperationCallbacks +from ._parts import PathConfig as PathConfig +from ._parts import permissions as permissions +from ._parts import ui_title as ui_title from ._reporter import all_local_files, all_rule_pack_files -from ._type_defs import PackageError, PackageID, PackageName, PackageVersion +from ._type_defs import PackageError as PackageError +from ._type_defs import PackageID as PackageID +from ._type_defs import PackageName as PackageName +from ._type_defs import PackageVersion as PackageVersion _logger = logging.getLogger(__name__) diff --git a/pyproject.toml b/pyproject.toml index 6b35da5d481..1655935bb45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,7 +103,7 @@ disallow_untyped_calls = false # 6427 errors in 1077 files disallow_untyped_decorators = true disallow_untyped_defs = false # 6738 errors in 1571 no_implicit_optional = true -no_implicit_reexport = false # 3026 errors in 1213 files +no_implicit_reexport = false # 893 errors in 383 files strict_concatenate = true strict_equality = true warn_redundant_casts = true diff --git a/tests/unit/cmk/gui/test_backup_unit.py b/tests/unit/cmk/gui/test_backup_unit.py index 15a59bfbc95..dd797b2d84f 100644 --- a/tests/unit/cmk/gui/test_backup_unit.py +++ b/tests/unit/cmk/gui/test_backup_unit.py @@ -11,8 +11,8 @@ from cmk.utils.crypto.password import Password from cmk.utils.user import UserId -import cmk.gui.wato as wato from cmk.gui.logged_in import user +from cmk.gui.wato.pages.backup import ModeBackupEditKey @pytest.mark.usefixtures("request_context") @@ -22,7 +22,7 @@ def test_backup_key_create_web(monkeypatch: pytest.MonkeyPatch) -> None: store_path = Path(cmk.utils.paths.default_config_dir, "backup_keys.mk") assert not store_path.exists() - mode = wato.ModeBackupEditKey() + mode = ModeBackupEditKey() # First create a backup key mode._create_key(alias="älias", passphrase=Password("passphra$e")) @@ -30,7 +30,7 @@ def test_backup_key_create_web(monkeypatch: pytest.MonkeyPatch) -> None: assert store_path.exists() # Then test key existence - test_mode = wato.ModeBackupEditKey() + test_mode = ModeBackupEditKey() keys = test_mode.key_store.load() assert len(keys) == 1 diff --git a/tests/unit/cmk/gui/test_userdb.py b/tests/unit/cmk/gui/test_userdb.py index bbae93530df..a1103a831de 100644 --- a/tests/unit/cmk/gui/test_userdb.py +++ b/tests/unit/cmk/gui/test_userdb.py @@ -17,12 +17,13 @@ from flask import Flask from pytest import MonkeyPatch -from tests.testlib import is_managed_repo +from tests.testlib.utils import is_managed_repo import cmk.utils.paths import cmk.utils.version from cmk.utils.crypto import password_hashing from cmk.utils.crypto.password import Password, PasswordHash +from cmk.utils.store.htpasswd import Htpasswd from cmk.utils.user import UserId import cmk.gui.plugins.userdb.utils as utils @@ -32,10 +33,11 @@ from cmk.gui.config import active_config from cmk.gui.exceptions import MKAuthException, MKUserError from cmk.gui.session import session -from cmk.gui.type_defs import SessionId, SessionInfo, WebAuthnCredential -from cmk.gui.userdb import htpasswd +from cmk.gui.type_defs import SessionId, SessionInfo, TwoFactorCredentials, WebAuthnCredential from cmk.gui.userdb import ldap_connector as ldap -from cmk.gui.userdb.store import load_custom_attr +from cmk.gui.userdb.htpasswd import hash_password +from cmk.gui.userdb.session import is_valid_user_session, load_session_infos +from cmk.gui.userdb.store import load_custom_attr, save_users from cmk.gui.valuespec import Dictionary if TYPE_CHECKING: @@ -121,7 +123,7 @@ def _load_failed_logins(user_id: UserId) -> int | None: def test_load_pre_20_session(user_id: UserId) -> None: timestamp = 1234567890 userdb.save_custom_attr(user_id, "session_info", f"sess2|{timestamp}") - old_session = userdb.load_session_infos(user_id) + old_session = load_session_infos(user_id) assert isinstance(old_session, dict) assert old_session["sess2"].started_at == timestamp assert old_session["sess2"].last_activity == timestamp @@ -137,7 +139,7 @@ def test_on_succeeded_login(single_auth_request: SingleRequest) -> None: assert len(session_info.csrf_token) == 36 # Verify the session was initialized - session_infos = userdb.load_session_infos(user_id) + session_infos = load_session_infos(user_id) assert session_infos == { session_id: SessionInfo( session_id=session_id, @@ -239,12 +241,12 @@ def test_on_logout_no_session(flask_app: Flask, auth_request: http.Request) -> N def test_on_logout_invalidate_session(single_auth_request: SingleRequest) -> None: user_id, session_info = single_auth_request() - assert session_info.session_id in userdb.load_session_infos(user_id) + assert session_info.session_id in load_session_infos(user_id) session_info.invalidate() userdb.session.save_session_infos(user_id, {session_info.session_id: session_info}) - assert userdb.load_session_infos(user_id)[session_info.session_id].logged_out + assert load_session_infos(user_id)[session_info.session_id].logged_out def test_access_denied_with_invalidated_session(single_auth_request: SingleRequest) -> None: @@ -253,13 +255,13 @@ def test_access_denied_with_invalidated_session(single_auth_request: SingleReque now = datetime.now() - assert session_id in userdb.load_session_infos(user_id) + assert session_id in load_session_infos(user_id) userdb.on_access(user_id, session_id, now) session.session_info.invalidate() userdb.session.save_session_infos(user_id, {session_id: session.session_info}) - assert userdb.load_session_infos(user_id)[session_info.session_id].logged_out + assert load_session_infos(user_id)[session_info.session_id].logged_out with pytest.raises(MKAuthException, match="Invalid user session"): userdb.on_access(user_id, session_id, now) @@ -315,7 +317,7 @@ def test_on_access_update_unknown_session(single_auth_request: SingleRequest) -> now = datetime.now() user_id, session_info = single_auth_request() session_valid = session_info.session_id - session_info = userdb.load_session_infos(user_id)[session_valid] + session_info = load_session_infos(user_id)[session_valid] session_info.started_at = 10 with pytest.raises(MKAuthException, match="Invalid user session"): @@ -342,14 +344,12 @@ def test_on_succeeded_login_already_existing_session(single_auth_request: Single def test_is_valid_user_session_single_user_session_disabled(user_id: UserId) -> None: assert active_config.single_user_session is None - assert not userdb.is_valid_user_session(user_id, userdb.load_session_infos(user_id), "session1") + assert not is_valid_user_session(user_id, load_session_infos(user_id), "session1") @pytest.mark.usefixtures("single_user_session_enabled") def test_is_valid_user_session_not_existing(user_id: UserId) -> None: - assert not userdb.is_valid_user_session( - user_id, userdb.load_session_infos(user_id), "not-existing-session" - ) + assert not is_valid_user_session(user_id, load_session_infos(user_id), "not-existing-session") @pytest.mark.usefixtures("single_user_session_enabled") @@ -365,16 +365,14 @@ def test_is_valid_user_session_still_valid_when_last_activity_extends_timeout( session_timed_out = session_info.session_id - assert userdb.is_valid_user_session( - user_id, userdb.load_session_infos(user_id), session_timed_out - ) + assert is_valid_user_session(user_id, load_session_infos(user_id), session_timed_out) @pytest.mark.usefixtures("single_user_session_enabled") def test_is_valid_user_session_valid(single_auth_request: SingleRequest) -> None: user_id, session_info = single_auth_request() session_valid = session_info.session_id - assert userdb.is_valid_user_session(user_id, userdb.load_session_infos(user_id), session_valid) + assert is_valid_user_session(user_id, load_session_infos(user_id), session_valid) def test_ensure_user_can_init_no_single_user_session(user_id: UserId) -> None: @@ -487,7 +485,7 @@ def test_refresh_session_success(single_auth_request: SingleRequest) -> None: assert old_session_info.last_activity < last_activity userdb.session.save_session_infos(user_id, {session_valid: old_session_info}) - new_session_info = userdb.load_session_infos(user_id)[session_valid] + new_session_info = load_session_infos(user_id)[session_valid] new_session_info.refresh() assert new_session_info.session_id == old_session_info.session_id assert new_session_info.last_activity > old_session_info.last_activity @@ -496,10 +494,10 @@ def test_refresh_session_success(single_auth_request: SingleRequest) -> None: def test_invalidate_session(single_auth_request: SingleRequest) -> None: user_id, session_info = single_auth_request() session_id = session_info.session_id - assert session_id in userdb.load_session_infos(user_id) + assert session_id in load_session_infos(user_id) session_info.invalidate() userdb.session.save_session_infos(user_id, {session_id: session_info}) - assert userdb.load_session_infos(user_id)[session_info.session_id].logged_out + assert load_session_infos(user_id)[session_info.session_id].logged_out def test_get_last_activity(single_auth_request: SingleRequest) -> None: @@ -586,8 +584,8 @@ def test_check_credentials_local_user_create_htpasswd_user_ad_hoc() -> None: assert not userdb._user_exists_according_to_profile(user_id) assert user_id not in _load_users_uncached(lock=False) - htpasswd.Htpasswd(Path(cmk.utils.paths.htpasswd_file)).save_all( - {user_id: htpasswd.hash_password(Password("cmk"))} + Htpasswd(Path(cmk.utils.paths.htpasswd_file)).save_all( + {user_id: hash_password(Password("cmk"))} ) # Once a user exists in the htpasswd, the GUI treats the user as existing user and will # automatically initialize the missing data structures @@ -611,7 +609,7 @@ def test_check_credentials_local_user_disallow_locked(with_user: tuple[UserId, s users = _load_users_uncached(lock=True) users[user_id]["locked"] = True - userdb.save_users(users, now) + save_users(users, now) with pytest.raises(MKUserError, match="User is locked"): userdb.check_credentials(user_id, Password(password), now) @@ -641,7 +639,7 @@ def test_check_credentials_managed_global_user_is_allowed(with_user: tuple[UserI users = _load_users_uncached(lock=True) users[user_id]["customer"] = managed.SCOPE_GLOBAL - userdb.save_users(users, now) + save_users(users, now) assert userdb.check_credentials(user_id, Password(password), now) == user_id @@ -652,7 +650,7 @@ def test_check_credentials_managed_customer_user_is_allowed(with_user: tuple[Use now = datetime.now() users = _load_users_uncached(lock=True) users[user_id]["customer"] = "test-customer" - userdb.save_users(users, now) + save_users(users, now) assert userdb.check_credentials(user_id, Password(password), now) == user_id @@ -665,7 +663,7 @@ def test_check_credentials_managed_wrong_customer_user_is_denied( now = datetime.now() users = _load_users_uncached(lock=True) users[user_id]["customer"] = "wrong-customer" - userdb.save_users(users, now) + save_users(users, now) assert userdb.check_credentials(user_id, Password(password), now) is False @@ -758,7 +756,7 @@ def test_load_two_factor_credentials_unset(user_id: UserId) -> None: def test_save_two_factor_credentials(user_id: UserId) -> None: - credentials = userdb.TwoFactorCredentials( + credentials = TwoFactorCredentials( { "webauthn_credentials": { "id": WebAuthnCredential( @@ -779,7 +777,7 @@ def test_save_two_factor_credentials(user_id: UserId) -> None: def test_disable_two_factor_authentication(user_id: UserId) -> None: - credentials = userdb.TwoFactorCredentials( + credentials = TwoFactorCredentials( { "webauthn_credentials": { "id": WebAuthnCredential(