From 6eeac797a49ac6add2a97199c0fc3b94448f8ea0 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Fri, 13 May 2022 14:40:59 +0800 Subject: [PATCH] add command nexus:update --- app/Console/Commands/NexusUpdate.php | 122 +++++++++++++++++++++++++++ include/functions.php | 2 +- nexus/Database/NexusDB.php | 19 ++++- nexus/Install/Install.php | 41 ++++++--- nexus/Install/Update.php | 18 ++-- 5 files changed, 178 insertions(+), 24 deletions(-) create mode 100644 app/Console/Commands/NexusUpdate.php diff --git a/app/Console/Commands/NexusUpdate.php b/app/Console/Commands/NexusUpdate.php new file mode 100644 index 00000000..08f85f3a --- /dev/null +++ b/app/Console/Commands/NexusUpdate.php @@ -0,0 +1,122 @@ +update = new Update(); + } + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + define('WITH_LARAVEL', true); + require ROOT_PATH . 'nexus/Database/helpers.php'; + //Step 1 + $step = $this->update->currentStep(); + $log = "Step 1, Checking environment..."; + $this->doLog($log); + $requirements = $this->update->listRequirementTableRows(); + $fails = $requirements['fails']; + if (!empty($fails)) { + foreach ($fails as $value) { + $this->doLog("Error: " . nexus_json_encode($value), 'error'); + } + return 0; + } + $this->update->gotoStep(++$step); + + //Step 2 + $log = "Step 2, get files, cli skip..."; + $this->doLog($log); + $this->update->gotoStep(++$step); + + //Step 3 + $log = "Step 3, update .env, cli skip..."; + $this->doLog($log); + $this->update->gotoStep(++$step); + + //Step 4 + $log = "Step 4, perform update..."; + $this->doLog($log); + $settingTableRows = $this->update->listSettingTableRows(); + $settings = $settingTableRows['settings']; + $symbolicLinks = $settingTableRows['symbolic_links']; + $fails = $settingTableRows['fails']; + $mysqlInfo = $this->update->getMysqlVersionInfo(); + + if (!empty($fails)) { + foreach ($fails as $value) { + $this->doLog("Error: " . nexus_json_encode($value), 'error'); + } + return 0; + } + if (!$mysqlInfo['match']) { + $this->doLog("Error: MySQL version: {$mysqlInfo['version']} is too low, please use the newest version of 5.7 or above.", 'error'); + return 0; + } + $this->doLog("going to createSymbolicLinks..."); + $this->update->createSymbolicLinks($symbolicLinks); + $this->doLog("createSymbolicLinks done!"); + + $this->doLog("going to saveSettings..."); + $this->update->saveSettings($settings); + $this->doLog("saveSettings done!"); + + $this->doLog("going to runExtraQueries..."); + $this->update->runExtraQueries(); + $this->doLog("runExtraQueries done!"); + + $this->doLog("going to runMigrate..."); + $this->update->runMigrate(); + $this->doLog("runMigrate done!"); + + $this->doLog("going to runExtraMigrate..."); + $this->update->runExtraMigrate(); + $this->doLog("runExtraMigrate done!"); + + $this->doLog("All done!"); + + return 0; + } + + private function doLog($log, string $level = 'info') + { + $this->update->doLog($log); + $this->{$level}(sprintf( + '[%s] [%s] %s', + date('Y-m-d H:i:s'), $this->update->currentStep(), $log + )); + } +} diff --git a/include/functions.php b/include/functions.php index 222d5207..2c413397 100644 --- a/include/functions.php +++ b/include/functions.php @@ -4951,7 +4951,7 @@ function saveSetting($prefix, $nameAndValue, $autoload = 'yes') $data[] = sprintf("(%s, %s, %s, %s, '%s')", sqlesc("$prefix.$name"), sqlesc($value), sqlesc($datetimeNow), sqlesc($datetimeNow), $autoload); } $sql .= implode(",", $data) . " on duplicate key update value = values(value)"; - sql_query($sql) or sqlerr(__FILE__, __LINE__); + \Nexus\Database\NexusDB::statement($sql); } function getFullDirectory($dir) diff --git a/nexus/Database/NexusDB.php b/nexus/Database/NexusDB.php index 882c0a82..322f95d3 100644 --- a/nexus/Database/NexusDB.php +++ b/nexus/Database/NexusDB.php @@ -2,6 +2,7 @@ namespace Nexus\Database; +use Illuminate\Support\Facades\Schema; use Illuminate\Database\Capsule\Manager as Capsule; use Illuminate\Database\Query\Expression; use Illuminate\Support\Facades\Cache; @@ -262,7 +263,7 @@ class NexusDB $connection->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); } - public static function schema(): \Illuminate\Database\Schema\Builder + private static function schema(): \Illuminate\Database\Schema\Builder { if (IN_NEXUS) { return Capsule::schema(self::ELOQUENT_CONNECTION_NAME); @@ -270,6 +271,22 @@ class NexusDB throw new \RuntimeException('can not call this when not in nexus.'); } + public static function hasTable($table): bool + { + if (IN_NEXUS) { + return self::schema()->hasTable($table); + } + return Schema::hasTable($table); + } + + public static function hasColumn($table, $column): bool + { + if (IN_NEXUS) { + return self::schema()->hasColumn($table, $column); + } + return Schema::hasColumn($table, $column); + } + public static function table($table): \Illuminate\Database\Query\Builder { if (IN_NEXUS) { diff --git a/nexus/Install/Install.php b/nexus/Install/Install.php index e38ac239..fdb20605 100644 --- a/nexus/Install/Install.php +++ b/nexus/Install/Install.php @@ -2,6 +2,7 @@ namespace Nexus\Install; +use App\Models\Setting; use App\Models\User; use App\Repositories\UserRepository; use Illuminate\Support\Str; @@ -44,7 +45,9 @@ class Install if (!session_id()) { session_start(); } - $this->checkLock(); + if (!$this->runningInConsole()) { + $this->checkLock(); + } $this->currentStep = min(intval($_REQUEST['step'] ?? 1) ?: 1, count($this->steps) + 1); } @@ -58,6 +61,11 @@ class Install return $this->currentStep; } + public function runningInConsole(): bool + { + return php_sapi_name() == 'cli'; + } + public function canAccessStep($step) { for ($i = 1; $i < $step; $i++) { @@ -144,9 +152,10 @@ class Install { $gdInfo = function_exists('gd_info') ? gd_info() : []; $tableRows = []; + $phpVersionRequire = '>= ' . $this->minimumPhpVersion; $tableRows[] = [ 'label' => 'PHP version', - 'required' => '>= ' . $this->minimumPhpVersion, + 'required' => $phpVersionRequire, 'current' => PHP_VERSION, 'result' => $this->yesOrNo(version_compare(PHP_VERSION, $this->minimumPhpVersion, '>=')), ]; @@ -188,13 +197,13 @@ class Install ]; } - - - $fails = array_filter($tableRows, function ($value) {return in_array($value['required'], ['true', 'enabled']) && $value['result'] == 'NO';}); + $fails = array_filter($tableRows, function ($value) use ($phpVersionRequire) { + return in_array($value['required'], ['true', 'enabled', $phpVersionRequire]) && $value['result'] == 'NO'; + }); $pass = empty($fails); - return [ 'table_rows' => $tableRows, + 'fails' => $fails, 'pass' => $pass, ]; } @@ -231,7 +240,7 @@ class Install require $originalConfigFile; $settings = require $defaultSettingsFile; $settingsFromDb = []; - if (NexusDB::schema()->hasTable('settings') && get_row_count('settings') > 0) { + if (NexusDB::hasTable('settings') && Setting::query()->count() > 0) { $settingsFromDb = get_setting(); } $this->doLog("settings form db: " . json_encode($settingsFromDb)); @@ -278,6 +287,7 @@ class Install 'table_rows' => $tableRows, 'symbolic_links' => $symbolicLinks, 'settings' => $settings, + 'fails' => $fails, 'pass' => $pass, ]; } @@ -290,8 +300,13 @@ class Install public function gotoStep($step) { - nexus_redirect(getBaseUrl() . "?step=$step"); - die(0); + if ($this->runningInConsole()) { + $this->currentStep = $step; + } else { + nexus_redirect(getBaseUrl() . "?step=$step"); + die(0); + } + } public function maxStep() @@ -524,7 +539,7 @@ class Install public function saveSettings($settings) { - if (!NexusDB::schema()->hasTable('settings')) { + if (!NexusDB::hasTable('settings')) { $this->runMigrate('database/migrations/2021_06_08_113437_create_settings_table.php'); } foreach ($settings as $prefix => $group) { @@ -635,9 +650,9 @@ class Install public function getMysqlVersionInfo(): array { - $res = mysql_query('select version() as v'); - $result = mysql_fetch_assoc($res); - $version = $result['v']; + $sql = 'select version() as v'; + $result = NexusDB::select($sql); + $version = $result[0]['v']; $match = version_compare($version, '5.7.7', '>='); return compact('version', 'match'); } diff --git a/nexus/Install/Update.php b/nexus/Install/Update.php index 3ec88817..451d23be 100644 --- a/nexus/Install/Update.php +++ b/nexus/Install/Update.php @@ -99,7 +99,7 @@ class Update extends Install $this->doLog("[ADD CUSTOM FIELD MENU] insert: " . json_encode($insert) . " to table: $table, id: $id"); } //since beta8 - if (WITH_LARAVEL && !NexusDB::schema()->hasColumn('categories', 'icon_id')) { + if (WITH_LARAVEL && !NexusDB::hasColumn('categories', 'icon_id')) { $this->doLog('[INIT CATEGORY ICON_ID]'); $this->runMigrate('database/migrations/2022_03_08_040415_add_icon_id_to_categories_table.php'); $icon = Icon::query()->orderBy('id', 'asc')->first(); @@ -108,7 +108,7 @@ class Update extends Install } } //fix base url, since beta8 - if (WITH_LARAVEL && NexusDB::schema()->hasTable('settings')) { + if (WITH_LARAVEL && NexusDB::hasTable('settings')) { $settingBasic = get_setting('basic'); if (isset($settingBasic['BASEURL']) && Str::startsWith($settingBasic['BASEURL'], 'localhost')) { $this->doLog('[RESET CONFIG basic.BASEURL]'); @@ -137,11 +137,11 @@ class Update extends Install * attendance change, do migrate */ if (WITH_LARAVEL) { - if (!NexusDB::schema()->hasTable('attendance')) { + if (!NexusDB::hasTable('attendance')) { //no table yet, no need to migrate $this->runMigrate('database/migrations/2021_06_08_113437_create_attendance_table.php'); } - if (!NexusDB::schema()->hasColumn('attendance', 'total_days')) { + if (!NexusDB::hasColumn('attendance', 'total_days')) { $this->runMigrate('database/migrations/2021_06_13_215440_add_total_days_to_attendance_table.php'); $attendanceRep = new AttendanceRepository(); $count = $attendanceRep->migrateAttendance(); @@ -154,7 +154,7 @@ class Update extends Install * * add seed points to user */ - if (WITH_LARAVEL && !NexusDB::schema()->hasColumn('users', 'seed_points')) { + if (WITH_LARAVEL && !NexusDB::hasColumn('users', 'seed_points')) { $this->runMigrate('database/migrations/2021_06_24_013107_add_seed_points_to_users_table.php'); //Don't do this, initial seed points = 0; // $result = $this->initSeedPoints(); @@ -166,7 +166,7 @@ class Update extends Install * * add id to agent_allowed_exception */ - if (WITH_LARAVEL && !NexusDB::schema()->hasColumn('agent_allowed_exception', 'id')) { + if (WITH_LARAVEL && !NexusDB::hasColumn('agent_allowed_exception', 'id')) { $this->runMigrate('database/migrations/2022_02_25_021356_add_id_to_agent_allowed_exception_table.php'); $this->doLog("[ADD_ID_TO_AGENT_ALLOWED_EXCEPTION]"); } @@ -176,7 +176,7 @@ class Update extends Install * * init tag */ - if (WITH_LARAVEL && !NexusDB::schema()->hasTable('tags')) { + if (WITH_LARAVEL && !NexusDB::hasTable('tags')) { $this->runMigrate('database/migrations/2022_03_07_012545_create_tags_table.php'); $this->initTag(); $this->doLog("[INIT_TAG]"); @@ -205,7 +205,7 @@ class Update extends Install * * add attendance_card to users */ - if (WITH_LARAVEL && !NexusDB::schema()->hasColumn('users', 'attendance_card')) { + if (WITH_LARAVEL && !NexusDB::hasColumn('users', 'attendance_card')) { $this->runMigrate('database/migrations/2022_04_02_163930_create_attendance_logs_table.php'); $this->runMigrate('database/migrations/2022_04_03_041642_add_attendance_card_to_users_table.php'); $rep = new AttendanceRepository(); @@ -232,7 +232,7 @@ class Update extends Install $this->doLog(__METHOD__ . ", laravel is not available"); return; } - if (NexusDB::schema()->hasColumn('torrents', 'tags')) { + if (NexusDB::hasColumn('torrents', 'tags')) { if (Torrent::query()->where('tags', '>', 0)->count() > 0 && TorrentTag::query()->count() == 0) { $this->doLog("[MIGRATE_TORRENT_TAG]..."); $tagRep = new TagRepository();