/** * Creates nodes that can be used to display the service configuration tree using the CTree class. * * @see CTree * * @param array $services * @param array $parentService * @param array $service * @param array $dependency * @param array $tree */ function createServiceConfigurationTree(array $services, &$tree, array $parentService = [], array $service = [], array $dependency = []) { if (!$service) { $serviceNode = ['id' => 0, 'parentid' => 0, 'caption' => _('root'), 'trigger' => [], 'action' => new CHorList([(new CLink(_('Add child'), 'services.php?form=1&parentname=' . _('root')))->addClass(ZBX_STYLE_LINK_ACTION)]), 'algorithm' => SPACE, 'description' => SPACE]; $service = $serviceNode; $service['serviceid'] = 0; $service['dependencies'] = []; $service['trigger'] = []; // add all top level services as children of "root" foreach ($services as $topService) { if (!$topService['parent']) { $service['dependencies'][] = ['servicedownid' => $topService['serviceid'], 'soft' => 0, 'linkid' => 0]; } } $tree = [$serviceNode]; } else { // service is deletable only if it has no hard dependency $deletable = true; foreach ($service['dependencies'] as $dep) { if ($dep['soft'] == 0) { $deletable = false; break; } } $serviceNode = ['id' => $service['serviceid'], 'caption' => new CLink($service['name'], 'services.php?form=1&serviceid=' . $service['serviceid']), 'action' => new CHorList([(new CLink(_('Add child'), 'services.php?form=1&parentid=' . $service['serviceid'] . '&parentname=' . $service['name']))->addClass(ZBX_STYLE_LINK_ACTION), $deletable ? (new CLink(_('Delete'), 'services.php?delete=1&serviceid=' . $service['serviceid']))->addClass(ZBX_STYLE_LINK_ACTION)->addConfirmation(_s('Delete service "%1$s"?', $service['name']))->addSID() : null]), 'description' => $service['trigger'] ? $service['trigger']['description'] : '', 'parentid' => $parentService ? $parentService['serviceid'] : 0, 'algorithm' => serviceAlgorithm($service['algorithm'])]; } if (!$dependency || !$dependency['soft']) { $tree[$serviceNode['id']] = $serviceNode; foreach ($service['dependencies'] as $dependency) { $childService = $services[$dependency['servicedownid']]; createServiceConfigurationTree($services, $tree, $service, $childService, $dependency); } } else { $serviceNode['caption'] = (new CSpan($serviceNode['caption']))->addClass('service-caption-soft'); $tree[$serviceNode['id'] . '.' . $dependency['linkid']] = $serviceNode; } }
$servicesParentForm = (new CForm())->setName('servicesForm'); if (!empty($this->data['service'])) { $servicesParentForm->addVar('serviceid', $this->data['service']['serviceid']); } // create table $servicesParentTable = (new CTableInfo())->setHeader([_('Service'), _('Status calculation'), _('Trigger')]); $prefix = null; // root $description = (new CLink(_('root'), '#'))->onClick('javascript: jQuery(\'#parent_name\', window.opener.document).val(' . zbx_jsvalue(_('root')) . '); jQuery(\'#parentname\', window.opener.document).val(' . zbx_jsvalue(_('root')) . '); jQuery(\'#parentid\', window.opener.document).val(' . zbx_jsvalue(0) . '); self.close(); return false;'); $servicesParentTable->addRow([[$prefix, $description], _('Note'), '-']); // others foreach ($this->data['db_pservices'] as $db_service) { $description = (new CSpan($db_service['name']))->addClass('link')->onClick('javascript: jQuery(\'#parent_name\', window.opener.document).val(' . zbx_jsvalue($db_service['name']) . '); jQuery(\'#parentname\', window.opener.document).val(' . zbx_jsvalue($db_service['name']) . '); jQuery(\'#parentid\', window.opener.document).val(' . zbx_jsvalue($db_service['serviceid']) . '); self.close(); return false;'); $servicesParentTable->addRow([[$prefix, $description], serviceAlgorithm($db_service['algorithm']), $db_service['trigger']]); } $servicesParentTable->setFooter(new CCol((new CButton('cancel', _('Cancel')))->onClick('javascript: self.close();')->setAttribute('style', 'text-align:right;'))); // append table to form $servicesParentForm->addItem($servicesParentTable); // append form to widget $widget->addItem($servicesParentForm); return $widget;
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ include 'include/views/js/configuration.services.edit.js.php'; $service = $this->data['service']; $widget = (new CWidget())->setTitle(_('IT services')); // create form $servicesForm = (new CForm())->setName('servicesForm')->addVar('form', $this->data['form'])->addVar('parentid', $this->data['parentid'])->addVar('parentname', $this->data['parentname'])->addVar('triggerid', $this->data['triggerid']); if (isset($this->data['service'])) { $servicesForm->addVar('serviceid', $this->data['service']['serviceid']); } // create form list $servicesFormList = (new CFormList('servicesFormList'))->addRow(_('Name'), (new CTextBox('name', $this->data['name'], false, 128))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)->setAttribute('autofocus', 'autofocus')); // append parent link to form list $servicesFormList->addRow(_('Parent service'), [(new CTextBox('parent_name', $this->data['parentname'], true, 128))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH), (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), (new CButton('select_parent', _('Change')))->addClass(ZBX_STYLE_BTN_GREY)->onClick("javascript: openWinCentered('services.php?pservices=1" . url_param('serviceid') . "', " . "'ZBX_Services_List', 740, 420, 'scrollbars=1, toolbar=0, menubar=0, resizable=1, dialog=0');")]); // append algorithm to form list $servicesFormList->addRow(_('Status calculation algorithm'), new CComboBox('algorithm', $this->data['algorithm'], null, serviceAlgorithm())); // append SLA to form list $showslaCheckbox = (new CCheckBox('showsla'))->setChecked($this->data['showsla'] == 1); $goodslaTextBox = (new CTextBox('goodsla', $this->data['goodsla'], false, 8))->setWidth(ZBX_TEXTAREA_TINY_WIDTH); if (!$this->data['showsla']) { $goodslaTextBox->setAttribute('disabled', 'disabled'); } $servicesFormList->addRow(_('Calculate SLA, acceptable SLA (in %)'), [$showslaCheckbox, (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), $goodslaTextBox]); // append trigger to form list $servicesFormList->addRow(_('Trigger'), [(new CTextBox('trigger', $this->data['trigger'], true))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH), (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), (new CButton('btn1', _('Select')))->addClass(ZBX_STYLE_BTN_GREY)->onClick('return PopUp("popup.php?' . 'dstfrm=' . $servicesForm->getName() . '&dstfld1=triggerid' . '&dstfld2=trigger' . '&srctbl=triggers' . '&srcfld1=triggerid' . '&srcfld2=description' . '&real_hosts=1' . '&with_triggers=1");')]); $servicesFormList->addRow(_('Sort order (0->999)'), (new CTextBox('sortorder', $this->data['sortorder'], false, 3))->setWidth(ZBX_TEXTAREA_TINY_WIDTH)); /* * Dependencies tab */ $servicesChildTable = (new CTable())->setAttribute('style', 'width: 100%;')->setId('service_children')->setHeader([_('Services'), _('Soft'), _('Trigger'), _('Action')]); foreach ($this->data['children'] as $child) {
/** * Validates the "algorithm" field. Assumes the "name" field is valid. * * @throws APIException if the name is missing or invalid * * @param array $service * * @return void */ protected function checkAlgorithm(array $service) { if (!isset($service['algorithm']) || !serviceAlgorithm($service['algorithm'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect algorithm for service "%1$s".', $service['name'])); } }
** ** 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. **/ include dirname(__FILE__) . '/js/configuration.services.child.list.js.php'; $servicesChildWidget = (new CWidget())->setTitle(_('IT service dependencies')); // create form $servicesChildForm = (new CForm())->setName('servicesForm'); if (!empty($this->data['service'])) { $servicesChildForm->addVar('serviceid', $this->data['service']['serviceid']); } // create table $servicesChildTable = (new CTableInfo())->setHeader([(new CColHeader((new CCheckBox('all_services'))->onClick("javascript: checkAll('" . $servicesChildForm->getName() . "', 'all_services', 'services');")))->addClass(ZBX_STYLE_CELL_WIDTH), _('Service'), _('Status calculation'), _('Trigger')]); $prefix = null; foreach ($this->data['db_cservices'] as $service) { $description = (new CLink($service['name'], '#'))->addClass('service-name')->setId('service-name-' . $service['serviceid'])->setAttribute('data-name', $service['name'])->setAttribute('data-serviceid', $service['serviceid'])->setAttribute('data-trigger', $service['trigger']); $cb = (new CCheckBox('services[' . $service['serviceid'] . ']', $service['serviceid']))->addClass('service-select'); $servicesChildTable->addRow([$cb, [$prefix, $description], serviceAlgorithm($service['algorithm']), $service['trigger']]); } $servicesChildTable->setFooter(new CCol(new CButton('select', _('Select')))); // append table to form $servicesChildForm->addItem($servicesChildTable); // append form to widget $servicesChildWidget->addItem($servicesChildForm); return $servicesChildWidget;