88 lines
2.1 KiB
Python
88 lines
2.1 KiB
Python
"""Install system packages."""
|
|
import logging
|
|
import subprocess
|
|
|
|
from .const import PROGRAM_DIR
|
|
from .whiptail import run_with_gauge
|
|
|
|
_LOGGER = logging.getLogger()
|
|
|
|
|
|
def packages_installed(*packages) -> bool:
|
|
for package in packages:
|
|
try:
|
|
subprocess.check_call(
|
|
["dpkg", "--status", str(package)],
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL,
|
|
)
|
|
except Exception:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def install_packages_nogui(*packages, update: bool = True) -> bool:
|
|
assert packages, "No packages"
|
|
|
|
commands = []
|
|
if update:
|
|
commands.append(["sudo", "apt-get", "update"])
|
|
|
|
commands.append(
|
|
["sudo", "apt-get", "install", "--yes"] + [str(p) for p in packages]
|
|
)
|
|
|
|
try:
|
|
for command in commands:
|
|
subprocess.check_call(
|
|
command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
|
|
)
|
|
except Exception:
|
|
_LOGGER.exception("Unexpected error installing packages: %s", packages)
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def install_packages(
|
|
text: str, sudo_password: str, *packages, update: bool = True
|
|
) -> bool:
|
|
assert packages, "No packages"
|
|
|
|
commands = []
|
|
if update:
|
|
commands.append(["sudo", "-S", "apt-get", "update"])
|
|
|
|
commands.append(
|
|
["sudo", "-S", "apt-get", "install", "--yes"] + [str(p) for p in packages]
|
|
)
|
|
|
|
return run_with_gauge(text, commands, sudo_password=sudo_password)
|
|
|
|
|
|
def can_import(*names) -> bool:
|
|
assert names, "No names"
|
|
|
|
venv_dir = PROGRAM_DIR / ".venv"
|
|
if not venv_dir.exists():
|
|
return False
|
|
|
|
try:
|
|
import venv
|
|
except ImportError:
|
|
return False
|
|
|
|
context = venv.EnvBuilder().ensure_directories(PROGRAM_DIR / ".venv")
|
|
|
|
try:
|
|
subprocess.check_call(
|
|
[context.env_exe, "-c", "; ".join(f"import {name}" for name in names)],
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL,
|
|
)
|
|
except Exception:
|
|
return False
|
|
|
|
return True
|