mirror of
				https://github.com/keylase/nvidia-patch.git
				synced 2025-10-31 12:42:00 +00:00 
			
		
		
		
	ndl: track Vulkan Beta Drivers
This commit is contained in:
		| @@ -23,6 +23,7 @@ All scripts may be used both as standalone application and importable module. Fo | ||||
| * mailer.py - module with email routines and minimalistic email client for test purposes. | ||||
| * gfe\_get\_driver.py - GeForce Experience client library (and test util). | ||||
| * get\_nvidia\_downloads.py - Nvidia downloads site parser (and test util). | ||||
| * get\_vulkan\_downloads.py - Nvidia Developer downloads site parser (and test util). Used for Vulkan Beta Drivers. | ||||
|  | ||||
| ### Operation | ||||
|  | ||||
| @@ -214,6 +215,20 @@ All scripts may be used both as standalone application and importable module. Fo | ||||
|             "type": "cuda_downloads", | ||||
|             "name": "cuda toolkit tracker", | ||||
|             "params": {} | ||||
|         }, | ||||
|         { | ||||
|             "type": "vulkan_beta", | ||||
|             "name": "vulkan beta windows", | ||||
|             "params": { | ||||
|                 "os": "Windows" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "type": "vulkan_beta", | ||||
|             "name": "vulkan beta linux", | ||||
|             "params": { | ||||
|                 "os": "Linux" | ||||
|             } | ||||
|         } | ||||
|     ], | ||||
|     "notifiers": [ | ||||
| @@ -306,6 +321,17 @@ Params: | ||||
|  | ||||
| * `timeout` - allowed delay in seconds for each network operation. Default: `10.0` | ||||
|  | ||||
| #### VulkanBetaDownloadsChannel | ||||
|  | ||||
| Parses Nvidia Developer downloads site for latest Vulkan Beta Drivers. | ||||
|  | ||||
| Type: `vulkan_beta` | ||||
|  | ||||
| Params: | ||||
|  | ||||
| * `os` - OS family. Allowed values: `Linux`, `Windows`. Default: `Linux`. | ||||
| * `timeout` - allowed delay in seconds for each network operation. Default: `10.0` | ||||
|  | ||||
| ### Notifiers | ||||
|  | ||||
| #### CommandNotifier | ||||
|   | ||||
							
								
								
									
										84
									
								
								tools/nv-driver-locator/get_vulkan_downloads.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										84
									
								
								tools/nv-driver-locator/get_vulkan_downloads.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| import sys | ||||
| import urllib.request | ||||
| import urllib.error | ||||
| import urllib.parse | ||||
| import codecs | ||||
| import enum | ||||
| import re | ||||
| from bs4 import BeautifulSoup | ||||
|  | ||||
| USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:65.0) '\ | ||||
|              'Gecko/20100101 Firefox/65.0' | ||||
| URL = 'https://developer.nvidia.com/vulkan-driver' | ||||
|  | ||||
| def parse_args(): | ||||
|     import argparse | ||||
|  | ||||
|     def check_positive_float(val): | ||||
|         val = float(val) | ||||
|         if val <= 0: | ||||
|             raise ValueError("Value %s is not valid positive float" % | ||||
|                              (repr(val),)) | ||||
|         return val | ||||
|  | ||||
|     parser = argparse.ArgumentParser( | ||||
|         description="Retrieves info about latest NVIDIA Vulkan beta drivers " | ||||
|                     "from developer downloads site", | ||||
|         formatter_class=argparse.ArgumentDefaultsHelpFormatter) | ||||
|     parser.add_argument("-T", "--timeout", | ||||
|                         type=check_positive_float, | ||||
|                         default=10., | ||||
|                         help="timeout for network operations") | ||||
|     args = parser.parse_args() | ||||
|     return args | ||||
|  | ||||
|  | ||||
| def fetch_url(url, timeout=10): | ||||
|     http_req = urllib.request.Request( | ||||
|         url, | ||||
|         data=None, | ||||
|         headers={ | ||||
|             'User-Agent': USER_AGENT | ||||
|         } | ||||
|     ) | ||||
|     with urllib.request.urlopen(http_req, None, timeout) as resp: | ||||
|         coding = resp.headers.get_content_charset() | ||||
|         coding = coding if coding is not None else 'utf-8-sig' | ||||
|         decoder = codecs.getreader(coding)(resp) | ||||
|         res = decoder.read() | ||||
|     return res | ||||
|  | ||||
|  | ||||
| def get_drivers(*, timeout=10): | ||||
|     body = fetch_url(URL) | ||||
|     soup = BeautifulSoup(body, 'html.parser') | ||||
|     result = [] | ||||
|     for sibling in soup.find('h4', | ||||
|                              string=re.compile(r'Vulkan .* Developer Beta Driver Downloads', re.I) | ||||
|                              ).next_siblings: | ||||
|         if sibling.name == 'h4': | ||||
|             break | ||||
|         if sibling.name == 'p' and sibling.b is not None: | ||||
|             m = re.match(r'(Windows|Linux)\s+((\d+\.){1,2}\d+)', sibling.b.string) | ||||
|             if m is not None: | ||||
|                 ver = m.group(2) | ||||
|                 os = m.group(1) | ||||
|                 obj = { | ||||
|                     "name": "Vulkan Beta Driver for %s" % (os,), | ||||
|                     "os": os, | ||||
|                     "version": ver, | ||||
|                 } | ||||
|                 result.append(obj) | ||||
|     return result | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     import pprint | ||||
|     args = parse_args() | ||||
|     pprint.pprint(get_drivers(timeout=args.timeout)) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
| @@ -238,6 +238,20 @@ | ||||
|             "type": "cuda_downloads", | ||||
|             "name": "cuda toolkit tracker", | ||||
|             "params": {} | ||||
|         }, | ||||
|         { | ||||
|             "type": "vulkan_beta", | ||||
|             "name": "vulkan beta windows", | ||||
|             "params": { | ||||
|                 "os": "Windows" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "type": "vulkan_beta", | ||||
|             "name": "vulkan beta linux", | ||||
|             "params": { | ||||
|                 "os": "Linux" | ||||
|             } | ||||
|         } | ||||
|     ], | ||||
|     "notifiers": [ | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import hashlib | ||||
| import importlib | ||||
| import logging | ||||
| from abc import ABC, abstractmethod | ||||
| import functools | ||||
|  | ||||
|  | ||||
| HASH_DELIM = b'\x00' | ||||
| @@ -275,6 +276,33 @@ class CudaToolkitDownloadsChannel(BaseChannel): | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @functools.lru_cache(maxsize=0) | ||||
| def vulkan_downloads(*, timeout=10): | ||||
|     gvd = importlib.import_module('get_vulkan_downloads') | ||||
|     return gvd.get_drivers(timeout=timeout) | ||||
|  | ||||
| class VulkanBetaDownloadsChannel(BaseChannel): | ||||
|     def __init__(self, name, *, | ||||
|                  os="Linux", | ||||
|                  timeout=10): | ||||
|         self.name = name | ||||
|         self._os = os | ||||
|         self._timeout = timeout | ||||
|  | ||||
|     def get_latest_driver(self): | ||||
|         drivers = vulkan_downloads(timeout=self._timeout) | ||||
|         for drv in drivers: | ||||
|             if drv["os"] == self._os: | ||||
|                 return { | ||||
|                     'DriverAttributes': { | ||||
|                         'Version': drv['version'], | ||||
|                         'Name': drv['name'], | ||||
|                         'NameLocalized': drv['name'], | ||||
|                     } | ||||
|                 } | ||||
|         else: | ||||
|             return None | ||||
|  | ||||
|  | ||||
| def parse_args(): | ||||
|     parser = argparse.ArgumentParser( | ||||
| @@ -303,6 +331,7 @@ class DriverLocator: | ||||
|             'gfe_client': GFEClientChannel, | ||||
|             'nvidia_downloads': NvidiaDownloadsChannel, | ||||
|             'cuda_downloads': CudaToolkitDownloadsChannel, | ||||
|             'vulkan_beta': VulkanBetaDownloadsChannel, | ||||
|         } | ||||
|  | ||||
|         channels = [] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Vladislav Yarmak
					Vladislav Yarmak