def compress_packet(self): def byte_padding(): padding = 8 - (len(self.bit_array) & 0x7) return 0 if padding == 8 else padding msb = self.bit_array[0] array_len = len(self.bit_array) sign_len = 1 assert sign_len < array_len while sign_len < array_len: if msb != self.bit_array[sign_len]: break sign_len += 1 self.stats["nbits"] += len(self.bit_array) + byte_padding() debug_print(" Payload %3d %s" % (len(self.bit_array), self.bit_array)) self.bit_array = self.bit_array[sign_len - 1:] compressed_bits = len(self.bit_array) # Make sure it's a multiple of 8 bits self.bit_array = msb * byte_padding() + self.bit_array debug_print(" Sent %3d %s (Compressed %s-bits)" % (len(self.bit_array), self.bit_array, compressed_bits)) self.stats["nbits_compressed"] += len(self.bit_array) assert len(self.bit_array) % 8 == 0, len(self.bit_array)
def __init__(self, owner, results, token): QtGui.QMainWindow.__init__(self) self.ui = ui_finished.Ui_finishedDialog() self.ui.setupUi(self) self.ui.progressBar.hide() self.done = False self.submitter = submit.ResultSubmitter() self.token = token; # generate a temporary file and store the results there _, tmpfile = tempfile.mkstemp(suffix='.gz') tf = gzip.open(tmpfile, 'wb') tf.write(json.dumps(results, sort_keys=True, indent=4)) tf.close() # store the tempfile path self.tmpfile = tmpfile utils.debug_print("Results saved to:" + tmpfile, utils.SUCC) self.ui.reviewPathLabel.setText('<b>' + tmpfile + '</b>') # signal/slot connections self.connect(self.ui.btnCancel, SIGNAL('clicked()'), self.cancel) self.connect(self.ui.btnNext, SIGNAL('clicked()'), self.next)
def get_bits(self, field, nbits, is_hex=False): if self.output is None: print("Error: packet output has not been set") exit(1) if nbits == 0: return None # Check whether we need to decompress more bits (by sign-extension) to allow the # required field to be read if nbits > self.bit: self.extend_msb(nbits - self.bit) if utils.debug: msg = "get_bits(%d) = b%s" % (nbits, self.bits[self.bit - nbits:self.bit]) if field is not None: msg += " -> %s" % field debug_print("b%s %s" % (self.bits, msg)) debug_print(" " * self.bit + "^") value = int(self.bits[self.bit - nbits:self.bit], 2) self.bit -= nbits self.bits_used += nbits if is_hex: self.output[field] = utils.as_hex(value, nbits) else: self.output[field] = value return value
def cancel(self): if self.confirmClose(): utils.debug_print("Cancelled scanning!", utils.ERR) self.scanThread.exit() quit() else: pass
def next(self): # check if we have actually selected some folders dirs = self.dir_model.getCheckList() if dirs == []: reply = QtGui.QMessageBox.warning(self, 'No directories selected', "You have not selected any directories. Would you like to attempt to work " + "out your home directory automatically?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: homeDirPath = os.getenv("HOME","") if homeDirPath != "": self.dir_model.addCheck(homeDirPath) else: utils.debug_print("Could not work out the home directory", utils.ERR) QtGui.QMessageBox.critical(self, 'Failed to detect home directory', "Failed to detect your home directory automatically. Please go back and select it manually.", QtGui.QMessageBox.Ok) return else: return # run the scan utils.debug_print("Folders selected:", utils.SUCC, False) print dirs self.close() d = surveyScanningDialog(self.app, dirs, self.token) d.setAttribute(Qt.WA_DeleteOnClose) d.exec_()
def next(self): utils.debug_print("Welcome screen confirmed", utils.SUCC) self.done = True #d = surveyFolderSelectionDialog(self.app) d = surveyTokenEntryDialog(self.app) d.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.close() d.exec_()
def finishedScanning(self): utils.debug_print("Finished scanning", utils.SUCC) # show results screen self.done = True self.close() d = surveyFinishedDialog(self.app, self.scanThread.results, self.token) d.setAttribute(Qt.WA_DeleteOnClose) d.exec_()
def walk(self, scanDirs): totalSize = 0 numFiles = 0 numDirs = 0 id = 0 for dir in scanDirs: for root, dirs, files in os.walk(dir, onerror=self.walkError): try: if self.exiting: return #utils.debug_print("DIR: " + root) numFiles += len(files) numDirs += 1 #self.emit(SIGNAL("scanned(int, int)"), numFiles, numDirs) # ignore filer snapshot dirs at the CL if '.snapshot' in dirs: dirs.remove('.snapshot') #print sum(getsize(join(root, name)) for name in files), totalSize += sum(getsize(join(root, name)) for name in files) #print "bytes in", len(files), "non-directory files" for f in files: #utils.debug_print("FILE: " + f) # create a dict for this file fp = join(root, f) mime = mimetypes.guess_type(fp, False) statinfo = str(os.stat(fp)) fileDict = {'elementID': sha1(fp).hexdigest(), 'size': getsize(fp), 'isDir': False, 'type': mime, 'namehash': sha1(f).hexdigest(), 'statinfo': statinfo, 'parent': sha1(fp).hexdigest() } self.results.append(fileDict) id += 1 for d in dirs: #utils.debug_print("SUBDIR: " + d) # create a dict for this subdirectory dp = join(root, d) mime = mimetypes.guess_type(dp, False) statinfo = str(os.stat(dp)) dirDict = {'elementID': sha1(dp).hexdigest(), 'size': getsize(join(root, d)), 'isDir': True, 'type': mime, 'namehash': sha1(d).hexdigest(), 'statinfo': statinfo, 'parent': sha1(fp).hexdigest() } self.results.append(dirDict) id += 1 except OSError as e: self.walkError(e) else: pass utils.debug_print("walked " + str(numFiles) + " files and " + str(numDirs) + " directories, totalling " + str(totalSize) + " bytes", utils.SUCC) # return the list of dicts (this will be MASSIVE) #print json.dumps(results, sort_keys=True, indent=4) return self.results
def check(self, msg=None): # Can only check that not more than 7-bits has not been used. if self.bit > 7: error = "Error: up to %d bits have not been assigned." % self.bit if msg is not None: error += " [%s]" % msg print(error) exit(1) if msg is not None: debug_print("Packet check for %s successful" % msg)
def __init__(self, parent = None): ''' Constructor ''' QThread.__init__(self, parent) self.exiting = False # set up main result data structure: a list of dicts self.results = [] utils.debug_print("Resetting results dict")
def extend_msb(self, nbits): msb = self.bits[0] assert nbits > 0 self.bits = (msb * nbits) + self.bits # Adjust current bit being processed as extension made to the start of string self.bit += nbits if utils.debug: debug_print("%s bit pos %d extended msb %d-bits" % (self.bits, self.bit, nbits)) debug_print(" " * self.bit + "^")
def next(self): utils.debug_print("Token entry screen confirmed", utils.SUCC) self.done = True self.ui.lblPleaseWait.setVisible(True); self.ui.lblExamplePic.setVisible(False); self.ui.progressBar.setVisible(True); self.ui.lblToken.setEnabled(False); self.ui.txtToken.setEnabled(False); self.ui.btnNext.setEnabled(False); self.ui.btnCancel.setEnabled(False); self.app.processEvents(); d = surveyFolderSelectionDialog(self.app, str(self.ui.txtToken.text())) d.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.close() d.exec_()
def add_bits(self, field, nbits): assert field not in self.fields_added, field self.fields_added.append(field) value = self.source[field] # Allow None values to be ignored to simplify the logic if value is not None and nbits != 0: debug_print("add_bits: %s=%s nbits=%d" % (field, value, nbits)) if isinstance(value, str): assert field in self.hex_fields, field value = int(value, 16) format_str = "{0:0%db}" % nbits all_bits = format_str.format(value) bits = all_bits[-nbits:] # Take the nbits required discard = all_bits[0:-nbits] if len(discard) != 0: # Check we're only discarding sign bits assert ( bits[0] * len(discard) == discard ), "Field %s discards non sign bit data %s" % (field, discard) self.bit_array = bits + self.bit_array else: debug_print("add_bits: field %s IGNORED" % field)
def __init__(self, owner, dirs, token): QtGui.QMainWindow.__init__(self) self.ui = ui_scanning.Ui_scanDialog() self.ui.setupUi(self) self.app = owner self.done = False self.token = token; # set up worker thread self.scanThread = walker.Walker() self.callbacks = 0 # signal/slot connections self.connect(self.scanThread, SIGNAL("finished()"), self.finishedScanning) self.connect(self.scanThread, SIGNAL("terminated()"), self.error) #self.connect(self.scanThread, SIGNAL("")) self.connect(self.ui.btnCancel, SIGNAL('clicked()'), self.cancel) self.connect(self.scanThread, SIGNAL("scanned(int, int)"), self.iterate) #vpos = d.height() / 2 - (self.height() / 2); #if (d.width() > 2*d.height()): # hpos = d.width() / 4 - (self.width() / 2); #else: # hpos = d.width() / 2 - (self.width() / 2); #self.move(hpos, vpos); self.center() #homeDirPath = os.getenv("HOME","") #utils.debug_print("Your home directory is: " + homeDirPath) if dirs == []: utils.debug_print("No directories selected!", utils.ERR) #for d in dirs: # self.scanThread.scan(d) self.scanThread.scan(dirs)
def exit(self): utils.debug_print("Scan thread exiting...", utils.MSG) self.exiting = True
def error(self): utils.debug_print("Scan thread terminated unexpectedly!", utils.ERR)
def cancel(self): if self.confirmClose(): utils.debug_print("Cancelled before submission!", utils.ERR) quit() else: pass
def run(self): utils.debug_print("Starting scan thread...", utils.MSG) self.results = self.walk(self.dirs)
def __del__(self): self.exiting = True utils.debug_print("Scan thread waiting to terminate...", utils.MSG, False) self.wait()
def walkError(self, err): utils.debug_print(err.strerror + " on " + err.filename, utils.ERR) pass