Source code

Revision control

Copy as Markdown

Other Tools

# 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:
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)