| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <?php declare(strict_types = 0);
- /*
- ** WeCom Center - page view (three tabs: Alert / Optimization / Maintenance).
- ** @var CView $this
- ** @var array $data
- */
- use Modules\WecomCenter\Lib\I18n;
- $this->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();
|