Source code for wiz.system

# :coding: utf-8

import platform as _platform

import distro

import wiz.exception
import wiz.history
import wiz.symbol
import wiz.utility

#: Operating System group mapping
OS_MAPPING = {
    "el": ["centos", "redhat"]
}


[docs]def query(platform=None, architecture=None, os_name=None, os_version=None): """Return system mapping. The mapping should be in the form of:: { "platform": "linux", "arch": "x86_64", "os": { "name": "centos", "version": "7.3.161" } } :param platform: Indicate a platform identifier which would override the platform identifier queried. Default is None. :param architecture: Indicate an architecture identifier which would override the architecture identifier queried. Default is None. :param os_name: Indicate an operating system identifier which would override the operating system identifier queried. Default is None. :param os_version: Indicate an operating system version which would override the operating system version queried. Default is None. :return: System mapping. :raise: :exc:`wiz.exception.IncorrectSystem` if current system could not be identified or is not supported. """ name = _platform.system().lower() try: if name == "linux": mapping = query_linux() elif name == "darwin": mapping = query_mac() elif name == "windows": mapping = query_windows() else: raise wiz.exception.UnsupportedPlatform(name) except wiz.exception.VersionError as error: raise wiz.exception.CurrentSystemError( "The operating system version found seems incorrect " "[{}]".format(error) ) if platform is not None: mapping["platform"] = platform if architecture is not None: mapping["arch"] = architecture if os_name is not None: mapping["os"]["name"] = os_name if os_version is not None: mapping["os"]["version"] = os_version wiz.history.record_action( wiz.symbol.SYSTEM_IDENTIFICATION_ACTION, system=mapping ) return mapping
[docs]def query_linux(): """Return Linux system mapping. :return: Mapping in the form of :: { "platform": "linux", "arch": "x86_64", "os": { "name": "centos", "version": "7.3.161" } } """ distribution, version, _ = distro.linux_distribution( full_distribution_name=False ) return { "platform": "linux", "arch": _platform.machine(), "os": { "name": distribution, "version": wiz.utility.get_version(version) } }
[docs]def query_mac(): """Return mac system mapping. :return: Mapping in the form of :: { "platform": "mac", "arch": "x86_64", "os": { "name": "mac", "version": "10.15.5" } } """ return { "platform": "mac", "arch": _platform.machine(), "os": { "name": "mac", "version": wiz.utility.get_version(_platform.mac_ver()[0]) } }
[docs]def query_windows(): """Return windows system mapping. :return: Mapping in the form of :: { "platform": "windows", "arch": "x86_64", "os": { "name": "windows", "version": "10.0.10240" } } .. warning:: The Windows versions superior to 8 will not be recognised properly with a Python version under 2.7.11 https://hg.python.org/cpython/raw-file/53d30ab403f1/Misc/NEWS Also a bug as been introduced in Python 2.7.11 that prevent the recognition of old Windows version https://bugs.python.org/issue26513 """ return { "platform": "windows", "arch": _platform.machine(), "os": { "name": "windows", "version": wiz.utility.get_version(_platform.win32_ver()[1]) } }
[docs]def validate(definition, system_mapping): """Validate *definition* against system *mapping*. :param definition: Instance of :class:`wiz.definition.Definition`. :param system_mapping: System mapping as returned by :func:`query`. :return: Boolean value. """ system = definition.system # If no system is set on the definition, it is considered compatible with # any platform. if len(system) == 0: return True # Filter platform if necessary. platform_identifier = system_mapping.get("platform") if system.get("platform", platform_identifier) != platform_identifier: return False # Filter architecture if necessary. architecture = system_mapping.get("arch") if system.get("arch", architecture) != architecture: return False # Filter operating system version if necessary. os_system = system.get("os") if os_system is not None: try: requirement = wiz.utility.get_requirement(os_system) except wiz.exception.RequirementError: raise wiz.exception.DefinitionError( "The operating system requirement is incorrect: {}".format( os_system ) ) os_mapping = system_mapping.get("os", {}) if not ( requirement.name == os_mapping.get("name") or os_mapping.get("name") in OS_MAPPING.get(requirement.name, []) ): return False if os_mapping.get("version") not in requirement.specifier: return False return True