def getpathtoupdate(dbcursor, filedigest): global _wdblogger hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wdblogger.log(logging.DEBUG, "[WUAPIS] argument not valid hex: getpathtoupdate") return hexfiledigest # Verify file is available sql = ("SELECT * FROM " + globs.UPDATEFILESDBNAME + " WHERE " + "FileName = '{}'").format(hexfiledigest[2:]) dbcursor.execute(sql) result = dbcursor.fetchall() if len(result) == 0: _wdblogger.log(logging.DEBUG, "[BAMA] Did not find entries from getpathtoupdate") return result diskpath = "" for row in result: for column in row.keys(): if column == "DiskPath": diskpath = row[column] _wdblogger.log(logging.DEBUG, "[WUAPIS] Found entries from getpathtoupdate") return diskpath
def kbtosupersedingkb(kbarticle, filedigest): global _wulogger result = [] try: kbarticleint = int(kbarticle) except ValueError: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid int: kbtosupersedingkb" + "(" + str(kbarticle) + ")") return result hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log(logging.DEBUG, "[WUAPIS] argument not valid hex: kbtosupersedingkb") return result updateinfo = [] fdlist = getKBtoufiledigest(kbarticle, hexfiledigest) if len(fdlist) == 0: return result for filed in fdlist: superfiles = getsupersedingfromfile(filed[0]) if len(superfiles) == 0: continue for superfile in superfiles: uinfo = findupdateinfo(superfile[1]) if len(uinfo) == 0: continue if uinfo[0][13] is not None: updateinfo.append(uinfo[0][13]) kbsorted = [] if len(updateinfo) != 0: kbsorted = list(sorted(set(updateinfo))) _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from kbtosupersedingkb (" + str(kbarticle) + ")") return kbsorted
def getsupersededfromfiledigest_custom(filedigest): ''' File to superseded updates; Determines if Digest is superseding (list all superseded updates for file if any) ''' global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid hex: getsupersededfromfile") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;' 'DECLARE @supersededupdates table ' '(FileDigest varbinary(max), RevisionID INT, FileName varchar(max), ' 'LegacyName varchar(max), SupersededUpdateID uniqueidentifier);' 'INSERT INTO @supersededupdates (FileDigest, RevisionID, FileName, LegacyName, SupersededUpdateID) ' 'SELECT ffr.FileDigest, ffr.RevisionID, f.FileName, u.LegacyName, rsu.SupersededUpdateID ' 'FROM SUSDB.dbo.tbFileForRevision as ffr ' 'JOIN SUSDB.dbo.tbBundleDependency tbd ON tbd.BundledRevisionID = ffr.RevisionID ' 'JOIN SUSDB.dbo.tbRevisionSupersedesUpdate rsu ON rsu.RevisionID = tbd.RevisionID ' 'JOIN SUSDB.dbo.tbUpdate u ON u.UpdateID = rsu.SupersededUpdateID ' 'JOIN SUSDB.dbo.tbFile f ON f.FileDigest = ffr.FileDigest ' 'WHERE ffr.FileDigest = {};' 'SELECT * FROM @supersededupdates').format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log( logging.DEBUG, "[WUAPIS] Did not find entries from getsupersededfromfile") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getsupersededfromfile (" + str(filedigest) + ")") wsuscursor.close() return result
def getKBtoufiledigest(kbarticle, filedigest): ''' KB to filedigest with matching platform ''' global _wulogger result = [] try: kbarticleint = int(kbarticle) except ValueError: _wulogger.log(logging.DEBUG, "[WUAPIS] argument not valid int: getKBtofiledigest") return result hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log(logging.DEBUG, "[WUAPIS] argument not valid hex: getKBoffiledigest") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;SELECT f.FileDigest, f.FileName, kbafr.KBArticleID ' 'FROM SUSDB.dbo.tbKBArticleForRevision kbafr ' 'JOIN SUSDB.dbo.tbBundleDependency bd ON kbafr.RevisionID = bd.RevisionID ' 'JOIN SUSDB.dbo.tbFileForRevision ffr ON ffr.RevisionID = bd.BundledRevisionID ' 'JOIN SUSDB.dbo.tbFile f ON f.FileDigest = ffr.FileDigest ' 'WHERE kbafr.KBArticleID = {} AND ffr.FileDigest = {} ' '').format(str(kbarticle), hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log(logging.DEBUG, "[WUAPIS] Did not find entries from getKBtofiledigest") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getKBtofiledigest (" + str(kbarticle) + ")") wsuscursor.close() return result
def getsupersedingfromfile(filedigest): global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid hex: getsupersedingfromfile") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( '' 'SET NOCOUNT ON;DECLARE @supersedingupdates table (FileDigest varbinary(max), RevisionID INT, ' 'LegacyName varchar(max), SuperRevisionID int);' 'INSERT INTO @supersedingupdates (FileDigest, RevisionID, LegacyName, SuperRevisionID) ' ' SELECT ffr.FileDigest, ffr.RevisionID, u.LegacyName, rsu.RevisionID FROM SUSDB.dbo.tbFileForRevision as ffr' ' JOIN SUSDB.dbo.tbBundleDependency tbd ON tbd.BundledRevisionID = ffr.RevisionID' ' JOIN SUSDB.dbo.tbRevision r ON r.RevisionID = tbd.RevisionID' ' JOIN SUSDB.dbo.tbUpdate u ON u.LocalUpdateID = r.LocalUpdateID' ' JOIN SUSDB.dbo.tbRevisionSupersedesUpdate rsu ON rsu.SupersededUpdateID = u.UpdateID' ' WHERE ffr.FileDigest = {};' 'SELECT * FROM tbUpdate WHERE LocalUpdateID IN (SELECT LocalUpdateID FROM tbRevision' ' WHERE RevisionID IN (SELECT SuperRevisionID FROM @supersedingupdates));' ).format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log( logging.DEBUG, "[WUAPIS] Did not find entries from getsupersedingfromfile") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getsupersedingfromfile (" + str(filedigest) + ")") wsuscursor.close() return result
def getfiledigestattributeswodu(filedigest): ''' Digest (cab/exe) to KB (file to KB) with other WSUS information without DefinitionUpdates. May return multiple results. ''' global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid hex: getfiledigestattributeswodu") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;SELECT * FROM SUSDB.dbo.tbFileForRevision AS ffr' ' JOIN SUSDB.dbo.tbRevision r ON r.RevisionID = ffr.RevisionID' ' JOIN SUSDB.dbo.tbUpdate u ON u.LocalUpdateID = r.LocalUpdateID' ' JOIN SUSDB.PUBLIC_VIEWS.vUpdate vu ON vu.UpdateId = u.UpdateID' " WHERE ffr.FileDigest = {} AND ClassificationId != 'E0789628-CE08-4437-BE74-2495B842F43B'" ).format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log( logging.DEBUG, "[WUAPIS] Did not find entries from getfiledigestattributeswodu") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getfiledigestattributeswodu (" + str(filedigest) + ")") wsuscursor.close() return result
def getfiledigestbattributes(filedigest): ''' Digest (cab/exe) to KB (file to KB) with other WSUS information (Bundled) ''' global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid hex: getfiledigestbattributes") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;SELECT * FROM SUSDB.dbo.tbFileForRevision AS ffr ' 'JOIN SUSDB.dbo.tbBundleDependency tbd ON tbd.BundledRevisionID = ffr.RevisionID ' 'JOIN SUSDB.dbo.tbRevision r ON r.RevisionID = tbd.RevisionID ' 'JOIN SUSDB.dbo.tbUpdate u ON u.LocalUpdateID = r.LocalUpdateID ' 'JOIN SUSDB.PUBLIC_VIEWS.vUpdate vu ON vu.UpdateId = u.UpdateID ' ' WHERE ffr.FileDigest = {}').format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log( logging.DEBUG, "[WUAPIS] Did not find entries from getfiledigestbattributes") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getfiledigestbattributes (" + str(filedigest) + ")") wsuscursor.close() return result
def getsupersededfromfiledigest(filedigest): ''' Lists all superseded updates ''' global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] argument not valid hex: getsupersededfromfile") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;SELECT * FROM SUSDB.dbo.tbFileForRevision as ffr ' 'JOIN SUSDB.dbo.tbBundleDependency tbd ON tbd.BundledRevisionID = ffr.RevisionID ' 'JOIN SUSDB.dbo.tbRevisionSupersedesUpdate rsu ON rsu.RevisionID = tbd.RevisionID ' 'JOIN SUSDB.dbo.tbUpdate u ON u.UpdateID = rsu.SupersededUpdateID ' 'WHERE ffr.FileDigest = {}').format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log( logging.DEBUG, "[WUAPIS] Did not find entries from getsupersededfromfile") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getsupersededfromfile (" + str(filedigest) + ")") wsuscursor.close() return result
def getKBoffiledigest(filedigest): ''' Digest (cab/exe) to KB (file to KB) ''' global _wulogger result = [] hexfiledigest = verifyhex(filedigest) if hexfiledigest is None: _wulogger.log(logging.DEBUG, "[WUAPIS] argument not valid hex: getKBoffiledigest") return result wsuscursor = globs.DBWSUSCONN.cursor() tsql = ( 'SET NOCOUNT ON;SELECT * FROM SUSDB.dbo.tbFileForRevision as ffr ' 'JOIN SUSDB.dbo.tbBundleDependency tbd ON ffr.RevisionID = tbd.BundledRevisionID ' 'JOIN SUSDB.dbo.tbKBArticleForRevision kbfr ON kbfr.RevisionID = tbd.RevisionID ' 'WHERE ffr.FileDigest = {}').format(hexfiledigest) check = wsuscursor.execute(tsql) if check is None: _wulogger.log(logging.DEBUG, "[WUAPIS] Did not find entries from getKBoffiledigest") wsuscursor.close() return result result = wsuscursor.fetchall() _wulogger.log( logging.DEBUG, "[WUAPIS] Found entries from getKBoffiledigest (" + str(filedigest) + ")") wsuscursor.close() return result
def getfileattrbyfnprodv(filename, prodversion): bamcursor = globs.DBCONN.cursor() wsuscursor = globs.DBWSUSCONN.cursor() filelist = prodvgtebyname(bamcursor, filename, prodversion) hashlist = [] for row in filelist: for column in row.keys(): if column == 'UpdateId': result = findupdate(row[column]) if len(result) == 0: continue hexfiledigest = verifyhex("0x" + row[column]) if hexfiledigest is None: _wulogger.log( logging.DEBUG, "[WUAPIS] {} not valid hex: getfileattrbyfnprodv". format(row[column])) continue hashlist.append(hexfiledigest) fileattrlist = [] for hash in hashlist: r = getfiledigestbattributes(hash) if len(r) == 0: continue fileattrlist.append(r) bamcursor.close() wsuscursor.close() return fileattrlist