Allow Shell to be used on WinNT

This commit is contained in:
Celestora 2022-03-20 17:37:52 +02:00
parent f4d8908d80
commit 02cf435868

View file

@ -11,17 +11,39 @@ class Shell
$functions = array_map(function($x) {
return trim($x);
}, explode(" ", ini_get("disable_functions")));
return !in_array("system", $functions);
if(in_array("system", $functions))
return FALSE;
if(Shell::isPowershell()) {
exec("WHERE powershell", $_x, $_c);
unset($_x);
return $_c === 0;
}
return TRUE;
}
static function isPowershell(): bool
{
return strncasecmp(PHP_OS, 'WIN', 3) === 0;
}
static function commandAvailable(string $name): bool
{
if(!Shell::shellAvailable())
throw new Exceptions\ShellUnavailableException;
if(Shell::isPowershell()) {
exec("WHERE $name", $_x, $_c);
unset($_x);
return $_c === 0;
}
return !is_null(`command -v $name`);
}
static function __callStatic(string $name, array $arguments): object
{
if(!Shell::commandAvailable($name))
@ -41,14 +63,25 @@ class Shell
function execute(?int &$result = nullptr): string
{
$stdout = [];
exec($this->command, $stdout, $result);
if(Shell::isPowershell()) {
$cmd = escapeshellarg($this->command);
exec("powershell -Command $this->command", $stdout, $result);
} else {
exec($this->command, $stdout, $result);
}
return implode(PHP_EOL, $stdout);
}
function start(): string
{
system("nohup " . $this->command . " > /dev/null 2>/dev/null &");
if(Shell::isPowershell()) {
$cmd = escapeshellarg($this->command);
pclose(popen("start /b powershell -Command $this->command", "r"));
} else {
system("nohup " . $this->command . " > /dev/null 2>/dev/null &");
}
return $this->command;
}