addCssFile('modules/WecomCenter/assets/wecom.center.css'); $save_url = (new CUrl('zabbix.php'))->setArgument('action', 'wecom.center.save')->getUrl(); $view_url = (new CUrl('zabbix.php'))->setArgument('action', 'wecom.center.view')->getUrl(); $html_page = (new CHtmlPage())->setTitle(I18n::t('page.title')); if (!$data['mediatype']) { $html_page->addItem((new CDiv())->addItem( (new CTag('p'))->addItem(I18n::t('msg.no_mediatype')) )); $html_page->show(); return; } $mask = (int) $data['severity']; $enabled = ((int) $data['active'] === 0); $tabs = new CTabView(); /* ================================================================== */ /* TAB 1 - ALERT (robot + strategy engine + manual threshold) */ /* ================================================================== */ $alert = new CDiv(); // --- 1a. Robot key ----------------------------------------------------- $robot_form = (new CForm()) ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId()) ->addItem( (new CFormList())->addRow(I18n::t('lbl.key'), (new CTextBox('webhook_url', $data['webhook_url'])) ->setWidth(ZBX_TEXTAREA_BIG_WIDTH) ->setAttribute('style', 'font-family:monospace;') ) ) ->addItem( (new CDiv()) ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_robot'))) ->addItem((new CSubmitButton(I18n::t('btn.test'), 'op', 'test_robot'))->addClass(ZBX_STYLE_BTN_ALT)) ) ->setAction($save_url) ->setId('wc-robot'); $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.robot'))); $alert->addItem($robot_form); // --- 1b. Strategy presets --------------------------------------------- $preset_tbl = new CTable(); $preset_tbl->setHeader([I18n::t('preset.col.name'), I18n::t('preset.col.desc'), I18n::t('preset.col.action')]); foreach ($data['presets'] as $key => $p) { $is_cur = ((string) $data['current_strategy'] === (string) $key); $name_cell = new CDiv(); $name_cell->addItem(I18n::t($p['label'])); if ($is_cur) { $name_cell->addItem((new CSpan(I18n::t('preset.current')))->addClass(ZBX_STYLE_GREEN)); } $preview_link = new CLink(I18n::t('btn.preview'), (new CUrl('zabbix.php')) ->setArgument('action', 'wecom.center.view') ->setArgument('mediatypeid', $data['mediatypeid']) ->setArgument('preview_preset', $key) ->getUrl() ); $apply_btn = (new CSubmitButton(I18n::t('btn.apply'), 'apply_strategy', $key)) ->addClass(ZBX_STYLE_BTN_ALT); $preset_tbl->addRow([ $name_cell, I18n::t($p['desc']), (new CDiv())->addItem($preview_link)->addItem($apply_btn) ]); } $strategy_form = (new CForm()) ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId()) ->addItem(new CDiv($preset_tbl)) ->setAction($save_url) ->setId('wc-strategy'); $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.strategy'))); $alert->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.strategy_hint'))); $alert->addItem($strategy_form); // --- 1c. Preview result (dry-run) ------------------------------------- if ($data['preview'] !== null) { $pv = $data['preview']; $pkey = $data['preview_key']; $pt = new CTable(); $pt->setHeader([ I18n::t('cls.col.class'), I18n::t('cls.col.target'), I18n::t('cls.col.count'), I18n::t('cls.col.changes') ]); foreach ($pv['classes'] as $ck => $c) { $label = I18n::t($data['classes'][$ck]['label'] ?? $ck); $pt->addRow([$label, I18n::t('sev.'.($c['target'] + 1)), $c['count'], $c['changes']]); } $pt->addRow([(new CTag('b'))->addItem(I18n::t('cls.total')), '', (new CTag('b'))->addItem((string) $pv['total']), (new CTag('b'))->addItem((string) $pv['changes'])]); $alert->addItem( (new CDiv()) ->addItem((new CTag('h4'))->addItem( I18n::t('preview.title', [I18n::t($data['presets'][$pkey]['label'] ?? $pkey)]) )) ->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('preview.hint'))) ->addItem($pt) ); } // --- 1d. Manual threshold override ------------------------------------ $sev_items = new CList(); for ($i = 1; $i <= 6; $i++) { $bit = 1 << ($i - 1); $sev_items->addItem( (new CCheckBox('sev_'.$i))->setLabel(I18n::t('sev.'.$i))->setChecked(($mask & $bit) !== 0) ); } $sev_form = (new CForm()) ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId()) ->addItem( (new CFormList()) ->addRow(I18n::t('lbl.alerting_on'), (new CCheckBox('enabled'))->setLabel(I18n::t('lbl.alerting_on'))->setChecked($enabled)) ->addRow(I18n::t('lbl.severity'), $sev_items) ) ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_alert'))) ->setAction($save_url) ->setId('wc-sev'); $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.threshold'))); $alert->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.threshold_hint'))); $alert->addItem($sev_form); $tabs->addTab('alert', I18n::t('tab.alert'), $alert); /* ================================================================== */ /* TAB 2 - OPTIMIZATION */ /* ================================================================== */ $opt = new CDiv(); // --- 2a. Server tuning generator -------------------------------------- $tune_sel = new CSelect('tuning_profile'); foreach (['small', 'medium', 'large'] as $pk) { $tune_sel->addOption(new CSelectOption($pk, I18n::t('tuning.'.$pk))); } $tune_sel->setValue($data['tuning_profile']); $tune_form = (new CForm('get', $view_url)) ->addItem( (new CFormList())->addRow(I18n::t('tuning.choose'), $tune_sel) ) ->addItem((new CSubmitButton(I18n::t('btn.generate'), 'generate', '1'))->addClass(ZBX_STYLE_BTN_ALT)) ->setId('wc-tune'); $env_pre = (new CTag('pre'))->addItem($data['tuning']['env']) ->setAttribute('style', 'background:#f4f4f4;padding:8px;border:1px solid #ccc;font-family:monospace;'); $cmd_pre = (new CTag('pre'))->addItem($data['tuning']['cmd']) ->setAttribute('style', 'background:#f4f4f4;padding:8px;border:1px solid #ccc;font-family:monospace;'); $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.tuning'))); $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.tuning_hint'))); $opt->addItem($tune_form); $opt->addItem((new CDiv())->addItem((new CTag('strong'))->addItem(I18n::t('tuning.env')))->addItem($env_pre)); $opt->addItem((new CDiv())->addItem((new CTag('strong'))->addItem(I18n::t('tuning.cmd')))->addItem($cmd_pre)); // --- 2b. Template import --------------------------------------------- $tpl_sel = new CSelect('template_file'); if (!$data['templates']) { $tpl_sel->addOption(new CSelectOption('', I18n::t('tpl.none'))); } foreach ($data['templates'] as $t) { $tpl_sel->addOption(new CSelectOption($t['file'], $t['name'])); } $tpl_form = (new CForm()) ->addItem((new CFormList())->addRow(I18n::t('tpl.choose'), $tpl_sel)) ->addItem((new CSubmitButton(I18n::t('btn.import'), 'op', 'import_template'))) ->setAction($save_url) ->setId('wc-tpl'); $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.template'))); $opt->addItem($tpl_form); // --- 2c. Map marker (single point = Zabbix server host) -------------- if ($data['server_host']) { $map_form = (new CForm()) ->addItem((new CVar('hostid', $data['server_host']['hostid']))->removeId()) ->addItem( (new CFormList()) ->addRow(I18n::t('map.host'), (new CSpan($data['server_host']['name']))) ->addRow(I18n::t('map.lat'), (new CTextBox('lat', $data['server_loc']['location_lat']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)) ->addRow(I18n::t('map.lon'), (new CTextBox('lon', $data['server_loc']['location_lon']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)) ) ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_map'))) ->setAction($save_url) ->setId('wc-map'); $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.map'))); $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('map.hint'))); $opt->addItem($map_form); } else { $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.map'))); $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('msg.no_server_host'))); } $tabs->addTab('opt', I18n::t('tab.opt'), $opt); /* ================================================================== */ /* TAB 3 - MAINTENANCE (per-trigger alerting switch) */ /* ================================================================== */ $maint = new CDiv(); $trig_search_form = (new CForm('get', $view_url)) ->addItem((new CTextBox('trig_search', $data['trig_search'])) ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) ->setAttribute('placeholder', I18n::t('lbl.trig_search'))) ->addItem((new CSubmitButton(I18n::t('btn.search'), 'search', '1'))->addClass(ZBX_STYLE_BTN_ALT)) ->setId('trig-search-form'); $maint->addItem((new CTag('h4'))->addItem(I18n::t('sec.triggers'))); $maint->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.trig_hint', [$data['trigger_count']]))); $maint->addItem($trig_search_form); if ($data['trig_search'] !== '') { if ($data['triggers']) { $trig_list = new CList(); $ids = []; foreach ($data['triggers'] as $t) { $ids[] = $t['triggerid']; $host = !empty($t['hosts']) ? $t['hosts'][0]['host'] : ''; $sev_name = I18n::t('sev.'.(((int) $t['priority']) + 1)); $label = '['.$sev_name.'] '.$host.' — '.$t['description']; $trig_list->addItem( (new CCheckBox('trig_'.$t['triggerid']))->setLabel($label)->setChecked(((int) $t['status']) === 0) ); } $trig_save_form = (new CForm()) ->addItem((new CVar('trig_ids', implode(',', $ids)))->removeId()) ->addItem((new CFormList())->addRow(I18n::t('lbl.trig_list'), $trig_list)) ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_triggers'))) ->setAction($save_url) ->setId('wc-trig'); $maint->addItem($trig_save_form); } else { $maint->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('msg.no_trig_search'))); } } $tabs->addTab('maint', I18n::t('tab.maint'), $maint); $html_page->addItem($tabs); $html_page->show();