1<?php 2/* 3** Zabbix 4** Copyright (C) 2001-2021 Zabbix SIA 5** 6** This program is free software; you can redistribute it and/or modify 7** it under the terms of the GNU General Public License as published by 8** the Free Software Foundation; either version 2 of the License, or 9** (at your option) any later version. 10** 11** This program is distributed in the hope that it will be useful, 12** but WITHOUT ANY WARRANTY; without even the implied warranty of 13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14** GNU General Public License for more details. 15** 16** You should have received a copy of the GNU General Public License 17** along with this program; if not, write to the Free Software 18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19**/ 20 21 22/** 23 * @var CView $this 24 */ 25 26$this->includeJsFile('configuration.services.edit.js.php'); 27 28$service = $this->data['service']; 29 30$widget = (new CWidget())->setTitle(_('Services')); 31 32// create form 33$servicesForm = (new CForm()) 34 ->setName('servicesForm') 35 ->setAttribute('aria-labeledby', ZBX_STYLE_PAGE_TITLE) 36 ->addVar('form', $this->data['form']) 37 ->addVar('parentid', $this->data['parentid']) 38 ->addVar('parentname', $this->data['parentname']) 39 ->addVar('triggerid', $this->data['triggerid']); 40if (isset($this->data['service'])) { 41 $servicesForm->addVar('serviceid', $this->data['service']['serviceid']); 42} 43 44// create form list 45$servicesFormList = (new CFormList('servicesFormList')) 46 ->addRow( 47 (new CLabel(_('Name'), 'name'))->setAsteriskMark(), 48 (new CTextBox('name', $this->data['name'], false, 128)) 49 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 50 ->setAriaRequired() 51 ->setAttribute('autofocus', 'autofocus') 52 ); 53 54// append parent link to form list 55$parent_service_popup_options = [ 56 'pservices' => '1' 57]; 58if ($this->data['service'] && $this->data['service']['serviceid']) { 59 $parent_service_popup_options['serviceid'] = $this->data['service']['serviceid']; 60} 61$servicesFormList->addRow((new CLabel(_('Parent service'), 'parent_name'))->setAsteriskMark(), [ 62 (new CTextBox('parent_name', $this->data['parentname'], true, 128)) 63 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 64 ->setAriaRequired(), 65 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 66 (new CButton('select_parent', _x('Change', 'verb'))) 67 ->addClass(ZBX_STYLE_BTN_GREY) 68 ->onClick('return PopUp("popup.services",jQuery.extend('. 69 json_encode($parent_service_popup_options). 70 ',{parentid: this.form.parentid.value}), null, this);' 71 ) 72]); 73 74// append algorithm to form list 75$servicesFormList->addRow( 76 new CLabel(_('Status calculation algorithm'), 'label-algorithm'), 77 (new CSelect('algorithm')) 78 ->setId('algorithm') 79 ->setValue($data['algorithm']) 80 ->addOptions(CSelect::createOptionsFromArray(serviceAlgorithm())) 81 ->setFocusableElementId('label-algorithm') 82); 83 84// append SLA to form list 85$showslaCheckbox = (new CCheckBox('showsla'))->setChecked($this->data['showsla'] == SERVICE_SHOW_SLA_ON); 86$goodslaTextBox = (new CTextBox('goodsla', $this->data['goodsla'], false, 8))->setWidth(ZBX_TEXTAREA_TINY_WIDTH); 87if (!$this->data['showsla']) { 88 $goodslaTextBox->setAttribute('disabled', 'disabled'); 89} 90$servicesFormList->addRow(_('Calculate SLA, acceptable SLA (in %)'), [ 91 $showslaCheckbox, (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), $goodslaTextBox 92]); 93 94// append trigger to form list 95$servicesFormList->addRow(_('Trigger'), [ 96 (new CTextBox('trigger', $this->data['trigger'], true))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH), 97 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 98 (new CButton('btn1', _('Select'))) 99 ->addClass(ZBX_STYLE_BTN_GREY) 100 ->onClick('return PopUp("popup.generic",'. 101 json_encode([ 102 'srctbl' => 'triggers', 103 'srcfld1' => 'triggerid', 104 'srcfld2' => 'description', 105 'dstfrm' => $servicesForm->getName(), 106 'dstfld1' => 'triggerid', 107 'dstfld2' => 'trigger', 108 'real_hosts' => '1', 109 'with_triggers' => '1' 110 ]).', null, this);' 111 ) 112]); 113$servicesFormList->addRow((new CLabel(_('Sort order (0->999)'), 'sortorder'))->setAsteriskMark(), 114 (new CTextBox('sortorder', $this->data['sortorder'], false, 3)) 115 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 116 ->setAriaRequired() 117); 118 119/* 120 * Dependencies tab 121 */ 122$servicesChildTable = (new CTable()) 123 ->setAttribute('style', 'width: 100%;') 124 ->setId('service_children') 125 ->setHeader([_('Services'), _('Soft'), _('Trigger'), _('Action')]); 126foreach ($this->data['children'] as $child) { 127 $childrenLink = (new CLink($child['name'], 'services.php?form=1&serviceid='.$child['serviceid'])) 128 ->setTarget('_blank'); 129 130 $servicesChildTable->addRow( 131 (new CRow([ 132 [ 133 $childrenLink, 134 new CVar('children['.$child['serviceid'].'][name]', $child['name']), 135 new CVar('children['.$child['serviceid'].'][serviceid]', $child['serviceid']), 136 new CVar('children['.$child['serviceid'].'][trigger]', $child['trigger']) 137 ], 138 (new CCheckBox('children['.$child['serviceid'].'][soft]')) 139 ->setChecked(isset($child['soft']) && !empty($child['soft'])), 140 !empty($child['trigger']) ? $child['trigger'] : '', 141 (new CCol( 142 (new CButton('remove', _('Remove'))) 143 ->onClick('javascript: removeDependentChild(\''.$child['serviceid'].'\');') 144 ->addClass(ZBX_STYLE_BTN_LINK) 145 ->removeId() 146 ))->addClass(ZBX_STYLE_NOWRAP) 147 ]))->setId('children_'.$child['serviceid']) 148 ); 149} 150$servicesDependenciesFormList = new CFormList('servicesDependensiesFormList'); 151 152$dep_service_popup_options = [ 153 'cservices' => '1' 154]; 155if ($this->data['service'] && $this->data['service']['serviceid']) { 156 $dep_service_popup_options['serviceid'] = $this->data['service']['serviceid']; 157} 158 159$servicesDependenciesFormList->addRow( 160 _('Depends on'), 161 (new CDiv([ 162 $servicesChildTable, 163 (new CButton('add_child_service', _('Add'))) 164 ->onClick('return PopUp("popup.services",jQuery.extend('. 165 json_encode($dep_service_popup_options). 166 ',{parentid: this.form.parentid.value}), null, this);' 167 ) 168 ->addClass(ZBX_STYLE_BTN_LINK) 169 ])) 170 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 171 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;') 172); 173 174// Service times tab. 175$servicesTimeFormList = new CFormList('servicesTimeFormList'); 176$servicesTimeTable = (new CTable()) 177 ->setAttribute('style', 'width: 100%;') 178 ->setHeader([_('Type'), _('Interval'), _('Note'), _('Action')]); 179 180$i = 0; 181 182foreach ($data['times'] as $service_time) { 183 switch ($service_time['type']) { 184 case SERVICE_TIME_TYPE_UPTIME: 185 $type = (new CSpan(_('Uptime')))->addClass('enabled'); 186 $from = dowHrMinToStr($service_time['ts_from']); 187 $till = dowHrMinToStr($service_time['ts_to'], true); 188 break; 189 190 case SERVICE_TIME_TYPE_DOWNTIME: 191 $type = (new CSpan(_('Downtime')))->addClass('disabled'); 192 $from = dowHrMinToStr($service_time['ts_from']); 193 $till = dowHrMinToStr($service_time['ts_to'], true); 194 break; 195 196 case SERVICE_TIME_TYPE_ONETIME_DOWNTIME: 197 $type = (new CSpan(_('One-time downtime')))->addClass('disabled'); 198 $from = zbx_date2str(DATE_TIME_FORMAT, $service_time['ts_from']); 199 $till = zbx_date2str(DATE_TIME_FORMAT, $service_time['ts_to']); 200 break; 201 } 202 203 $row = new CRow([ 204 [ 205 $type, 206 new CVar('times['.$i.'][type]', $service_time['type']), 207 new CVar('times['.$i.'][ts_from]', $service_time['ts_from']), 208 new CVar('times['.$i.'][ts_to]', $service_time['ts_to']), 209 new CVar('times['.$i.'][note]', $service_time['note']) 210 ], 211 $from.' - '.$till, 212 (new CCol($service_time['note'])) 213 ->addClass(ZBX_STYLE_WORDWRAP) 214 ->addStyle('max-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;'), 215 (new CCol( 216 (new CButton('remove', _('Remove'))) 217 ->onClick('javascript: removeTime(\''.$i.'\');') 218 ->addClass(ZBX_STYLE_BTN_LINK) 219 ->removeId() 220 ))->addClass(ZBX_STYLE_NOWRAP) 221 ]); 222 $row->setId('times_'.$i); 223 $servicesTimeTable->addRow($row); 224 $i++; 225} 226 227$servicesTimeFormList->addRow(_('Service times'), 228 (new CDiv($servicesTimeTable)) 229 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 230 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;') 231); 232 233// create service time table 234$serviceTimeTable = (new CFormList()) 235 ->addRow( 236 (new CLabel(_('Period type'), 'label-period-type')), 237 (new CSelect('new_service_time[type]')) 238 ->setId('period-type') 239 ->setFocusableElementId('label-period-type') 240 ->setValue($data['new_service_time']['type']) 241 ->addOptions(CSelect::createOptionsFromArray([ 242 SERVICE_TIME_TYPE_UPTIME => _('Uptime'), 243 SERVICE_TIME_TYPE_DOWNTIME => _('Downtime'), 244 SERVICE_TIME_TYPE_ONETIME_DOWNTIME => _('One-time downtime') 245 ])) 246 ); 247 248if ($data['new_service_time']['type'] == SERVICE_TIME_TYPE_ONETIME_DOWNTIME) { 249 $serviceTimeTable 250 ->addRow( 251 _('Note'), 252 (new CTextBox('new_service_time[note]')) 253 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 254 ->setAttribute('placeholder', _('short description')) 255 ) 256 ->addRow( 257 (new CLabel(_('From'), 'new_service_time_from'))->setAsteriskMark(), 258 (new CDateSelector('new_service_time_from', $data['new_service_time_from'])) 259 ->setDateFormat(ZBX_DATE_TIME) 260 ->setPlaceholder(_('YYYY-MM-DD hh:mm')) 261 ->setAriaRequired() 262 ) 263 ->addRow( 264 (new CLabel(_('Till'), 'new_service_time_till'))->setAsteriskMark(), 265 (new CDateSelector('new_service_time_till', $data['new_service_time_till'])) 266 ->setDateFormat(ZBX_DATE_TIME) 267 ->setPlaceholder(_('YYYY-MM-DD hh:mm')) 268 ->setAriaRequired() 269 ); 270} 271else { 272 $week_from_select = (new CSelect('new_service_time[from_week]')) 273 ->setValue(isset($_REQUEST['new_service_time']['from_week']) ? $_REQUEST['new_service_time']['from_week'] : 0); 274 275 $week_to_select = (new CSelect('new_service_time[to_week]')) 276 ->setValue(isset($_REQUEST['new_service_time']['from_week']) ? $_REQUEST['new_service_time']['to_week'] : 0); 277 278 for ($dow = 0; $dow < 7; $dow++) { 279 $week_from_select->addOption(new CSelectOption($dow, getDayOfWeekCaption($dow))); 280 $week_to_select->addOption(new CSelectOption($dow, getDayOfWeekCaption($dow))); 281 } 282 $timeFromHourTextBox = (new CTextBox('new_service_time[from_hour]', isset($_REQUEST['new_service_time']['from_hour']) 283 ? $_REQUEST['new_service_time']['from_hour'] : '', false, 2)) 284 ->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH) 285 ->setAriaRequired() 286 ->setAttribute('placeholder', _('hh')); 287 $timeFromMinuteTextBox = (new CTextBox('new_service_time[from_minute]', isset($_REQUEST['new_service_time']['from_minute']) 288 ? $_REQUEST['new_service_time']['from_minute'] : '', false, 2)) 289 ->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH) 290 ->setAriaRequired() 291 ->setAttribute('placeholder', _('mm')); 292 $timeToHourTextBox = (new CTextBox('new_service_time[to_hour]', isset($_REQUEST['new_service_time']['to_hour']) 293 ? $_REQUEST['new_service_time']['to_hour'] : '', false, 2)) 294 ->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH) 295 ->setAriaRequired() 296 ->setAttribute('placeholder', _('hh')); 297 $timeToMinuteTextBox = (new CTextBox('new_service_time[to_minute]', isset($_REQUEST['new_service_time']['to_minute']) 298 ? $_REQUEST['new_service_time']['to_minute'] : '', false, 2)) 299 ->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH) 300 ->setAriaRequired() 301 ->setAttribute('placeholder', _('mm')); 302 303 $serviceTimeTable 304 ->addRow( 305 (new CLabel(_('From'), 'new_service_time_from'))->setAsteriskMark(), 306 (new CDiv([ 307 $week_from_select, 308 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 309 _('Time'), 310 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 311 $timeFromHourTextBox, 312 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 313 ':', 314 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 315 $timeFromMinuteTextBox 316 ])) 317 ) 318 ->addRow( 319 (new CLabel(_('Till'), 'new_service_time_to'))->setAsteriskMark(), 320 (new CDiv([ 321 $week_to_select, 322 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 323 _('Time'), 324 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 325 $timeToHourTextBox, 326 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 327 ':', 328 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 329 $timeToMinuteTextBox 330 ])) 331 ); 332 $servicesForm->addVar('new_service_time[note]', ''); 333} 334 335$servicesTimeFormList->addRow(_('New service time'), 336 (new CDiv([ 337 $serviceTimeTable, 338 (new CSimpleButton(_('Add'))) 339 ->onClick('javascript: submitFormWithParam("'.$servicesForm->getName().'", "add_service_time", "1");') 340 ->addClass(ZBX_STYLE_BTN_LINK) 341 ])) 342 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 343 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;') 344); 345 346/* 347 * Append tabs to form 348 */ 349$servicesTab = new CTabView(); 350if (!$this->data['form_refresh']) { 351 $servicesTab->setSelected(0); 352} 353$servicesTab 354 ->addTab('servicesTab', _('Service'), $servicesFormList) 355 ->addTab('servicesDependenciesTab', _('Dependencies'), $servicesDependenciesFormList) 356 ->addTab('servicesTimeTab', _('Time'), $servicesTimeFormList); 357 358// append buttons to form 359if ($service && $service['serviceid']) { 360 $buttons = [new CButtonCancel()]; 361 if (!$service['dependencies']) { 362 array_unshift($buttons, new CButtonDelete( 363 'Delete selected service?', 364 url_param('form').url_param('serviceid').'&saction=1' 365 )); 366 } 367 368 $servicesTab->setFooter(makeFormFooter( 369 (new CSubmit('update', _('Update')))->onClick('javascript: document.forms[0].action += \'?saction=1\';'), 370 $buttons 371 )); 372} 373else { 374 $servicesTab->setFooter(makeFormFooter( 375 (new CSubmit('add', _('Add')))->onClick('javascript: document.forms[0].action += \'?saction=1\';'), 376 [new CButtonCancel()] 377 )); 378} 379 380$servicesForm->addItem($servicesTab); 381 382// append form to widget 383$widget->addItem($servicesForm); 384 385$widget->show(); 386