Last active
November 4, 2020 16:48
-
-
Save thurask/02b6b75adce4d59a22dfcd291d244104 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
"""Check for Samsung updates.""" | |
import argparse | |
import sys | |
import requests | |
try: | |
from defusedxml import ElementTree | |
except (ImportError, AttributeError): | |
from xml.etree import ElementTree | |
CSCDICT = {'OYV': ['BMC', 'BWA', 'CHR', 'ESK', 'FMC', 'GLW', 'KDO', 'MTB', 'RWC', 'TLS', 'VMC', 'VTR', 'XAC'], 'OYM': ['AGC', 'AIO', 'ATT', 'BST', 'CCT', 'GCF', 'LRA', 'SPR', 'TFN', 'TMB', 'TMK', 'USC', 'VMU', 'VZW', 'XAA', 'XAS'], 'OYN': ['ACG', 'ATT', 'BST', 'CCT', 'GCF', 'LRA', 'SPR', 'TFN', 'TMB', 'USC', 'VMU', 'VZW', 'XAA', 'XAS'], 'OYA': ['BMC', 'BWA', 'CHR', 'ESK', 'FMC', 'GLW', 'KDO', 'MTB', 'RWC', 'TLS', 'VMC', 'VTR', 'XAC'], 'OKR': ['KTC', 'LUC', 'SKC'], 'UWE': ['BAT', 'CWW', 'DOR', 'ICE', 'IUS', 'JDI', 'PCW', 'TDR', 'UNE'], 'UWC': ['CHE', 'CHV', 'CHX'], 'UWB': ['ALE', 'ANC', 'BVO', 'PNT', 'PSN', 'PSP', 'PVT', 'UPO', 'UYO'], 'OXM': ['ACR', 'AFG', 'AFR', 'ARO', 'ATO', 'AUT', 'BGL', 'BNG', 'BRI', 'BTC', 'BTU', 'CAC', 'CAM', 'CEL', 'CHO', 'COO', 'CPW', 'DBT', 'DKR', 'ECT', 'EGY', 'EON', 'ETL', 'EUR', 'GLB', 'ILO', 'INS', 'ITV', 'KSA', 'LAO', 'LUX', 'LYS', 'MAT', 'MID', 'MM1', 'MWD', 'MYM', 'NEE', 'NPL', 'ORX', 'PAK', 'PCL', 'PHE', 'PHN', 'PTR', 'ROM', 'SER', 'SIN', 'SKZ', 'SLK', 'SMA', 'SMP', 'STH', 'TEB', 'THL', 'THR', 'TMC', 'TPA', 'TPH', 'TTT', 'TUN', 'TUR', 'WTL', 'XEF', 'XEH', 'XEO', 'XEU', 'XFA', 'XFE', 'XME', 'XSG', 'XSP', 'XTC', 'XXV', 'ZTO', 'MTZ', 'SEB', 'SEE', 'SEK'], 'OXJ': ['AME', 'MEO', 'SFR'], 'OWT': ['CHT', 'COB', 'CRM', 'EBE', 'NBS', 'PBS', 'SAM', 'TGU', 'TMM', 'UFN', 'UFU', 'ZVV'], 'OWM': ['CGU', 'COL', 'CTE', 'ETE', 'TGP'], 'OWA': ['CDR', 'CHL', 'COM', 'CPA', 'CRC', 'CTI', 'CTP', 'CTU', 'ECO', 'PCT', 'PET', 'PGU', 'TCE', 'ZTA'], 'OVF': ['ATL', 'AVF', 'CNX', 'CYV', 'MOB', 'MTL', 'OMN', 'PRO', 'SIM', 'SWC', 'TCL', 'VD2', 'VDC', 'VDF', 'VDH', 'VDI', 'VGR', 'VIP', 'VOD', 'XFV'], 'OTF': ['O2U', 'XEC'], 'OLN': ['NZC', 'OPS', 'PNG', 'TEL', 'TNZ', 'VAU', 'VFJ', 'VNZ', 'XNX', 'XNZ', 'XSA'], 'OLE': ['XID'], 'OGC': ['AMO', 'FTM', 'OPV', 'ORO', 'ORS'], 'ODX': ['COA', 'COS', 'CRO', 'DCO', 'DHR', 'DNL', 'DPL', 'DTM', 'MAX', 'MBM', 'TMH', 'TMS', 'TMZ', 'TNL', 'TPL', 'TRG'], 'CKH': ['3IE', 'DRE', 'H3G', 'HYS', 'HUI']} | |
def fubar(killme=True): | |
"""Error handler.""" | |
print("NOTHING FOUND") | |
if killme: | |
raise SystemExit | |
def multi_csc(csccheck): | |
"""Check if CSC is a multi-CSC.""" | |
cschup = csccheck.upper() | |
if csccheck.upper() in CSCDICT: | |
sentinel, ismulti = CSCDICT[cschup], False | |
else: | |
sentinel, ismulti = [cschup], True | |
return sentinel, ismulti | |
def grab(csc, hwid, test, killme=True): | |
"""Grab info from URL.""" | |
fname = "version.test" if test else "version" | |
url = "http://fota-cloud-dn.ospserver.net/firmware/{0}/{1}/{2}.xml".format(csc, hwid, fname) | |
req = requests.get(url) | |
if req.status_code != 200: | |
sentinel = None | |
fubar(killme) | |
else: | |
sentinel = req.text | |
return sentinel | |
def parse(data, killme=True, latest=False): | |
"""Parse grabbed info.""" | |
root = ElementTree.fromstring(data) | |
version = root.find("firmware").find("version") | |
lastver = version.find("latest").text | |
if latest: | |
sentinel = [lastver] | |
else: | |
upgrade = version.find("upgrade") | |
pastvers = [value.text for value in upgrade.findall("value")] | |
if lastver: | |
pastvers.insert(0, lastver) | |
if set(pastvers) == {None}: | |
fubar(killme) | |
sentinel = None | |
elif [_ for _ in pastvers if "/" in _]: | |
splitvers = [ver.split("/") for ver in pastvers] | |
splitvers.sort(key=lambda x: x[1]) | |
allvers = ["/".join(ver) for ver in splitvers] | |
sentinel = allvers | |
else: | |
sentinel = pastvers | |
return sentinel | |
def prettyprint(versions): | |
"""Pretty print versions.""" | |
for version in versions: | |
print(version) | |
def main(hwid, csc, test=False, latest=False, killme=True): | |
"""Main program.""" | |
if killme: | |
print("SAMSUNG UPDATE CHECKER") | |
print("DEVICE: {0}".format(hwid)) | |
print("CSC: {0}".format(csc)) | |
print("CHECKING...") | |
data = grab(csc, hwid, test, killme) | |
if data is None: | |
pass | |
else: | |
versions = parse(data, killme, latest) | |
if versions is None: | |
pass | |
else: | |
prettyprint(versions) | |
def parse_args(): | |
"""Parse command line.""" | |
parser = argparse.ArgumentParser() | |
parser.add_argument("hwid") | |
parser.add_argument("csc") | |
parser.add_argument("-t", "--test", dest="test", action="store_true", default=False) | |
parser.add_argument("-l", "--latest", dest="latest", action="store_true", default=False) | |
parser.add_argument("-m", "--multi-csc", dest="multicsc", action="store_true", default=False) | |
args = parser.parse_args(sys.argv[1:]) | |
if args.multicsc: | |
multicsc, killme = multi_csc(args.csc.upper()) | |
if not killme: | |
print("SAMSUNG UPDATE CHECKER") | |
for csc in multicsc: | |
main(args.hwid.upper(), csc.upper(), args.test, args.latest, killme) | |
else: | |
main(args.hwid.upper(), args.csc.upper(), args.test, args.latest) | |
if __name__ == "__main__": | |
parse_args() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
it it checking all new firmwares