diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/lib/mic/bootstrap.py | 279 | 
1 files changed, 0 insertions, 279 deletions
| diff --git a/scripts/lib/mic/bootstrap.py b/scripts/lib/mic/bootstrap.py deleted file mode 100644 index 66c291b0a8..0000000000 --- a/scripts/lib/mic/bootstrap.py +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/python -tt -# -# Copyright (c) 2009, 2010, 2011 Intel, Inc. -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the Free -# Software Foundation; version 2 of the License -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from __future__ import with_statement -import os -import sys -import tempfile -import shutil -import subprocess -import rpm -from mic import msger -from mic.utils import errors, proxy, misc -from mic.utils.rpmmisc import readRpmHeader, RPMInstallCallback -from mic.chroot import cleanup_mounts, setup_chrootenv, cleanup_chrootenv - -PATH_BOOTSTRAP = "/usr/sbin:/usr/bin:/sbin:/bin" - -RPMTRANS_FLAGS = [ -                   rpm.RPMTRANS_FLAG_ALLFILES, -                   rpm.RPMTRANS_FLAG_NOSCRIPTS, -                   rpm.RPMTRANS_FLAG_NOTRIGGERS, -                 ] - -RPMVSF_FLAGS = [ -                 rpm._RPMVSF_NOSIGNATURES, -                 rpm._RPMVSF_NODIGESTS -               ] - -RPMPROB_FLAGS = [ -                  rpm.RPMPROB_FILTER_OLDPACKAGE, -                  rpm.RPMPROB_FILTER_REPLACEPKG, -                  rpm.RPMPROB_FILTER_IGNOREARCH -                ] - -class MiniBackend(object): -    def __init__(self, rootdir, arch=None, repomd=None): -        self._ts = None -        self.rootdir = os.path.abspath(rootdir) -        self.arch = arch -        self.repomd = repomd -        self.dlpkgs = [] -        self.localpkgs = {} -        self.optionals = [] -        self.preins = {} -        self.postins = {} -        self.scriptlets = False - -    def __del__(self): -        try: -            del self.ts -        except: -            pass - -    def get_ts(self): -        if not self._ts: -            self._ts = rpm.TransactionSet(self.rootdir) -            self._ts.setFlags(reduce(lambda x, y: x|y, RPMTRANS_FLAGS)) -            self._ts.setVSFlags(reduce(lambda x, y: x|y, RPMVSF_FLAGS)) -            self._ts.setProbFilter(reduce(lambda x, y: x|y, RPMPROB_FLAGS)) - -        return self._ts - -    def del_ts(self): -        if self._ts: -            self._ts.closeDB() -            self._ts = None - -    ts = property(fget = lambda self: self.get_ts(), -                  fdel = lambda self: self.del_ts(), -                  doc="TransactionSet object") - -    def selectPackage(self, pkg): -        if not pkg in self.dlpkgs: -            self.dlpkgs.append(pkg) - -    def runInstall(self): -        # FIXME: check space -        self.downloadPkgs() -        self.installPkgs() - -        if not self.scriptlets: -            return - -        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: -            localpth = misc.get_package(pkg, self.repomd, self.arch) -            if localpth: -                self.localpkgs[pkg] = localpth -            elif pkg in self.optionals: -                # skip optional rpm -                continue -            else: -                # mark nonexist rpm -                nonexist.append(pkg) - -        if nonexist: -            raise errors.BootstrapError("Can't get rpm binary: %s" % -                                        ','.join(nonexist)) - -    def installPkgs(self): -        for pkg in self.localpkgs.keys(): -            rpmpath = self.localpkgs[pkg] - -            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') - -        # run transaction -        self.ts.order() -        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 == "<lua>": -            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: -            msger.warning(str(err)) -        finally: -            os.unlink(tmpfp) - -class Bootstrap(object): -    def __init__(self, rootdir, distro, arch=None): -        self.rootdir = misc.mkdtemp(dir=rootdir, prefix=distro) -        self.distro = distro -        self.arch = arch -        self.logfile = None -        self.pkgslist = [] -        self.repomd = None - -    def __del__(self): -        self.cleanup() - -    def get_rootdir(self): -        if os.path.exists(self.rootdir): -            shutil.rmtree(self.rootdir, ignore_errors=True) -        os.makedirs(self.rootdir) -        return self.rootdir - -    def dirsetup(self, rootdir=None): -        _path = lambda pth: os.path.join(rootdir, pth.lstrip('/')) - -        if not rootdir: -            rootdir = self.rootdir - -        try: -            # make /tmp and /etc path -            tmpdir = _path('/tmp') -            if not os.path.exists(tmpdir): -                os.makedirs(tmpdir) -            etcdir = _path('/etc') -            if not os.path.exists(etcdir): -                os.makedirs(etcdir) - -            # touch distro file -            tzdist = _path('/etc/%s-release' % self.distro) -            if not os.path.exists(tzdist): -                with open(tzdist, 'w') as wf: -                    wf.write("bootstrap") -        except: -            pass - -    def create(self, repomd, pkglist, optlist=()): -        try: -            pkgmgr = MiniBackend(self.get_rootdir()) -            pkgmgr.arch = self.arch -            pkgmgr.repomd = repomd -            pkgmgr.optionals = list(optlist) -            map(pkgmgr.selectPackage, pkglist + list(optlist)) -            pkgmgr.runInstall() -        except (OSError, IOError, errors.CreatorError), err: -            raise errors.BootstrapError("%s" % err) - -    def run(self, cmd, chdir, rootdir=None, bindmounts=None): -        def mychroot(): -            os.chroot(rootdir) -            os.chdir(chdir) - -        def sync_timesetting(rootdir): -            try: -                # sync time and zone info to bootstrap -                if os.path.exists(rootdir + "/etc/localtime"): -                    os.unlink(rootdir + "/etc/localtime") -                shutil.copyfile("/etc/localtime", rootdir + "/etc/localtime") -            except: -                pass - -        def sync_passwdfile(rootdir): -            try: -                # sync passwd file to bootstrap, saving the user info -                if os.path.exists(rootdir + "/etc/passwd"): -                    os.unlink(rootdir + "/etc/passwd") -                shutil.copyfile("/etc/passwd", rootdir + "/etc/passwd") -            except: -                pass - -        if not rootdir: -            rootdir = self.rootdir - -        if isinstance(cmd, list): -            shell = False -        else: -            shell = True - -        env = os.environ -        env['PATH'] = "%s:%s" % (PATH_BOOTSTRAP, env['PATH']) - -        retcode = 0 -        gloablmounts = None -        try: -            proxy.set_proxy_environ() -            gloablmounts = setup_chrootenv(rootdir, bindmounts, False) -            sync_timesetting(rootdir) -            sync_passwdfile(rootdir) -            retcode = subprocess.call(cmd, preexec_fn=mychroot, env=env, shell=shell) -        except (OSError, IOError): -            # add additional information to original exception -            value, tb = sys.exc_info()[1:] -            value = '%s: %s' % (value, ' '.join(cmd)) -            raise RuntimeError, value, tb -        finally: -            if self.logfile and os.path.isfile(self.logfile): -                msger.log(file(self.logfile).read()) -            cleanup_chrootenv(rootdir, bindmounts, gloablmounts) -            proxy.unset_proxy_environ() -        return retcode - -    def cleanup(self): -        try: -            # clean mounts -            cleanup_mounts(self.rootdir) -            # remove rootdir -            shutil.rmtree(self.rootdir, ignore_errors=True) -        except: -            pass | 
