From d428653b942e1a387c3f4299edfcc0f2d6209272 Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 16:46:49 +0200 Subject: [PATCH 1/6] store and check update requirement state --- app/Console/Commands/PerformUpdate.php | 6 ++++ app/Console/Commands/QueueUpdates.php | 1 + app/Jobs/CheckSiteHealth.php | 6 ++++ app/Jobs/UpdateSite.php | 6 ++++ app/Models/Site.php | 8 ++--- app/RemoteSite/Responses/HealthCheck.php | 3 +- .../2024_11_15_191942_create_sites_table.php | 3 -- ...pdate_requirement_state_to_sites_table.php | 36 +++++++++++++++++++ 8 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php diff --git a/app/Console/Commands/PerformUpdate.php b/app/Console/Commands/PerformUpdate.php index 59b7b95..d466417 100644 --- a/app/Console/Commands/PerformUpdate.php +++ b/app/Console/Commands/PerformUpdate.php @@ -35,6 +35,12 @@ public function handle(): int /** @var Site $site */ $site = Site::findOrFail($this->input->getArgument('siteId')); + if (!$site->update_requirement_state) { + $this->output->writeln('Update requirements not met, aborting!'); + + return Command::FAILURE; + } + UpdateSite::dispatchSync( $site, $targetVersion diff --git a/app/Console/Commands/QueueUpdates.php b/app/Console/Commands/QueueUpdates.php index 57b433d..60360f2 100644 --- a/app/Console/Commands/QueueUpdates.php +++ b/app/Console/Commands/QueueUpdates.php @@ -39,6 +39,7 @@ public function handle(): int $this->output->writeln('Pushing update jobs'); $sites = Site::query() + ->where('update_requirement_state', '=', true) ->where( 'cms_version', 'like', diff --git a/app/Jobs/CheckSiteHealth.php b/app/Jobs/CheckSiteHealth.php index 0c7e5ab..2acb61a 100644 --- a/app/Jobs/CheckSiteHealth.php +++ b/app/Jobs/CheckSiteHealth.php @@ -42,6 +42,12 @@ public function handle(): void $this->site->last_seen = Carbon::now(); $this->site->save(); + // Check if conditions are met + // @phpstan-ignore-next-line + if (!$this->site->update_requirement_state) { + return; + } + // Check if a newer Joomla version for that site is available /** @var TufFetcher $tufFetcher */ $tufFetcher = App::make(TufFetcher::class); diff --git a/app/Jobs/UpdateSite.php b/app/Jobs/UpdateSite.php index 11ae42e..9b9b4a0 100644 --- a/app/Jobs/UpdateSite.php +++ b/app/Jobs/UpdateSite.php @@ -51,6 +51,12 @@ public function handle(): void return; } + if (!$healthResult->update_requirement_state) { + Log::info("Site does not meet requirements, abort"); + + return; + } + // Do not make a major version update $majorVersionCms = (int) $healthResult->cms_version; $majorTargetVersion = (int) $this->targetVersion; diff --git a/app/Models/Site.php b/app/Models/Site.php index 66a4fcf..ae3b91e 100644 --- a/app/Models/Site.php +++ b/app/Models/Site.php @@ -20,9 +20,7 @@ class Site extends Model 'db_version', 'cms_version', 'server_os', - 'update_patch', - 'update_minor', - 'update_major' + 'update_requirement_state' ]; protected $hidden = [ @@ -33,9 +31,7 @@ protected function casts(): array { return [ 'last_seen' => 'datetime', - 'update_patch' => 'bool', - 'update_minor' => 'bool', - 'update_major' => 'bool' + 'update_requirement_state' => 'bool', ]; } diff --git a/app/RemoteSite/Responses/HealthCheck.php b/app/RemoteSite/Responses/HealthCheck.php index 1af735a..bf8d437 100644 --- a/app/RemoteSite/Responses/HealthCheck.php +++ b/app/RemoteSite/Responses/HealthCheck.php @@ -11,7 +11,8 @@ public function __construct( public string $db_type, public string $db_version, public string $cms_version, - public string $server_os + public string $server_os, + public bool $update_requirement_state ) { } } diff --git a/database/migrations/2024_11_15_191942_create_sites_table.php b/database/migrations/2024_11_15_191942_create_sites_table.php index 87cee44..9ecfabb 100644 --- a/database/migrations/2024_11_15_191942_create_sites_table.php +++ b/database/migrations/2024_11_15_191942_create_sites_table.php @@ -19,9 +19,6 @@ public function up(): void $table->string('db_version'); $table->string('cms_version')->index(); $table->string('server_os'); - $table->boolean('update_patch'); - $table->boolean('update_minor'); - $table->boolean('update_major'); $table->dateTime('last_seen'); $table->timestamps(); }); diff --git a/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php new file mode 100644 index 0000000..d7c8d73 --- /dev/null +++ b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php @@ -0,0 +1,36 @@ +boolean('update_requirement_state')->default(false)->nullable(true); + + $table->dropColumn('update_patch'); + $table->dropColumn('update_minor'); + $table->dropColumn('update_major'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('sites', function (Blueprint $table) { + $table->dropColumn('update_requirement_state'); + + $table->boolean('update_patch'); + $table->boolean('update_minor'); + $table->boolean('update_major'); + }); + } +}; From 76a9cd6953c2b96b9104f0a5cd84817dbfbfca9c Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 16:51:11 +0200 Subject: [PATCH 2/6] fix tests --- app/Jobs/CheckSiteHealth.php | 1 - app/RemoteSite/Responses/HealthCheck.php | 2 +- ...pdate_requirement_state_to_sites_table.php | 3 +-- tests/Unit/Jobs/UpdateSiteTest.php | 25 ++++++++++++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/Jobs/CheckSiteHealth.php b/app/Jobs/CheckSiteHealth.php index 2acb61a..8fc188e 100644 --- a/app/Jobs/CheckSiteHealth.php +++ b/app/Jobs/CheckSiteHealth.php @@ -43,7 +43,6 @@ public function handle(): void $this->site->save(); // Check if conditions are met - // @phpstan-ignore-next-line if (!$this->site->update_requirement_state) { return; } diff --git a/app/RemoteSite/Responses/HealthCheck.php b/app/RemoteSite/Responses/HealthCheck.php index bf8d437..ba6d4ee 100644 --- a/app/RemoteSite/Responses/HealthCheck.php +++ b/app/RemoteSite/Responses/HealthCheck.php @@ -12,7 +12,7 @@ public function __construct( public string $db_version, public string $cms_version, public string $server_os, - public bool $update_requirement_state + public ?bool $update_requirement_state = null ) { } } diff --git a/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php index d7c8d73..8658a21 100644 --- a/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php +++ b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. */ diff --git a/tests/Unit/Jobs/UpdateSiteTest.php b/tests/Unit/Jobs/UpdateSiteTest.php index 569df9a..f4a1c51 100644 --- a/tests/Unit/Jobs/UpdateSiteTest.php +++ b/tests/Unit/Jobs/UpdateSiteTest.php @@ -59,6 +59,28 @@ public function testJobQuitsIfNoUpdateIsAvailable() $this->assertTrue(true); } + public function testJobQuitsIfRequirementsArentMet() + { + $site = $this->getSiteMock( + [ + 'checkHealth' => $this->getHealthCheckMock(['update_requirement_state' => false]) + ] + ); + + Log::spy(); + + $object = new UpdateSite($site, "1.0.1"); + $object->handle(); + + Log::shouldHaveReceived('info') + ->once() + ->withArgs(function ($message) { + return str_contains($message, 'Site does not meet requirements, abort'); + }); + + $this->assertTrue(true); + } + public function testJobQuitsIfWeDetectALoopForAVersion() { $site = $this->getSiteMock([], null, 6); @@ -241,7 +263,8 @@ protected function getHealthCheckMock($overrides = []) "db_type" => "mysqli", "db_version" => "1.0.0", "cms_version" => "1.0.0", - "server_os" => "Joomla OS 1.0.0" + "server_os" => "Joomla OS 1.0.0", + "update_requirement_state" => true ]; return HealthCheck::from([ From 586e6261a3e199a3c3430937d1a212a3aa40fc3c Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 16:54:46 +0200 Subject: [PATCH 3/6] fix migration --- ...851_add_update_requirement_state_to_sites_table.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php index 8658a21..87e0d02 100644 --- a/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php +++ b/database/migrations/2025_05_18_143851_add_update_requirement_state_to_sites_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class () extends Migration { /** * Run the migrations. */ @@ -12,10 +12,6 @@ public function up(): void { Schema::table('sites', function (Blueprint $table) { $table->boolean('update_requirement_state')->default(false)->nullable(true); - - $table->dropColumn('update_patch'); - $table->dropColumn('update_minor'); - $table->dropColumn('update_major'); }); } @@ -26,10 +22,6 @@ public function down(): void { Schema::table('sites', function (Blueprint $table) { $table->dropColumn('update_requirement_state'); - - $table->boolean('update_patch'); - $table->boolean('update_minor'); - $table->boolean('update_major'); }); } }; From 1828c97f3c8220f8fabd598be2e0859cb81beacd Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 16:56:30 +0200 Subject: [PATCH 4/6] =?UTF-8?q?stupid=20me=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/migrations/2024_11_15_191942_create_sites_table.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/database/migrations/2024_11_15_191942_create_sites_table.php b/database/migrations/2024_11_15_191942_create_sites_table.php index 9ecfabb..87cee44 100644 --- a/database/migrations/2024_11_15_191942_create_sites_table.php +++ b/database/migrations/2024_11_15_191942_create_sites_table.php @@ -19,6 +19,9 @@ public function up(): void $table->string('db_version'); $table->string('cms_version')->index(); $table->string('server_os'); + $table->boolean('update_patch'); + $table->boolean('update_minor'); + $table->boolean('update_major'); $table->dateTime('last_seen'); $table->timestamps(); }); From 925fe5597733cfc926f84c9791043fb86ab50b74 Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 17:01:39 +0200 Subject: [PATCH 5/6] fix tests --- tests/Feature/Api/SiteControllerTest.php | 6 ++++-- tests/Unit/Jobs/CheckSiteHealthTest.php | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/Feature/Api/SiteControllerTest.php b/tests/Feature/Api/SiteControllerTest.php index e44115a..3a6efd9 100644 --- a/tests/Feature/Api/SiteControllerTest.php +++ b/tests/Feature/Api/SiteControllerTest.php @@ -37,7 +37,8 @@ public function testRegisteringASiteWithUrlAndKeyCreatesRow(): void "db_type" => "mysqli", "db_version" => "1.0.0", "cms_version" => "1.0.0", - "server_os" => "Joomla OS 1.0.0" + "server_os" => "Joomla OS 1.0.0", + "update_requirement_state" => true ])); $this->app->bind(Connection::class, fn () => $mock); @@ -170,7 +171,8 @@ protected function createMockSiteInDb(): Site "db_version" => "1.0.0", "cms_version" => "1.0.0", "server_os" => "Joomla OS 1.0.0", - "last_seen" => Carbon::now() + "last_seen" => Carbon::now(), + "update_requirement_state" => true ]); $site->key = 'foobar123foobar123foobar123foobar123'; diff --git a/tests/Unit/Jobs/CheckSiteHealthTest.php b/tests/Unit/Jobs/CheckSiteHealthTest.php index 0e42e40..0ff699d 100644 --- a/tests/Unit/Jobs/CheckSiteHealthTest.php +++ b/tests/Unit/Jobs/CheckSiteHealthTest.php @@ -95,7 +95,8 @@ protected function getHealthCheckMock($overrides = []) "db_type" => "mysqli", "db_version" => "1.0.0", "cms_version" => "1.0.0", - "server_os" => "Joomla OS 1.0.0" + "server_os" => "Joomla OS 1.0.0", + "update_requirement_state" => true ]; return HealthCheck::from([ From 6a6366a1cd5082d9a887dbaad7853a75d58d32fd Mon Sep 17 00:00:00 2001 From: David Jardin Date: Sun, 18 May 2025 17:05:44 +0200 Subject: [PATCH 6/6] fix test --- tests/Unit/Jobs/CheckSiteHealthTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/Jobs/CheckSiteHealthTest.php b/tests/Unit/Jobs/CheckSiteHealthTest.php index 0ff699d..02be82a 100644 --- a/tests/Unit/Jobs/CheckSiteHealthTest.php +++ b/tests/Unit/Jobs/CheckSiteHealthTest.php @@ -84,6 +84,7 @@ function () use ($healthMock) { $siteMock->id = 1; $siteMock->url = "http://example.org"; $siteMock->cms_version = "1.0.0"; + $siteMock->update_requirement_state = true; return $siteMock; }