From 79de95e787b5a12d837c8070002db5a0f842d051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 16 Mar 2021 17:09:23 +0000 Subject: [PATCH] Run sudo. --- ognibuild/__main__.py | 2 +- ognibuild/debian/apt.py | 27 ++++++++++++++++++++------- ognibuild/resolver/__init__.py | 19 ++++--------------- ognibuild/resolver/apt.py | 2 +- ognibuild/session/__init__.py | 4 ++++ 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index a889962..e0bed9c 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -159,7 +159,7 @@ def main(): # noqa: C901 elif args.resolve == "native": resolver = native_resolvers(session) elif args.resolve == "auto": - resolver = auto_resolver(session) + resolver = auto_resolver(session, explain=args.explain) logging.info("Using requirement resolver: %s", resolver) os.chdir(args.directory) try: diff --git a/ognibuild/debian/apt.py b/ognibuild/debian/apt.py index eb318b6..6daefa5 100644 --- a/ognibuild/debian/apt.py +++ b/ognibuild/debian/apt.py @@ -26,13 +26,15 @@ from buildlog_consultant.apt import ( ) from .. import DetailedFailure, UnidentifiedError -from ..session import Session, run_with_tee +from ..session import Session, run_with_tee, get_user from .file_search import FileSearcher, AptCachedContentsFileSearcher, GENERATED_FILE_SEARCHER, get_package_for_paths -def run_apt(session: Session, args: List[str]) -> None: +def run_apt(session: Session, args: List[str], prefix: Optional[List[str]] = None) -> None: """Run apt.""" - args = ["apt", "-y"] + args + if prefix is None: + prefix = [] + args = prefix = ["apt", "-y"] + args retcode, lines = run_with_tee(session, args, cwd="/", user="root") if retcode == 0: return @@ -49,10 +51,21 @@ class AptManager(object): session: Session _searchers: Optional[List[FileSearcher]] - def __init__(self, session): + def __init__(self, session, prefix=None): self.session = session self._apt_cache = None self._searchers = None + if prefix is None: + prefix = [] + self.prefix = prefix + + @classmethod + def from_session(cls, session): + if get_user(session) != "root": + prefix = ["sudo"] + else: + prefix = [] + return cls(session, prefix=prefix) def searchers(self): if self._searchers is None: @@ -94,10 +107,10 @@ class AptManager(object): logging.info("Installing using apt: %r", packages) packages = self.missing(packages) if packages: - run_apt(self.session, ["install"] + packages) + run_apt(self.session, ["install"] + packages, prefix=self.prefix) def satisfy(self, deps: List[str]) -> None: - run_apt(self.session, ["satisfy"] + deps) + run_apt(self.session, ["satisfy"] + deps, prefix=self.prefix) def satisfy_command(self, deps: List[str]) -> List[str]: - return ["apt", "satisfy"] + deps + return self.prefix + ["apt", "satisfy"] + deps diff --git a/ognibuild/resolver/__init__.py b/ognibuild/resolver/__init__.py index 51e0467..4dacd35 100644 --- a/ognibuild/resolver/__init__.py +++ b/ognibuild/resolver/__init__.py @@ -275,28 +275,17 @@ def native_resolvers(session): return StackedResolver([kls(session) for kls in NATIVE_RESOLVER_CLS]) -class ExplainResolver(Resolver): - def __init__(self, session): - self.session = session - - @classmethod - def from_session(cls, session): - return cls(session) - - def install(self, requirements): - raise UnsatisfiedRequirements(requirements) - - -def auto_resolver(session): +def auto_resolver(session, explain=False): # if session is SchrootSession or if we're root, use apt from .apt import AptResolver from ..session.schroot import SchrootSession + from ..session import get_user - user = session.check_output(["echo", "$USER"]).decode().strip() + user = get_user(session) resolvers = [] # TODO(jelmer): Check VIRTUAL_ENV, and prioritize PypiResolver if # present? - if isinstance(session, SchrootSession) or user == "root": + if isinstance(session, SchrootSession) or user == "root" or explain: resolvers.append(AptResolver.from_session(session)) resolvers.extend([kls(session) for kls in NATIVE_RESOLVER_CLS]) return StackedResolver(resolvers) diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 6089850..5827ab6 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -582,7 +582,7 @@ class AptResolver(Resolver): @classmethod def from_session(cls, session): - return cls(AptManager(session)) + return cls(AptManager.from_session(session)) def install(self, requirements): missing = [] diff --git a/ognibuild/session/__init__.py b/ognibuild/session/__init__.py index 7cdd15f..23021c1 100644 --- a/ognibuild/session/__init__.py +++ b/ognibuild/session/__init__.py @@ -88,3 +88,7 @@ def run_with_tee(session: Session, args: List[str], **kwargs): sys.stdout.buffer.flush() contents.append(line.decode("utf-8", "surrogateescape")) return p.returncode, contents + + +def get_user(session): + return session.check_output(["echo", "$USER"]).decode().strip()