static-php-cli/src/SPC/doctor/item/LinuxToolCheckList.php

116 lines
3.7 KiB
PHP
Raw Normal View History

2023-07-17 20:26:48 +08:00
<?php
declare(strict_types=1);
namespace SPC\doctor\item;
use SPC\builder\linux\SystemUtil;
use SPC\builder\traits\UnixSystemUtilTrait;
use SPC\doctor\AsCheckItem;
use SPC\doctor\AsFixItem;
use SPC\doctor\CheckResult;
use SPC\exception\RuntimeException;
class LinuxToolCheckList
{
use UnixSystemUtilTrait;
2023-07-17 21:11:06 +08:00
public const TOOLS_ALPINE = [
2023-09-18 13:43:58 +02:00
'make', 'bison', 'flex',
2023-07-17 21:11:06 +08:00
'git', 'autoconf', 'automake',
'tar', 'unzip', 'gzip',
'bzip2', 'cmake', 'gcc',
'g++', 'patch',
];
public const TOOLS_DEBIAN = [
2023-09-18 13:43:58 +02:00
'make', 'bison', 'flex',
2023-07-17 21:11:06 +08:00
'git', 'autoconf', 'automake',
'tar', 'unzip', 'gzip',
'bzip2', 'cmake', 'patch',
2023-08-25 16:31:16 +02:00
'xz',
2023-07-17 21:11:06 +08:00
];
2023-09-18 13:43:58 +02:00
public const TOOLS_RHEL = [
'perl', 'make', 'bison', 'flex',
'git', 'autoconf', 'automake',
'tar', 'unzip', 'gzip', 'gcc',
'bzip2', 'cmake', 'patch',
2023-09-30 17:50:37 +02:00
'xz', 'wget', // to get musl
2023-09-18 13:43:58 +02:00
];
/** @noinspection PhpUnused */
2023-09-30 23:18:53 +08:00
#[AsCheckItem('if necessary tools are installed', limit_os: 'Linux', level: 999)]
2023-07-17 20:26:48 +08:00
public function checkCliTools(): ?CheckResult
{
$distro = SystemUtil::getOSRelease();
$required = match ($distro['dist']) {
2023-07-17 21:11:06 +08:00
'alpine' => self::TOOLS_ALPINE,
2023-09-18 13:43:58 +02:00
'almalinux' => self::TOOLS_RHEL,
'rhel' => self::TOOLS_RHEL,
2023-07-17 21:11:06 +08:00
default => self::TOOLS_DEBIAN,
2023-07-17 20:26:48 +08:00
};
$missing = [];
foreach ($required as $cmd) {
if ($this->findCommand($cmd) === null) {
$missing[] = $cmd;
}
}
if (!empty($missing)) {
return match ($distro['dist']) {
2023-09-18 12:52:12 +02:00
'ubuntu',
'alpine',
'rhel',
'almalinux',
'debian' => CheckResult::fail(implode(', ', $missing) . ' not installed on your system', 'install-linux-tools', [$distro, $missing]),
2023-07-17 20:26:48 +08:00
default => CheckResult::fail(implode(', ', $missing) . ' not installed on your system'),
};
}
return CheckResult::ok();
}
/** @noinspection PhpUnused */
2023-07-17 20:58:48 +08:00
#[AsCheckItem('if necessary packages are installed', limit_os: 'Linux')]
public function checkSystemOSPackages(): ?CheckResult
{
$distro = SystemUtil::getOSRelease();
if ($distro['dist'] === 'alpine') {
// check linux-headers installation
if (!file_exists('/usr/include/linux/mman.h')) {
2023-07-17 20:59:59 +08:00
return CheckResult::fail('linux-headers not installed on your system', 'install-linux-tools', [$distro, ['linux-headers']]);
2023-07-17 20:58:48 +08:00
}
}
return CheckResult::ok();
}
/**
* @throws RuntimeException
* @noinspection PhpUnused
*/
2023-07-17 20:26:48 +08:00
#[AsFixItem('install-linux-tools')]
public function fixBuildTools(array $distro, array $missing): bool
{
$install_cmd = match ($distro['dist']) {
2023-08-21 21:47:35 +02:00
'ubuntu', 'debian' => 'apt-get install -y',
2023-07-17 20:26:48 +08:00
'alpine' => 'apk add',
2023-09-18 12:52:12 +02:00
'rhel' => 'dnf install -y',
'almalinux' => 'dnf install -y',
default => throw new RuntimeException('Current linux distro does not have an auto-install script for musl packages yet.'),
2023-07-17 20:26:48 +08:00
};
$prefix = '';
if (get_current_user() !== 'root') {
$prefix = 'sudo ';
logger()->warning('Current user is not root, using sudo for running command');
}
try {
2023-09-18 12:52:12 +02:00
$is_rhel = in_array($distro['dist'], ['rhel', 'almalinux']);
$to_install = $is_rhel ? $missing : str_replace('xz', 'xz-utils', $missing);
shell(true)->exec($prefix . $install_cmd . ' ' . implode(' ', $to_install));
2023-07-17 20:26:48 +08:00
} catch (RuntimeException) {
return false;
}
return true;
}
}