Get system information.

    Returns:
        dict: Dictionary containing information about the system to include
        name, description, version, etc...

    CLI Example:

    .. code-block:: bash

        salt 'minion-id' system.get_system_info

def get_system_info():
    '''
    Get system information.

    Returns:
        dict: Dictionary containing information about the system to include
        name, description, version, etc...

    CLI Example:

    .. code-block:: bash

        salt 'minion-id' system.get_system_info
    '''
    def byte_calc(val):
        val = float(val)
        if val < 2**10:
            return '{0:.3f}B'.format(val)
        elif val < 2**20:
            return '{0:.3f}KB'.format(val / 2**10)
        elif val < 2**30:
            return '{0:.3f}MB'.format(val / 2**20)
        elif val < 2**40:
            return '{0:.3f}GB'.format(val / 2**30)
        else:
            return '{0:.3f}TB'.format(val / 2**40)

    # Lookup dicts for Win32_OperatingSystem
    os_type = {1: 'Work Station',
               2: 'Domain Controller',
               3: 'Server'}

    # lookup dicts for Win32_ComputerSystem
    domain_role = {0: 'Standalone Workstation',
                   1: 'Member Workstation',
                   2: 'Standalone Server',
                   3: 'Member Server',
                   4: 'Backup Domain Controller',
                   5: 'Primary Domain Controller'}
    warning_states = {1: 'Other',
                      2: 'Unknown',
                      3: 'Safe',
                      4: 'Warning',
                      5: 'Critical',
                      6: 'Non-recoverable'}
    pc_system_types = {0: 'Unspecified',
                       1: 'Desktop',
                       2: 'Mobile',
                       3: 'Workstation',
                       4: 'Enterprise Server',
                       5: 'SOHO Server',
                       6: 'Appliance PC',
                       7: 'Performance Server',
                       8: 'Maximum'}

    # Connect to WMI
    with salt.utils.winapi.Com():
        conn = wmi.WMI()

        system = conn.Win32_OperatingSystem()[0]
        ret = {'name': get_computer_name(),
               'description': system.Description,
               'install_date': system.InstallDate,
               'last_boot': system.LastBootUpTime,
               'os_manufacturer': system.Manufacturer,
               'os_name': system.Caption,
               'users': system.NumberOfUsers,
               'organization': system.Organization,
               'os_architecture': system.OSArchitecture,
               'primary': system.Primary,
               'os_type': os_type[system.ProductType],
               'registered_user': system.RegisteredUser,
               'system_directory': system.SystemDirectory,
               'system_drive': system.SystemDrive,
               'os_version': system.Version,
               'windows_directory': system.WindowsDirectory}

        system = conn.Win32_ComputerSystem()[0]
        # Get pc_system_type depending on Windows version
        if platform.release() in ['Vista', '7', '8']:
            # Types for Vista, 7, and 8
            pc_system_type = pc_system_types[system.PCSystemType]
        else:
            # New types were added with 8.1 and newer
            pc_system_types.update({8: 'Slate', 9: 'Maximum'})
            pc_system_type = pc_system_types[system.PCSystemType]
        ret.update({
            'bootup_state': system.BootupState,
            'caption': system.Caption,
            'chassis_bootup_state': warning_states[system.ChassisBootupState],
            'chassis_sku_number': system.ChassisSKUNumber,
            'dns_hostname': system.DNSHostname,
            'domain': system.Domain,
            'domain_role': domain_role[system.DomainRole],
            'hardware_manufacturer': system.Manufacturer,
            'hardware_model': system.Model,
            'network_server_mode_enabled': system.NetworkServerModeEnabled,
            'part_of_domain': system.PartOfDomain,
            'pc_system_type': pc_system_type,
            'power_state': system.PowerState,
            'status': system.Status,
            'system_type': system.SystemType,
            'total_physical_memory': byte_calc(system.TotalPhysicalMemory),
            'total_physical_memory_raw': system.TotalPhysicalMemory,
            'thermal_state': warning_states[system.ThermalState],
            'workgroup': system.Workgroup
        })
        # Get processor information
        processors = conn.Win32_Processor()
        ret['processors'] = 0
        ret['processors_logical'] = 0
        ret['processor_cores'] = 0
        ret['processor_cores_enabled'] = 0
        ret['processor_manufacturer'] = processors[0].Manufacturer
        ret['processor_max_clock_speed'] = six.text_type(processors[0].MaxClockSpeed) + 'MHz'
        for processor in processors:
            ret['processors'] += 1
            ret['processors_logical'] += processor.NumberOfLogicalProcessors
            ret['processor_cores'] += processor.NumberOfCores
            ret['processor_cores_enabled'] += processor.NumberOfEnabledCore

        bios = conn.Win32_BIOS()[0]
        ret.update({'hardware_serial': bios.SerialNumber,
                    'bios_manufacturer': bios.Manufacturer,
                    'bios_version': bios.Version,
                    'bios_details': bios.BIOSVersion,
                    'bios_caption': bios.Caption,
                    'bios_description': bios.Description})
        ret['install_date'] = _convert_date_time_string(ret['install_date'])
        ret['last_boot'] = _convert_date_time_string(ret['last_boot'])
    return ret