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.

532 lines
17 KiB

<?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.
**/
class CMenuHelper {
/**
* Get main menu element.
*
* @throws Exception
* @return CMenu
*/
public static function getMainMenu(): CMenu {
$menu = new CMenu();
if (CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DASHBOARD)) {
$menu->add(
(new CMenuItem(_('Dashboards')))
->setId('dashboard')
->setIcon(ZBX_ICON_DASHBOARD)
->setAction('dashboard.view')
->setAliases(['dashboard.list'])
);
}
$submenu_monitoring = [
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_PROBLEMS)
? (new CMenuItem(_('Problems')))
->setAction('problem.view')
->setAliases(['tr_events.php'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_HOSTS)
? (new CMenuItem(_('Hosts')))
->setAction('host.view')
->setAliases([
'web.view', 'charts.view', 'chart2.php', 'chart3.php', 'chart6.php', 'chart7.php',
'httpdetails.php', 'host.dashboard.view'
])
: null,
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_LATEST_DATA)
? (new CMenuItem(_('Latest data')))
->setAction('latest.view')
->setAliases(['history.php', 'chart.php'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_MAPS)
? (new CMenuItem(_('Maps')))
->setAction('map.view')
->setAliases(['image.php', 'sysmaps.php', 'sysmap.php', 'map.php'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DISCOVERY)
? (new CMenuItem(_('Discovery')))->setAction('discovery.view')
: null
];
$submenu_monitoring = array_filter($submenu_monitoring);
if ($submenu_monitoring) {
$menu->add(
(new CMenuItem(_('Monitoring')))
->setId('view')
->setIcon(ZBX_ICON_EYE_ALT)
->setSubMenu(new CMenu($submenu_monitoring))
);
}
$submenu_services = [
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SERVICES)
? (new CMenuItem(_('Services')))
->setAction('service.list')
->setAliases(['service.list.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SLA)
? (new CMenuItem(_('SLA')))
->setAction('sla.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SLA_REPORT)
? (new CMenuItem(_('SLA report')))
->setAction('slareport.list')
: null
];
$submenu_services = array_filter($submenu_services);
if ($submenu_services) {
$menu->add(
(new CMenuItem(_('Services')))
->setId('services')
->setIcon(ZBX_ICON_HIERARCHY)
->setSubMenu(new CMenu($submenu_services))
);
}
$submenu_inventory = [
CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_OVERVIEW)
? (new CMenuItem(_('Overview')))
->setUrl(new CUrl('hostinventoriesoverview.php'), 'hostinventoriesoverview.php')
: null,
CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_HOSTS)
? (new CMenuItem(_('Hosts')))->setUrl(new CUrl('hostinventories.php'), 'hostinventories.php')
: null
];
$submenu_inventory = array_filter($submenu_inventory);
if ($submenu_inventory) {
$menu->add(
(new CMenuItem(_('Inventory')))
->setId('cm')
->setIcon(ZBX_ICON_LIST)
->setSubMenu(new CMenu($submenu_inventory))
);
}
$submenu_reports = [
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SYSTEM_INFO)
? (new CMenuItem(_('System information')))->setAction('report.status')
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SCHEDULED_REPORTS)
? (new CMenuItem(_('Scheduled reports')))
->setAction('scheduledreport.list')
->setAliases(['scheduledreport.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AVAILABILITY_REPORT)
? (new CMenuItem(_('Availability report')))
->setUrl(new CUrl('report2.php'), 'report2.php')
->setAliases(['chart4.php'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_TOP_TRIGGERS)
? (new CMenuItem(_('Top 100 triggers')))->setAction('toptriggers.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AUDIT)
? (new CMenuItem(_('Audit log')))->setAction('auditlog.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_ACTION_LOG)
? (new CMenuItem(_('Action log')))->setAction('actionlog.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_NOTIFICATIONS)
? (new CMenuItem(_('Notifications')))->setUrl(new CUrl('report4.php'), 'report4.php')
: null
];
$submenu_reports = array_filter($submenu_reports);
if ($submenu_reports) {
$menu->add(
(new CMenuItem(_('Reports')))
->setId('reports')
->setIcon(ZBX_ICON_REPORT)
->setSubMenu(new CMenu($submenu_reports))
);
}
$submenu_data_collection = [
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATE_GROUPS)
? (new CMenuItem(_('Template groups')))->setAction('templategroup.list')
->setAliases(['templategroup.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOST_GROUPS)
? (new CMenuItem(_('Host groups')))->setAction('hostgroup.list')
->setAliases(['hostgroup.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATES)
? (new CMenuItem(_('Templates')))
->setAction('template.list')
->setAliases([
'template.dashboard.list', 'template.dashboard.edit', 'items.php?context=template',
'triggers.php?context=template', 'graphs.php?context=template',
'host_discovery.php?context=template', 'disc_prototypes.php?context=template',
'trigger_prototypes.php?context=template', 'host_prototypes.php?context=template',
'httpconf.php?context=template'
])
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOSTS)
? (new CMenuItem(_('Hosts')))
->setAction('host.list')
->setAliases([
'items.php?context=host', 'triggers.php?context=host', 'graphs.php?context=host',
'host_discovery.php?context=host', 'disc_prototypes.php?context=host',
'trigger_prototypes.php?context=host', 'host_prototypes.php?context=host',
'httpconf.php?context=host', 'host.edit'
])
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_MAINTENANCE)
? (new CMenuItem(_('Maintenance')))->setAction('maintenance.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_EVENT_CORRELATION)
? (new CMenuItem(_('Event correlation')))
->setAction('correlation.list')
->setAliases(['correlation.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY)
? (new CMenuItem(_('Discovery')))
->setAction('discovery.list')
->setAliases(['discovery.edit'])
: null
];
$submenu_data_collection = array_filter($submenu_data_collection);
if ($submenu_data_collection) {
$menu->add(
(new CMenuItem(_('Data collection')))
->setId('config')
->setIcon(ZBX_ICON_DOWNLOAD)
->setSubMenu(new CMenu($submenu_data_collection))
);
}
$submenu_alerts = [
(CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TRIGGER_ACTIONS) ||
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICE_ACTIONS) ||
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY_ACTIONS) ||
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_AUTOREGISTRATION_ACTIONS) ||
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_INTERNAL_ACTIONS))
? (new CMenuItem(_('Actions')))
->setSubMenu(new CMenu(array_filter([
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TRIGGER_ACTIONS)
? (new CMenuItem(_('Trigger actions')))
->setUrl(
(new CUrl('zabbix.php'))
->setArgument('action', 'action.list')
->setArgument('eventsource', EVENT_SOURCE_TRIGGERS),
'action.list?eventsource='.EVENT_SOURCE_TRIGGERS
)
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICE_ACTIONS)
? (new CMenuItem(_('Service actions')))
->setUrl(
(new CUrl('zabbix.php'))
->setArgument('action', 'action.list')
->setArgument('eventsource', EVENT_SOURCE_SERVICE),
'action.list?eventsource='.EVENT_SOURCE_SERVICE
)
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY_ACTIONS)
? (new CMenuItem(_('Discovery actions')))
->setUrl(
(new CUrl('zabbix.php'))
->setArgument('action', 'action.list')
->setArgument('eventsource', EVENT_SOURCE_DISCOVERY),
'action.list?eventsource='.EVENT_SOURCE_DISCOVERY
)
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_AUTOREGISTRATION_ACTIONS)
? (new CMenuItem(_('Autoregistration actions')))
->setUrl(
(new CUrl('zabbix.php'))
->setArgument('action', 'action.list')
->setArgument('eventsource', EVENT_SOURCE_AUTOREGISTRATION),
'action.list?eventsource='.EVENT_SOURCE_AUTOREGISTRATION
)
: null,
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_INTERNAL_ACTIONS)
? (new CMenuItem(_('Internal actions')))
->setUrl(
(new CUrl('zabbix.php'))
->setArgument('action', 'action.list')
->setArgument('eventsource', EVENT_SOURCE_INTERNAL),
'action.list?eventsource='.EVENT_SOURCE_INTERNAL
)
: null
])))
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_MEDIA_TYPES)
? (new CMenuItem(_('Media types')))
->setAction('mediatype.list')
->setAliases(['mediatype.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_SCRIPTS)
? (new CMenuItem(_('Scripts')))
->setAction('script.list')
->setAliases(['script.edit'])
: null
];
$submenu_alerts = array_filter($submenu_alerts);
if ($submenu_alerts) {
$menu->add(
(new CMenuItem(_('Alerts')))
->setId('alerts')
->setIcon(ZBX_ICON_ENVELOPE)
->setSubMenu(new CMenu($submenu_alerts))
);
}
$submenu_users = [
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_GROUPS)
? (new CMenuItem(_('User groups')))
->setAction('usergroup.list')
->setAliases(['usergroup.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_ROLES)
? (new CMenuItem(_('User roles')))
->setAction('userrole.list')
->setAliases(['userrole.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USERS)
? (new CMenuItem(_('Users')))
->setAction('user.list')
->setAliases(['user.edit'])
: null,
(!CWebUser::isGuest() && CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_API_TOKENS) &&
CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS))
? (new CMenuItem(_('API tokens')))
->setAction('token.list')
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_AUTHENTICATION)
? (new CMenuItem(_('Authentication')))
->setAction('authentication.edit')
: null
];
$submenu_users = array_filter($submenu_users);
if ($submenu_users) {
$menu->add(
(new CMenuItem(_('Users')))
->setId('users-menu')
->setIcon(ZBX_ICON_USERS)
->setSubMenu(new CMenu($submenu_users))
);
}
$submenu_administration = [
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_GENERAL)
? (new CMenuItem(_('General')))
->setSubMenu(new CMenu(array_filter([
(new CMenuItem(_('GUI')))
->setAction('gui.edit'),
(new CMenuItem(_('Autoregistration')))
->setAction('autoreg.edit'),
(new CMenuItem(_('Images')))
->setAction('image.list')
->setAliases(['image.edit']),
(new CMenuItem(_('Icon mapping')))
->setAction('iconmap.list')
->setAliases(['iconmap.edit']),
(new CMenuItem(_('Regular expressions')))
->setAction('regex.list')
->setAliases(['regex.edit']),
(new CMenuItem(_('Trigger displaying options')))
->setAction('trigdisplay.edit'),
(new CMenuItem(_('Geographical maps')))
->setAction('geomaps.edit'),
(new CMenuItem(_('Modules')))
->setAction('module.list')
->setAliases(['module.edit', 'module.scan']),
(new CMenuItem(_('Connectors')))
->setAction('connector.list')
->setAliases(['connector.edit']),
(new CMenuItem(_('Other')))
->setAction('miscconfig.edit')
])))
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_AUDIT_LOG)
? (new CMenuItem(_('Audit log')))
->setAction('audit.settings.edit')
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_HOUSEKEEPING)
? (new CMenuItem(_('Housekeeping')))
->setAction('housekeeping.edit')
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_PROXIES)
? (new CMenuItem(_('Proxies')))
->setAction('proxy.list')
->setAliases(['proxy.edit'])
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_MACROS)
? (new CMenuItem(_('Macros')))
->setAction('macros.edit')
: null,
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_QUEUE)
? (new CMenuItem(_('Queue')))
->setSubMenu(new CMenu([
(new CMenuItem(_('Queue overview')))
->setAction('queue.overview'),
(new CMenuItem(_('Queue overview by proxy')))
->setAction('queue.overview.proxy'),
(new CMenuItem(_('Queue details')))
->setAction('queue.details')
]))
: null
];
$submenu_administration = array_filter($submenu_administration);
if ($submenu_administration) {
$menu->add(
(new CMenuItem(_('Administration')))
->setId('admin')
->setIcon(ZBX_ICON_COG)
->setSubMenu(new CMenu($submenu_administration))
);
}
return $menu;
}
/**
* Get user menu element.
*
* @return CMenu
*/
public static function getUserMenu(): CMenu {
$menu = new CMenu();
if (!CBrandHelper::isRebranded()) {
$lang = CWebUser::getLang();
$menu
->add(
(new CMenuItem(_('Support')))
->setIcon(ZBX_ICON_SUPPORT)
->setUrl(new CUrl(getSupportUrl($lang)))
->setTitle(_('Zabbix Technical Support'))
->setTarget('_blank')
)
->add(
(new CMenuItem(_('Integrations')))
->setIcon(ZBX_ICON_Z)
->setUrl(new CUrl(getIntegrationsUrl($lang)))
->setTitle(_('Zabbix Integrations'))
->setTarget('_blank')
);
}
$menu->add(
(new CMenuItem(_('Help')))
->setIcon(ZBX_ICON_HELP)
->setUrl(new CUrl(CBrandHelper::getHelpUrl()))
->setTitle(_('Help'))
->setTarget('_blank')
);
$user = array_intersect_key(CWebUser::$data, array_flip(['username', 'name', 'surname'])) + [
'name' => null,
'surname' => null
];
if (CWebUser::isGuest()) {
$menu->add(
(new CMenuItem(_('Guest user')))
->setIcon(ZBX_ICON_USER)
->setTitle(getUserFullname($user))
);
}
elseif (CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS)) {
$menu->add(
(new CMenuItem(_('User settings')))
->setIcon(ZBX_ICON_USER_FILLED)
->setTitle(getUserFullname($user))
->setSubMenu(new CMenu([
(new CMenuItem(_('Profile')))
->setAction('userprofile.edit'),
(new CMenuItem(_('API tokens')))
->setAction('user.token.list')
]))
);
}
else {
$menu->add(
(new CMenuItem(_('User settings')))
->setIcon(ZBX_ICON_USER_FILLED)
->setAction('userprofile.edit')
->setTitle(getUserFullname($user))
);
}
$menu->add(
(new CMenuItem(_('Sign out')))
->setIcon(ZBX_ICON_SIGNOUT)
->setUrl(new CUrl('#signout'))
->setTitle(_('Sign out'))
->onClick('ZABBIX.logout(event)')
);
return $menu;
}
/**
* Get first menu item from main menu.
*
* @return CMenuItem
*/
private static function getFirstMenuItem(): CMenuItem {
$menu = self::getMainMenu();
foreach (CRoleHelper::getUiSectionsLabels(CWebUser::$data['type']) as $section_label) {
$section_submenu = $menu->find($section_label);
if ($section_submenu instanceof CMenuItem && !$section_submenu->hasSubMenu()) {
return $menu->getMenuItems()[0];
}
elseif ($section_submenu instanceof CMenuItem) {
$menu = $section_submenu
->getSubMenu()
->getMenuItems();
if ($menu[0]->hasSubMenu()) {
$menu = $menu[0]
->getSubMenu()
->getMenuItems();
}
return $menu[0];
}
}
return $menu->getMenuItems()[0];
}
public static function getFirstUrl(): string {
return self::getFirstMenuItem()
->getUrl()
->getUrl();
}
public static function getFirstLabel(): string {
return self::getFirstMenuItem()->getLabel();
}
}