wecom.center.view.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php declare(strict_types = 0);
  2. /*
  3. ** WeCom Center - page view (three tabs: Alert / Optimization / Maintenance).
  4. ** @var CView $this
  5. ** @var array $data
  6. */
  7. use Modules\WecomCenter\Lib\I18n;
  8. $this->addCssFile('modules/WecomCenter/assets/wecom.center.css');
  9. $save_url = (new CUrl('zabbix.php'))->setArgument('action', 'wecom.center.save')->getUrl();
  10. $view_url = (new CUrl('zabbix.php'))->setArgument('action', 'wecom.center.view')->getUrl();
  11. $html_page = (new CHtmlPage())->setTitle(I18n::t('page.title'));
  12. if (!$data['mediatype']) {
  13. $html_page->addItem((new CDiv())->addItem(
  14. (new CTag('p'))->addItem(I18n::t('msg.no_mediatype'))
  15. ));
  16. $html_page->show();
  17. return;
  18. }
  19. $mask = (int) $data['severity'];
  20. $enabled = ((int) $data['active'] === 0);
  21. $tabs = new CTabView();
  22. /* ================================================================== */
  23. /* TAB 1 - ALERT (robot + strategy engine + manual threshold) */
  24. /* ================================================================== */
  25. $alert = new CDiv();
  26. // --- 1a. Robot key -----------------------------------------------------
  27. $robot_form = (new CForm())
  28. ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId())
  29. ->addItem(
  30. (new CFormList())->addRow(I18n::t('lbl.key'),
  31. (new CTextBox('webhook_url', $data['webhook_url']))
  32. ->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
  33. ->setAttribute('style', 'font-family:monospace;')
  34. )
  35. )
  36. ->addItem(
  37. (new CDiv())
  38. ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_robot')))
  39. ->addItem((new CSubmitButton(I18n::t('btn.test'), 'op', 'test_robot'))->addClass(ZBX_STYLE_BTN_ALT))
  40. )
  41. ->setAction($save_url)
  42. ->setId('wc-robot');
  43. $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.robot')));
  44. $alert->addItem($robot_form);
  45. // --- 1b. Strategy presets ---------------------------------------------
  46. $preset_tbl = new CTable();
  47. $preset_tbl->setHeader([I18n::t('preset.col.name'), I18n::t('preset.col.desc'), I18n::t('preset.col.action')]);
  48. foreach ($data['presets'] as $key => $p) {
  49. $is_cur = ((string) $data['current_strategy'] === (string) $key);
  50. $name_cell = new CDiv();
  51. $name_cell->addItem(I18n::t($p['label']));
  52. if ($is_cur) {
  53. $name_cell->addItem((new CSpan(I18n::t('preset.current')))->addClass(ZBX_STYLE_GREEN));
  54. }
  55. $preview_link = new CLink(I18n::t('btn.preview'),
  56. (new CUrl('zabbix.php'))
  57. ->setArgument('action', 'wecom.center.view')
  58. ->setArgument('mediatypeid', $data['mediatypeid'])
  59. ->setArgument('preview_preset', $key)
  60. ->getUrl()
  61. );
  62. $apply_btn = (new CSubmitButton(I18n::t('btn.apply'), 'apply_strategy', $key))
  63. ->addClass(ZBX_STYLE_BTN_ALT);
  64. $preset_tbl->addRow([
  65. $name_cell,
  66. I18n::t($p['desc']),
  67. (new CDiv())->addItem($preview_link)->addItem($apply_btn)
  68. ]);
  69. }
  70. $strategy_form = (new CForm())
  71. ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId())
  72. ->addItem(new CDiv($preset_tbl))
  73. ->setAction($save_url)
  74. ->setId('wc-strategy');
  75. $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.strategy')));
  76. $alert->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.strategy_hint')));
  77. $alert->addItem($strategy_form);
  78. // --- 1c. Preview result (dry-run) -------------------------------------
  79. if ($data['preview'] !== null) {
  80. $pv = $data['preview'];
  81. $pkey = $data['preview_key'];
  82. $pt = new CTable();
  83. $pt->setHeader([
  84. I18n::t('cls.col.class'), I18n::t('cls.col.target'),
  85. I18n::t('cls.col.count'), I18n::t('cls.col.changes')
  86. ]);
  87. foreach ($pv['classes'] as $ck => $c) {
  88. $label = I18n::t($data['classes'][$ck]['label'] ?? $ck);
  89. $pt->addRow([$label, I18n::t('sev.'.($c['target'] + 1)), $c['count'], $c['changes']]);
  90. }
  91. $pt->addRow([(new CTag('b'))->addItem(I18n::t('cls.total')), '', (new CTag('b'))->addItem((string) $pv['total']), (new CTag('b'))->addItem((string) $pv['changes'])]);
  92. $alert->addItem(
  93. (new CDiv())
  94. ->addItem((new CTag('h4'))->addItem(
  95. I18n::t('preview.title', [I18n::t($data['presets'][$pkey]['label'] ?? $pkey)])
  96. ))
  97. ->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('preview.hint')))
  98. ->addItem($pt)
  99. );
  100. }
  101. // --- 1d. Manual threshold override ------------------------------------
  102. $sev_items = new CList();
  103. for ($i = 1; $i <= 6; $i++) {
  104. $bit = 1 << ($i - 1);
  105. $sev_items->addItem(
  106. (new CCheckBox('sev_'.$i))->setLabel(I18n::t('sev.'.$i))->setChecked(($mask & $bit) !== 0)
  107. );
  108. }
  109. $sev_form = (new CForm())
  110. ->addItem((new CVar('mediatypeid', $data['mediatypeid']))->removeId())
  111. ->addItem(
  112. (new CFormList())
  113. ->addRow(I18n::t('lbl.alerting_on'),
  114. (new CCheckBox('enabled'))->setLabel(I18n::t('lbl.alerting_on'))->setChecked($enabled))
  115. ->addRow(I18n::t('lbl.severity'), $sev_items)
  116. )
  117. ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_alert')))
  118. ->setAction($save_url)
  119. ->setId('wc-sev');
  120. $alert->addItem((new CTag('h4'))->addItem(I18n::t('sec.threshold')));
  121. $alert->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.threshold_hint')));
  122. $alert->addItem($sev_form);
  123. $tabs->addTab('alert', I18n::t('tab.alert'), $alert);
  124. /* ================================================================== */
  125. /* TAB 2 - OPTIMIZATION */
  126. /* ================================================================== */
  127. $opt = new CDiv();
  128. // --- 2a. Server tuning generator --------------------------------------
  129. $tune_sel = new CSelect('tuning_profile');
  130. foreach (['small', 'medium', 'large'] as $pk) {
  131. $tune_sel->addOption(new CSelectOption($pk, I18n::t('tuning.'.$pk)));
  132. }
  133. $tune_sel->setValue($data['tuning_profile']);
  134. $tune_form = (new CForm('get', $view_url))
  135. ->addItem(
  136. (new CFormList())->addRow(I18n::t('tuning.choose'), $tune_sel)
  137. )
  138. ->addItem((new CSubmitButton(I18n::t('btn.generate'), 'generate', '1'))->addClass(ZBX_STYLE_BTN_ALT))
  139. ->setId('wc-tune');
  140. $env_pre = (new CTag('pre'))->addItem($data['tuning']['env'])
  141. ->setAttribute('style', 'background:#f4f4f4;padding:8px;border:1px solid #ccc;font-family:monospace;');
  142. $cmd_pre = (new CTag('pre'))->addItem($data['tuning']['cmd'])
  143. ->setAttribute('style', 'background:#f4f4f4;padding:8px;border:1px solid #ccc;font-family:monospace;');
  144. $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.tuning')));
  145. $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.tuning_hint')));
  146. $opt->addItem($tune_form);
  147. $opt->addItem((new CDiv())->addItem((new CTag('strong'))->addItem(I18n::t('tuning.env')))->addItem($env_pre));
  148. $opt->addItem((new CDiv())->addItem((new CTag('strong'))->addItem(I18n::t('tuning.cmd')))->addItem($cmd_pre));
  149. // --- 2b. Template import ---------------------------------------------
  150. $tpl_sel = new CSelect('template_file');
  151. if (!$data['templates']) {
  152. $tpl_sel->addOption(new CSelectOption('', I18n::t('tpl.none')));
  153. }
  154. foreach ($data['templates'] as $t) {
  155. $tpl_sel->addOption(new CSelectOption($t['file'], $t['name']));
  156. }
  157. $tpl_form = (new CForm())
  158. ->addItem((new CFormList())->addRow(I18n::t('tpl.choose'), $tpl_sel))
  159. ->addItem((new CSubmitButton(I18n::t('btn.import'), 'op', 'import_template')))
  160. ->setAction($save_url)
  161. ->setId('wc-tpl');
  162. $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.template')));
  163. $opt->addItem($tpl_form);
  164. // --- 2c. Map marker (single point = Zabbix server host) --------------
  165. if ($data['server_host']) {
  166. $map_form = (new CForm())
  167. ->addItem((new CVar('hostid', $data['server_host']['hostid']))->removeId())
  168. ->addItem(
  169. (new CFormList())
  170. ->addRow(I18n::t('map.host'),
  171. (new CSpan($data['server_host']['name'])))
  172. ->addRow(I18n::t('map.lat'),
  173. (new CTextBox('lat', $data['server_loc']['location_lat']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH))
  174. ->addRow(I18n::t('map.lon'),
  175. (new CTextBox('lon', $data['server_loc']['location_lon']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH))
  176. )
  177. ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_map')))
  178. ->setAction($save_url)
  179. ->setId('wc-map');
  180. $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.map')));
  181. $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('map.hint')));
  182. $opt->addItem($map_form);
  183. }
  184. else {
  185. $opt->addItem((new CTag('h4'))->addItem(I18n::t('sec.map')));
  186. $opt->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('msg.no_server_host')));
  187. }
  188. $tabs->addTab('opt', I18n::t('tab.opt'), $opt);
  189. /* ================================================================== */
  190. /* TAB 3 - MAINTENANCE (per-trigger alerting switch) */
  191. /* ================================================================== */
  192. $maint = new CDiv();
  193. $trig_search_form = (new CForm('get', $view_url))
  194. ->addItem((new CTextBox('trig_search', $data['trig_search']))
  195. ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
  196. ->setAttribute('placeholder', I18n::t('lbl.trig_search')))
  197. ->addItem((new CSubmitButton(I18n::t('btn.search'), 'search', '1'))->addClass(ZBX_STYLE_BTN_ALT))
  198. ->setId('trig-search-form');
  199. $maint->addItem((new CTag('h4'))->addItem(I18n::t('sec.triggers')));
  200. $maint->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('lbl.trig_hint', [$data['trigger_count']])));
  201. $maint->addItem($trig_search_form);
  202. if ($data['trig_search'] !== '') {
  203. if ($data['triggers']) {
  204. $trig_list = new CList();
  205. $ids = [];
  206. foreach ($data['triggers'] as $t) {
  207. $ids[] = $t['triggerid'];
  208. $host = !empty($t['hosts']) ? $t['hosts'][0]['host'] : '';
  209. $sev_name = I18n::t('sev.'.(((int) $t['priority']) + 1));
  210. $label = '['.$sev_name.'] '.$host.' — '.$t['description'];
  211. $trig_list->addItem(
  212. (new CCheckBox('trig_'.$t['triggerid']))->setLabel($label)->setChecked(((int) $t['status']) === 0)
  213. );
  214. }
  215. $trig_save_form = (new CForm())
  216. ->addItem((new CVar('trig_ids', implode(',', $ids)))->removeId())
  217. ->addItem((new CFormList())->addRow(I18n::t('lbl.trig_list'), $trig_list))
  218. ->addItem((new CSubmitButton(I18n::t('btn.save'), 'op', 'save_triggers')))
  219. ->setAction($save_url)
  220. ->setId('wc-trig');
  221. $maint->addItem($trig_save_form);
  222. }
  223. else {
  224. $maint->addItem(new CDiv(new CTag('p'))->addItem(I18n::t('msg.no_trig_search')));
  225. }
  226. }
  227. $tabs->addTab('maint', I18n::t('tab.maint'), $maint);
  228. $html_page->addItem($tabs);
  229. $html_page->show();