mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 04:44:53 +08:00
add linux tool check
This commit is contained in:
parent
fc7ac921e2
commit
63287dd9c4
72
src/SPC/doctor/item/LinuxToolCheckList.php
Normal file
72
src/SPC/doctor/item/LinuxToolCheckList.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?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;
|
||||||
|
|
||||||
|
#[AsCheckItem('if necessary tools are installed', limit_os: 'Linux')]
|
||||||
|
public function checkCliTools(): ?CheckResult
|
||||||
|
{
|
||||||
|
$distro = SystemUtil::getOSRelease();
|
||||||
|
|
||||||
|
$required = match ($distro['dist']) {
|
||||||
|
'ubuntu', 'debian' => [
|
||||||
|
'make', 'bison', 'flex',
|
||||||
|
'git', 'autoconf', 'automake',
|
||||||
|
'tar', 'unzip', 'gzip',
|
||||||
|
'bzip2', 'cmake',
|
||||||
|
],
|
||||||
|
'alpine' => [
|
||||||
|
'make', 'bison', 'flex',
|
||||||
|
'git', 'autoconf', 'automake',
|
||||||
|
'tar', 'unzip', 'gzip',
|
||||||
|
'bzip2', 'cmake', 'gcc',
|
||||||
|
]
|
||||||
|
};
|
||||||
|
$missing = [];
|
||||||
|
foreach ($required as $cmd) {
|
||||||
|
if ($this->findCommand($cmd) === null) {
|
||||||
|
$missing[] = $cmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($missing)) {
|
||||||
|
return match ($distro['dist']) {
|
||||||
|
'ubuntu', 'alpine', 'debian' => CheckResult::fail(implode(', ', $missing) . ' not installed on your system', 'install-linux-tools', [$distro, $missing]),
|
||||||
|
default => CheckResult::fail(implode(', ', $missing) . ' not installed on your system'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return CheckResult::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[AsFixItem('install-linux-tools')]
|
||||||
|
public function fixBuildTools(array $distro, array $missing): bool
|
||||||
|
{
|
||||||
|
$install_cmd = match ($distro['dist']) {
|
||||||
|
'ubuntu', 'debian' => 'apt install -y',
|
||||||
|
'alpine' => 'apk add',
|
||||||
|
default => throw new RuntimeException('Current linux distro is not supported for auto-install musl packages'),
|
||||||
|
};
|
||||||
|
$prefix = '';
|
||||||
|
if (get_current_user() !== 'root') {
|
||||||
|
$prefix = 'sudo ';
|
||||||
|
logger()->warning('Current user is not root, using sudo for running command');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
shell(true)->exec($prefix . $install_cmd . ' ' . implode(' ', $missing));
|
||||||
|
} catch (RuntimeException) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user