From e915841288e32acac636e02101bb2b78c810c2f7 Mon Sep 17 00:00:00 2001 From: Gui Chen Date: Thu, 16 Aug 2012 15:10:44 +0800 Subject: [PATCH] add preinstall and postinstall scripts handling Signed-off-by: Gui Chen --- mic/bootstrap.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/mic/bootstrap.py b/mic/bootstrap.py index ab98ebf..69c7259 100644 --- a/mic/bootstrap.py +++ b/mic/bootstrap.py @@ -18,6 +18,7 @@ from __future__ import with_statement import os import sys +import tempfile import shutil import subprocess import rpm @@ -41,6 +42,8 @@ class MiniBackend(object): self.repomd = repomd self.dlpkgs = [] self.localpkgs = {} + self.preins = {} + self.postins = {} def __del__(self): if not os.path.exists('/etc/fedora-release') and \ @@ -62,7 +65,7 @@ class MiniBackend(object): def del_ts(self): if self._ts: self._ts.closeDB() - self.ts = None + self._ts = None ts = property(fget = lambda self: self.get_ts(), fdel = lambda self: self.del_ts(), @@ -77,6 +80,13 @@ class MiniBackend(object): self.downloadPkgs() self.installPkgs() + for pkg in self.preins.keys(): + prog, script = self.preins[pkg] + self.run_pkg_script(pkg, prog, script, '0') + for pkg in self.postins.keys(): + prog, script = self.postins[pkg] + self.run_pkg_script(pkg, prog, script, '1') + def downloadPkgs(self): nonexist = [] for pkg in self.dlpkgs: @@ -100,6 +110,8 @@ class MiniBackend(object): hdr = readRpmHeader(self.ts, rpmpath) # save prein and postin scripts + self.preins[pkg] = (hdr['PREINPROG'], hdr['PREIN']) + self.postins[pkg] = (hdr['POSTINPROG'], hdr['POSTIN']) # mark pkg as install self.ts.addInstall(hdr, rpmpath, 'u') @@ -109,6 +121,32 @@ class MiniBackend(object): cb = RPMInstallCallback(self.ts) self.ts.run(cb.callback, '') + def run_pkg_script(self, pkg, prog, script, arg): + mychroot = lambda: os.chroot(self.rootdir) + + if not script: + return + + if prog == "": + prog = "/usr/bin/lua" + + tmpdir = os.path.join(self.rootdir, "tmp") + if not os.path.exists(tmpdir): + os.makedirs(tmpdir) + tmpfd, tmpfp = tempfile.mkstemp(dir=tmpdir, prefix="%s.pre-" % pkg) + script = script.replace('\r', '') + os.write(tmpfd, script) + os.close(tmpfd) + os.chmod(tmpfp, 0700) + + try: + script_fp = os.path.join('/tmp', os.path.basename(tmpfp)) + subprocess.call([prog, script_fp, arg], preexec_fn=mychroot) + except (OSError, IOError), err: + raise RuntimeError(err) + finally: + os.unlink(tmpfp) + class Bootstrap(object): def __init__(self, rootdir, distro): self.rootdir = rootdir -- 2.7.4