-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUpdateChecker.py
More file actions
144 lines (121 loc) · 4.1 KB
/
UpdateChecker.py
File metadata and controls
144 lines (121 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import requests # required for checking http response code
import ssl # required for accepting unverified ssl certificates
ssl._create_default_https_context = ssl._create_unverified_context
import urllib.request # require for requesting html source
import chardet # required to determine encoding
import re # regular expressions required for parsing source code
import UpdateItem
class UpdateChecker:
def __init__(self, UpdateItem, is_verbose):
self.status = True
self.is_verbose = is_verbose
self.new_version = False
warning_info = ""
try:
self.name = UpdateItem.name
self.url = UpdateItem.url
self.re_pattern = UpdateItem.re_pattern
self.installed_version = UpdateItem.installed_version
self.version_info = self.installed_version
except:
self.message = "Error: Undefined input"
self.status = False
if self.is_verbose:
print(self.message)
return None
if len(self.name) == 0:
self.status = False
warning_info += "Empty software name "
if len(self.url) == 0:
self.status = False
warning_info += "Empty URL "
if len(self.re_pattern) == 0:
self.status = False
warning_info += "Empty search pattern "
if len(self.installed_version) == 0:
self.status = False
warning_info += "Empty version "
# if all parameters non-empty, some more validity checking
if self.status:
if "(.*?)" not in self.re_pattern:
self.status = False
warning_info += "Incorrect search pattern "
try:
r = requests.head(self.url)
if r.status_code >= 400:
self.status = False
warning_info += "HTTP status: " + str(r.status_code)
except requests.ConnectionError:
self.status = False
warning_info += "Failed to connect"
if self.status:
self.message = "Info: UpdateChecker initialization okay"
else:
self.message = "Warning: " + warning_info
if self.is_verbose:
print(self.message)
def getCurrentVersion(self):
if self.status != True:
if self.is_verbose:
print("Warning: UpdateChecker not initialized")
return self
else:
# accept unverified ssl certificates
ssl._create_default_https_context = ssl._create_unverified_context
# headers to improving response
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Connection': 'keep-alive'}
try:
request=urllib.request.Request(self.url,None,headers) # assembled request
fp = urllib.request.urlopen(request)
mybytes = fp.read()
# detect encoding
result = chardet.detect(mybytes)
charenc = result['encoding']
# decode response
html_source = mybytes.decode(charenc)
fp.close()
except:
self.status = False
self.message = "Error: Could not read from URL " + url
if self.is_verbose:
print(self.message)
return self
if self.status:
try:
search_result = re.search(self.re_pattern, html_source)
except:
search_result = None
self.status = False
self.message = "Error: Check search pattern or HTML source"
if self.is_verbose:
print(self.message)
return self
if search_result:
installed_version = self.installed_version.strip()
current_version = search_result.group(1)
current_version = current_version.strip()
if current_version!=installed_version:
self.new_version = True
self.version_info = current_version
self.message = "Info: New version " + current_version + " for " + self.name
if self.is_verbose:
print(self.message)
return self
else:
self.message = "Info: No new version for " + self.name
if self.is_verbose:
print(self.message)
return self
else:
self.status = False
self.message = "Warning: Source code for " + self.name + " may have changed"
if self.is_verbose:
print(self.message)
return self
else:
if self.is_verbose:
print("Error: Unknown error")
return self