# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. import subprocess from mozfile import which from mozboot.base import BaseBootstrapper from mozboot.linux_common import LinuxBootstrapper class CentOSFedoraBootstrapper(LinuxBootstrapper, BaseBootstrapper): def __init__(self, distro, version, dist_id, **kwargs): BaseBootstrapper.__init__(self, **kwargs) self.distro = distro self.version = int(version.split(".")[0]) self.dist_id = dist_id def install_packages(self, packages): if self.version >= 33 and "perl" in packages: packages.append("perl-FindBin") # watchman is not available on centos/rocky if self.distro in ("centos", "rocky", "oracle"): packages = [p for p in packages if p != "watchman"] self.dnf_install(*packages) def upgrade_mercurial(self, current): if current is None: self.dnf_install("mercurial") else: self.dnf_update("mercurial") def dnf_install(self, *packages): if which("dnf"): def not_installed(package): # We could check for "Error: No matching Packages to list", but # checking `dnf`s exit code is sufficent. # Ideally we'd invoke dnf with '--cacheonly', but there's: # https://bugzilla.redhat.com/show_bug.cgi?id=2030255 is_installed = subprocess.run( ["dnf", "list", "--installed", package], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) if is_installed.returncode not in [0, 1]: stdout = is_installed.stdout raise Exception( f'Failed to determine whether package "{package}" is installed: "{stdout}"' ) return is_installed.returncode != 0 packages = list(filter(not_installed, packages)) if len(packages) == 0: # avoid sudo prompt (support unattended re-bootstrapping) return command = ["dnf", "install"] else: command = ["yum", "install"] if self.no_interactive: command.append("-y") command.extend(packages) self.run_as_root(command) def dnf_update(self, *packages): if which("dnf"): command = ["dnf", "update"] else: command = ["yum", "update"] if self.no_interactive: command.append("-y") command.extend(packages) self.run_as_root(command)