diff --git a/src/SPC/doctor/item/LinuxToolCheckList.php b/src/SPC/doctor/item/LinuxToolCheckList.php new file mode 100644 index 00000000..6d69bd6e --- /dev/null +++ b/src/SPC/doctor/item/LinuxToolCheckList.php @@ -0,0 +1,72 @@ + [ + '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; + } +}