import os import piksemel import packages # no i18n yet def _(x): return x default_exclude_list = """ lib/rcscripts/ usr/include/ usr/lib/cups/ usr/lib/python2.4/lib-tk/ usr/lib/python2.4/idlelib/ usr/lib/python2.4/distutils/ usr/lib/python2.4/bsddb/test/ usr/lib/python2.4/lib-old/ usr/lib/python2.4/test/ usr/lib/klibc/include/ usr/qt/3/include/ usr/share/aclocal/ usr/share/cups/ usr/share/doc/ usr/share/info/ usr/share/sip/ usr/share/man/ var/db/pisi/ var/lib/pisi/ var/cache/pisi/packages/ var/cache/pisi/archives/ var/tmp/pisi/ tmp/pisi-root/ var/log/comar.log var/log/pisi.log root/.bash_history """ class Project: def __init__(self): self.reset() def reset(self): self.title = None self.work_dir = None self.release_files = None self.repo_uri = None self.media_type = "install" self.media_size = 700 * 1024 * 1024 self.selected_components = [] self.selected_packages = [] self.all_packages = [] self.exclude_list = default_exclude_list.split() def open(self, filename): try: doc = piksemel.parse(filename) except OSError, e: if e.errno == 2: return _("Project file '%s' does not exists!" % filename) raise except piksemel.ParseError: return _("Not a Pardusman project file, invalid xml!") if doc.name() != "PardusmanProject": return _("Not a Pardusman project file") self.reset() self.title = doc.getTagData("Title") self.media_type = doc.getAttribute("type") self.media_size = doc.getAttribute("size") self.work_dir = doc.getTagData("WorkDir") self.release_files = doc.getTagData("ReleaseFiles") paksel = doc.getTag("PackageSelection") if paksel: self.repo_uri = paksel.getAttribute("repo_uri") for tag in paksel.tags("SelectedComponent"): self.selected_components.append(tag.firstChild().data()) for tag in paksel.tags("SelectedPackage"): self.selected_packages.append(tag.firstChild().data()) for tag in paksel.tags("Package"): self.all_packages.append(tag.firstChild().data()) return None def save(self, filename): doc = piksemel.newDocument("PardusmanProject") doc.setAttribute("type", self.media_type) doc.setAttribute("size", str(self.media_size)) if self.title: doc.insertTag("Title").insertData(self.title) if self.work_dir: doc.insertTag("WorkDir").insertData(self.work_dir) if self.release_files: doc.insertTag("ReleaseFiles").insertData(self.release_files) if self.repo_uri: paks = doc.insertTag("PackageSelection") paks.setAttribute("repo_uri", self.repo_uri) self.selected_components.sort() for item in self.selected_components: paks.insertTag("SelectedComponent").insertData(item) self.selected_packages.sort() for item in self.selected_packages: paks.insertTag("SelectedPackage").insertData(item) self.all_packages.sort() for item in self.all_packages: paks.insertTag("Package").insertData(item) data = doc.toPrettyString() f = file(filename, "w") f.write(data) f.close() def _get_dir(self, name, clean=False): dirname = os.path.join(self.work_dir, name) if os.path.exists(dirname): if clean: os.system('rm -rf "%s"' % dirname) os.makedirs(dirname) else: os.makedirs(dirname) return dirname def get_repo(self, console=None): cache_dir = self._get_dir("repo_cache") repo = packages.Repository(self.repo_uri, cache_dir) repo.parse_index(console) return repo def image_repo_dir(self, clean=False): return self._get_dir("image_repo", clean) def image_dir(self, clean=False): return self._get_dir("image", clean) def image_file(self): return os.path.join(self.work_dir, "pardus.img") def install_repo_dir(self, clean=False): return self._get_dir("install_repo", clean) def iso_dir(self, clean=False): return self._get_dir("iso", clean) def iso_file(self, clean=True): path = os.path.join(self.work_dir, "pardus.iso") if clean and os.path.exists(path): os.unlink(path) return path