From c7b5427faeeafdb88319089a12ef6373ca934898 Mon Sep 17 00:00:00 2001 From: Astatin3 <77305074+Astatin3@users.noreply.github.com> Date: Tue, 5 Sep 2023 07:23:38 -0600 Subject: [PATCH] swapped over to json for output If two servers were found at the same time, they might try to write to the xlsx file at the same time. this could corrupt the file. outputting to json, and just using another script to convert is much safer. --- README.md | 12 +++++++++++- json2xlsx.py | 18 +++++++++++++++++ srvstatus.py | 55 +++++++++++++++++++++++++++++----------------------- 3 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 json2xlsx.py diff --git a/README.md b/README.md index 5104dd2..a06f6ee 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,15 @@ Usage: Usage: srvstatus.py -p IP srvstatus.py -f inlist.txt -srvstatus.py -f inlist.txt -o outfile.xlsx +srvstatus.py -f inlist.txt -o outfile.json ``` + +Then convert json to xlsx using: +``` +json2xlsx.py infile.json outfile.xlsx +``` + +Dependencies: +``` +Pillow mcstatus openpyxl +``` \ No newline at end of file diff --git a/json2xlsx.py b/json2xlsx.py new file mode 100644 index 0000000..001f738 --- /dev/null +++ b/json2xlsx.py @@ -0,0 +1,18 @@ +import sys +import json +from openpyxl import Workbook + +inputfile = sys.argv[1] +outputfile = sys.argv[2] + +book = Workbook() +sheet = book.active + +sheet.append(("ip", "latency", "pver", "ver", "cplayers", "mplayers", "motd", "isicon")) + +with open(inputfile) as f: + data = json.load(f) + for entry in data: + sheet.append((entry["ip"], entry["latency"], entry["pver"], entry["ver"], entry["cplayers"], entry["mplayers"], entry["motd"], entry["isicon"])) + +book.save(outputfile) \ No newline at end of file diff --git a/srvstatus.py b/srvstatus.py index 130fd07..44729de 100644 --- a/srvstatus.py +++ b/srvstatus.py @@ -2,38 +2,34 @@ import io import math import base64 import sys +import json from time import sleep from threading import Thread from PIL import Image from mcstatus import JavaServer -from openpyxl import load_workbook -from openpyxl import Workbook - - imgsize = (16,16) sleeptime = 0.1 nullimg = b"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaklEQVQ4T62TWw7AIAgEl/sf2qoRY4ywa1tD/JvhoRjGKUAN/RhQY1y3sKdpEltht2Z17Mmm4A3cW3AjE+yVTk4RnNqUBdGMJEE2YCpgr5MKGNymHwoUOBSo8FGw/j72J1LBDfzPMn1d5wfNZUf5qKNxAQAAAABJRU5ErkJggg==" threadcount = 1 +savecount = 5 +foundcount = 0 outputfilename = None def appenddata(ip, latency, pver, ver, cplayers, mplayers, motd, isicon): - book = None - sheet = None + #with open("output.txt", "a") as file: + # file.write(f"{ip}|{latency}|{pver}|{ver}|{cplayers}|{mplayers}|{motd}|{isicon}\n") + data = None try: - book = load_workbook(filename=outputfilename) - sheet = book.active + with open(outputfilename, "r") as file: + data = json.load(file) except: - book = Workbook() - sheet = book.active - sheet.append(("ip", "latency", "pver", "ver", "cplayers", "mplayers", "motd", "isicon")) - - - sheet.append((ip, latency, pver, ver, cplayers, mplayers, motd, isicon)) - - book.save(outputfilename) + appenddata(ip, latency, pver, ver, cplayers, mplayers, motd, isicon) + data.append({"ip": ip, "latency": latency, "pver": pver, "ver": ver, "cplayers": cplayers, "mplayers": mplayers, "motd": motd, "isicon": isicon}) + with open(outputfilename, "w") as file: + json.dump(data, file) def img2ascii(icon): @@ -82,9 +78,6 @@ def scanip(ip): motdtxt = status.motd.to_plain() - if outputfilename != None: - appenddata(ip, status.latency, ver.protocol, ver.name, players.online, players.max, motdtxt, isicon) - motd = ["", ""] if "\n" in motdtxt: split = motdtxt.split("\n") @@ -112,10 +105,14 @@ def scanip(ip): line += f"{motd[1]}" output += f"{line}\n" - #with open("output.txt", "a") as file: - # file.write(f"{output}\n") print(f"{output}\n") # If everything isn't printed at the same time, the output text could become mixed. + + global foundcount + foundcount += 1 + if outputfilename != None: + appenddata(ip, math.ceil(status.latency), ver.protocol, ver.name, players.online, players.max, motdtxt, isicon) threadcount -= 1 + return True threads = [] @@ -124,8 +121,15 @@ if sys.argv[1] == "-p": if not scanip(sys.argv[2]): print("Server not online") elif sys.argv[1] == "-f": - if sys.argv[3] == "-o": + if len(sys.argv) == 4 and sys.argv[3] == "-o": outputfilename = sys.argv[4] + try: + open(outputfilename, "r") + except: + with open(outputfilename, "a") as file: + file.write("[]") + with open(outputfilename, "r") as file: + data = json.load(file) with open(sys.argv[2]) as file: length = sum(1 for line in open(sys.argv[2])) @@ -137,8 +141,9 @@ elif sys.argv[1] == "-f": per = round(100*(index/length), 2) pergap = ' '*(6-len(str(per))) thrgap = ' '*(3-len(str(threadcount))) + fndgap = ' '*(4-len(str(foundcount))) - print(f"Scanning IP: {ip}{ipgap} {pergap}{per}% done {thrgap} {threadcount} pending", end='\r') + print(f"Scanning IP: {ip}{ipgap} {pergap}{per}% done {thrgap} {threadcount} pending {fndgap}{foundcount} found", end='\r') thread = Thread(target = scanip, args = (ip, )) thread.start() threads.append(thread) @@ -148,8 +153,10 @@ elif sys.argv[1] == "-f": for thread in threads: thread.join() + cursavecount = 10 + appenddata("ip", "latency", "pver", "ver", "cplayers", "mplayers", "motd", "isicon") else: print("Usage:\n"+\ "srvstatus.py -p IP\n"+\ "srvstatus.py -f inlist.txt\n"+\ - "srvstatus.py -f inlist.txt -o outfile.xlsx") + "srvstatus.py -f inlist.txt -o outfile.xlsx") \ No newline at end of file