$row['moduleid'], 'mtime' => filemtime($row['filepath'])]); } } if (!tableHasColumn('configtgz', 'dateline')) { if (Database::exec("ALTER TABLE `configtgz` ADD `dateline` int(10) unsigned NOT NULL DEFAULT '0'") === false) { finalResponse(UPDATE_FAILED, 'Could not add dateline to configtgz: ' . Database::lastError()); } $update[] = UPDATE_DONE; // Infer from latest module (since module injection by slx-admin modules would alter the timestamp) $res = Database::simpleQuery('SELECT c.configid, Max(m.dateline) AS dateline FROM configtgz c INNER JOIN configtgz_x_module cxm USING (configid) INNER JOIN configtgz_module m USING (moduleid) GROUP BY configid'); foreach ($res as $row) { Database::exec('UPDATE configtgz SET dateline = :mtime WHERE configid = :configid', ['configid' => $row['configid'], 'mtime' => $row['dateline']]); } } // 2020-01-16: Change contents column type Database::exec("ALTER TABLE `configtgz_module` CHANGE `contents` `contents` LONGBLOB NOT NULL"); // 2020-11-02: Add warnings column if (!tableHasColumn('configtgz', 'warnings')) { if (Database::exec("ALTER TABLE `configtgz` ADD `warnings` TEXT NULL DEFAULT NULL") === false) { finalResponse(UPDATE_FAILED, 'Could not add warnings to configtgz: ' . Database::lastError()); } $update[] = UPDATE_DONE; } // ----- rebuild configs ------ // PERMANENT HACK; Rebuild configs.. move somewhere else? Module::isAvailable('sysconfig'); $list = ConfigModule::getAll(); $parentTask = null; $configList = []; if ($list === null) { EventLog::warning('Could not regenerate configs - please do so manually'); } else { foreach ($list as $confMod) { if ($confMod->moduleType() === 'SshConfig') { // 2020-11-12: Split SshConfig into SshConfig and SshKey $pubkey = $confMod->getData('publicKey'); if (!empty($pubkey)) { error_log('Legacy module with pubkey ' . $confMod->id()); $key = ConfigModule::getInstanceOrNull('SshKey'); if ($key !== null) { $key->setData('publicKey', $pubkey); if ($key->insert($confMod->title())) { // Insert worked, remove key from old module, add this module to the same configs $task = $key->generate(false, $parentTask); if ($task !== false) { $parentTask = $task; } error_log('Inserted new module with id ' . $key->id()); $confMod->setData('publicKey', false); $confMod->update(); $configs = ConfigTgz::getAllForModule($confMod->id()); foreach ($configs as $config) { // Add newly created key-only module to all configs $new = array_merge($config->getModuleIds(), [$key->id()]); error_log(implode(',', $config->getModuleIds()) . ' -> ' . implode(',', $new)); $config->update('', $new); $configList[] = $config; } } } } } if ($confMod->needRebuild()) { $update[] = UPDATE_DONE; $task = $confMod->generate(false, $parentTask); if ($task !== false) { $parentTask = $task; } } } foreach ($configList as $config) { $config->generate(false, 0, $parentTask); } } // Start any changed services ConfigModuleBaseLdap::ldadp(); // Create response for browser responseFromArray($update);