mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #50844 from twangboy/fix_grains
Fix grains for future windows releases
This commit is contained in:
commit
fdff67594c
2 changed files with 62 additions and 31 deletions
|
@ -982,27 +982,35 @@ def _windows_platform_data():
|
|||
except IndexError:
|
||||
log.debug('Motherboard info not available on this system')
|
||||
|
||||
os_release = platform.release()
|
||||
info = salt.utils.win_osinfo.get_os_version_info()
|
||||
server = {'Vista': '2008Server',
|
||||
'7': '2008ServerR2',
|
||||
'8': '2012Server',
|
||||
'8.1': '2012ServerR2',
|
||||
'10': '2016Server'}
|
||||
|
||||
# Starting with Python 2.7.12 and 3.5.2 the `platform.uname()` function
|
||||
# started reporting the Desktop version instead of the Server version on
|
||||
# Server versions of Windows, so we need to look those up
|
||||
# So, if you find a Server Platform that's a key in the server
|
||||
# dictionary, then lookup the actual Server Release.
|
||||
# (Product Type 1 is Desktop, Everything else is Server)
|
||||
if info['ProductType'] > 1 and os_release in server:
|
||||
os_release = server[os_release]
|
||||
|
||||
service_pack = None
|
||||
if info['ServicePackMajor'] > 0:
|
||||
service_pack = ''.join(['SP', str(info['ServicePackMajor'])])
|
||||
|
||||
# This creates the osrelease grain based on the Windows Operating
|
||||
# System Product Name. As long as Microsoft maintains a similar format
|
||||
# this should be future proof
|
||||
version = 'Unknown'
|
||||
release = ''
|
||||
if 'Server' in osinfo.Caption:
|
||||
for item in osinfo.Caption.split(' '):
|
||||
# If it's all digits, then it's version
|
||||
if re.match(r'\d+', item):
|
||||
version = item
|
||||
# If it starts with R and then numbers, it's the release
|
||||
# ie: R2
|
||||
if re.match(r'^R\d+$', item):
|
||||
release = item
|
||||
os_release = '{0}Server{1}'.format(version, release)
|
||||
else:
|
||||
for item in osinfo.Caption.split(' '):
|
||||
# If it's a number, decimal number, Thin or Vista, then it's the
|
||||
# version
|
||||
if re.match(r'^(\d+(\.\d+)?)|Thin|Vista$', item):
|
||||
version = item
|
||||
os_release = version
|
||||
|
||||
grains = {
|
||||
'kernelrelease': _clean_value('kernelrelease', osinfo.Version),
|
||||
'osversion': _clean_value('osversion', osinfo.Version),
|
||||
|
@ -1081,6 +1089,7 @@ def id_():
|
|||
'''
|
||||
return {'id': __opts__.get('id', '')}
|
||||
|
||||
|
||||
_REPLACE_LINUX_RE = re.compile(r'\W(?:gnu/)?linux', re.IGNORECASE)
|
||||
|
||||
# This maps (at most) the first ten characters (no spaces, lowercased) of
|
||||
|
|
|
@ -653,26 +653,47 @@ def system_information():
|
|||
else:
|
||||
return ''
|
||||
|
||||
version = system_version()
|
||||
release = platform.release()
|
||||
if platform.win32_ver()[0]:
|
||||
# Get the version and release info based on the Windows Operating
|
||||
# System Product Name. As long as Microsoft maintains a similar format
|
||||
# this should be future proof
|
||||
import win32api # pylint: disable=3rd-party-module-not-gated
|
||||
server = {'Vista': '2008Server',
|
||||
'7': '2008ServerR2',
|
||||
'8': '2012Server',
|
||||
'8.1': '2012ServerR2',
|
||||
'10': '2016Server'}
|
||||
# Starting with Python 2.7.12 and 3.5.2 the `platform.uname()` function
|
||||
# started reporting the Desktop version instead of the Server version on
|
||||
# Server versions of Windows, so we need to look those up
|
||||
# So, if you find a Server Platform that's a key in the server
|
||||
# dictionary, then lookup the actual Server Release.
|
||||
# If this is a Server Platform then `GetVersionEx` will return a number
|
||||
# greater than 1.
|
||||
if win32api.GetVersionEx(1)[8] > 1 and release in server:
|
||||
release = server[release]
|
||||
import win32con # pylint: disable=3rd-party-module-not-gated
|
||||
|
||||
# Get the product name from the registry
|
||||
hkey = win32con.HKEY_LOCAL_MACHINE
|
||||
key = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'
|
||||
value_name = 'ProductName'
|
||||
reg_handle = win32api.RegOpenKey(hkey, key)
|
||||
|
||||
# Returns a tuple of (product_name, value_type)
|
||||
product_name, _ = win32api.RegQueryValueEx(reg_handle, value_name)
|
||||
|
||||
version = 'Unknown'
|
||||
release = ''
|
||||
if 'Server' in product_name:
|
||||
for item in product_name.split(' '):
|
||||
# If it's all digits, then it's version
|
||||
if re.match(r'\d+', item):
|
||||
version = item
|
||||
# If it starts with R and then numbers, it's the release
|
||||
# ie: R2
|
||||
if re.match(r'^R\d+$', item):
|
||||
release = item
|
||||
release = '{0}Server{1}'.format(version, release)
|
||||
else:
|
||||
for item in product_name.split(' '):
|
||||
# If it's a number, decimal number, Thin or Vista, then it's the
|
||||
# version
|
||||
if re.match(r'^(\d+(\.\d+)?)|Thin|Vista$', item):
|
||||
version = item
|
||||
release = version
|
||||
|
||||
_, ver, sp, extra = platform.win32_ver()
|
||||
version = ' '.join([release, ver, sp, extra])
|
||||
else:
|
||||
version = system_version()
|
||||
release = platform.release()
|
||||
|
||||
system = [
|
||||
('system', platform.system()),
|
||||
|
@ -745,6 +766,7 @@ def msi_conformant_version():
|
|||
commi = __saltstack_version__.noc
|
||||
return '{0}.{1}.{2}.{3}'.format(year2, month, minor, commi)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) == 2 and sys.argv[1] == 'msi':
|
||||
# Building the msi requires an msi-conformant version
|
||||
|
|
Loading…
Add table
Reference in a new issue