#!/usr/bin/python import rpm import glob import os.path import cpio import lzma import re _ts = rpm.ts() _ts.setVSFlags(0x7FFFFFFF) tags = {} for name in dir(rpm): if name.startswith("RPMTAG_"): tags[getattr(rpm, name)] = name[7:] def read_menu_entry(filename, content): print filename m = re.search("Categories=(.+);\n", content) if m: categories = m.group(1).split(";") print categories def write_desktop_file(directory, hdr, cpioarchive): path = os.path.join(directory, hdr["name"]) if not os.path.exists(path): os.makedirs(path) f = open(os.path.join(path, os.path.basename(cpioarchive.filename)), "w") f.write(cpioarchive.read()) f.close() class LZMA: def __init__(self, f): self._f = f self.decomp = lzma.LZMADecompressor() self.leftover = "" def read(self, size): # highly inefficient while not size < len(self.leftover): c = self._f.read(size) if not c: break d = self.decomp.decompress(c) self.leftover += d result = self.leftover[:size] self.leftover = self.leftover[size:] return result def read_package(path, targetpath): fd = os.open(path, os.O_RDONLY) hdr = _ts.hdrFromFdno(fd) fi = hdr.fiFromHeader() apps = [] for (fname, size, mode, mtime, flags, dev, inode, nlink, state, vflags, user, group, digest) in fi: if fname.endswith(".desktop"): apps.append(fname) if not apps: os.close(fd) return f = os.fdopen(fd) lf = LZMA(f) cpioarchive = cpio.CpioArchive(lf) for filename in cpioarchive: if filename.endswith(".desktop"): write_desktop_file(targetpath, hdr, cpioarchive) f.close() def check_dir(rpmpath, targetpath): for f in glob.glob(os.path.join(rpmpath, "*.rpm")): read_package(f, targetpath) check_dir("testrpms/", "desktopfiles/")