Пример #1
0
    def iter_entries(handle):

        cd = pycdlib.PyCdlib()

        if hasattr(handle, 'seek') and handle.seekable():
            handle.seek(0)
            cd.open_fp(handle)
        else:
            cd.open(handle)

        rock_ridge = cd.rock_ridge is not None
        joliet = cd.joliet_vd is not None
        joliet_only = joliet and not rock_ridge

        directories = Queue()
        directories.put(cd.get_entry('/', joliet_only))

        while not directories.empty():
            directory = directories.get()

            for child in directory.children:
                if not child.is_dot() and not child.is_dotdot():
                    if child.is_dir():
                        directories.put(child)
                    yield child
Пример #2
0
def __generate_raw(directory):
    '''Return a file-like object containing the raw disk data for directory.'''
    root_path = pathlib.Path(directory).resolve()
    filenames = root_path.glob('**/*')

    iso = pycdlib.PyCdlib()
    iso.new(vol_ident='cidata', joliet=3, rock_ridge='1.09')
    for path in filenames:
        rel_filename = str(path)[len(str(root_path)):].lstrip('/')
        # Add directories.
        if path.is_dir():
            iso.add_directory(joliet_path='/%s' % rel_filename,
                              rr_name='/%s' % rel_filename)
            continue

        # Add file
        iso.add_file(path,
                     joliet_path='/%s' % rel_filename,
                     rr_name='%s' % rel_filename)

    output = io.BytesIO()
    iso.write_fp(output)
    iso.close()
    output.seek(0)

    return output
Пример #3
0
    def __init__(self, handle, **options):  # noqa: D102, D107
        """Create a new ISO reader filesystem.

        Parameters:
            handle (`io.IOBase` or `str`): A filename or a readable
                file-like object storing the archive to read.

        Keyword Arguments:
            close_handle (`boolean`): If ``True``, close the handle
                when the filesystem is closed. **[default: True]**

        """
        super(ISOReadFS, self).__init__(handle, **options)
        self._cd = pycdlib.PyCdlib()

        if isinstance(handle, io.IOBase):
            self._cd.open_fp(handle)
        else:
            self._cd.open(handle)

        self._joliet = self._cd.joliet_vd is not None
        self._rock_ridge = self._cd.rock_ridge is not None
        self._joliet_only = self._joliet and not self._rock_ridge

        self._path_table = {}  #weakref.WeakValueDictionary()
        self._path_table['/'] = self._cd.get_record(iso_path='/')
Пример #4
0
def main():
    if len(sys.argv) < 2:
        sys.stderr.write("ERROR: Unable to locate CD/DVD device.\n")
        sys.exit(-1)

    iso = pycdlib.PyCdlib()

    with open(sys.argv[1], "rb") as cdfp:
        try:
            iso.open_fp(cdfp)
            for path, dr in iso.walk():
                if path == "/VYOSINIT.CFG":
                    with open("/tmp/vyos-firstboot.cfg", "wb") as dest_file:
                        print("Extracting first boot config...")
                        iso_path = dr.file_identifier().decode()
                        iso.get_file_from_iso_fp(dest_file,
                                                 iso_path=("/%s" % iso_path))
                        break
            else:
                sys.stderr.write(
                    "WARN: Unable to locate first boot configuration file.\n")
                sys.exit(-2)

        finally:
            iso.close()
Пример #5
0
    def extract_iso(self, extract_content=True):
        iso_path = self.download_game(False)

        iso = pycdlib.PyCdlib()
        iso.open(iso_path)

        if not os.path.exists(self.movie_folder):
            os.mkdir(self.movie_folder)

        try:
            children = iso.list_children(iso_path='/Movies')
            iso.get_record(iso_path='/Movies')
        except pycdlib.pycdlib.pycdlibexception.PyCdlibInvalidInput:
            children = iso.list_children(iso_path='/MOVIES')
            iso.get_record(iso_path='/MOVIES')

        for child in children:
            assert isinstance(child, pycdlib.pycdlib.dr.DirectoryRecord)
            if child is None or child.is_dot() or child.is_dotdot():
                continue

            file = iso.full_path_from_dirrecord(child)
            extracted_file = os.path.join(self.movie_folder, os.path.basename(file).upper())
            iso.get_file_from_iso(extracted_file, iso_path=file)
            if extract_content:
                try:
                    ShockwaveExtractor.main(['-e', '-i', extracted_file])
                except Exception as e:
                    print('%s: %s' % (file, str(e)))
                    continue

        if self.language != 'sv':
            self.rename()
Пример #6
0
    def open(self, dev):
        """
        Open the device as a DVD with pycdlib and libdvdcss.

        pycdlib will be used to identify and extract information.
        libdvdcss will be used for reading, writing, and decrypting.

        Raises SlipstreamDiscInUse if you try to load the same disc that's
        already opened. You can open a different disc without an exception as
        it will automatically dispose the current disc before opening.
        """
        if self.dvdcss or self.cdlib:
            if dev != self.device:
                # dispose, and continue loading the new disc
                self.dispose()
            else:
                raise SlipstreamDiscInUse("The specified DVD device is already open in this instance.")
        self.device = dev
        self.log.info(f"Opening '{dev}'...")
        self.cdlib = pycdlib.PyCdlib()
        self.cdlib.open(rf"\\.\{dev}" if cfg.windows else dev)
        self.log.info("Initialised pycdlib instance successfully...")
        self.dvdcss = DvdCss()
        self.dvdcss.open(dev)
        self.log.info("Initialised pydvdcss instance successfully...")
        self.ready = True
        self.log.info("DVD opened and ready...")
Пример #7
0
def compute(dvd_path):
    """Computes a Windows API IDvdInfo2::GetDiscID-compatible 64-bit Cyclic Redundancy Check
       checksum from the DVD .vob, .ifo and .bup files found in the supplied DVD path.
    """

    dvd = pycdlib.PyCdlib()

    try:
        dvd.open(dvd_path)
    except:
        raise FileContentReadException(dvd_path)

    _check_video_ts_path_exists(dvd)

    # the polynomial used for this CRC-64 checksum is:
    # x^63 + x^60 + x^57 + x^55 + x^54 + x^50 + x^49 + x^46 + x^41 + x^38 + x^37 + x^34 + x^32 +
    # x^31 + x^30 + x^28 + x^25 + x^24 + x^21 + x^16 + x^13 + x^12 + x^11 + x^8 + x^7 + x^5 + x^2
    calculator = _Crc64Calculator(0x92c64265d32139a4)

    for vob, file_path in _get_video_ts_files(dvd):
        calculator.update(_get_file_creation_time(vob))
        calculator.update(_get_file_size(vob))
        calculator.update(_get_file_name(file_path))
    for vob, file_path in _get_video_ts_files(dvd):
        if basename(file_path) in ["VIDEO_TS.IFO", "VTS_01_0.IFO"]:
            calculator.update(_get_first_64k_content(dvd, vob))

    return calculator.crc64
Пример #8
0
def addToOutIsos():
    """Use chunks() to split the list of files in the outdir into 'equal' length elements based on the amount of out isos created"""
    outCountIsos = calculateOutDisks()
    outPath = archiveOutput + 'out/'
    outFiles = os.listdir(outPath)
    splitOut = math.ceil(len(outFiles) / int(outCountIsos))
    isosWritten = 1
    outFullList = list(
        chunks(os.listdir(archiveOutput + 'out/'), int(splitOut)))
    outFullListCount = 0
    while isosWritten <= outCountIsos:
        iso = pycdlib.PyCdlib()
        iso.open(archiveOutput + 'isos/disk' + str(isosWritten) + '.iso')
        for a in outFullList[int(outFullListCount)]:
            fullPath = archiveOutput + "out/" + a
            isoPath = "/OUT/" + a.replace('-', '').upper()
            udfPath = "/out/" + a
            print("Adding " + a + " to " + archiveOutput + 'isos/disk' +
                  str(isosWritten) + '.iso')
            iso.add_file(fullPath, isoPath, udf_path=udfPath)
        print("Writing " + archiveOutput + 'isos/disk' + str(isosWritten) +
              '.iso')
        iso.write(archiveOutput + 'isos/disk' + str(isosWritten) + '.iso')
        iso.close()
        outFullListCount += 1
        isosWritten += 1
    return
Пример #9
0
def get_gameid_from_iso(path='NORMAL01.iso'):
    if not have_pycdlib and not have_iso9660:
        raise Exception('Can not find either pycdlib or pycdio. Try either \'pip3 install pycdio\' or \'pip3 install pycdlib\'.')

    if have_pycdlib:
        iso = pycdlib.PyCdlib()
        iso.open(path)
        extracted = io.BytesIO()
        iso.get_file_from_iso_fp(extracted, iso_path='/SYSTEM.CNF;1')
        extracted.seek(0)
        buf = str(extracted.read(1024))
        iso.close()
    if have_iso9660:
        iso = iso9660.ISO9660.IFS(source=path)

        st = iso.stat('system.cnf', True)
        if st is None:
            raise Exception('Could not open system.cnf')

        buf = iso.seek_read(st['LSN'])[1][:128]
        iso.close()

    idx = buf.find('cdrom:')
    if idx < 0:
        raise Exception('Could not read system.cnf')

    buf = buf[idx:idx+50]
    idx = buf.find(';1')
    buf = buf[idx-11:idx]
    
    game_id = buf.upper()
    return game_id[:4] + game_id[5:8] + game_id[9:11]
Пример #10
0
def walk_iso(iso_file, isofs_dir):
    """The main walking mechanism is the first level extractor, it just extracts the files
       and creates any links for iso filesystem
    """
    iso_in = pycdlib.PyCdlib()
    iso_in.open(iso_file)
    iso_out = pycdlib.PyCdlib()
    iso_out.new(joliet=3)
    os.mkdir(isofs_dir)
    for path, dirs, files in iso_in.walk(rr_path="/"):
        for dirname in dirs:
            dst = isofs_dir + os.path.join(path, dirname)
            print("dir %s" % dst)
            os.mkdir(dst)
        for filename in files:
            src = os.path.join(path, filename)
            extract_one_iso_file(iso_in, src, isofs_dir)
Пример #11
0
def create_configdrive(userdata,
                       configdrive_file,
                       metatdata=None,
                       vendordata=None,
                       networkdata=None):
    """ create the ISO9660 configdrive containing only the user-data """
    if not userdata:
        LOG.error('can not create a ISO9660 configdrive without userdata')
        return False
    if not configdrive_file:
        LOG.error(
            'can not create tmos_declared configdrive wihtout output file')
        return False
    md_prefix = '/openstack/latest'
    tmpdir = '%s%s' % (tempfile.mkdtemp(), md_prefix)
    try:
        os.makedirs(tmpdir)
        iso = pycdlib.PyCdlib()
        iso.new(interchange_level=3,
                joliet=True,
                sys_ident='LINUX',
                pub_ident_str='F5 Application and Orchestration PM Team',
                app_ident_str='tmos_configdrive_builder',
                rock_ridge='1.09',
                vol_ident='config-2')
        iso.add_directory('/OPENSTACK', rr_name='openstack')
        iso.add_directory('/OPENSTACK/LATEST', rr_name='latest')
        with open('%s/user_data' % tmpdir, 'w+') as ud_file:
            ud_file.write(userdata)
        iso.add_file('%s/user_data' % tmpdir,
                     '%s/USER_DATA.;1' % md_prefix.upper(),
                     rr_name='user_data')
        if metatdata:
            with open('%s/meta_data.json' % tmpdir, 'w+') as md_file:
                md_file.write(metatdata)
            iso.add_file('%s/meta_data.json' % tmpdir,
                         '%s/META_DATA.JSON;1' % md_prefix.upper(),
                         rr_name='meta_data.json')
        if vendordata:
            with open('%s/vendor_data.json' % tmpdir, 'w+') as vd_file:
                vd_file.write(vendordata)
            iso.add_file('%s/vendor_data.json' % tmpdir,
                         '%s/VENDOR_DATA.JSON;1' % md_prefix.upper(),
                         rr_name='vendor_data.json')
        if networkdata:
            with open('%s/network_data.json' % tmpdir, 'w+') as nd_file:
                nd_file.write(networkdata)
            iso.add_file('%s/network_data.json' % tmpdir,
                         '%s/NETWORK_DATA.JSON;1' % md_prefix.upper(),
                         rr_name='network_data.json')
        iso.write(configdrive_file)
        iso.close()
        clean_tmpdir(tmpdir)
    except TypeError as type_error:
        LOG.error('error creating ISO file: %s', type_error)
        clean_tmpdir(tmpdir)
        return False
    return True
Пример #12
0
def test_facade_rock_ridge_not_rock_ridge_iso():
    iso = pycdlib.PyCdlib()
    iso.new()

    with pytest.raises(
            pycdlib.pycdlibexception.PyCdlibInvalidInput) as excinfo:
        facade = pycdlib.facade.PyCdlibRockRidge(iso)
    assert (str(excinfo.value) ==
            'Can only instantiate a Rock Ridge facade for a Rock Ridge ISO')
Пример #13
0
def test_facade_joliet_not_joliet_iso():
    iso = pycdlib.PyCdlib()
    iso.new()

    with pytest.raises(
            pycdlib.pycdlibexception.PyCdlibInvalidInput) as excinfo:
        facade = pycdlib.facade.PyCdlibJoliet(iso)
    assert (str(excinfo.value) ==
            'Can only instantiate a Joliet facade for a Joliet ISO')
Пример #14
0
def test_facade_udf_not_udf_iso():
    iso = pycdlib.PyCdlib()
    iso.new()

    with pytest.raises(
            pycdlib.pycdlibexception.PyCdlibInvalidInput) as excinfo:
        facade = pycdlib.facade.PyCdlibUDF(iso)
    assert (str(
        excinfo.value) == 'Can only instantiate a UDF facade for a UDF ISO')
Пример #15
0
def test_facade_udf_get_record():
    iso = pycdlib.PyCdlib()
    iso.new(udf='2.60')

    facade = iso.get_udf_facade()

    facade.add_directory('/dir1')

    rec = facade.get_record('/dir1')
    assert (rec.file_identifier() == b'dir1')

    iso.close()
Пример #16
0
def test_facade_iso9660_add_directory_with_rr():
    iso = pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')

    facade = iso.get_iso9660_facade()

    facade.add_directory('/DIR1')

    rec = facade.get_record('/DIR1')
    assert (rec.file_identifier() == b'DIR1')

    iso.close()
Пример #17
0
def test_facade_rock_ridge_get_record():
    iso = pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')

    facade = iso.get_rock_ridge_facade()

    facade.add_directory('/dir1', 0o040555)

    rec = facade.get_record('/dir1')
    assert (rec.file_identifier() == b'DIR1')

    iso.close()
Пример #18
0
def test_facade_joliet_get_record():
    iso = pycdlib.PyCdlib()
    iso.new(joliet=3)

    facade = iso.get_joliet_facade()

    facade.add_directory('/dir1')

    rec = facade.get_record('/dir1')
    assert (rec.file_identifier() == bytes('dir1'.encode('utf-16_be')))

    iso.close()
Пример #19
0
def test_facade_iso9660_get_record():
    iso = pycdlib.PyCdlib()
    iso.new()

    facade = iso.get_iso9660_facade()

    facade.add_directory('/DIR1')

    rec = facade.get_record('/DIR1')
    assert (rec.file_identifier() == b'DIR1')

    iso.close()
Пример #20
0
    def _to(self, handle, fs):
        _cd = pycdlib.PyCdlib()
        _cd.new(interchange_level=self.interchange_level,
                sys_ident='',
                vol_ident='',
                set_size=1,
                seqnum=1,
                log_block_size=2048,
                vol_set_ident=' ',
                pub_ident_str='',
                preparer_ident_str='',
                app_ident_str='PyCdlib (C) 2015-2016 Chris Lalancette',
                copyright_file='',
                abstract_file='',
                bibli_file='',
                vol_expire_date=None,
                app_use='',
                joliet=self.joliet,
                rock_ridge=self.rock_ridge,
                xa=False)
        slug_table = {'/': '/'}

        try:
            for parent, dirs, files in fs.walk('/',
                                               search='breadth',
                                               namespaces=('details', 'access',
                                                           'stat')):
                for d in dirs:
                    path = join(parent, d.name)
                    iso_path = \
                        iso_path_slugify(path, slug_table, True, self.strict)
                    _cd.add_directory(
                        iso_path=iso_path,
                        rr_name=d.name if self.rock_ridge else None,
                        joliet_path=path if self.joliet else None,
                    )
                for f in files:
                    path = join(parent, f.name)
                    iso_path = \
                        iso_path_slugify(path, slug_table, strict=self.strict)
                    _cd.add_fp(
                        fp=fs.openbin(path),
                        length=f.size,
                        iso_path=iso_path,
                        rr_name=f.name if self.rock_ridge else None,
                        joliet_path=path if self.joliet else None,
                    )
        finally:
            if isinstance(handle, io.IOBase):
                _cd.write_fp(handle)
            else:
                _cd.write(handle)
            _cd.close()
Пример #21
0
    def get_iso_label(self):
        """
        Get the iso's label using isoinfo

        Sets self.label if one is found
        """
        try:
            iso = pycdlib.PyCdlib()
            iso.open(self.iso_path)
            self.label = iso.pvd.volume_identifier.decode("UTF-8").strip()
        except PyCdlibException as e:
            log.error("Problem reading label from %s: %s", self.iso_path, e)
Пример #22
0
def test_facade_iso9660_add_fp_with_rr_bad_name():
    iso = pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')

    facade = iso.get_iso9660_facade()

    foostr = b'foo\n'
    with pytest.raises(
            pycdlib.pycdlibexception.PyCdlibInvalidInput) as excinfo:
        facade.add_fp(BytesIO(foostr), len(foostr), 'FOO.;1')
    assert (str(excinfo.value) == "iso_path must start with '/'")

    iso.close()
Пример #23
0
def test_facade_rock_ridge_add_fp_bad_filename():
    iso = pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')

    facade = iso.get_rock_ridge_facade()

    foostr = b'foo\n'
    with pytest.raises(
            pycdlib.pycdlibexception.PyCdlibInvalidInput) as excinfo:
        facade.add_fp(BytesIO(foostr), len(foostr), 'foo', 0o040555)
    assert (str(excinfo.value) == "rr_path must start with '/'")

    iso.close()
Пример #24
0
def test_facade_udf_rm_directory():
    iso = pycdlib.PyCdlib()
    iso.new(udf='2.60')

    facade = iso.get_udf_facade()

    facade.add_directory('/dir1')
    rec = facade.get_record('/dir1')
    assert (rec.is_dir())

    facade.rm_directory('/dir1')

    iso.close()
Пример #25
0
 def extract(self, fetch_routes: tuple):
     """
     :param fetch_routes: 从ISO文件中抽取的文件路径集合
     :return: NULL
     """
     iso = pycdlib.PyCdlib()
     iso.open(self.iso_path)
     for route in fetch_routes:
         filename = route.split('/')[-1]
         extracted = open(os.path.join(self.out_path, filename), 'wb')
         iso.get_file_from_iso_fp(extracted, joliet_path=route)
         extracted.close()
     iso.close()
Пример #26
0
    def create(self, flags=None):
        """
        Creates a new ISO image

        :param flags: the flags used when creating a new image
        :type flags: dict
        """
        if self._iso is None:
            self._iso = pycdlib.PyCdlib()
            if flags is None:
                flags = self.DEFAULT_CREATE_FLAGS
            self._iso.new(**flags)
            self._iso_opened_for_create = True
Пример #27
0
def extractIso(isofile, extractfolder, workfolder=""):
    common.logMessage("Extracting ISO", isofile, "...")
    common.makeFolder(extractfolder)
    iso = pycdlib.PyCdlib()
    iso.open(isofile)
    for dirname, dirlist, filelist in iso.walk(iso_path="/"):
        common.makeFolders(extractfolder + dirname[1:])
        for file in filelist:
            with open(extractfolder + dirname[1:] + "/" + file, "wb") as f:
                iso.get_file_from_iso_fp(f, iso_path=dirname + "/" + file)
    iso.close()
    if workfolder != "":
        common.copyFolder(extractfolder, workfolder)
    common.logMessage("Done!")
Пример #28
0
def test_facade_rock_ridge_open_file_from_iso():
    iso = pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')

    facade = iso.get_rock_ridge_facade()

    foostr = b'foo\n'
    facade.add_fp(BytesIO(foostr), len(foostr), '/foo', 0o040555)

    with facade.open_file_from_iso('/foo') as infp:
        assert (infp.read() == b'foo\n')
        assert (infp.tell() == 4)

    iso.close()
Пример #29
0
def test_facade_udf_rm_file():
    iso = pycdlib.PyCdlib()
    iso.new(udf='2.60')

    facade = iso.get_udf_facade()

    foostr = b'foo\n'
    facade.add_fp(BytesIO(foostr), len(foostr), '/foo')
    rec = facade.get_record('/foo')
    assert (rec.is_file())

    facade.rm_file('/foo')

    iso.close()
Пример #30
0
def test_facade_udf_open_file_from_iso():
    iso = pycdlib.PyCdlib()
    iso.new(udf='2.60')

    facade = iso.get_udf_facade()

    foostr = b'foo\n'
    facade.add_fp(BytesIO(foostr), len(foostr), '/foo')

    with facade.open_file_from_iso('/foo') as infp:
        assert (infp.read() == b'foo\n')
        assert (infp.tell() == 4)

    iso.close()