-
Hahn Axel (hahn) authoredHahn Axel (hahn) authored
inc_functions.php 3.70 KiB
<?php
// ----------------------------------------------------------------------
// SHARED FUNCTIONS FOR INSTALLER AND BUILDER
// ----------------------------------------------------------------------
$aCol=[
"reset" => "\e[0m",
"red" => "\e[31m",
"green" => "\e[32m",
"yellow" => "\e[33m",
"blue" => "\e[34m",
"magenta" => "\e[35m",
"cyan" => "\e[36m",
"light_gray" => "\e[37m",
"dark_gray" => "\e[90m",
"light_red" => "\e[91m",
"light_green" => "\e[92m",
"light_yellow" => "\e[93m",
"light_blue" => "\e[94m",
"light_magenta" => "\e[95m",
];
function _h1(string $s): void
{
global $aCol;
echo "\n$aCol[magenta]>>>>>>>>>> $s$aCol[reset]\n";
/*
echo "\n __".str_repeat("_", strlen($s))."\n";
echo "__/ ".str_repeat(" ", strlen($s))." \___".str_repeat("_", 70-strlen($s))."\n";
echo " $s\n";
echo str_repeat(".", 79)."\n\n";
*/
}
function _abort(string $sMessage, int $iExitcode = 1): never
{
global $aCol;
echo "❌ $aCol[red]$sMessage$aCol[reset]\n";
exit($iExitcode);
}
function _ok(string $sMessage=""): void
{
echo "✅ OK $sMessage\n";
}
function _skip(string $sMessage=""): void
{
echo "🔹 SKIP: $sMessage\n";
}
function _chdir(string $sDir): void
{
global $aCol;
if (!is_dir($sDir)) {
_abort("Directory '$sDir' not found.");
}
chdir($sDir);
echo "$aCol[cyan]dir # " . getcwd() . "$aCol[reset]\n";
}
/**
* Execute shell command and abort if it fails
* @param string $cmd
*
* @return int
*/
function _exec(string $cmd, bool $bAbortOnError=true): int
{
global $aCol;
echo "$aCol[blue]cmd > $cmd$aCol[reset]\n";
$iStart=microtime(true);
/*
exec("$cmd 2>&1", $aOut, $rc);
$iEnd=microtime(true);
if (!count($aOut)) {
$aOut = ["-- no output --"];
}
echo implode("\n", $aOut) . "\n";
*/
// show output in real-time
$descriptorspec = [
0 => ["pipe", "r"], // stdin
1 => ["pipe", "w"], // stdout
2 => ["pipe", "w"] // stderr
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// Close stdin pipe
fclose($pipes[0]);
// Read stdout and stderr in real-time
while ($output = fgets($pipes[1])) {
echo " | $output";
flush();
}
fclose($pipes[1]);
while ($error = fgets($pipes[2])) {
echo " 2| $error";
flush();
}
fclose($pipes[2]);
// Close the process
$rc=proc_close($process);
$iEnd=microtime(true);
} else {
if($bAbortOnError){
_abort("Unable to execute command.");
}
_skip("Unable to execute command.");
}
$sTime= "... ⏱️ Time: " . round($iEnd-$iStart, 3) . "s\n";
if ($rc != 0) {
echo "rc=$rc $sTime";
if($bAbortOnError){
_abort("Command failed. Aborting.", $rc);
}
_skip("Unable to execute command.");
}
_ok($sTime);
return $rc;
}
function _mkdir(string $sMyDir): void
{
if (!is_dir($sMyDir)) {
echo "DIR > '$sMyDir' ";
if (!mkdir($sMyDir, 0755, true)) {
_abort("mkdir('$sMyDir') failed.");
}
_ok();
echo "\n";
} else {
_skip("mkdir: already exists: '$sMyDir'");
}
}
function _rm(string $sFileObj): void
{
if (is_dir($sFileObj))
{
_exec("rm -rf \"$sFileObj\"");
} else if (file_exists($sFileObj)) {
if (!unlink($sFileObj)) {
_abort("unlink('$sFileObj') failed.");
}
_ok("File was deleted");
} else {
_skip("rm '$sFileObj' - does not exist");
}
}