diff --git a/lib/core/progress.py b/lib/core/progress.py index 0db932530..dfb13765a 100644 --- a/lib/core/progress.py +++ b/lib/core/progress.py @@ -8,6 +8,7 @@ See the file 'doc/COPYING' for copying permission from lib.core.common import getUnicode from lib.core.common import dataToStdout from lib.core.data import conf +from lib.core.data import kb class ProgressBar(object): """ @@ -22,6 +23,7 @@ class ProgressBar(object): self._span = self._max - self._min self._width = totalWidth if totalWidth else conf.progressWidth self._amount = 0 + self._times = [] self.update() def _convertSeconds(self, value): @@ -50,7 +52,7 @@ class ProgressBar(object): percentDone = int(percentDone) # Figure out how many hash bars the percentage should be - allFull = self._width - 2 + allFull = self._width - len("100%% [] %s/%s ETA 00:00" % (self._max, self._max)) numHashes = (percentDone / 100.0) * allFull numHashes = int(round(numHashes)) @@ -67,6 +69,22 @@ class ProgressBar(object): percentString = getUnicode(percentDone) + "%" self._progBar = "%s %s" % (percentString, self._progBar) + def progress(self, deltaTime, newAmount, threads=1): + """ + This method saves item delta time and shows updated progress bar with calculated eta + """ + + if len(self._times) <= ((self._max * 3) / 100) or newAmount == self._max: + eta = 0 + else: + midTime = sum(self._times) / len(self._times) + midTimeWithLatest = (midTime + deltaTime) / 2 + eta = midTimeWithLatest * (self._max - newAmount) / threads + + self._times.append(deltaTime) + self.update(newAmount) + self.draw(eta) + def draw(self, eta=0): """ This method draws the progress bar if it has changed @@ -78,8 +96,11 @@ class ProgressBar(object): if eta and self._amount < self._max: dataToStdout("\r%s %d/%d ETA %s" % (self._progBar, self._amount, self._max, self._convertSeconds(int(eta)))) else: - blank = " " * (80 - len("\r%s %d/%d" % (self._progBar, self._amount, self._max))) - dataToStdout("\r%s %d/%d%s" % (self._progBar, self._amount, self._max, blank)) + dataToStdout("\r%s\r" % (" " * (self._width - 1))) + if self._amount < self._max: + dataToStdout("%s %d/%d" % (self._progBar, self._amount, self._max)) + else: + kb.prependFlag = False def __str__(self): """ diff --git a/lib/techniques/blind/inference.py b/lib/techniques/blind/inference.py index 08b9ff45d..b0992d78a 100644 --- a/lib/techniques/blind/inference.py +++ b/lib/techniques/blind/inference.py @@ -140,7 +140,6 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None if showEta: progress = ProgressBar(maxValue=length) - progressTime = [] if timeBasedCompare and conf.threads > 1: warnMsg = "multi-threading is considered unsafe in time-based data retrieval. Going to switch it off automatically" @@ -354,18 +353,6 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None return None - def etaProgressUpdate(charTime, index): - if len(progressTime) <= ((length * 3) / 100): - eta = 0 - else: - midTime = sum(progressTime) / len(progressTime) - midTimeWithLatest = (midTime + charTime) / 2 - eta = midTimeWithLatest * (length - index) / conf.threads - - progressTime.append(charTime) - progress.update(index) - progress.draw(eta) - # Go multi-threading (--threads > 1) if conf.threads > 1 and isinstance(length, int) and length > 1: threadData = getCurrentThreadData() @@ -404,7 +391,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None if kb.threadContinue: if showEta: - etaProgressUpdate(time.time() - charStart, threadData.shared.index[0]) + progress.progress(time.time() - charStart, threadData.shared.index[0], numThreads) elif conf.verbose >= 1: startCharIndex = 0 endCharIndex = 0 @@ -496,7 +483,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None # Did we have luck? if result: if showEta: - etaProgressUpdate(time.time() - charStart, len(commonValue)) + progress.progress(time.time() - charStart, len(commonValue)) elif conf.verbose in (1, 2) or hasattr(conf, "api"): dataToStdout(filterControlChars(commonValue[index - 1:])) @@ -546,7 +533,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None partialValue += val if showEta: - etaProgressUpdate(time.time() - charStart, index) + progress.progress(time.time() - charStart, index) elif conf.verbose in (1, 2) or hasattr(conf, "api"): dataToStdout(filterControlChars(val)) @@ -578,7 +565,7 @@ def bisection(payload, expression, length=None, charsetType=None, firstChar=None infoMsg = "\r[%s] [INFO] retrieved: %s %s\n" % (time.strftime("%X"), filterControlChars(finalValue), " " * retrievedLength) dataToStdout(infoMsg) else: - if conf.verbose in (1, 2) or showEta and not hasattr(conf, "api"): + if conf.verbose in (1, 2) and not showEta and not hasattr(conf, "api"): dataToStdout("\n") if (conf.verbose in (1, 2) and showEta) or conf.verbose >= 3: