Пример #1
0
 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()
Пример #2
0
 def init_vol(self, blkdev):
   vol = ADFSVolume(blkdev)
   n = len(self.opts)
   if n < 1 or n > 2:
     print("Usage: format <volume_name> [dos_type]")
     return None
   else:
     if n > 1:
       dos_str = self.opts[1]
       dos_type = DosType.parse_dos_type_str(dos_str)
       if dos_type is None:
         print("ERROR invalid dos_tpye:", dos_str)
         return None
     else:
       dos_type = None
     vol_name = make_fsstr(self.opts[0])
     vol.create(vol_name, dos_type=dos_type)
     return vol
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
 def init_vol(self, blkdev):
     vol = ADFSVolume(blkdev)
     vol.open()
     return vol
Пример #8
0
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()
Пример #9
0
    def open(self, path):
        self.cleanUp()

        self.blkdev = BlkDevFactory().open(path)
        self.volume = ADFSVolume(self.blkdev)
        self.volume.open()