Skip to content

Instantly share code, notes, and snippets.

@thurask
Last active November 4, 2020 16:48
Show Gist options
  • Save thurask/02b6b75adce4d59a22dfcd291d244104 to your computer and use it in GitHub Desktop.
Save thurask/02b6b75adce4d59a22dfcd291d244104 to your computer and use it in GitHub Desktop.
#!/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()
@kmrbillya
Copy link

it it checking all new firmwares

@kmrbillya
Copy link

not working bro

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment