В статье Исправление ручного закрытия проблем в Zabbix 3.4 я уже описывал, как дать права на ручное закрытие проблем пользователям, не имеющим прав редактирования узла. Похожая ситуация возникла и с редактированием периодов обслуживания. Для того, чтобы предоставить пользователю права редактировать периоды обслуживания, нужно дать ему права на редактирование самого узла. Пользователь, имеющий доступ к редактированию узла в Zabbix, может злоупотребить своими правами и просто снять с контроля узел на время его обслуживания. Ещё хуже, если этот пользователь по окончании обслуживания забудет вернуть узел на контроль.
Чтобы избежать подобных злоупотреблений, может быть лучше выдать права создавать и редактировать периоды обслуживания всем пользователям, имеющим права на просмотр соответствующей группы узлов. Именно такое изменение внёс в исходный код веб-интерфейса Zabbix мой коллега Кирилл. Изменил он два файла: frontends/php/include/classes/api/services/CMaintenance.php и frontends/php/maintenance.php. Первый файл исправляет права доступа в методах API maintenance, причём права удалять периоды обслуживания при помощи метода delete пользователю, не имеющему доступа к группе узлов, не предоставляется. Второй файл исправляет права доступа к периодам обслуживания непосредственно через сам веб-интерфейс Zabbix. Получившаяся заплатка выглядит следующим образом:
Index: zabbix-3.4.12-1+buster/frontends/php/include/classes/api/services/CMaintenance.php =================================================================== --- zabbix-3.4.12-1+buster.orig/frontends/php/include/classes/api/services/CMaintenance.php +++ zabbix-3.4.12-1+buster/frontends/php/include/classes/api/services/CMaintenance.php @@ -276,7 +276,6 @@ class CMaintenance extends CApiService { // hosts permissions $options = [ 'hostids' => $hostids, - 'editable' => true, 'output' => ['hostid'], 'preservekeys' => true ]; @@ -289,7 +288,6 @@ class CMaintenance extends CApiService { // groups permissions $options = [ 'groupids' => $groupids, - 'editable' => true, 'output' => ['groupid'], 'preservekeys' => true ]; @@ -458,7 +456,6 @@ class CMaintenance extends CApiService { 'selectGroups' => ['groupid'], 'selectHosts' => ['hostid'], 'selectTimeperiods' => API_OUTPUT_EXTEND, - 'editable' => true, 'preservekeys' => true ]); @@ -580,7 +577,6 @@ class CMaintenance extends CApiService { $db_hosts = API::Host()->get([ 'output' => [], 'hostids' => $hostids, - 'editable' => true, 'preservekeys' => true ]); @@ -598,7 +594,6 @@ class CMaintenance extends CApiService { $db_groups = API::HostGroup()->get([ 'output' => [], 'groupids' => $groupids, - 'editable' => true, 'preservekeys' => true ]); Index: zabbix-3.4.12-1+buster/frontends/php/maintenance.php =================================================================== --- zabbix-3.4.12-1+buster.orig/frontends/php/maintenance.php +++ zabbix-3.4.12-1+buster/frontends/php/maintenance.php @@ -105,7 +105,6 @@ if (isset($_REQUEST['maintenanceid'])) { $dbMaintenance = API::Maintenance()->get([ 'output' => API_OUTPUT_EXTEND, 'selectTimeperiods' => API_OUTPUT_EXTEND, - 'editable' => true, 'maintenanceids' => getRequest('maintenanceid'), ]); if (empty($dbMaintenance)) { @@ -412,7 +411,6 @@ if (!empty($data['form'])) { 'maintenanceids' => $data['maintenanceid'], 'real_hosts' => true, 'output' => ['hostid'], - 'editable' => true ]); $data['hostids'] = zbx_objectValues($data['hostids'], 'hostid'); @@ -458,7 +456,6 @@ if (!empty($data['form'])) { // get groups $data['all_groups'] = API::HostGroup()->get([ - 'editable' => true, 'output' => ['groupid', 'name'], 'real_hosts' => true, 'preservekeys' => true @@ -475,7 +472,6 @@ if (!empty($data['form'])) { $data['hosts'] = API::Host()->get([ 'output' => ['hostid', 'name'], 'real_hosts' => true, - 'editable' => true, 'groupids' => $data['twb_groupid'] ]); @@ -483,7 +479,6 @@ if (!empty($data['form'])) { $hostsSelected = API::Host()->get([ 'output' => ['hostid', 'name'], 'real_hosts' => true, - 'editable' => true, 'hostids' => $data['hostids'] ]); $data['hosts'] = array_merge($data['hosts'], $hostsSelected); @@ -532,7 +527,6 @@ else { 'search' => [ 'name' => ($filter['name'] === '') ? null : $filter['name'] ], - 'editable' => true, 'sortfield' => $sortField, 'sortorder' => $sortOrder, 'limit' => $config['search_limit'] + 1
Эту заплатку можно взять по ссылке zabbix3_4_12_permit_edit_maintenances.patch.