Added debug options, possibility to save as csv files.
This commit is contained in:
		
							parent
							
								
									22210ca352
								
							
						
					
					
						commit
						0f785dd215
					
				| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "CurrentProjectSetting": null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "Interpreter": "Global|PythonCore|3.11"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "ExpandedNodes": [
 | 
				
			||||||
 | 
					    ""
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "PreviewInSolutionExplorer": false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Use IntelliSense to learn about possible attributes.
 | 
				
			||||||
 | 
					  // Hover to view descriptions of existing attributes.
 | 
				
			||||||
 | 
					  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
 | 
				
			||||||
 | 
					  "version": "0.2.0",
 | 
				
			||||||
 | 
					  "configurations": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "name": "Python: downloade single",
 | 
				
			||||||
 | 
					      "type": "python",
 | 
				
			||||||
 | 
					      "request": "launch",
 | 
				
			||||||
 | 
					      "program": "${workspaceFolder}/speedtest.py",
 | 
				
			||||||
 | 
					      "console": "integratedTerminal",
 | 
				
			||||||
 | 
					      "args": [
 | 
				
			||||||
 | 
					        "--csv",
 | 
				
			||||||
 | 
					        "--json"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      // "linux": {
 | 
				
			||||||
 | 
					      //   "MIMode": "gdb",
 | 
				
			||||||
 | 
					      //   "miDebuggerPath": "/usr/bin/gdb"
 | 
				
			||||||
 | 
					      // },
 | 
				
			||||||
 | 
					      // "osx": {
 | 
				
			||||||
 | 
					      //   "MIMode": "lldb"
 | 
				
			||||||
 | 
					      // },
 | 
				
			||||||
 | 
					      // "windows": {
 | 
				
			||||||
 | 
					      //   "MIMode": "gdb",
 | 
				
			||||||
 | 
					      //   "miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // "cwd": "${workspaceFolder}",
 | 
				
			||||||
 | 
					      "justMyCode": false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					download,upload,ping,server_url,server_lat,server_lon,server_name,server_country,server_cc,server_sponsor,server_id,server_host,server_d,server_latency,timestamp,bytes_sent,bytes_received,share,client_ip,client_lat,client_lon,client_isp,client_isprating,client_rating,client_ispdlavg,client_ispulavg,client_loggedin,client_country
 | 
				
			||||||
 | 
					0,0,6.93,http://ookla-osl.net.avur.no:8080/speedtest/upload.php,59.9494,10.7564,Oslo,Norway,NO,AVUR AS,18967,ookla-osl.net.avur.no:8080,5.7463776547060155,6.93,2024-01-01T21:26:53.963606Z,0,0,,84.215.59.36,59.955,10.859,Telia Norge AS,3.7,0,0,0,0,NO
 | 
				
			||||||
		
		
			
  | 
| 
						 | 
					@ -28,6 +28,8 @@ import sys
 | 
				
			||||||
import threading
 | 
					import threading
 | 
				
			||||||
import timeit
 | 
					import timeit
 | 
				
			||||||
import xml.parsers.expat
 | 
					import xml.parsers.expat
 | 
				
			||||||
 | 
					import utilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
    import gzip
 | 
					    import gzip
 | 
				
			||||||
| 
						 | 
					@ -1830,6 +1832,7 @@ def printer(string, quiet=False, debug=False, error=False, **kwargs):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not quiet:
 | 
					    if not quiet:
 | 
				
			||||||
        print_(out, **kwargs)
 | 
					        print_(out, **kwargs)
 | 
				
			||||||
 | 
					        # return str(out)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def shell():
 | 
					def shell():
 | 
				
			||||||
| 
						 | 
					@ -1940,6 +1943,9 @@ def shell():
 | 
				
			||||||
        speedtest.get_best_server(speedtest.set_mini_server(args.mini))
 | 
					        speedtest.get_best_server(speedtest.set_mini_server(args.mini))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    results = speedtest.results
 | 
					    results = speedtest.results
 | 
				
			||||||
 | 
					    # print(dict(str(results)))
 | 
				
			||||||
 | 
					    # os.makedirs('tmp', exist_ok=True)
 | 
				
			||||||
 | 
					    utilities.write_to_csv(str(results))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    printer('Hosted by %(sponsor)s (%(name)s) [%(d)0.2f km]: '
 | 
					    printer('Hosted by %(sponsor)s (%(name)s) [%(d)0.2f km]: '
 | 
				
			||||||
            '%(latency)s ms' % results.server, quiet)
 | 
					            '%(latency)s ms' % results.server, quiet)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					{'download': 0, 'upload': 0, 'ping': 9.319, 'server': {'url': 'http://speedtest.nextgentel.no:8080/speedtest/upload.php', 'lat': '59.9494', 'lon': '10.7564', 'name': 'Oslo', 'country': 'Norway', 'cc': 'NO', 'sponsor': 'NextGenTel AS', 'id': '8018', 'host': 'speedtest.nextgentel.no:8080', 'd': 5.7463776547060155, 'latency': 9.319}, 'timestamp': '2024-01-01T20:06:56.839888Z', 'bytes_sent': 0, 'bytes_received': 0, 'share': None, 'client': {'ip': '84.215.59.36', 'lat': '59.955', 'lon': '10.859', 'isp': 'Telia Norge AS', 'isprating': '3.7', 'rating': '0', 'ispdlavg': '0', 'ispulavg': '0', 'loggedin': '0', 'country': 'NO'}}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,103 @@
 | 
				
			||||||
 | 
					import logging
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					import csv
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def remove_directory(directory_path, n=100):
 | 
				
			||||||
 | 
					    directory_path = str(directory_path)
 | 
				
			||||||
 | 
					    if os.path.islink(directory_path):
 | 
				
			||||||
 | 
					        os.unlink(directory_path)
 | 
				
			||||||
 | 
					    elif os.path.exists(directory_path):
 | 
				
			||||||
 | 
					        deleted = False
 | 
				
			||||||
 | 
					        for i in range(0, n - 1):
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                shutil.rmtree(directory_path, onerror=on_error)
 | 
				
			||||||
 | 
					                deleted = True
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            except OSError as err:
 | 
				
			||||||
 | 
					                logging.error(
 | 
				
			||||||
 | 
					                    "Error while deleting directory {}, on attempt number {}: {}. Retrying...".format(
 | 
				
			||||||
 | 
					                        directory_path, i, err.strerror
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                time.sleep(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not deleted:
 | 
				
			||||||
 | 
					            shutil.rmtree(directory_path, onerror=on_error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def on_error(func, path, exc_info):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Error handler for ``shutil.rmtree``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If the error is due to an access error (read only file)
 | 
				
			||||||
 | 
					    it attempts to add write permission and then retries.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If the error is for another reason it re-raises the error.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Usage : ``shutil.rmtree(path, onerror=on_error)``
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    import stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if not os.access(path, os.W_OK):
 | 
				
			||||||
 | 
					        # Is the error an access error ?
 | 
				
			||||||
 | 
					        os.chmod(path, stat.S_IWUSR)
 | 
				
			||||||
 | 
					        func(path)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def make_directory(directory_path):
 | 
				
			||||||
 | 
					    directory_path = str(directory_path)
 | 
				
			||||||
 | 
					    if not os.path.exists(directory_path):
 | 
				
			||||||
 | 
					        os.makedirs(directory_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def make_clean_directory(directory_path):
 | 
				
			||||||
 | 
					    directory_path = str(directory_path)
 | 
				
			||||||
 | 
					    remove_directory(directory_path)
 | 
				
			||||||
 | 
					    while os.path.exists(directory_path):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    make_directory(directory_path)
 | 
				
			||||||
 | 
					    while not os.path.exists(directory_path):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def delete_file(file):
 | 
				
			||||||
 | 
					    file = str(file)
 | 
				
			||||||
 | 
					    if os.path.exists(file):
 | 
				
			||||||
 | 
					        os.remove(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def write_to_csv(input_str):
 | 
				
			||||||
 | 
					    # Convert single quotes to double quotes for valid JSON
 | 
				
			||||||
 | 
					    input_str = input_str.replace("'", "\"")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Convert the input string to a dictionary
 | 
				
			||||||
 | 
					    input_dict = eval(input_str)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Extract keys for the header row
 | 
				
			||||||
 | 
					    header = []
 | 
				
			||||||
 | 
					    for key, value in input_dict.items():
 | 
				
			||||||
 | 
					        if isinstance(value, dict):
 | 
				
			||||||
 | 
					            header.extend([f"{key}_{subkey}" for subkey in value.keys()])
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            header.append(key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Extract values for the data row
 | 
				
			||||||
 | 
					    values = []
 | 
				
			||||||
 | 
					    for key, value in input_dict.items():
 | 
				
			||||||
 | 
					        if isinstance(value, dict):
 | 
				
			||||||
 | 
					            values.extend(value.values())
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            values.append(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Write to CSV
 | 
				
			||||||
 | 
					    with open('output.csv', 'w', newline='') as csvfile:
 | 
				
			||||||
 | 
					        csv_writer = csv.writer(csvfile)
 | 
				
			||||||
 | 
					        csv_writer.writerow(header)
 | 
				
			||||||
 | 
					        csv_writer.writerow(values)
 | 
				
			||||||
		Loading…
	
		Reference in New Issue