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"
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)
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)
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)