From d331c2caacc1534a8409e0e7bac792f0b2e26cd4 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@cd1c1023-2f26-0410-ae45-c471fc1f0318> Date: Sun, 11 Nov 2007 16:44:38 +0000 Subject: [PATCH] adding reagent tool md5remote that remotely checks packages hash git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@657 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- libraries/activatorTools.py | 8 +-- libraries/outputTools.py | 2 +- libraries/reagentTools.py | 114 +++++++++++++++++++++++++++++++++--- server/reagent | 1 + 4 files changed, 111 insertions(+), 14 deletions(-) diff --git a/libraries/activatorTools.py b/libraries/activatorTools.py index 7798fbca3..e2508bd26 100644 --- a/libraries/activatorTools.py +++ b/libraries/activatorTools.py @@ -70,8 +70,8 @@ def sync(options, justTidy = False): # if packages are ok, we can sync the database database(["sync"]) # now check packages checksum - import databaseTools - databaseTools.database(['md5check','--noask']) + import reagentTools + reagentTools.database(['md5check','--noask']) time.sleep(2) if (not activatorRequestNoAsk): # ask question @@ -670,8 +670,8 @@ def packages(options): # Now we should start to check all the packages in the packages directory if (activatorRequestPackagesCheck): - import databaseTools - databaseTools.database(['md5check']) + import reagentTools + reagentTools.database(['md5check']) def database(options): diff --git a/libraries/outputTools.py b/libraries/outputTools.py index 9929f0b9c..b5a6eaf49 100644 --- a/libraries/outputTools.py +++ b/libraries/outputTools.py @@ -263,5 +263,5 @@ def writechar(char): def readtext(request): xtermTitle("Entropy needs your attention") - text = raw_input(request) + text = raw_input(request) # using readline module return text \ No newline at end of file diff --git a/libraries/reagentTools.py b/libraries/reagentTools.py index 3a918ac58..4144c65cd 100644 --- a/libraries/reagentTools.py +++ b/libraries/reagentTools.py @@ -949,7 +949,7 @@ def database(options): pass dbconn.closeDB() print_info(red(" * ")+bold("WARNING")+red(": database file already exists. Overwriting.")) - rc = entropyTools.askquestion("\n Do you want to continue ?") + rc = askquestion("\n Do you want to continue ?") if rc == "No": exit(0) os.remove(etpConst['etpdatabasefilepath']) @@ -1099,7 +1099,7 @@ def database(options): atom = dbconn.retrieveAtom(pkg) print_info(red(" (*) ")+bold(atom)) - rc = entropyTools.askquestion(" Would you like to continue ?") + rc = askquestion(" Would you like to continue ?") if rc == "No": exit(0) @@ -1141,7 +1141,7 @@ def database(options): # change filename remotely for uri in etpConst['activatoruploaduris']: - print_info(green(" * ")+darkred(atom+": ")+red("Moving file remotely on: ")+entropyTools.extractFTPHostFromUri(uri), back = True) + print_info(green(" * ")+darkred(atom+": ")+red("Moving file remotely on: ")+extractFTPHostFromUri(uri), back = True) ftp = mirrorTools.handlerFTP(uri) ftp.setCWD(etpConst['binaryurirelativepath']) @@ -1202,7 +1202,7 @@ def database(options): print_info(red("\t (*) ")+bold(pkgatom)+blue(" [")+red(branch)+blue("]")) # ask to continue - rc = entropyTools.askquestion(" Would you like to continue ?") + rc = askquestion(" Would you like to continue ?") if rc == "No": exit(0) @@ -1246,9 +1246,11 @@ def database(options): # catch the names pkgs2check = [] for pkg in mypackages: - results = dbconn.searchPackages(pkg) - for i in results: - pkgs2check.append(i) + result = dbconn.atomMatch(pkg) + if result[0] != -1: + iatom = dbconn.retrieveAtom(result[0]) + ibranch = dbconn.retrieveBranch(result[0]) + pkgs2check.append((iatom,result[0],ibranch)) if (not worldSelected): print_info(red(" This is the list of the packages that would be checked:")) @@ -1274,7 +1276,7 @@ def database(options): toBeDownloaded.append([idpackage,pkgfile,pkgbranch]) if (not databaseRequestNoAsk): - rc = entropyTools.askquestion(" Would you like to continue ?") + rc = askquestion(" Would you like to continue ?") if rc == "No": exit(0) @@ -1319,7 +1321,7 @@ def database(options): pkgfile = os.path.basename(pkgfile) print_info(" ("+red(str(currentcounter))+"/"+blue(totalcounter)+") "+red("Checking hash of ")+yellow(pkgfile)+red(" in branch: ")+blue(pkgbranch)+red(" ..."), back = True) storedmd5 = dbconn.retrieveDigest(pkg) - result = entropyTools.compareMd5(etpConst['packagesbindir']+"/"+pkgbranch+"/"+pkgfile,storedmd5) + result = compareMd5(etpConst['packagesbindir']+"/"+pkgbranch+"/"+pkgfile,storedmd5) if (result): # match ! pkgMatch += 1 @@ -1346,3 +1348,97 @@ def database(options): print_info(green(" Number of happy downloads:\t\t")+str(pkgDownloadedSuccessfully)) print_info(red(" Number of failed downloads:\t\t")+str(pkgDownloadedError)) + + # used by reagent + elif (options[0] == "md5remote"): + + print_info(green(" * ")+red("Integrity verification of the selected packages:")) + + mypackages = options[1:] + dbconn = databaseTools.openServerDatabase(readOnly = True, noUpload = True) + worldSelected = False + + if (len(mypackages) == 0): + # check world + # create packages list + worldSelected = True + pkgs2check = dbconn.listAllIdpackages() + elif (mypackages[0] == "world"): + # check world + # create packages list + worldSelected = True + pkgs2check = dbconn.listAllIdpackages() + else: + # catch the names + pkgs2check = [] + for pkg in mypackages: + result = dbconn.atomMatch(pkg) + if result[0] != -1: + pkgs2check.append(result[0]) + else: + print_warning(red("ATTENTION: ")+blue("cannot match: ")+bold(pkg)) + + if (not worldSelected): + print_info(red(" This is the list of the packages that would be checked:")) + else: + print_info(red(" All the packages in the Entropy Packages repository will be checked.")) + + + if (not worldSelected): + for idpackage in pkgs2check: + pkgatom = dbconn.retrieveAtom(idpackage) + pkgbranch = dbconn.retrieveBranch(idpackage) + pkgfile = os.path.basename(dbconn.retrieveDownloadURL(idpackage)) + print_info(green(" - ")+red(pkgatom)+" -> "+bold(str(pkgbranch)+"/"+pkgfile)) + + if (not databaseRequestNoAsk): + rc = askquestion(" Would you like to continue ?") + if rc == "No": + exit(0) + + import remoteTools + for uri in etpConst['activatoruploaduris']: + + # statistic vars + pkgMatch = 0 + pkgNotMatch = 0 + currentcounter = 0 + print_info(green(" * ")+yellow("Working on ")+bold(extractFTPHostFromUri(uri)+red(" mirror."))) + brokenPkgsList = [] + totalcounter = str(len(pkgs2check)) + + + for idpackage in pkgs2check: + + currentcounter += 1 + pkgfile = dbconn.retrieveDownloadURL(idpackage) + pkgbranch = dbconn.retrieveBranch(idpackage) + pkgfilename = os.path.basename(pkgfile) + + print_info(" ("+red(str(currentcounter))+"/"+blue(totalcounter)+") "+red("Checking hash of ")+blue(pkgbranch+"/"+pkgfilename), back = True) + ckOk = False + ck = remoteTools.getRemotePackageChecksum(extractFTPHostFromUri(uri),pkgfilename, pkgbranch) + if ck == None: + print_warning(" "+red(" -> Digest verification of ")+green(pkgfilename)+bold(" not supported")) + elif len(ck) == 32: + ckOk = True + + if (ckOk): + pkgMatch += 1 + else: + pkgNotMatch += 1 + print_error(red(" Package ")+blue(pkgbranch+"/"+pkgfilename)+red(" is NOT healthy.")) + brokenPkgsList.append(pkgbranch+"/"+pkgfilename) + + if (brokenPkgsList): + print_info(blue(" * This is the list of broken packages: ")) + for bp in brokenPkgsList: + print_info(red(" * Package: ")+bold(bp)) + + # print stats + print_info(blue(" * Statistics for "+extractFTPHostFromUri(uri)+":")) + print_info(yellow(" Number of checked packages:\t\t")+str(pkgMatch+pkgNotMatch)) + print_info(green(" Number of healthy packages:\t\t")+str(pkgMatch)) + print_info(red(" Number of broken packages:\t\t")+str(pkgNotMatch)) + + dbconn.closeDB() \ No newline at end of file diff --git a/server/reagent b/server/reagent index d922de16e..022099aac 100644 --- a/server/reagent +++ b/server/reagent @@ -53,6 +53,7 @@ def print_help(): print_info(" \t\t"+green("create-empty-database")+"\t\t Create an empty Entropy database file in the specified ") print_info(" \t\t"+green("switchbranch")+"\t\t\t Switch to the specified branch, a package, a list of packages, world") print_info(" \t\t"+green("md5check")+"\t\t\t Check digest of a package, a list of packages, world") + print_info(" \t\t"+green("md5remote")+"\t\t\t Compare digest of a package between database and mirrors") print_info(" \t"+green("deptest")+yellow("\t\t Look for unsatisfied dependencies inside database")) print_info(" \t"+green("depends")+yellow("\t\t Regenerate depends table (plus database lock and bump)")) print_info(" \t\t"+red("--quiet")+"\t\t\t\t just print the dependencies list")