build: drop pywin32 usage (#26186)

* build: drop pywin32 usage

* chore: ignore extra output on AppVeyor
This commit is contained in:
David Sanders 2022-03-16 10:40:47 -07:00 committed by GitHub
parent b274011720
commit cf3ee7be56
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,9 +1,12 @@
from __future__ import with_statement from __future__ import unicode_literals
import contextlib import contextlib
import sys import sys
import os import os
import optparse import optparse
import json import json
import re
import subprocess
sys.path.append("%s/../../build" % os.path.dirname(os.path.realpath(__file__))) sys.path.append("%s/../../build" % os.path.dirname(os.path.realpath(__file__)))
@ -33,36 +36,56 @@ def calculate_hash(root):
return CalculateHash('.', None) return CalculateHash('.', None)
def windows_installed_software(): def windows_installed_software():
import win32com.client powershell_command = [
strComputer = "." "Get-CimInstance",
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") "-Namespace",
objSWbemServices = objWMIService.ConnectServer(strComputer, "root\cimv2") "root\cimv2",
colItems = objSWbemServices.ExecQuery("Select * from Win32_Product") "-Class",
items = [] "Win32_product",
"|",
"Select",
"vendor,",
"description,",
"@{l='install_location';e='InstallLocation'},",
"@{l='install_date';e='InstallDate'},",
"@{l='install_date_2';e='InstallDate2'},",
"caption,",
"version,",
"name,",
"@{l='sku_number';e='SKUNumber'}",
"|",
"ConvertTo-Json",
]
for objItem in colItems: proc = subprocess.Popen(
item = {} ["powershell.exe", "-Command", "-"],
if objItem.Caption: stdin=subprocess.PIPE,
item['caption'] = objItem.Caption stdout=subprocess.PIPE,
if objItem.Caption: )
item['description'] = objItem.Description
if objItem.InstallDate:
item['install_date'] = objItem.InstallDate
if objItem.InstallDate2:
item['install_date_2'] = objItem.InstallDate2
if objItem.InstallLocation:
item['install_location'] = objItem.InstallLocation
if objItem.Name:
item['name'] = objItem.Name
if objItem.SKUNumber:
item['sku_number'] = objItem.SKUNumber
if objItem.Vendor:
item['vendor'] = objItem.Vendor
if objItem.Version:
item['version'] = objItem.Version
items.append(item)
return items stdout, _ = proc.communicate(" ".join(powershell_command).encode("utf-8"))
if proc.returncode != 0:
raise RuntimeError("Failed to get list of installed software")
# On AppVeyor there's other output related to PSReadline,
# so grab only the JSON output and ignore everything else
json_match = re.match(
r".*(\[.*{.*}.*\]).*", stdout.decode("utf-8"), re.DOTALL
)
if not json_match:
raise RuntimeError(
"Couldn't find JSON output for list of installed software"
)
# Filter out missing keys
return list(
map(
lambda info: {k: info[k] for k in info if info[k]},
json.loads(json_match.group(1)),
)
)
def windows_profile(): def windows_profile():
@ -89,7 +112,7 @@ def windows_profile():
def main(options): def main(options):
if sys.platform == 'win32': if sys.platform == 'win32':
with open(options.output_json, 'wb') as f: with open(options.output_json, 'w') as f:
json.dump(windows_profile(), f) json.dump(windows_profile(), f)
else: else:
raise OSError("Unsupported OS") raise OSError("Unsupported OS")