-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provide migration hook & migrate jobs config to database
- Loading branch information
Showing
7 changed files
with
211 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
<?php | ||
|
||
/* Icinga Web 2 X.509 Module | (c) 2023 Icinga GmbH | GPLv2 */ | ||
|
||
namespace Icinga\Module\X509\Model; | ||
|
||
use ipl\Orm\Behavior\BoolCast; | ||
use ipl\Orm\Behavior\MillisecondTimestamp; | ||
use ipl\Orm\Behaviors; | ||
use ipl\Orm\Model; | ||
|
||
class Schema extends Model | ||
{ | ||
public function getTableName(): string | ||
{ | ||
return 'x509_schema'; | ||
} | ||
|
||
public function getKeyName() | ||
{ | ||
return 'id'; | ||
} | ||
|
||
public function getColumns(): array | ||
{ | ||
return [ | ||
'version', | ||
'timestamp', | ||
'success', | ||
'reason' | ||
]; | ||
} | ||
|
||
public function createBehaviors(Behaviors $behaviors): void | ||
{ | ||
$behaviors->add(new BoolCast(['success'])); | ||
$behaviors->add(new MillisecondTimestamp(['timestamp'])); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
<?php | ||
|
||
/* Icinga Web 2 X.509 Module | (c) 2023 Icinga GmbH | GPLv2 */ | ||
|
||
namespace Icinga\Module\X509\ProvidedHook; | ||
|
||
use Icinga\Application\Hook\DbMigrationHook; | ||
use Icinga\Module\X509\Common\Database; | ||
use Icinga\Module\X509\Model\Schema; | ||
use ipl\Orm\Query; | ||
use ipl\Sql; | ||
use ipl\Sql\Adapter\Pgsql; | ||
|
||
class DbMigration extends DbMigrationHook | ||
{ | ||
use Database { | ||
getDb as private getX509Db; | ||
} | ||
|
||
public function getName(): string | ||
{ | ||
return $this->translate('Icinga Certificate Monitoring'); | ||
} | ||
|
||
public function providedDescriptions(): array | ||
{ | ||
return [ | ||
'1.0.0' => $this->translate( | ||
'Adjusts the database type of several columns and changes some composed primary keys.' | ||
), | ||
'1.1.0' => $this->translate( | ||
'Changes the composed x509_target index and x509_certificate valid from/to types to bigint.' | ||
), | ||
'1.2.0' => $this->translate( | ||
'Changes all timestamp columns to bigint and adjusts enum types of "yes/no" to "n/y".' | ||
), | ||
'1.3.0' => $this->translate( | ||
'Introduces the required tables to store jobs and job schedules in the database.' | ||
) | ||
]; | ||
} | ||
|
||
public function getVersion(): string | ||
{ | ||
if ($this->version === null) { | ||
$conn = $this->getDb(); | ||
$schema = $this->getSchemaQuery() | ||
->columns(['version', 'success']) | ||
->orderBy('id', SORT_DESC) | ||
->limit(2); | ||
|
||
if (static::tableExists($conn, $schema->getModel()->getTableName())) { | ||
/** @var Schema $version */ | ||
foreach ($schema as $version) { | ||
if ($version->success) { | ||
$this->version = $version->version; | ||
|
||
break; | ||
} | ||
} | ||
|
||
if (! $this->version) { | ||
// Schema version table exist, but the user has probably deleted the entry! | ||
$this->version = '1.3.0'; | ||
} | ||
} elseif ( | ||
$this->getDb()->getAdapter() instanceof Pgsql | ||
|| static::getColumnType($conn, 'x509_certificate', 'ctime') === 'bigint(20) unsigned' | ||
) { | ||
// We modified a bunch of timestamp columns to bigint in x509 version 1.2.0. | ||
// We have also added Postgres support with x509 version 1.2 and never had an upgrade scripts until now. | ||
$this->version = '1.2.0'; | ||
} elseif (static::getColumnType($conn, 'x509_certificate_subject_alt_name', 'hash') !== null) { | ||
// We know for sure that x509 version 1.0 has been applied, though not whether x509 version 1.1.0 | ||
// did too. Therefore, we have modified the 1.1.0 upgrade script to run multiple times without any | ||
// errors so that we can use 1.0 as the last (migrated) version. | ||
$this->version = '1.0.0'; | ||
} else { | ||
// X509 version 1.0 was the first release of this module, but due to some reason it also contains | ||
// an upgrade script and adds `hash` column. However, if this column doesn't exist yet, we need | ||
// to use the lowest possible release value as the initial (last migrated) version. | ||
$this->version = '0.0.0'; | ||
} | ||
} | ||
|
||
return $this->version; | ||
} | ||
|
||
public function getDb(): Sql\Connection | ||
{ | ||
return $this->getX509Db(); | ||
} | ||
|
||
protected function getSchemaQuery(): Query | ||
{ | ||
return Schema::on($this->getDb()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters