Files
nexusphp/nexus/Install/update/update.php

255 lines
10 KiB
PHP
Raw Normal View History

2021-02-01 02:33:45 +08:00
<?php
$rootpath = dirname(dirname(__DIR__)) . '/';
define('ROOT_PATH', $rootpath);
require ROOT_PATH . 'nexus/Install/install_update_start.php';
2021-02-01 02:33:45 +08:00
$isPost = $_SERVER['REQUEST_METHOD'] == 'POST';
2021-02-01 02:33:45 +08:00
$update = new \Nexus\Install\Update();
$currentStep = $update->currentStep();
$maxStep = $update->maxStep();
if (!$update->canAccessStep($currentStep)) {
$update->gotoStep(1);
}
$error = $copy = '';
2021-06-05 17:04:53 +08:00
$pass = true;
2021-02-01 02:33:45 +08:00
//step 1
if ($currentStep == 1) {
$requirements = $update->listRequirementTableRows();
$pass = $requirements['pass'];
if ($isPost) {
$update->nextStep();
}
}
if ($currentStep == 2) {
2021-06-17 20:07:22 +08:00
$tableRows = [];
$versionTable = $versions = [];
$cacheKkey = '__versions_' . date('Ymd_H');
try {
2021-06-22 12:56:03 +08:00
$versions = $update->listVersions();
// if (!empty($_SESSION[$cacheKkey])) {
// $update->doLog("get versions from session.");
// $versions = $_SESSION[$cacheKkey];
// } else {
// $_SESSION[$cacheKkey] = $versions;
// }
2021-06-17 20:07:22 +08:00
} catch (\Exception $exception) {
$error = $exception->getMessage();
}
2022-02-12 19:46:04 +08:00
if (!$isPost) {
$versionHeader = [
'checkbox' => '选择',
'tag_name' => '版本(标签)',
'name' => '名称',
'published_at' => '发布时间',
];
$tableRows[] = [
'checkbox' => sprintf('<input type="radio" name="version_url" value="manual"/>'),
'tag_name' => '手动更新',
'name' => '如若有改动不宜全量覆盖,请勾选此选项并确保已经手动更新了代码',
'published_at' => '---',
];
$latestCommit = $update->getLatestCommit();
$time = \Carbon\Carbon::parse($latestCommit['committer']['date']);
2021-06-17 20:07:22 +08:00
$time->tz = nexus_env('TIMEZONE');
$tableRows[] = [
'checkbox' => sprintf('<input type="radio" name="version_url" value="development|%s"/>', $latestCommit['sha']),
2022-02-12 19:46:04 +08:00
'tag_name' => '最新开发代码',
'name' => "仅限开发测试!最新提交:" . $latestCommit['commit']['message'],
2021-06-17 20:07:22 +08:00
'published_at' => $time->format('Y-m-d H:i:s'),
];
2022-02-12 19:46:04 +08:00
foreach ($versions as $version) {
if ($version['draft']) {
continue;
}
$time = \Carbon\Carbon::parse($version['published_at']);
$time->tz = nexus_env('TIMEZONE');
$versionUrl = $version['tag_name'] . '|' . $version['tarball_url'];
$checked = !empty($_REQUEST['version_url']) && $_REQUEST['version_url'] == $versionUrl ? ' checked' : '';
$tableRows[] = [
'checkbox' => sprintf('<input type="radio" name="version_url" value="%s"%s/>', $versionUrl, $checked),
'tag_name' => $version['tag_name'],
'name' => $version['name'],
'published_at' => $time->format('Y-m-d H:i:s'),
];
}
2021-06-17 20:07:22 +08:00
}
2022-02-12 19:46:04 +08:00
2021-06-22 12:56:03 +08:00
// dd($tableRows);
2021-06-17 20:07:22 +08:00
while ($isPost) {
try {
if (empty($_REQUEST['version_url'])) {
throw new \RuntimeException("没有选择版本");
}
2022-02-12 19:46:04 +08:00
$downloadUrl = '';
2021-06-22 12:56:03 +08:00
if ($_REQUEST['version_url'] == 'manual') {
$update->nextStep();
} elseif (\Illuminate\Support\Str::startsWith($_REQUEST['version_url'], 'development')) {
$downloadUrlArr = explode('|', $_REQUEST['version_url']);
$downloadUrl = sprintf('https://github.com/xiaomlove/nexusphp/archive/%s.zip', $downloadUrlArr[1]);
2022-02-12 19:46:04 +08:00
} else {
$versionUrlArr = explode('|', $_REQUEST['version_url']);
$version = strtolower($versionUrlArr[0]);
$downloadUrl = $versionUrlArr[1];
if (\Illuminate\Support\Str::startsWith($version, 'v')) {
$version = substr($version, 1);
}
$update->doLog("version: $version, downloadUrl: $downloadUrl, currentVersion: " . VERSION_NUMBER);
if (version_compare($version, VERSION_NUMBER, '<=')) {
throw new \RuntimeException("必须选择一个高于当前版本(" . VERSION_NUMBER . ")的");
}
2021-06-17 20:07:22 +08:00
}
$update->downAndExtractCode($downloadUrl);
$update->nextStep();
} catch (\Exception $exception) {
$update->doLog($exception->getMessage() . $exception->getTraceAsString());
$error = $exception->getMessage();
break;
}
break;
}
}
if ($currentStep == 3) {
2021-05-01 02:02:01 +08:00
$envExampleFile = $rootpath . ".env.example";
// $dbstructureFile = $rootpath . "_db/dbstructure_v1.6.sql";
2021-02-01 02:33:45 +08:00
$envExampleData = readEnvFile($envExampleFile);
$envFormControls = $update->listEnvFormControls();
$newData = array_column($envFormControls, 'value', 'name');
while ($isPost) {
try {
$update->createEnvFile($_POST);
$update->nextStep();
} catch (\Exception $exception) {
$error = $exception->getMessage();
break;
}
break;
}
$tableRows = [
[
2021-05-01 02:02:01 +08:00
'label' => basename($envExampleFile),
2021-02-01 02:33:45 +08:00
'required' => 'exists && readable',
'current' => $envExampleFile,
'result' => $update->yesOrNo(file_exists($envExampleFile) && is_readable($envExampleFile)),
],
// [
// 'label' => basename($dbstructureFile),
// 'required' => 'exists && readable',
// 'current' => $dbstructureFile,
// 'result' => $update->yesOrNo(file_exists($dbstructureFile) && is_readable($dbstructureFile)),
// ],
2021-02-01 02:33:45 +08:00
];
$fails = array_filter($tableRows, function ($value) {return $value['result'] == 'NO';});
$pass = empty($fails);
}
if ($currentStep == 4) {
$settingTableRows = $update->listSettingTableRows();
$settings = $settingTableRows['settings'];
$symbolicLinks = $settingTableRows['symbolic_links'];
$tableRows = $settingTableRows['table_rows'];
$pass = $settingTableRows['pass'];
while ($isPost) {
try {
2022-02-12 15:48:26 +08:00
$update->updateDependencies();
2021-02-01 02:33:45 +08:00
$update->createSymbolicLinks($symbolicLinks);
$update->saveSettings($settings);
2021-06-17 20:07:22 +08:00
$update->runExtraQueries();
2022-02-10 22:30:26 +08:00
$update->runMigrate();
2021-02-01 02:33:45 +08:00
$update->nextStep();
} catch (\Exception $e) {
$error = $e->getMessage();
break;
}
break;
}
}
2021-06-04 10:26:34 +08:00
if (!empty($error)) {
$pass = false;
}
2021-02-01 02:33:45 +08:00
?>
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
2021-02-04 17:57:53 +08:00
<title>Update NexusPHP | step <?php echo $currentStep?></title>
2021-02-01 02:33:45 +08:00
</head>
<body>
<div class="container mx-auto">
<?php echo $update->renderSteps()?>
<div class="mt-10">
<form method="post" action="<?php echo getBaseUrl() . '?step=' . $currentStep?>">
<input type="hidden" name="step" value="<?php echo $currentStep?>">
<?php
echo'<div class="step-' . $currentStep . ' text-center">';
2021-06-17 20:07:22 +08:00
$header = [
'label' => '项目',
'required' => '要求',
2021-06-17 20:07:22 +08:00
'current'=> '当前',
'result'=> '结果'
];
2021-02-01 02:33:45 +08:00
if ($currentStep == 1) {
echo $update->renderTable($header, $requirements['table_rows']);
2021-06-17 20:07:22 +08:00
} elseif ($currentStep == 3) {
2021-02-01 02:33:45 +08:00
echo $update->renderTable($header, $tableRows);
echo '<div class="text-gray-700 p-4 text-red-400">若 Redis 不启用,相关项目留空</div>';
echo $update->renderForm($envFormControls);
2021-06-17 20:07:22 +08:00
} elseif ($currentStep == 2) {
2021-02-01 20:19:39 +08:00
if (empty($tableRows)) {
2021-06-17 20:07:22 +08:00
echo '<div class="text-green-600 text-center">抱歉,暂无任何版可以选择!</div>';
2021-02-01 02:33:45 +08:00
} else {
2021-06-17 20:07:22 +08:00
echo $update->renderTable($versionHeader, $tableRows);
2021-02-01 02:33:45 +08:00
}
} elseif ($currentStep == 4) {
echo $update->renderTable($header, $tableRows);
echo '<div class="text-blue-500 pt-10">';
echo sprintf('这一步会把 <code>%s</code> 的数据合并到 <code>%s</code>, 然后插入数据库中。', $tableRows[1]['label'], $tableRows[0]['label']);
echo '</div>';
} elseif ($currentStep > $maxStep) {
echo '<div class="text-green-900 text-6xl p-10">恭喜,一切就绪!</div>';
2021-02-01 20:19:39 +08:00
echo '<div class="mb-6">有问题可查阅升级日志:<code>' . $update->getLogFile() . '</code></div>';
2021-02-01 02:33:45 +08:00
echo '<div class="text-red-500">为安全起见,请删除以下目录</div>';
2021-02-01 20:19:39 +08:00
echo '<div class="text-red-500"><code>' . $update->getUpdateDirectory() . '</code></div>';
2021-02-01 02:33:45 +08:00
}
echo'</div>';
if (!empty($error)) {
echo sprintf('<div class="text-center text-red-500 p-4">Error: %s</div>', nl2br($error));
unset($error);
}
if (!empty($copy)) {
echo sprintf('<div class="text-center"><textarea class="w-1/2 h-40 border">%s</textarea></div>', $copy);
unset($copy);
}
?>
<div class="mt-10 text-center">
<button class="bg-blue-500 p-2 m-4 text-white rounded" type="button" onclick="goBack()">上一步</button>
<?php if ($currentStep <= $maxStep) {?>
<button class="bg-blue-<?php echo $pass ? 500 : 200;?> p-2 m-4 text-white rounded" type="submit" <?php echo $pass ? '' : 'disabled';?>>下一步</button>
<?php } else {?>
2021-02-03 18:41:53 +08:00
<a class="bg-blue-500 p-2 m-4 text-white rounded" href="<?php echo getSchemeAndHttpHost()?>">回首页</a>
2021-02-01 02:33:45 +08:00
<?php }?>
</div>
</form>
</div>
</div>
2021-02-01 20:19:39 +08:00
<div class="m-10 text-center">
2021-05-29 21:48:50 +08:00
欢迎使用 NexusPHP 升级程序,如有疑问,点击<a href="https://nexusphp.org/" target="_blank" class="text-blue-500 p-1">这里</a>获取帮助。
2021-02-01 02:33:45 +08:00
</div>
</body>
<script>
function goBack() {
window.location.search="step=<?php echo $currentStep == 1 ? 1 : $currentStep - 1?>"
}
</script>
2021-04-30 01:27:29 +08:00
</html>