def _start(self): pkg = self.pkg settings = self.settings if not self.opts.fetchonly: rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild" if self.opts.buildpkgonly: settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly" else: settings.configdict["pkg"]["MERGE_TYPE"] = "source" ebuild_path = portdb.findname(pkg.cpv, myrepo=pkg.repo) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path portage.doebuild_environment(ebuild_path, 'setup', settings=self.settings, db=portdb) # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self._async_wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif prefetcher.isAlive() and \ prefetcher.poll() is None: waiting_msg = "Fetching files " + \ "in the background. " + \ "To view fetch progress, run `tail -f %s` in another terminal." \ % (_emerge.emergelog._emerge_log_dir) msg_prefix = colorize("GOOD", " * ") from textwrap import wrap waiting_msg = "".join("%s%s\n" % (msg_prefix, line) \ for line in wrap(waiting_msg, 65)) if not self.background: writemsg(waiting_msg, noiselevel=-1) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)
def _start(self): pkg = self.pkg settings = self.settings rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self.wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = pkg.type_name ebuild_path = portdb.findname(pkg.cpv) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self.wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif not prefetcher.isAlive(): prefetcher.cancel() elif prefetcher.poll() is None: waiting_msg = "Fetching files " + \ "in the background. " + \ "To view fetch progress, run `tail -f " + \ "/var/log/emerge-fetch.log` in another " + \ "terminal." msg_prefix = colorize("GOOD", " * ") from textwrap import wrap waiting_msg = "".join("%s%s\n" % (msg_prefix, line) \ for line in wrap(waiting_msg, 65)) if not self.background: writemsg(waiting_msg, noiselevel=-1) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)
def _start(self): pkg = self.pkg settings = self.settings rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self.wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = pkg.type_name ebuild_path = portdb.findname(pkg.cpv) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self.wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif not prefetcher.isAlive(): prefetcher.cancel() elif prefetcher.poll() is None: waiting_msg = "Fetching files " + \ "in the background. " + \ "To view fetch progress, run `tail -f " + \ "/var/log/emerge-fetch.log` in another " + \ "terminal." msg_prefix = colorize("GOOD", " * ") from textwrap import wrap waiting_msg = "".join("%s%s\n" % (msg_prefix, line) \ for line in wrap(waiting_msg, 65)) if not self.background: writemsg(waiting_msg, noiselevel=-1) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)
def _start(self): if not self.opts.fetchonly: rval = _check_temp_dir(self.settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return # First get the SRC_URI metadata (it's not cached in self.pkg.metadata # because some packages have an extremely large SRC_URI value). self._start_task( AsyncTaskFuture( future=self.pkg.root_config.trees["porttree"].dbapi.\ async_aux_get(self.pkg.cpv, ["SRC_URI"], myrepo=self.pkg.repo, loop=self.scheduler)), self._start_with_metadata)
def _start(self): if not self.opts.fetchonly: rval = _check_temp_dir(self.settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return # First get the SRC_URI metadata (it's not cached in self.pkg.metadata # because some packages have an extremely large SRC_URI value). self._start_task( AsyncTaskFuture( future=self.pkg.root_config.trees["porttree"].dbapi.\ async_aux_get(self.pkg.cpv, ["SRC_URI"], myrepo=self.pkg.repo, loop=self.scheduler)), self._start_with_metadata)
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 _start(self): pkg = self.pkg settings = self.settings if not self.opts.fetchonly: rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild" if self.opts.buildpkgonly: settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly" else: settings.configdict["pkg"]["MERGE_TYPE"] = "source" ebuild_path = portdb.findname(pkg.cpv, myrepo=pkg.repo) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path portage.doebuild_environment(ebuild_path, 'setup', settings=self.settings, db=portdb) # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self._async_wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif prefetcher.isAlive() and \ prefetcher.poll() is None: if not self.background: fetch_log = os.path.join(_emerge.emergelog._emerge_log_dir, 'emerge-fetch.log') msg = ( 'Fetching files in the background.', 'To view fetch progress, run in another terminal:', 'tail -f %s' % fetch_log, ) out = portage.output.EOutput() for l in msg: out.einfo(l) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)
def _start(self): pkg = self.pkg settings = self.settings if not self.opts.fetchonly: rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild" if self.opts.buildpkgonly: settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly" else: settings.configdict["pkg"]["MERGE_TYPE"] = "source" ebuild_path = portdb.findname(pkg.cpv, myrepo=pkg.repo) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path portage.doebuild_environment(ebuild_path, 'setup', settings=self.settings, db=portdb) # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self._async_wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif prefetcher.isAlive() and \ prefetcher.poll() is None: if not self.background: fetch_log = os.path.join( _emerge.emergelog._emerge_log_dir, 'emerge-fetch.log') msg = ( 'Fetching files in the background.', 'To view fetch progress, run in another terminal:', 'tail -f %s' % fetch_log, ) out = portage.output.EOutput() for l in msg: out.einfo(l) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)
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
def _start(self): pkg = self.pkg settings = self.settings if not self.opts.fetchonly: rval = _check_temp_dir(settings) if rval != os.EX_OK: self.returncode = rval self._current_task = None self._async_wait() return root_config = pkg.root_config tree = "porttree" self._tree = tree portdb = root_config.trees[tree].dbapi settings.setcpv(pkg) settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild" if self.opts.buildpkgonly: settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly" else: settings.configdict["pkg"]["MERGE_TYPE"] = "source" ebuild_path = portdb.findname(pkg.cpv, myrepo=pkg.repo) if ebuild_path is None: raise AssertionError("ebuild not found for '%s'" % pkg.cpv) self._ebuild_path = ebuild_path portage.doebuild_environment(ebuild_path, 'setup', settings=self.settings, db=portdb) # Check the manifest here since with --keep-going mode it's # currently possible to get this far with a broken manifest. if not self._check_manifest(): self.returncode = 1 self._current_task = None self._async_wait() return prefetcher = self.prefetcher if prefetcher is None: pass elif prefetcher.isAlive() and \ prefetcher.poll() is None: waiting_msg = "Fetching files " + \ "in the background. " + \ "To view fetch progress, run `tail -f %s` in another terminal." \ % (os.path.join(_emerge.emergelog._emerge_log_dir, "emerge-fetch.log")) msg_prefix = colorize("GOOD", " * ") from textwrap import wrap waiting_msg = "".join("%s%s\n" % (msg_prefix, line) \ for line in wrap(waiting_msg, 65)) if not self.background: writemsg(waiting_msg, noiselevel=-1) self._current_task = prefetcher prefetcher.addExitListener(self._prefetch_exit) return self._prefetch_exit(prefetcher)