def binTestsInit(): binTestsCleanup() global basedir, env basedir = tempfile.mkdtemp() env = {} env['EAPI'] = '0' env['D'] = os.path.join(basedir, 'image') env['T'] = os.path.join(basedir, 'temp') env['S'] = os.path.join(basedir, 'workdir') env['PF'] = 'portage-tests-0.09-r1' env['PATH'] = bindir + ':' + os.environ['PATH'] env['PORTAGE_BIN_PATH'] = bindir env['PORTAGE_PYM_PATH'] = PORTAGE_PYM_PATH env['PORTAGE_INST_UID'] = str(os.getuid()) env['PORTAGE_INST_GID'] = str(os.getgid()) env['DESTTREE'] = '/usr' os.mkdir(env['D']) os.mkdir(env['T']) os.mkdir(env['S'])
def binTestsInit(): binTestsCleanup() global basedir, env basedir = tempfile.mkdtemp() env = {} env["EAPI"] = "0" env["D"] = os.path.join(basedir, "image") env["T"] = os.path.join(basedir, "temp") env["S"] = os.path.join(basedir, "workdir") env["PF"] = "portage-tests-0.09-r1" env["PATH"] = bindir + ":" + os.environ["PATH"] env["PORTAGE_BIN_PATH"] = bindir env["PORTAGE_PYM_PATH"] = pymdir env["PORTAGE_INST_UID"] = str(os.getuid()) env["PORTAGE_INST_GID"] = str(os.getgid()) env["DESTTREE"] = "/usr" os.mkdir(env["D"]) os.mkdir(env["T"]) os.mkdir(env["S"])
def binTestsInit(): binTestsCleanup() global basedir, env basedir = tempfile.mkdtemp() env = os.environ.copy() env["EAPI"] = "0" env["D"] = os.path.join(basedir, "image") env["T"] = os.path.join(basedir, "temp") env["S"] = os.path.join(basedir, "workdir") env["PF"] = "portage-tests-0.09-r1" env["PATH"] = bindir + ":" + env["PATH"] env["PORTAGE_BIN_PATH"] = bindir env["PORTAGE_PYM_PATH"] = pymdir env["PORTAGE_INST_UID"] = str(os.getuid()) env["PORTAGE_INST_GID"] = str(os.getgid()) env["DESTTREE"] = "/usr" os.mkdir(env["D"]) os.mkdir(env["T"]) os.mkdir(env["S"])
def __init__(self, _unused_param=DeprecationWarning, mysettings=None): """ @param _unused_param: deprecated, use mysettings['PORTDIR'] instead @type _unused_param: None @param mysettings: an immutable config instance @type mysettings: portage.config """ from portage import config if mysettings: self.settings = mysettings else: from portage import settings self.settings = config(clone=settings) if _unused_param is not DeprecationWarning: warnings.warn("The first parameter of the " + \ "portage.dbapi.porttree.portdbapi" + \ " constructor is unused since portage-2.1.8. " + \ "mysettings['PORTDIR'] is used instead.", DeprecationWarning, stacklevel=2) self.repositories = self.settings.repositories self.treemap = self.repositories.treemap # This is strictly for use in aux_get() doebuild calls when metadata # is generated by the depend phase. It's safest to use a clone for # this purpose because doebuild makes many changes to the config # instance that is passed in. self.doebuild_settings = config(clone=self.settings) self.depcachedir = os.path.realpath(self.settings.depcachedir) if os.environ.get("SANDBOX_ON") == "1": # Make api consumers exempt from sandbox violations # when doing metadata cache updates. sandbox_write = os.environ.get("SANDBOX_WRITE", "").split(":") if self.depcachedir not in sandbox_write: sandbox_write.append(self.depcachedir) os.environ["SANDBOX_WRITE"] = \ ":".join(filter(None, sandbox_write)) self.porttrees = list(self.settings.repositories.repoLocationList()) # This is used as sanity check for aux_get(). If there is no # root eclass dir, we assume that PORTDIR is invalid or # missing. This check allows aux_get() to detect a missing # portage tree and return early by raising a KeyError. self._have_root_eclass_dir = os.path.isdir( os.path.join(self.settings.repositories.mainRepoLocation(), "eclass")) #if the portdbapi is "frozen", then we assume that we can cache everything (that no updates to it are happening) self.xcache = {} self.frozen = 0 #Keep a list of repo names, sorted by priority (highest priority first). self._ordered_repo_name_list = tuple(reversed(self.repositories.prepos_order)) self.auxdbmodule = self.settings.load_best_module("portdbapi.auxdbmodule") self.auxdb = {} self._pregen_auxdb = {} # If the current user doesn't have depcachedir write permission, # then the depcachedir cache is kept here read-only access. self._ro_auxdb = {} self._init_cache_dirs() try: depcachedir_st = os.stat(self.depcachedir) depcachedir_w_ok = os.access(self.depcachedir, os.W_OK) except OSError: depcachedir_st = None depcachedir_w_ok = False cache_kwargs = {} depcachedir_unshared = False if portage.data.secpass < 1 and \ depcachedir_w_ok and \ depcachedir_st is not None and \ os.getuid() == depcachedir_st.st_uid and \ os.getgid() == depcachedir_st.st_gid: # If this user owns depcachedir and is not in the # portage group, then don't bother to set permissions # on cache entries. This makes it possible to run # egencache without any need to be a member of the # portage group. depcachedir_unshared = True else: cache_kwargs.update(portage._native_kwargs({ 'gid' : portage_gid, 'perms' : 0o664 })) # If secpass < 1, we don't want to write to the cache # since then we won't be able to apply group permissions # to the cache entries/directories. if (secpass < 1 and not depcachedir_unshared) or not depcachedir_w_ok: for x in self.porttrees: self.auxdb[x] = volatile.database( self.depcachedir, x, self._known_keys, **cache_kwargs) try: self._ro_auxdb[x] = self.auxdbmodule(self.depcachedir, x, self._known_keys, readonly=True, **cache_kwargs) except CacheError: pass else: for x in self.porttrees: if x in self.auxdb: continue # location, label, auxdbkeys self.auxdb[x] = self.auxdbmodule( self.depcachedir, x, self._known_keys, **cache_kwargs) if "metadata-transfer" not in self.settings.features: for x in self.porttrees: if x in self._pregen_auxdb: continue cache = self._create_pregen_cache(x) if cache is not None: self._pregen_auxdb[x] = cache # Selectively cache metadata in order to optimize dep matching. self._aux_cache_keys = set( ["DEPEND", "EAPI", "HDEPEND", "INHERITED", "IUSE", "KEYWORDS", "LICENSE", "PDEPEND", "PROPERTIES", "PROVIDE", "RDEPEND", "repository", "RESTRICT", "SLOT", "DEFINED_PHASES", "REQUIRED_USE"]) self._aux_cache = {} self._broken_ebuilds = set()
def __init__(self, _unused_param=DeprecationWarning, mysettings=None): """ @param _unused_param: deprecated, use mysettings['PORTDIR'] instead @type _unused_param: None @param mysettings: an immutable config instance @type mysettings: portage.config """ from portage import config if mysettings: self.settings = mysettings else: from portage import settings self.settings = config(clone=settings) if _unused_param is not DeprecationWarning: warnings.warn("The first parameter of the " + \ "portage.dbapi.porttree.portdbapi" + \ " constructor is unused since portage-2.1.8. " + \ "mysettings['PORTDIR'] is used instead.", DeprecationWarning, stacklevel=2) self.repositories = self.settings.repositories self.treemap = self.repositories.treemap # This is strictly for use in aux_get() doebuild calls when metadata # is generated by the depend phase. It's safest to use a clone for # this purpose because doebuild makes many changes to the config # instance that is passed in. self.doebuild_settings = config(clone=self.settings) self.depcachedir = os.path.realpath(self.settings.depcachedir) if os.environ.get("SANDBOX_ON") == "1": # Make api consumers exempt from sandbox violations # when doing metadata cache updates. sandbox_write = os.environ.get("SANDBOX_WRITE", "").split(":") if self.depcachedir not in sandbox_write: sandbox_write.append(self.depcachedir) os.environ["SANDBOX_WRITE"] = \ ":".join(filter(None, sandbox_write)) self.porttrees = list(self.settings.repositories.repoLocationList()) # This is used as sanity check for aux_get(). If there is no # root eclass dir, we assume that PORTDIR is invalid or # missing. This check allows aux_get() to detect a missing # repository and return early by raising a KeyError. self._have_root_eclass_dir = os.path.isdir( os.path.join(self.settings.repositories.mainRepoLocation(), "eclass")) #if the portdbapi is "frozen", then we assume that we can cache everything (that no updates to it are happening) self.xcache = {} self.frozen = 0 #Keep a list of repo names, sorted by priority (highest priority first). self._ordered_repo_name_list = tuple(reversed(self.repositories.prepos_order)) self.auxdbmodule = self.settings.load_best_module("portdbapi.auxdbmodule") self.auxdb = {} self._pregen_auxdb = {} # If the current user doesn't have depcachedir write permission, # then the depcachedir cache is kept here read-only access. self._ro_auxdb = {} self._init_cache_dirs() try: depcachedir_st = os.stat(self.depcachedir) depcachedir_w_ok = os.access(self.depcachedir, os.W_OK) except OSError: depcachedir_st = None depcachedir_w_ok = False cache_kwargs = {} depcachedir_unshared = False if portage.data.secpass < 1 and \ depcachedir_w_ok and \ depcachedir_st is not None and \ os.getuid() == depcachedir_st.st_uid and \ os.getgid() == depcachedir_st.st_gid: # If this user owns depcachedir and is not in the # portage group, then don't bother to set permissions # on cache entries. This makes it possible to run # egencache without any need to be a member of the # portage group. depcachedir_unshared = True else: cache_kwargs.update({ 'gid' : portage_gid, 'perms' : 0o664 }) # If secpass < 1, we don't want to write to the cache # since then we won't be able to apply group permissions # to the cache entries/directories. if (secpass < 1 and not depcachedir_unshared) or not depcachedir_w_ok: for x in self.porttrees: self.auxdb[x] = volatile.database( self.depcachedir, x, self._known_keys, **cache_kwargs) try: self._ro_auxdb[x] = self.auxdbmodule(self.depcachedir, x, self._known_keys, readonly=True, **cache_kwargs) except CacheError: pass else: for x in self.porttrees: if x in self.auxdb: continue # location, label, auxdbkeys self.auxdb[x] = self.auxdbmodule( self.depcachedir, x, self._known_keys, **cache_kwargs) if "metadata-transfer" not in self.settings.features: for x in self.porttrees: if x in self._pregen_auxdb: continue cache = self._create_pregen_cache(x) if cache is not None: self._pregen_auxdb[x] = cache # Selectively cache metadata in order to optimize dep matching. self._aux_cache_keys = set( ["BDEPEND", "DEPEND", "EAPI", "INHERITED", "IUSE", "KEYWORDS", "LICENSE", "PDEPEND", "PROPERTIES", "RDEPEND", "repository", "RESTRICT", "SLOT", "DEFINED_PHASES", "REQUIRED_USE"]) self._aux_cache = {} self._better_cache = None self._broken_ebuilds = set()
def pre_sync(self, repo): msg = ">>> Syncing repository '%s' into '%s'..." \ % (repo.name, repo.location) self.logger(self.xterm_titles, msg) writemsg_level(msg + "\n") try: st = os.stat(repo.location) except OSError: st = None self.usersync_uid = None spawn_kwargs = {} # Redirect command stderr to stdout, in order to prevent # spurious cron job emails (bug 566132). spawn_kwargs["fd_pipes"] = { 0: sys.__stdin__.fileno(), 1: sys.__stdout__.fileno(), 2: sys.__stdout__.fileno() } spawn_kwargs["env"] = self.settings.environ() if repo.sync_user is not None: def get_sync_user_data(sync_user): user = None group = None home = None logname = None spl = sync_user.split(':', 1) if spl[0]: username = spl[0] try: try: pw = pwd.getpwnam(username) except KeyError: pw = pwd.getpwuid(int(username)) except (ValueError, KeyError): writemsg("!!! User '%s' invalid or does not exist\n" % username, noiselevel=-1) return (logname, user, group, home) user = pw.pw_uid group = pw.pw_gid home = pw.pw_dir logname = pw.pw_name if len(spl) > 1: groupname = spl[1] try: try: gp = grp.getgrnam(groupname) except KeyError: pw = grp.getgrgid(int(groupname)) except (ValueError, KeyError): writemsg("!!! Group '%s' invalid or does not exist\n" % groupname, noiselevel=-1) return (logname, user, group, home) group = gp.gr_gid return (logname, user, group, home) # user or user:group (logname, uid, gid, home) = get_sync_user_data(repo.sync_user) if uid is not None: spawn_kwargs["uid"] = uid self.usersync_uid = uid if gid is not None: spawn_kwargs["gid"] = gid spawn_kwargs["groups"] = [gid] if home is not None: spawn_kwargs["env"]["HOME"] = home if logname is not None: spawn_kwargs["env"]["LOGNAME"] = logname if st is None: perms = {'mode': 0o755} # respect sync-user if set if 'umask' in spawn_kwargs: perms['mode'] &= ~spawn_kwargs['umask'] if 'uid' in spawn_kwargs: perms['uid'] = spawn_kwargs['uid'] if 'gid' in spawn_kwargs: perms['gid'] = spawn_kwargs['gid'] portage.util.ensure_dirs(repo.location, **perms) st = os.stat(repo.location) if (repo.sync_user is None and 'usersync' in self.settings.features and portage.data.secpass >= 2 and (st.st_uid != os.getuid() and st.st_mode & 0o700 or st.st_gid != os.getgid() and st.st_mode & 0o070)): try: pw = pwd.getpwuid(st.st_uid) except KeyError: pass else: # Drop privileges when syncing, in order to match # existing uid/gid settings. self.usersync_uid = st.st_uid spawn_kwargs["uid"] = st.st_uid spawn_kwargs["gid"] = st.st_gid spawn_kwargs["groups"] = [st.st_gid] spawn_kwargs["env"]["HOME"] = pw.pw_dir spawn_kwargs["env"]["LOGNAME"] = pw.pw_name umask = 0o002 if not st.st_mode & 0o020: umask = umask | 0o020 spawn_kwargs["umask"] = umask # override the defaults when sync_umask is set if repo.sync_umask is not None: spawn_kwargs["umask"] = int(repo.sync_umask, 8) self.spawn_kwargs = spawn_kwargs if self.usersync_uid is not None: # PORTAGE_TMPDIR is used below, so validate it and # bail out if necessary. rval = _check_temp_dir(self.settings) if rval != os.EX_OK: return rval os.umask(0o022) return os.EX_OK
def pre_sync(self, repo): msg = ">>> Syncing repository '%s' into '%s'..." % (repo.name, repo.location) self.logger(self.xterm_titles, msg) writemsg_level(msg + "\n") try: st = os.stat(repo.location) except OSError: st = None self.usersync_uid = None spawn_kwargs = {} # Redirect command stderr to stdout, in order to prevent # spurious cron job emails (bug 566132). spawn_kwargs["fd_pipes"] = {0: sys.__stdin__.fileno(), 1: sys.__stdout__.fileno(), 2: sys.__stdout__.fileno()} spawn_kwargs["env"] = self.settings.environ() if repo.sync_user is not None: def get_sync_user_data(sync_user): user = None group = None home = None logname = None spl = sync_user.split(":", 1) if spl[0]: username = spl[0] try: try: pw = pwd.getpwnam(username) except KeyError: pw = pwd.getpwuid(int(username)) except (ValueError, KeyError): writemsg("!!! User '%s' invalid or does not exist\n" % username, noiselevel=-1) return (logname, user, group, home) user = pw.pw_uid group = pw.pw_gid home = pw.pw_dir logname = pw.pw_name if len(spl) > 1: groupname = spl[1] try: try: gp = grp.getgrnam(groupname) except KeyError: pw = grp.getgrgid(int(groupname)) except (ValueError, KeyError): writemsg("!!! Group '%s' invalid or does not exist\n" % groupname, noiselevel=-1) return (logname, user, group, home) group = gp.gr_gid return (logname, user, group, home) # user or user:group (logname, uid, gid, home) = get_sync_user_data(repo.sync_user) if uid is not None: spawn_kwargs["uid"] = uid self.usersync_uid = uid if gid is not None: spawn_kwargs["gid"] = gid spawn_kwargs["groups"] = [gid] if home is not None: spawn_kwargs["env"]["HOME"] = home if logname is not None: spawn_kwargs["env"]["LOGNAME"] = logname if st is None: perms = {"mode": 0o755} # respect sync-user if set if "umask" in spawn_kwargs: perms["mode"] &= ~spawn_kwargs["umask"] if "uid" in spawn_kwargs: perms["uid"] = spawn_kwargs["uid"] if "gid" in spawn_kwargs: perms["gid"] = spawn_kwargs["gid"] portage.util.ensure_dirs(repo.location, **perms) st = os.stat(repo.location) if ( repo.sync_user is None and "usersync" in self.settings.features and portage.data.secpass >= 2 and (st.st_uid != os.getuid() and st.st_mode & 0o700 or st.st_gid != os.getgid() and st.st_mode & 0o070) ): try: pw = pwd.getpwuid(st.st_uid) except KeyError: pass else: # Drop privileges when syncing, in order to match # existing uid/gid settings. self.usersync_uid = st.st_uid spawn_kwargs["uid"] = st.st_uid spawn_kwargs["gid"] = st.st_gid spawn_kwargs["groups"] = [st.st_gid] spawn_kwargs["env"]["HOME"] = pw.pw_dir spawn_kwargs["env"]["LOGNAME"] = pw.pw_name umask = 0o002 if not st.st_mode & 0o020: umask = umask | 0o020 spawn_kwargs["umask"] = umask # override the defaults when sync_umask is set if repo.sync_umask is not None: spawn_kwargs["umask"] = int(repo.sync_umask, 8) self.spawn_kwargs = spawn_kwargs if self.usersync_uid is not None: # PORTAGE_TMPDIR is used below, so validate it and # bail out if necessary. rval = _check_temp_dir(self.settings) if rval != os.EX_OK: return rval os.umask(0o022) return os.EX_OK
def pre_sync(self, repo): self.settings, self.trees, self.mtimedb = self.emerge_config self.xterm_titles = "notitles" not in self.settings.features msg = ">>> Synchronization of repository '%s' located in '%s'..." \ % (repo.name, repo.location) self.logger(self.xterm_titles, msg) writemsg_level(msg + "\n") try: st = os.stat(repo.location) except OSError: st = None self.usersync_uid = None spawn_kwargs = {} spawn_kwargs["env"] = self.settings.environ() if repo.sync_user is not None: def get_sync_user_data(sync_user): user = None group = None home = None spl = sync_user.split(':', 1) if spl[0]: username = spl[0] try: try: pw = pwd.getpwnam(username) except KeyError: pw = pwd.getpwuid(int(username)) except (ValueError, KeyError): writemsg("!!! User '%s' invalid or does not exist\n" % username, noiselevel=-1) return (user, group, home) user = pw.pw_uid group = pw.pw_gid home = pw.pw_dir if len(spl) > 1: groupname = spl[1] try: try: gp = grp.getgrnam(groupname) except KeyError: pw = grp.getgrgid(int(groupname)) except (ValueError, KeyError): writemsg("!!! Group '%s' invalid or does not exist\n" % groupname, noiselevel=-1) return (user, group, home) group = gp.gr_gid return (user, group, home) # user or user:group (uid, gid, home) = get_sync_user_data(repo.sync_user) if uid is not None: spawn_kwargs["uid"] = uid self.usersync_uid = uid if gid is not None: spawn_kwargs["gid"] = gid spawn_kwargs["groups"] = [gid] if home is not None: spawn_kwargs["env"]["HOME"] = home if st is None: perms = {'mode': 0o755} # respect sync-user if set if 'umask' in spawn_kwargs: perms['mode'] &= ~spawn_kwargs['umask'] if 'uid' in spawn_kwargs: perms['uid'] = spawn_kwargs['uid'] if 'gid' in spawn_kwargs: perms['gid'] = spawn_kwargs['gid'] writemsg_level(">>> '%s' not found, creating it." % _unicode_decode(repo.location)) portage.util.ensure_dirs(repo.location, **perms) st = os.stat(repo.location) if (repo.sync_user is None and 'usersync' in self.settings.features and portage.data.secpass >= 2 and (st.st_uid != os.getuid() and st.st_mode & 0o700 or st.st_gid != os.getgid() and st.st_mode & 0o070)): try: homedir = pwd.getpwuid(st.st_uid).pw_dir except KeyError: pass else: # Drop privileges when syncing, in order to match # existing uid/gid settings. self.usersync_uid = st.st_uid spawn_kwargs["uid"] = st.st_uid spawn_kwargs["gid"] = st.st_gid spawn_kwargs["groups"] = [st.st_gid] spawn_kwargs["env"]["HOME"] = homedir umask = 0o002 if not st.st_mode & 0o020: umask = umask | 0o020 spawn_kwargs["umask"] = umask # override the defaults when sync_umask is set if repo.sync_umask is not None: spawn_kwargs["umask"] = int(repo.sync_umask, 8) self.spawn_kwargs = spawn_kwargs if self.usersync_uid is not None: # PORTAGE_TMPDIR is used below, so validate it and # bail out if necessary. rval = _check_temp_dir(self.settings) if rval != os.EX_OK: return rval os.umask(0o022) return os.EX_OK