def handle(self, scan_file, scanner): if scan_file.is_seekable(): sf = scan_file else: sf = scanner.promote_scan_file(scan_file, seekable=True) # create blkdev blkdev = self.factory.open(sf.get_local_path(), fobj=sf.get_fobj()) # create volume volume = ADFSVolume(blkdev) volume.open() # scan volume node = volume.get_root_dir() ok = self._scan_node(sf, scanner, node) # done volume.close() blkdev.close() return ok
class FSCommandQueue(CommandQueue): def __init__(self, args, cmd_list, sep, cmd_map): CommandQueue.__init__(self, cmd_list, sep, cmd_map) self.args = args self.blkdev = None self.volume = None def run(self): self.img = self.args.image_file try: # main command loop exit_code = CommandQueue.run(self) except FSError as e: cmd = "'%s'" % " ".join(self.cmd_line) print cmd, "FSError:", e exit_code = 3 except IOError as e: cmd = "'%s'" % " ".join(self.cmd_line) print cmd, "IOError:", e exit_code = 4 finally: # close volume if self.volume != None: self.volume.close() if self.args.verbose: print "closing volume:", self.img # close blkdev if self.blkdev != None: self.blkdev.close() if self.args.verbose: print "closing image:", self.img return exit_code def create_cmd(self, cclass, name, opts): return cclass(self.args, opts) def _open_volume(self): # setup volume if self.volume == None: self.volume = ADFSVolume(self.blkdev) if self.args.verbose: print "opening volume:", self.img self.volume.open() def run_first(self, cmd_line, cmd): self.cmd_line = cmd_line # check if first command is an init command if not cmd.has_init_blkdev(): # auto add 'open' command pre_cmd = OpenCmd(self.args, []) if self.args.verbose: print "auto open command:", self.cmd_line exit_code = pre_cmd.run(self.blkdev, self.volume) if self.args.verbose: print "auto open exit_code:", exit_code if exit_code != 0: return exit_code self.blkdev = pre_cmd.blkdev # setup volume (if necessary) if cmd.need_volume(): self._open_volume() # run first command if self.args.verbose: print "command:", self.cmd_line if cmd.edit and self.args.read_only: raise IOError("Edit commands not allowed in read-only mode") # check code of command after __init__ parsing if cmd.exit_code != 0: return cmd.exit_code # perform command exit_code = cmd.run(self.blkdev, self.volume) if cmd.blkdev != None: self.blkdev = cmd.blkdev if cmd.volume != None: self.volume = cmd.volume # final exit code if self.args.verbose: print "exit_code:", exit_code return exit_code def run_next(self, cmd_line, cmd): self.cmd_line = cmd_line if self.args.verbose: print "command:", self.cmd_line # verify command if cmd.edit and self.args.read_only: raise IOError("Edit commands not allowed in read-only mode") # make sure volume is set up if self.volume == None and cmd.need_volume(): self._open_volume() # run command exit_code = cmd.run(self.blkdev, self.volume) if cmd.blkdev != None: self.blkdev = cmd.blkdev if cmd.volume != None: self.volume = cmd.volume if self.args.verbose: print "exit_code:", exit_code return exit_code
class FSCommandQueue(CommandQueue): def __init__(self, args, cmd_list, sep, cmd_map): CommandQueue.__init__(self, cmd_list, sep, cmd_map) self.args = args self.blkdev = None self.volume = None def run(self): self.img = self.args.image_file try: # main command loop exit_code = CommandQueue.run(self) except FSError as e: cmd = "'%s'" % " ".join(self.cmd_line) print(cmd, "FSError:", e) exit_code = 3 except IOError as e: cmd = "'%s'" % " ".join(self.cmd_line) print(cmd, "IOError:", e) exit_code = 4 finally: # close volume if self.volume != None: self.volume.close() if self.args.verbose: print("closing volume:", self.img) # close blkdev if self.blkdev != None: self.blkdev.close() if self.args.verbose: print("closing image:",self.img) return exit_code def create_cmd(self, cclass, name, opts): return cclass(self.args, opts) def _open_volume(self): # setup volume if self.volume == None: self.volume = ADFSVolume(self.blkdev) if self.args.verbose: print("opening volume:", self.img) self.volume.open() def run_first(self, cmd_line, cmd): self.cmd_line = cmd_line # check if first command is an init command if not cmd.has_init_blkdev(): # auto add 'open' command pre_cmd = OpenCmd(self.args, []) if self.args.verbose: print("auto open command:", self.cmd_line) exit_code = pre_cmd.run(self.blkdev, self.volume) if self.args.verbose: print("auto open exit_code:", exit_code) if exit_code != 0: return exit_code self.blkdev = pre_cmd.blkdev # setup volume (if necessary) if cmd.need_volume(): self._open_volume() # run first command if self.args.verbose: print("command:", self.cmd_line) if cmd.edit and self.args.read_only: raise IOError("Edit commands not allowed in read-only mode") # check code of command after __init__ parsing if cmd.exit_code != 0: return cmd.exit_code # perform command exit_code = cmd.run(self.blkdev, self.volume) if cmd.blkdev != None: self.blkdev = cmd.blkdev if cmd.volume != None: self.volume = cmd.volume # final exit code if self.args.verbose: print("exit_code:", exit_code) return exit_code def run_next(self, cmd_line, cmd): self.cmd_line = cmd_line if self.args.verbose: print("command:", self.cmd_line) # verify command if cmd.edit and self.args.read_only: raise IOError("Edit commands not allowed in read-only mode") # make sure volume is set up if self.volume == None and cmd.need_volume(): self._open_volume() # run command exit_code = cmd.run(self.blkdev, self.volume) if cmd.blkdev != None: self.blkdev = cmd.blkdev if cmd.volume != None: self.volume = cmd.volume if self.args.verbose: print("exit_code:", exit_code) return exit_code
def init_vol(self, blkdev): vol = ADFSVolume(blkdev) vol.open() return vol
class ADF(): def __init__(self, app): self.app = app self.volume = None self.blkdev = None self.node = None self.path = None def absolutePath(self, name): return (self.path + '/' if self.path != '/' else '') + name def create(self, path): self.cleanUp() self.blkdev = BlkDevFactory().create(path) self.volume = ADFSVolume(self.blkdev) name = os.path.basename(path) self.volume.create(make_fsstr(name), dos_type=None) def open(self, path): self.cleanUp() self.blkdev = BlkDevFactory().open(path) self.volume = ADFSVolume(self.blkdev) self.volume.open() def navigate(self, path='/'): try: self.node = self.volume.get_path_name(make_fsstr(path)) except: return self.path = path self.entries = [{ 'name': entry.get_file_name().get_name().__str__(), 'type': 'dir' if entry.is_dir() else 'file' } for entry in self.node.get_entries_sorted_by_name()] self.app.updatePath(self.path) self.app.updateBrowser(self.entries) def navigateDown(self, dir): if self.path == '/': self.navigate(dir) else: self.navigate(self.path + '/' + dir) def parent(self): path = self.path.split('/')[:-1] if len(path) > 1: self.navigate(path.join('/')) elif len(path) == 1: self.navigate(path[0]) else: self.navigate() def volumeName(self): return self.volume.get_volume_name().__str__() def volumeInfo(self): return self.volume.get_info().__str__() def extract(self, name, output): path = self.absolutePath(name) node = self.volume.get_path_name(make_fsstr(path)) if node.is_file(): data = node.get_file_data() fh = open(output, 'wb') fh.write(data) fh.close() elif node.is_dir(): img = Imager(meta_mode=Imager.META_MODE_NONE) img.unpack_dir(node, output) def insert(self, input): name = os.path.basename(input) if os.path.isfile(input): fh = open(input, 'rb') data = fh.read() fh.close() self.volume.write_file(data, make_fsstr(self.path), make_fsstr(name)) elif os.path.isdir(input): parent, name = self.volume.get_create_path_name( make_fsstr(self.path), make_fsstr(name)) node = parent.create_dir(name) img = Imager(meta_mode=Imager.META_MODE_NONE) img.pack_dir(input, node) self.navigate(self.path) def makeDir(self, name): path = self.absolutePath(name) self.volume.create_dir(make_fsstr(path)) self.navigate(self.path) def delete(self, name): path = self.absolutePath(name) self.volume.delete(make_fsstr(path), all=True) self.navigate(self.path) def relabel(self, name): self.volume.relabel(make_fsstr(name)) def cleanUp(self): if self.volume: self.volume.close() if self.blkdev: self.blkdev.close()