You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.9 KiB
143 lines
3.9 KiB
1 year ago
|
<?php declare(strict_types = 0);
|
||
|
/*
|
||
|
** Zabbix
|
||
|
** Copyright (C) 2001-2023 Zabbix SIA
|
||
|
**
|
||
|
** This program is free software; you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation; either version 2 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program; if not, write to the Free Software
|
||
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
**/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Module directory scan action.
|
||
|
*/
|
||
|
class CControllerModuleScan extends CController {
|
||
|
|
||
|
protected function checkInput(): bool {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
protected function checkPermissions(): bool {
|
||
|
return $this->checkAccess(CRoleHelper::UI_ADMINISTRATION_GENERAL);
|
||
|
}
|
||
|
|
||
|
protected function doAction(): void {
|
||
|
get_and_clear_messages();
|
||
|
|
||
|
$db_modules_create = [];
|
||
|
$db_modules_create_names = [];
|
||
|
$db_modules_delete = [];
|
||
|
$db_modules_delete_names = [];
|
||
|
|
||
|
$db_modules = API::Module()->get([
|
||
|
'output' => ['id', 'relative_path'],
|
||
|
'sortfield' => 'relative_path',
|
||
|
'preservekeys' => true
|
||
|
]);
|
||
|
|
||
|
$db_moduleids = [];
|
||
|
$healthy_modules = [];
|
||
|
|
||
|
foreach ($db_modules as $moduleid => $db_module) {
|
||
|
$db_moduleids[$db_module['relative_path']] = $moduleid;
|
||
|
}
|
||
|
|
||
|
$module_manager = new CModuleManager(APP::getRootDir());
|
||
|
|
||
|
foreach (['widgets', 'modules'] as $modules_dir) {
|
||
|
foreach (new DirectoryIterator(APP::getRootDir().'/'.$modules_dir) as $item) {
|
||
|
if (!$item->isDir() || $item->isDot()) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$relative_path = $modules_dir.'/'.$item->getFilename();
|
||
|
|
||
|
$manifest = $module_manager->addModule($relative_path);
|
||
|
|
||
|
if (!$manifest) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$is_stored = array_key_exists($relative_path, $db_moduleids);
|
||
|
$is_healthy = !$is_stored || $db_modules[$db_moduleids[$relative_path]]['id'] === $manifest['id'];
|
||
|
|
||
|
if ($is_healthy) {
|
||
|
$healthy_modules[] = $relative_path;
|
||
|
}
|
||
|
|
||
|
if (!$is_stored || !$is_healthy) {
|
||
|
$db_modules_create[] = [
|
||
|
'id' => $manifest['id'],
|
||
|
'relative_path' => $relative_path,
|
||
|
'status' => MODULE_STATUS_DISABLED,
|
||
|
'config' => $manifest['config']
|
||
|
];
|
||
|
$db_modules_create_names[] = $manifest['name'];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach (array_diff_key($db_moduleids, array_flip($healthy_modules)) as $relative_path => $moduleid) {
|
||
|
$db_modules_delete[] = $moduleid;
|
||
|
$db_modules_delete_names[] = $relative_path;
|
||
|
}
|
||
|
|
||
|
if ($db_modules_create) {
|
||
|
$result = API::Module()->create($db_modules_create);
|
||
|
|
||
|
if ($result) {
|
||
|
info(_n('Module added: %1$s.', 'Modules added: %1$s.', implode(', ', $db_modules_create_names),
|
||
|
count($db_modules_create)
|
||
|
));
|
||
|
}
|
||
|
else {
|
||
|
error(_n('Cannot add module: %1$s.', 'Cannot add modules: %1$s.',
|
||
|
implode(', ', $db_modules_create_names), count($db_modules_create)
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($db_modules_delete) {
|
||
|
$result = API::Module()->delete($db_modules_delete);
|
||
|
|
||
|
if ($result) {
|
||
|
info(_n('Module deleted: %1$s.', 'Modules deleted: %1$s.', implode(', ', $db_modules_delete_names),
|
||
|
count($db_modules_delete)
|
||
|
));
|
||
|
}
|
||
|
else {
|
||
|
error(_n('Cannot delete module: %1$s.', 'Cannot delete modules: %1$s.',
|
||
|
implode(', ', $db_modules_delete_names), count($db_modules_delete)
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$response = new CControllerResponseRedirect((new CUrl('zabbix.php'))->setArgument('action', 'module.list'));
|
||
|
|
||
|
$message = ($db_modules_create || $db_modules_delete)
|
||
|
? _('Modules updated')
|
||
|
: _('No new modules discovered');
|
||
|
|
||
|
if (hasErrorMessages()) {
|
||
|
CMessageHelper::setErrorTitle($message);
|
||
|
}
|
||
|
else {
|
||
|
CMessageHelper::setSuccessTitle($message);
|
||
|
}
|
||
|
|
||
|
$response->setFormData(['uncheck' => '1']);
|
||
|
$this->setResponse($response);
|
||
|
}
|
||
|
}
|