Exemplo n.º 1
0
def _setSEcontext(filename, rfi):
    """Set SELinux context of filename data from RpmFileInfo rfi.

    Raise OSError."""

    if se_linux.is_selinux_enabled() >= 0:
        context = se_linux.matchpathcon(rfi.filename, rfi.mode)
        se_linux.lsetfilecon(filename, context[1])
    else:
        raise ImportError, "selinux module is not available"
Exemplo n.º 2
0
def _setSEcontext(filename, rfi):
    """Set SELinux context of filename data from RpmFileInfo rfi.

    Raise OSError."""

    if se_linux.is_selinux_enabled() >= 0:
        context = se_linux.matchpathcon(rfi.filename, rfi.mode)
        se_linux.lsetfilecon(filename, context[1])
    else:
        raise ImportError, "selinux module is not available"
Exemplo n.º 3
0
def runScript(prog=None, script=None, otherargs=[], force=False, rusage=False,
              tmpdir="/var/tmp", chroot='', prefixes=None):
    """Run (script otherargs) with interpreter prog (which can be a list
    containing initial arguments).

    If prefixes is supplied, it's used to populate environment.
    The following env. variables are defined: RPM_INSTALL_PREFIX.

    Return (exit status, getrusage() stats, script output).  Use None instead
    of getrusage() data if !rusage.  Disable ldconfig optimization if force.
    Raise IOError, OSError."""

    if chroot is None:
        chroot = ''
    # FIXME? hardcodes config.rpmconfig usage
    if prog == None:
        prog = "/bin/sh"
    if prog == "/bin/sh" and script == None:
        return (0, None, "")
    tdir = chroot + tmpdir
    if not os.path.exists(tdir):
        try:
            os.makedirs(os.path.dirname(tdir), mode=0755)
        except OSError:
            pass
        try:
            os.makedirs(tdir, mode=01777)
        except OSError:
            return (0, None, "")
    if isinstance(prog, TupleType):
        args = prog
    else:
        args = [prog]
    if not force and args == ["/sbin/ldconfig"] and script == None:
        if rpmconfig.delayldconfig == 1:
            rpmconfig.ldconfig += 1
        # FIXME: assumes delayldconfig is checked after all runScript
        # invocations
        rpmconfig.delayldconfig = 1
        return (0, None, "")
    elif rpmconfig.delayldconfig:
        rpmconfig.delayldconfig = 0
        runScript("/sbin/ldconfig", force=1, chroot=chroot)
    if script != None:
        (fd, tmpfilename) = mkstemp_file(tdir, "rpm-tmp.")
        # test for open fds:
        # script = "ls -l /proc/$$/fd >> /$$.out\n" + script
        os.write(fd, script)
        os.close(fd)
        fd = None
        args.append(tmpfilename[len(chroot):])
        args += otherargs
    (rfd, wfd) = os.pipe()

    if rusage:
        rusage_old = resource.getrusage(resource.RUSAGE_CHILDREN)

    pid = os.fork()
    if pid == 0:
        try:
            if chroot:
                os.chroot(chroot)
            os.close(rfd)
            if not os.path.exists("/dev"):
                os.mkdir("/dev")
            if not os.path.exists("/dev/null"):
                os.mknod("/dev/null", 0666, 259)
            fd = os.open("/dev/null", os.O_RDONLY)
            if fd != 0:
                os.dup2(fd, 0)
                os.close(fd)
            if wfd != 1:
                os.dup2(wfd, 1)
                os.close(wfd)
            os.dup2(1, 2)
            os.chdir("/")
            # FIXME: what about PATH=%{_install_script_path}?
            e = {"HOME": "/", "USER": "******", "LOGNAME": "root",
                 "PATH": "/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin",
                 "PYRPM_VERSION" : __version__}
            if prefixes:
                e["RPM_INSTALL_PREFIX"] = prefixes[0]
                idx = 1
                for prefix in prefixes:
                    e["RPM_INSTALL_PREFIX%d" % idx] = prefix
                    idx += 1
            if rpmconfig.selinux_enabled and se_linux.is_selinux_enabled():
                _env = [ "%s=%s" % (key, e[key]) for key in e.keys() ]
                se_linux.rpm_execcon(0, args[0], args, _env)
            else:
                os.execve(args[0], args, e)
        finally:
            os._exit(255)
    os.close(wfd)
    # no need to read in chunks if we don't pass on data to some output func
    cret = ""
    cout = os.read(rfd, 8192)
    while cout:
        cret += cout
        cout = os.read(rfd, 8192)
    os.close(rfd)
    (cpid, status) = os.waitpid(pid, 0)

    if rusage:
        rusage_new = resource.getrusage(resource.RUSAGE_CHILDREN)
        rusage_val = [rusage_new[i] - rusage_old[i]
                      for i in xrange(len(rusage_new))]
    else:
        rusage_val = None

    if script != None:
        os.unlink(tmpfilename)

    return (status, rusage_val, cret)
Exemplo n.º 4
0
 def __init__(self):
     (self.sysname, self.nodename, self.release, self.version,
         self.machine) = os.uname()
     self.printhash = 0
     self.buildroot = ''
     self.dbpath = "rpmdb://var/lib/rpm/"
     self.force = 0
     self.rusage = 0
     self.oldpackage = 0
     self.justdb = 0
     self.test = 0
     self.ignoresize = 0
     self.ignorearch = 0
     self.nodeps = 0
     self.nosignature = 1        # Default: No signature/gpg checks
     self.noorder = 0
     self.noscripts = 0
     self.notriggers = 0
     self.noconflicts = 0
     self.nofileconflicts = 0
     self.excludedocs = 0
     self.excludeconfigs = 0
     self.checkinstalled = 0
     self.exactarch = 1          # same base arch is not enough for updates
     self.tid = int(time.time()) # Install time id.
     self.tscolor = 0            # Transaction color, needed for rpmdb
     self.nevratags = ("name", "epoch", "version", "release",
                       "arch", "sourcerpm")
     self.resolvertags = self.nevratags + \
        ("providename", "provideflags", "provideversion", "requirename",
         "requireflags", "requireversion", "obsoletename", "obsoleteflags",
         "obsoleteversion", "conflictname", "conflictflags",
         "conflictversion", "filesizes", "filemodes", "filemd5s",
         "fileusername", "filegroupname", "filelinktos", "fileflags",
         "filecolors", "fileverifyflags", "dirindexes", "basenames",
         "dirnames", "oldfilenames", "md5", "sha1header", "archivesize",
         "payloadsize")
         # Tags used by RpmResolver
     self.diskspacetags = self.nevratags + \
                          ("filesizes", "dirindexes", "basenames",
                           "dirnames", "oldfilenames", "filemodes")
     self.timer = 0                   # Output timing information
     self.ldconfig = 0             # Number of ldconfig calls optimized away
     self.delayldconfig = 0           # A delayed ldconfig call is pending
     self.service = 0                 # Install /sbin/service with "exit 0"
     self.yumconf = ['/etc/yum.conf'] # Yum config files
     self.relver  = None              # Release version, needed by YumConfig
     self.arch = None                 # If explicitly selected, for --test
     self.archlist = None             # Specific list of supported archs
     self.tmpdir = None
     self.supported_signals = [ signal.SIGINT, signal.SIGTERM,
                                signal.SIGHUP ]
     self.srpmdir = "/usr/src/redhat/SOURCES" # Dir where srpms will be
                                              # installed to
     self.enablerepo = [ ]           # Manually enabled repos
     self.disablerepo  = [ ]         # Manually disabled repos
     self.cachedir = "/var/cache/pyrpm"      # Directory for cached files
     self.nocache = 0                # Disable caching for packages
     self.excludes = [ ]
     # The first element should be a full path, interpreted outside
     # self.buildroot
     self.prelink_undo = ["/usr/sbin/prelink", "-y"]
     self.diff = False               # Try to show a diff in pyrpmverify
     # Verify contents of all nonempty config files, even if the package has
     # disabled it
     self.verifyallconfig = False
     self.keepcache = True           # Keep cached packages after install
     self.selinux_enabled = (se_linux.is_selinux_enabled() >= 0)
Exemplo n.º 5
0
def runScript(prog=None,
              script=None,
              otherargs=[],
              force=False,
              rusage=False,
              tmpdir="/var/tmp",
              chroot='',
              prefixes=None):
    """Run (script otherargs) with interpreter prog (which can be a list
    containing initial arguments).

    If prefixes is supplied, it's used to populate environment.
    The following env. variables are defined: RPM_INSTALL_PREFIX.

    Return (exit status, getrusage() stats, script output).  Use None instead
    of getrusage() data if !rusage.  Disable ldconfig optimization if force.
    Raise IOError, OSError."""

    if chroot is None:
        chroot = ''
    # FIXME? hardcodes config.rpmconfig usage
    if prog == None:
        prog = "/bin/sh"
    if prog == "/bin/sh" and script == None:
        return (0, None, "")
    tdir = chroot + tmpdir
    if not os.path.exists(tdir):
        try:
            os.makedirs(os.path.dirname(tdir), mode=0755)
        except OSError:
            pass
        try:
            os.makedirs(tdir, mode=01777)
        except OSError:
            return (0, None, "")
    if isinstance(prog, TupleType):
        args = prog
    else:
        args = [prog]
    if not force and args == ["/sbin/ldconfig"] and script == None:
        if rpmconfig.delayldconfig == 1:
            rpmconfig.ldconfig += 1
        # FIXME: assumes delayldconfig is checked after all runScript
        # invocations
        rpmconfig.delayldconfig = 1
        return (0, None, "")
    elif rpmconfig.delayldconfig:
        rpmconfig.delayldconfig = 0
        runScript("/sbin/ldconfig", force=1, chroot=chroot)
    if script != None:
        (fd, tmpfilename) = mkstemp_file(tdir, "rpm-tmp.")
        # test for open fds:
        # script = "ls -l /proc/$$/fd >> /$$.out\n" + script
        os.write(fd, script)
        os.close(fd)
        fd = None
        args.append(tmpfilename[len(chroot):])
        args += otherargs
    (rfd, wfd) = os.pipe()

    if rusage:
        rusage_old = resource.getrusage(resource.RUSAGE_CHILDREN)

    pid = os.fork()
    if pid == 0:
        try:
            if chroot:
                os.chroot(chroot)
            os.close(rfd)
            if not os.path.exists("/dev"):
                os.mkdir("/dev")
            if not os.path.exists("/dev/null"):
                os.mknod("/dev/null", 0666, 259)
            fd = os.open("/dev/null", os.O_RDONLY)
            if fd != 0:
                os.dup2(fd, 0)
                os.close(fd)
            if wfd != 1:
                os.dup2(wfd, 1)
                os.close(wfd)
            os.dup2(1, 2)
            os.chdir("/")
            # FIXME: what about PATH=%{_install_script_path}?
            e = {
                "HOME": "/",
                "USER": "******",
                "LOGNAME": "root",
                "PATH": "/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin",
                "PYRPM_VERSION": __version__
            }
            if prefixes:
                e["RPM_INSTALL_PREFIX"] = prefixes[0]
                idx = 1
                for prefix in prefixes:
                    e["RPM_INSTALL_PREFIX%d" % idx] = prefix
                    idx += 1
            if rpmconfig.selinux_enabled and se_linux.is_selinux_enabled():
                _env = ["%s=%s" % (key, e[key]) for key in e.keys()]
                se_linux.rpm_execcon(0, args[0], args, _env)
            else:
                os.execve(args[0], args, e)
        finally:
            os._exit(255)
    os.close(wfd)
    # no need to read in chunks if we don't pass on data to some output func
    cret = ""
    cout = os.read(rfd, 8192)
    while cout:
        cret += cout
        cout = os.read(rfd, 8192)
    os.close(rfd)
    (cpid, status) = os.waitpid(pid, 0)

    if rusage:
        rusage_new = resource.getrusage(resource.RUSAGE_CHILDREN)
        rusage_val = [
            rusage_new[i] - rusage_old[i] for i in xrange(len(rusage_new))
        ]
    else:
        rusage_val = None

    if script != None:
        os.unlink(tmpfilename)

    return (status, rusage_val, cret)