* * OPTIONS * * --author= * An Icinga Web 2 user used to mark as an author for all the migrated jobs. */ public function jobsAction(): void { /** @var string $author */ $author = $this->params->getRequired('author'); /** @var User $user */ $user = Auth::getInstance()->getUser(); $user->setUsername($author); $this->migrateJobs(); Logger::info('Successfully applied all pending migrations'); } protected function migrateJobs(): void { $repo = new class () extends IniRepository { /** @var array> */ protected $queryColumns = [ 'jobs' => ['name', 'cidrs', 'ports', 'exclude_targets', 'schedule', 'frequencyType'] ]; /** @var array> */ protected $configs = [ 'jobs' => [ 'module' => 'x509', 'name' => 'jobs', 'keyColumn' => 'name' ] ]; }; $conn = Database::get(); $conn->transaction(function (Connection $conn) use ($repo) { /** @var User $user */ $user = Auth::getInstance()->getUser(); /** @var stdClass $data */ foreach ($repo->select() as $data) { $config = []; if (! isset($data->frequencyType) && ! empty($data->schedule)) { $frequency = new Cron($data->schedule); $config = [ 'type' => get_php_type($frequency), 'frequency' => Json::encode($frequency) ]; } elseif (! empty($data->schedule)) { $config = [ 'type' => $data->frequencyType, 'frequency' => $data->schedule // Is already json encoded ]; } $excludes = $data->exclude_targets; if (empty($excludes)) { $excludes = new Expression('NULL'); } $conn->insert('x509_job', [ 'name' => $data->name, 'author' => $user->getUsername(), 'cidrs' => $data->cidrs, 'ports' => $data->ports, 'exclude_targets' => $excludes, 'ctime' => (new DateTime())->getTimestamp() * 1000, 'mtime' => (new DateTime())->getTimestamp() * 1000 ]); $jobId = (int) $conn->lastInsertId(); if (! empty($config)) { $config['rescan'] = 'n'; $config['full_scan'] = 'n'; $config['since_last_scan'] = Job::DEFAULT_SINCE_LAST_SCAN; $conn->insert('x509_schedule', [ 'job_id' => $jobId, 'name' => $data->name . ' Schedule', 'author' => $user->getUsername(), 'config' => Json::encode($config), 'ctime' => (new DateTime())->getTimestamp() * 1000, 'mtime' => (new DateTime())->getTimestamp() * 1000, ]); } } }); } }