MicroFrameWork/kernel/services/KernelService.php
2024-12-18 16:38:08 +03:00

96 lines
3.0 KiB
PHP

<?php
namespace kernel\services;
use kernel\helpers\Debug;
use kernel\helpers\Files;
use kernel\helpers\Manifest;
use kernel\helpers\RESTClient;
use kernel\helpers\Version;
use kernel\Request;
use ZipArchive;
class KernelService
{
protected null|bool $serverAvailable = null;
protected ModuleService $moduleService;
protected Files $files;
public function __construct()
{
$this->moduleService = new ModuleService();
$this->files = new Files();
}
public function getKernelInfo(): false|array|string
{
$info = [];
$info['path'] = KERNEL_DIR;
if (file_exists(KERNEL_DIR . "/manifest.json")) {
$manifest = json_decode(file_get_contents(KERNEL_DIR . "/manifest.json"), true);
$manifest = getConst($manifest);
$info = array_merge($info, $manifest);
}
return $info;
}
public function isLastVersion(): bool
{
if ($this->moduleService->isServerAvailable()) {
$modules_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug');
$modules_info = json_decode($modules_info->getBody()->getContents(), true);
$kernel_info = $this->getKernelInfo();
$kernelVersion = Version::getIntVersionByString($kernel_info['version']);
foreach ($modules_info as $mod) {
$modVersion = Version::getIntVersionByString($mod['version']);
if ($mod['slug'] === $kernel_info['slug'] && $modVersion <= $kernelVersion) {
return true;
}
}
}
return false;
}
public function updateKernel(string $path): bool
{
$request = new Request();
$files = $request->post('files');
$zip = new ZipArchive;
if (file_exists(ROOT_DIR . $path)) {
$tmpKernelDir = md5(time());
$res = $zip->open(ROOT_DIR . $path);
if ($res === TRUE) {
$tmpKernelDirFull = RESOURCES_DIR . '/tmp/kernel/' . $tmpKernelDir . "/";
$zip->extractTo($tmpKernelDirFull);
$zip->close();
$this->files->recursiveRemoveKernelDir();
$this->files->copyKernelFolder($tmpKernelDirFull . 'kernel' , ROOT_DIR . "/kernel");
foreach ($files as $file) {
Debug::prn($file);
if ($file === 'bootstrap.php') {
Debug::prn(123);
$this->files->recursiveRemoveDir(ROOT_DIR . '/bootstrap');
$this->files->copyKernelFolder($tmpKernelDirFull . 'bootstrap' , ROOT_DIR . '/bootstrap');
}
copy($tmpKernelDirFull . $file , ROOT_DIR . '/' . $file);
}
$this->files->recursiveRemoveDir($tmpKernelDirFull);
unlink(ROOT_DIR . $path);
Debug::dd("update kernel success");
return true;
}
}
return false;
}
}