donate-cpu-server.py: improved error handling and reporting / some cleanups (#4534)
This commit is contained in:
parent
ad8c1e26f0
commit
e235297a14
|
@ -26,7 +26,7 @@ from urllib.parse import urlparse
|
||||||
# Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/
|
# Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/
|
||||||
# Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic
|
# Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic
|
||||||
# changes)
|
# changes)
|
||||||
SERVER_VERSION = "1.3.30"
|
SERVER_VERSION = "1.3.31"
|
||||||
|
|
||||||
OLD_VERSION = '2.9'
|
OLD_VERSION = '2.9'
|
||||||
|
|
||||||
|
@ -1055,6 +1055,37 @@ class HttpClientThread(Thread):
|
||||||
self.connection.close()
|
self.connection.close()
|
||||||
|
|
||||||
|
|
||||||
|
def read_data(connection, cmd, pos_nl, max_data_size, check_done, cmd_name, timeout=10):
|
||||||
|
data = cmd[pos_nl+1:]
|
||||||
|
try:
|
||||||
|
t = 0.0
|
||||||
|
while (len(data) < max_data_size) and (not check_done or not data.endswith('\nDONE')) and (timeout > 0 and t < timeout):
|
||||||
|
bytes_received = connection.recv(1024)
|
||||||
|
if bytes_received:
|
||||||
|
try:
|
||||||
|
text_received = bytes_received.decode('utf-8', 'ignore')
|
||||||
|
except UnicodeDecodeError as e:
|
||||||
|
print_ts('Error: Decoding failed ({}): {}'.format(cmd_name, e))
|
||||||
|
data = None
|
||||||
|
break
|
||||||
|
t = 0.0
|
||||||
|
data += text_received
|
||||||
|
elif not check_done:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
time.sleep(0.2)
|
||||||
|
t += 0.2
|
||||||
|
connection.close()
|
||||||
|
except socket.error as e:
|
||||||
|
print_ts('Socket error occured ({}): {}'.format(cmd_name, e))
|
||||||
|
data = None
|
||||||
|
|
||||||
|
if (timeout > 0 and t >= timeout):
|
||||||
|
print_ts('Timeout occurred ({}).'.format(cmd_name))
|
||||||
|
data = None
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
def server(server_address_port: int, packages: list, packageIndex: int, resultPath: str) -> None:
|
def server(server_address_port: int, packages: list, packageIndex: int, resultPath: str) -> None:
|
||||||
socket.setdefaulttimeout(30)
|
socket.setdefaulttimeout(30)
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
@ -1086,10 +1117,13 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
connection.close()
|
connection.close()
|
||||||
print_ts('Error: Decoding failed: ' + str(e))
|
print_ts('Error: Decoding failed: ' + str(e))
|
||||||
continue
|
continue
|
||||||
if cmd.find('\n') < 1:
|
pos_nl = cmd.find('\n')
|
||||||
|
if pos_nl < 1:
|
||||||
|
print_ts('No newline found in data.')
|
||||||
continue
|
continue
|
||||||
firstLine = cmd[:cmd.find('\n')]
|
firstLine = cmd[:pos_nl]
|
||||||
if re.match('[a-zA-Z0-9./ ]+', firstLine) is None:
|
if re.match('[a-zA-Z0-9./ ]+', firstLine) is None:
|
||||||
|
print_ts('Unsupported characters found in command: {}'.format(firstLine))
|
||||||
connection.close()
|
connection.close()
|
||||||
continue
|
continue
|
||||||
if cmd.startswith('GET /'):
|
if cmd.startswith('GET /'):
|
||||||
|
@ -1113,31 +1147,16 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
connection.send(pkg.encode('utf-8', 'ignore'))
|
connection.send(pkg.encode('utf-8', 'ignore'))
|
||||||
connection.close()
|
connection.close()
|
||||||
elif cmd.startswith('write\nftp://') or cmd.startswith('write\nhttp://'):
|
elif cmd.startswith('write\nftp://') or cmd.startswith('write\nhttp://'):
|
||||||
# read data
|
data = read_data(connection, cmd, pos_nl, max_data_size=2 * 1024 * 1024, check_done=True, cmd_name='write')
|
||||||
data = cmd[cmd.find('\n')+1:]
|
if data is None:
|
||||||
try:
|
continue
|
||||||
t = 0.0
|
|
||||||
max_data_size = 2 * 1024 * 1024
|
|
||||||
while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10):
|
|
||||||
bytes_received = connection.recv(1024)
|
|
||||||
if bytes_received:
|
|
||||||
try:
|
|
||||||
text_received = bytes_received.decode('utf-8', 'ignore')
|
|
||||||
except UnicodeDecodeError as e:
|
|
||||||
print_ts('Error: Decoding failed (write): ' + str(e))
|
|
||||||
data = ''
|
|
||||||
break
|
|
||||||
t = 0.0
|
|
||||||
data += text_received
|
|
||||||
else:
|
|
||||||
time.sleep(0.2)
|
|
||||||
t += 0.2
|
|
||||||
connection.close()
|
|
||||||
except socket.error:
|
|
||||||
pass
|
|
||||||
|
|
||||||
pos = data.find('\n')
|
pos = data.find('\n')
|
||||||
|
if pos == -1:
|
||||||
|
print_ts('No newline found in data. Ignoring result data.')
|
||||||
|
continue
|
||||||
if pos < 10:
|
if pos < 10:
|
||||||
|
print_ts('Data is less than 10 characters. Ignoring result data.')
|
||||||
continue
|
continue
|
||||||
url = data[:pos]
|
url = data[:pos]
|
||||||
print_ts('write:' + url)
|
print_ts('write:' + url)
|
||||||
|
@ -1147,10 +1166,10 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
if res is None:
|
if res is None:
|
||||||
res = re.match(r'https?://cppcheck\.sf\.net/([a-z]+).tgz', url)
|
res = re.match(r'https?://cppcheck\.sf\.net/([a-z]+).tgz', url)
|
||||||
if res is None:
|
if res is None:
|
||||||
print_ts('results not written. res is None.')
|
print_ts('res is None. Ignoring result data.')
|
||||||
continue
|
continue
|
||||||
if url not in packages:
|
if url not in packages:
|
||||||
print_ts('results not written. url is not in packages.')
|
print_ts('Url is not in packages. Ignoring result data.')
|
||||||
continue
|
continue
|
||||||
# Verify that head was compared to correct OLD_VERSION
|
# Verify that head was compared to correct OLD_VERSION
|
||||||
versions_found = False
|
versions_found = False
|
||||||
|
@ -1160,14 +1179,14 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
versions_found = True
|
versions_found = True
|
||||||
if OLD_VERSION not in line.split():
|
if OLD_VERSION not in line.split():
|
||||||
print_ts('Compared to wrong old version. Should be ' + OLD_VERSION + '. Versions compared: ' +
|
print_ts('Compared to wrong old version. Should be ' + OLD_VERSION + '. Versions compared: ' +
|
||||||
line)
|
line + '. Ignoring result data.')
|
||||||
print_ts('Ignoring data.')
|
|
||||||
old_version_wrong = True
|
old_version_wrong = True
|
||||||
break
|
break
|
||||||
if not versions_found:
|
if not versions_found:
|
||||||
print_ts('Cppcheck versions missing in result data. Ignoring data.')
|
print_ts('Cppcheck versions missing in result data. Ignoring result data.')
|
||||||
continue
|
continue
|
||||||
if old_version_wrong:
|
if old_version_wrong:
|
||||||
|
print_ts('Unexpected old version. Ignoring result data.')
|
||||||
continue
|
continue
|
||||||
print_ts('results added for package ' + res.group(1))
|
print_ts('results added for package ' + res.group(1))
|
||||||
filename = os.path.join(resultPath, res.group(1))
|
filename = os.path.join(resultPath, res.group(1))
|
||||||
|
@ -1182,31 +1201,16 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
# generate package.diff..
|
# generate package.diff..
|
||||||
generate_package_diff_statistics(filename)
|
generate_package_diff_statistics(filename)
|
||||||
elif cmd.startswith('write_info\nftp://') or cmd.startswith('write_info\nhttp://'):
|
elif cmd.startswith('write_info\nftp://') or cmd.startswith('write_info\nhttp://'):
|
||||||
# read data
|
data = read_data(connection, cmd, pos_nl, max_data_size=1024 * 1024, check_done=True, cmd_name='write_info')
|
||||||
data = cmd[cmd.find('\n') + 1:]
|
if data is None:
|
||||||
try:
|
continue
|
||||||
t = 0.0
|
|
||||||
max_data_size = 1024 * 1024
|
|
||||||
while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10):
|
|
||||||
bytes_received = connection.recv(1024)
|
|
||||||
if bytes_received:
|
|
||||||
try:
|
|
||||||
text_received = bytes_received.decode('utf-8', 'ignore')
|
|
||||||
except UnicodeDecodeError as e:
|
|
||||||
print_ts('Error: Decoding failed (write_info): ' + str(e))
|
|
||||||
data = ''
|
|
||||||
break
|
|
||||||
t = 0.0
|
|
||||||
data += text_received
|
|
||||||
else:
|
|
||||||
time.sleep(0.2)
|
|
||||||
t += 0.2
|
|
||||||
connection.close()
|
|
||||||
except socket.error:
|
|
||||||
pass
|
|
||||||
|
|
||||||
pos = data.find('\n')
|
pos = data.find('\n')
|
||||||
|
if pos == -1:
|
||||||
|
print_ts('No newline found in data. Ignoring information data.')
|
||||||
|
continue
|
||||||
if pos < 10:
|
if pos < 10:
|
||||||
|
print_ts('Data is less than 10 characters. Ignoring information data.')
|
||||||
continue
|
continue
|
||||||
url = data[:pos]
|
url = data[:pos]
|
||||||
print_ts('write_info:' + url)
|
print_ts('write_info:' + url)
|
||||||
|
@ -1216,10 +1220,10 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
if res is None:
|
if res is None:
|
||||||
res = re.match(r'https://cppcheck\.sf\.net/([a-z]+).tgz', url)
|
res = re.match(r'https://cppcheck\.sf\.net/([a-z]+).tgz', url)
|
||||||
if res is None:
|
if res is None:
|
||||||
print_ts('info output not written. res is None.')
|
print_ts('res is None. Ignoring information data.')
|
||||||
continue
|
continue
|
||||||
if url not in packages:
|
if url not in packages:
|
||||||
print_ts('info output not written. url is not in packages.')
|
print_ts('Url is not in packages. Ignoring information data.')
|
||||||
continue
|
continue
|
||||||
print_ts('adding info output for package ' + res.group(1))
|
print_ts('adding info output for package ' + res.group(1))
|
||||||
info_path = resultPath + '/' + 'info_output'
|
info_path = resultPath + '/' + 'info_output'
|
||||||
|
@ -1246,7 +1250,7 @@ def server(server_address_port: int, packages: list, packageIndex: int, resultPa
|
||||||
print_ts('getPackageIdx: index is out of range')
|
print_ts('getPackageIdx: index is out of range')
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
if cmd.find('\n') < 0:
|
if pos_nl < 0:
|
||||||
print_ts('invalid command: "' + firstLine + '"')
|
print_ts('invalid command: "' + firstLine + '"')
|
||||||
else:
|
else:
|
||||||
lines = cmd.split('\n')
|
lines = cmd.split('\n')
|
||||||
|
|
Loading…
Reference in New Issue