Merge pull request #113 from Snawoot/ndl_cuda_tk

ndl: track cuda toolkit releases
This commit is contained in:
Snawoot 2019-05-20 16:51:29 +03:00 committed by GitHub
commit 7ac81f3a0a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 108 additions and 2 deletions

View File

@ -257,8 +257,6 @@ Params:
Parses Nvidia downloads site.
Params:
Type: `nvidia_downloads`
Params:
@ -271,6 +269,16 @@ Params:
* `cuda_ver` - verson of CUDA Toolkit bundled with driver. Currently useless for covered product families. Default: `Nothing`.
* `timeout` - allowed delay in seconds for each network operation. Default: `10.0`
#### CudaToolkitDownloadsChannel
Parses CUDA Toolkit downloads archive and extracts kit name instead of driver name.
Type: `cuda_downloads`
Params:
* `timeout` - allowed delay in seconds for each network operation. Default: `10.0`
### Notifiers
#### CommandNotifier

View File

@ -0,0 +1,71 @@
#!/usr/bin/env python3
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'
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 drivers from "
"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 issue_request(timeout=10):
ENDPOINT = 'https://developer.nvidia.com/cuda-toolkit-archive'
http_req = urllib.request.Request(
ENDPOINT,
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_latest_cuda_tk(*, timeout=10):
doc = issue_request(timeout)
soup = BeautifulSoup(doc, 'html.parser')
res = soup.find('strong', string=re.compile(r'^\s*latest\s+release\s*$', re.I)).\
parent.find('a', string=re.compile(r'^\s*cuda\s+toolkit\s+.*$', re.I)).\
string
return res
def main():
import pprint
args = parse_args()
print(get_latest_cuda_tk(timeout=args.timeout))
if __name__ == '__main__':
main()

View File

@ -175,6 +175,11 @@
"product": "Quadro",
"certlevel": "Certified"
}
},
{
"type": "cuda_downloads",
"name": "cuda toolkit tracker",
"params": {}
}
],
"notifiers": [

View File

@ -197,6 +197,27 @@ class NvidiaDownloadsChannel(BaseChannel):
}
class CudaToolkitDownloadsChannel(BaseChannel):
def __init__(self, name, *,
timeout=10):
self.name = name
gcd = importlib.import_module('get_cuda_downloads')
self._gcd = gcd
self._timeout = timeout
def get_latest_driver(self):
latest = self._gcd.get_latest_cuda_tk(timeout=self._timeout)
if not latest:
return None
return {
'DriverAttributes': {
'Version': '???',
'Name': latest,
'NameLocalized': latest,
}
}
def parse_args():
parser = argparse.ArgumentParser(
description="Watches for GeForce experience driver updates for "
@ -223,6 +244,7 @@ class DriverLocator:
channel_types = {
'gfe_client': GFEClientChannel,
'nvidia_downloads': NvidiaDownloadsChannel,
'cuda_downloads': CudaToolkitDownloadsChannel,
}
channels = []