def fingerprint(self): """Select num_probes most useful paths, and fetch them from the site at url. Return an ordered list of possible versions or []. """ self._load_db() paths = wafu.pick_fingerprint_files(self.path_nodes, self.all_versions) self.logger.logStartFingerprint(self.url, self.app_name) self.error_page_fingerprint = wafu.identify_error_page(self.url) possible_vers = [] for path in paths[:self.num_probes]: curr_vers = self.fingerprint_file(path) if curr_vers: possible_vers.append(curr_vers) if self._host_down_errors >= HOST_DOWN_THRESHOLD: break ver_set = wafu.collapse_version_possibilities(possible_vers) self.ver_list = list(ver_set) #if more than one possibility, try to narrow it by winnowing! if len(self.ver_list) > 1 and self.winnow: print "ver_list before winnowing:" for v in self.ver_list: print v.vstring print "\n" self.winnow_versions(possible_vers) ver_set = wafu.collapse_version_possibilities(possible_vers) self.ver_list = list(ver_set) self.ver_list.sort() if len(self.ver_list) > 1: self.best_guess = wafu.pick_likely_version(self.ver_list) elif len(self.ver_list) == 1: self.best_guess = self.ver_list[0] else: self.best_guess = None self.logger.logFinishFingerprint(self.ver_list, self.best_guess) return self.ver_list