コード例 #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
ファイル: build.py プロジェクト: datagutten/mulle.js
    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
ファイル: dvd.py プロジェクト: developeric/Slipstream
    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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: iso.py プロジェクト: cutecutecat/EulerInit
 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
ファイル: iso9660.py プロジェクト: yolkfull/avocado
    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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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
ファイル: test_facade.py プロジェクト: mikalstill/pycdlib
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()