Skip to content

Instantly share code, notes, and snippets.

@goofwear
Forked from thurask/samcheck.py
Created October 27, 2018 06:08
Show Gist options
  • Save goofwear/9dedb22416f4c70cbcfc3e4aeaaa22c5 to your computer and use it in GitHub Desktop.
Save goofwear/9dedb22416f4c70cbcfc3e4aeaaa22c5 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import argparse
import sys
try:
from defusedxml import ElementTree
except (ImportError, AttributeError):
from xml.etree import ElementTree
import requests
def fubar(killme=True):
print("NOTHING FOUND")
if killme:
raise SystemExit
def multi_csc(csccheck):
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"]}
if csccheck.upper() in cscdict:
return cscdict[csccheck.upper()], False
else:
return [csccheck.upper()], True
def grab(csc, hwid, test, killme=True):
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:
fubar(killme)
else:
return req.text
def parse(data, killme=True, latest=False):
root = ElementTree.fromstring(data)
version = root.find("firmware").find("version")
lastver = version.find("latest").text
if latest:
return [lastver]
else:
upgrade = version.find("upgrade")
pastvers = [value.text for value in upgrade.findall("value")]
pastvers.insert(0, lastver)
if set(pastvers) == {None}:
fubar(killme)
return None
else:
splitvers = [ver.split("/") for ver in pastvers]
splitvers.sort(key=lambda x: x[1])
allvers = ["/".join(ver) for ver in splitvers]
return allvers
def prettyprint(versions):
for version in versions:
print(version)
def main(hwid, csc, test=False, latest=False, killme=True):
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)
if __name__ == "__main__":
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()
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment