From fe4ed3476f816a802506a66fed62bdfd357f1fb2 Mon Sep 17 00:00:00 2001 From: Marius Hein Date: Wed, 9 Oct 2013 16:38:46 +0200 Subject: [PATCH] Design: Host and service list Fix: Command controller and downtimes refs #4824 --- .../controllers/CommandController.php | 14 +- .../controllers/ListController.php | 22 +-- .../views/scripts/list/downtimes.phtml | 22 ++- .../views/scripts/list/hosts.phtml | 52 ++++--- .../views/scripts/list/services.phtml | 127 ++++++++---------- public/css/icons.css | 64 ++++++--- public/css/main.css | 23 +++- .../img/{images => icons}/acknowledgement.png | Bin public/img/icons/active_checks_disabled.png | Bin 0 -> 453 bytes .../icons/active_passive_checks_disabled.png | Bin 0 -> 570 bytes public/img/{images => icons}/comment.png | Bin public/img/{images => icons}/create.png | Bin public/img/icons/csv.png | Bin 0 -> 509 bytes public/img/{images => icons}/dashboard.png | Bin public/img/{images => icons}/disabled.png | Bin public/img/icons/downtime_end.png | Bin 0 -> 550 bytes public/img/icons/downtime_start.png | Bin 0 -> 524 bytes public/img/{images => icons}/edit.png | Bin public/img/{images => icons}/error.png | Bin public/img/{images => icons}/flapping.png | Bin public/img/icons/host.png | Bin 0 -> 500 bytes public/img/icons/hostgroup.png | Bin 0 -> 541 bytes public/img/{images => icons}/in_downtime.png | Bin public/img/icons/json.png | Bin 0 -> 517 bytes public/img/icons/notification.png | Bin 0 -> 544 bytes public/img/icons/notification_disabled.png | Bin 0 -> 487 bytes public/img/icons/pdf.png | Bin 0 -> 507 bytes public/img/{images => icons}/remove.png | Bin public/img/{images => icons}/save.png | Bin public/img/{images => icons}/service.png | Bin public/img/icons/servicegroup.png | Bin 0 -> 599 bytes public/img/{images => icons}/submit.png | Bin public/img/icons/success.png | Bin 0 -> 509 bytes public/img/icons/uebersicht.png | Bin 0 -> 16518 bytes public/img/{images => icons}/unhandled.png | Bin public/img/{images => icons}/user.png | Bin 36 files changed, 180 insertions(+), 144 deletions(-) rename public/img/{images => icons}/acknowledgement.png (100%) create mode 100644 public/img/icons/active_checks_disabled.png create mode 100644 public/img/icons/active_passive_checks_disabled.png rename public/img/{images => icons}/comment.png (100%) rename public/img/{images => icons}/create.png (100%) create mode 100644 public/img/icons/csv.png rename public/img/{images => icons}/dashboard.png (100%) rename public/img/{images => icons}/disabled.png (100%) create mode 100644 public/img/icons/downtime_end.png create mode 100644 public/img/icons/downtime_start.png rename public/img/{images => icons}/edit.png (100%) rename public/img/{images => icons}/error.png (100%) rename public/img/{images => icons}/flapping.png (100%) create mode 100644 public/img/icons/host.png create mode 100644 public/img/icons/hostgroup.png rename public/img/{images => icons}/in_downtime.png (100%) create mode 100644 public/img/icons/json.png create mode 100644 public/img/icons/notification.png create mode 100644 public/img/icons/notification_disabled.png create mode 100644 public/img/icons/pdf.png rename public/img/{images => icons}/remove.png (100%) rename public/img/{images => icons}/save.png (100%) rename public/img/{images => icons}/service.png (100%) create mode 100644 public/img/icons/servicegroup.png rename public/img/{images => icons}/submit.png (100%) create mode 100644 public/img/icons/success.png create mode 100644 public/img/icons/uebersicht.png rename public/img/{images => icons}/unhandled.png (100%) rename public/img/{images => icons}/user.png (100%) diff --git a/modules/monitoring/application/controllers/CommandController.php b/modules/monitoring/application/controllers/CommandController.php index e5a4bf09d..fe09db712 100644 --- a/modules/monitoring/application/controllers/CommandController.php +++ b/modules/monitoring/application/controllers/CommandController.php @@ -267,7 +267,7 @@ class Monitoring_CommandController extends ActionController $given = array_intersect_key($supported, $this->getRequest()->getParams()); if (empty($given)) { - throw new \Exception('Missing parameter, supported: '.implode(', ', $supported)); + throw new \Exception('Missing parameter, supported: '.implode(', ', array_flip($supported))); } if (isset($given['host'])) { @@ -815,19 +815,19 @@ class Monitoring_CommandController extends ActionController */ public function removedowntimeAction() { - $this->setSupportedParameters(array('downtimeid')); - $form = new CommandWithIdentifierForm(); + $this->setSupportedParameters(array('host', 'service', 'downtimeid')); + $form = new SingleArgumentCommandForm(); $form->setRequest($this->getRequest()); $form->setSubmitLabel(t('Delete Downtime')); - $form->setFieldName('downtimeid'); - $form->setFieldLabel(t('Downtime Id')); + $form->setParameterName('downtimeid'); $form->addNote(t('Delete a single downtime with the id shown above')); - + $form->setCommand('DEL_HOST_DOWNTIME', 'DEL_SVC_DOWNTIME'); + $form->setObjectIgnoreFlag(true); $this->setForm($form); if ($form->IsSubmittedAndValid() === true) { - $this->target->removeDowntime($this->view->objects); + $this->target->sendCommand($form->createCommand(), $this->view->objects); } } } diff --git a/modules/monitoring/application/controllers/ListController.php b/modules/monitoring/application/controllers/ListController.php index b6f5fc0a5..2719a266c 100644 --- a/modules/monitoring/application/controllers/ListController.php +++ b/modules/monitoring/application/controllers/ListController.php @@ -28,17 +28,17 @@ */ // {{{ICINGA_LICENSE_HEADER}}} -use \Icinga\Application\Benchmark; -use \Icinga\Data\Db\Query; -use \Icinga\File\Csv; -use \Icinga\Module\Monitoring\Controller as MonitoringController; -use \Icinga\Web\Hook; -use \Icinga\Web\Widget\Tabextension\DashboardAction; -use \Icinga\Web\Widget\Tabextension\OutputFormat; -use \Icinga\Web\Widget\Tabs; -use \Icinga\Module\Monitoring\Backend; -use \Icinga\Web\Widget\SortBox; -use \Icinga\Application\Config as IcingaConfig; +use Icinga\Application\Benchmark; +use Icinga\Data\Db\Query; +use Icinga\File\Csv; +use Icinga\Module\Monitoring\Controller as MonitoringController; +use Icinga\Web\Hook; +use Icinga\Web\Widget\Tabextension\DashboardAction; +use Icinga\Web\Widget\Tabextension\OutputFormat; +use Icinga\Web\Widget\Tabs; +use Icinga\Module\Monitoring\Backend; +use Icinga\Web\Widget\SortBox; +use Icinga\Application\Config as IcingaConfig; use Icinga\Module\Monitoring\DataView\Notification as NotificationView; use Icinga\Module\Monitoring\DataView\Downtime as DowntimeView; diff --git a/modules/monitoring/application/views/scripts/list/downtimes.phtml b/modules/monitoring/application/views/scripts/list/downtimes.phtml index 38d4f9cb2..0237d9c2c 100644 --- a/modules/monitoring/application/views/scripts/list/downtimes.phtml +++ b/modules/monitoring/application/views/scripts/list/downtimes.phtml @@ -1,5 +1,3 @@ -tabs->render($this); ?> - util()->showTime($d->getTimestamp()); } +$commandHelper = $this->getHelper('CommandForm'); ?> +tabs->render($this); ?> +
sortControl->render($this); ?> @@ -48,6 +49,7 @@ function formatDateString($self,$dateString){ Downtime ID Trigger ID Duration +   @@ -109,6 +111,22 @@ function formatDateString($self,$dateString){ util()->showHourMin(intval($downtime->downtime_duration)); ?> + $downtime->downtime_internal_downtime_id, + 'host' => $downtime->host_name + ); + + if ($downtime->object_type == 'service') { + $data['service'] = $downtime->service_description; + } + + echo $commandHelper->simpleForm( + 'removedowntime', + 'Remove Downtime', + $data + ); + ?> diff --git a/modules/monitoring/application/views/scripts/list/hosts.phtml b/modules/monitoring/application/views/scripts/list/hosts.phtml index f795aa7a6..6e2009ff1 100644 --- a/modules/monitoring/application/views/scripts/list/hosts.phtml +++ b/modules/monitoring/application/views/scripts/list/hosts.phtml @@ -1,22 +1,14 @@ -tabs->render($this); ?> - getHelper('MonitoringState'); ?> +tabs->render($this); ?>

Hosts Status

- sortControl->render($this); ?> paginationControl($hosts, null, null, array('preserve' => $this->preserve)); ?> - - - - - - - + @@ -27,11 +19,6 @@ $viewHelper = $this->getHelper('MonitoringState'); @@ -69,11 +56,11 @@ $viewHelper = $this->getHelper('MonitoringState'); host_active_checks_enabled): ?> host_passive_checks_enabled): ?> - {{ACTIVE_PASSIVE_CHECKS_DISABLED_ICON}} + - + @@ -89,32 +76,39 @@ $viewHelper = $this->getHelper('MonitoringState'); diff --git a/modules/monitoring/application/views/scripts/list/services.phtml b/modules/monitoring/application/views/scripts/list/services.phtml index e1190e9f5..c7fb858c6 100644 --- a/modules/monitoring/application/views/scripts/list/services.phtml +++ b/modules/monitoring/application/views/scripts/list/services.phtml @@ -1,141 +1,120 @@ -tabs->render($this); ?> - getHelper('MonitoringState'); ?> +tabs->render($this); ?>

Services Status

- sortControl->render($this); ?> paginationControl($services, null, null, array('preserve' => $this->preserve)); ?> -
StatusHost
-
host_unhandled_service_count): ?> - + host_unhandled_service_count; ?> - monitoringState($host, 'host')); ?>
Since - timeSince($host->host_last_state_change); ?> (host_current_check_attempt; ?>/host_max_check_attempts; ?>) + monitoringState($host, 'host')); ?>
+
+ Since timeSince($host->host_last_state_change); ?> + host_state > 0): ?> +
+ Attempt: host_current_check_attempt; ?>/host_max_check_attempts; ?> + (host_state_type === '1') ? 'Hard' : 'Soft'; ?>) + +
+ host_icon_image) : ?> +
+ +
+ - host_name ?> (host_address ?>) + host_name ?> - host_action_url)): ?> - Action - - host_notes_url)): ?> - Notes - - -
escape(substr(strip_tags($host->host_output), 0, 10000)); ?> +
+ escape(substr(strip_tags($host->host_output), 0, 10000)); ?> +
- - - - - - - - - href('monitoring/show/service',array( - 'host' => $service->host_name, - 'service' => $service->service_description - ) - ); - $hostLink = $this->href('monitoring/show/host',array( - 'host' => $service->host_name, - ) - ); + $serviceLink = $this->href( + 'monitoring/show/service', + array( + 'host' => $service->host_name, + 'service' => $service->service_description + ) + ); + $hostLink = $this->href( + 'monitoring/show/host', + array( + 'host' => $service->host_name, + ) + ); + $serviceStateName = strtolower($this->util()->getServiceStateName($service->service_state)); ?> activeRowHref === $serviceLink) ? 'class="active"' : ''; ?>> + + - - - - - - diff --git a/public/css/icons.css b/public/css/icons.css index f5508b888..ae314f4ff 100644 --- a/public/css/icons.css +++ b/public/css/icons.css @@ -1,104 +1,138 @@ +.icinga-icon-blank { + background: transparent; + display: inline-block; + width: 16px; + height: 16px; +} .icinga-icon-acknowledgement { - background: transparent url("../img/images/acknowledgement.png") center center no-repeat; + background: transparent url("../img/icons/acknowledgement.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-comment { - background: transparent url("../img/images/comment.png") center center no-repeat; + background: transparent url("../img/icons/comment.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-create { - background: transparent url("../img/images/create.png") center center no-repeat; + background: transparent url("../img/icons/create.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-dashboard { - background: transparent url("../img/images/dashboard.png") center center no-repeat; + background: transparent url("../img/icons/dashboard.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-disabled { - background: transparent url("../img/images/disabled.png") center center no-repeat; + background: transparent url("../img/icons/disabled.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-edit { - background: transparent url("../img/images/edit.png") center center no-repeat; + background: transparent url("../img/icons/edit.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-error { - background: transparent url("../img/images/error.png") center center no-repeat; + background: transparent url("../img/icons/error.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-flapping { - background: transparent url("../img/images/flapping.png") center center no-repeat; + background: transparent url("../img/icons/flapping.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-in-downtime { - background: transparent url("../img/images/in_downtime.png") center center no-repeat; + background: transparent url("../img/icons/in_downtime.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-remove { - background: transparent url("../img/images/remove.png") center center no-repeat; + background: transparent url("../img/icons/remove.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-save { - background: transparent url("../img/images/save.png") center center no-repeat; + background: transparent url("../img/icons/save.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-service { - background: transparent url("../img/images/service.png") center center no-repeat; + background: transparent url("../img/icons/service.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-submit { - background: transparent url("../img/images/submit.png") center center no-repeat; + background: transparent url("../img/icons/submit.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-unhandled { - background: transparent url("../img/images/unhandled.png") center center no-repeat; + background: transparent url("../img/icons/unhandled.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } .icinga-icon-user { - background: transparent url("../img/images/user.png") center center no-repeat; + background: transparent url("../img/icons/user.png") center center no-repeat; display: inline-block; width: 16px; height: 16px; } + +.icinga-icon-active-checks-disabled { + background: transparent url("../img/icons/active_checks_disabled.png") center center no-repeat; + display: inline-block; + width: 16px; + height: 16px; +} + +.icinga-icon-active-passive-checks-disabled { + background: transparent url("../img/icons/active_passive_checks_disabled.png") center center no-repeat; + display: inline-block; + width: 16px; + height: 16px; +} + +.icinga-icon-notification { + background: transparent url("../img/icons/notification.png") center center no-repeat; + display: inline-block; + width: 16px; + height: 16px; +} + +.icinga-icon-notification-disabled { + background: transparent url("../img/icons/notification_disabled.png") center center no-repeat; + display: inline-block; + width: 16px; + height: 16px; +} \ No newline at end of file diff --git a/public/css/main.css b/public/css/main.css index 2c1c64bd1..5d187866d 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -24,6 +24,18 @@ body { padding-top: 70px; } border: none; } +.inline-image { + display: inline-block; + width: 16px; + height: 16px; + background: #c0c0c0 center center no-repeat; +} + +.small-row { + font-size: 12px; + line-height: 16px; + display: block; +} /* ========================================================================== Icinga Design @@ -188,12 +200,10 @@ td { .output-text { font-size: 12px; - line-height: 14px; - display: inline-block; + line-height: 16px; + display: block; } - - /* ========================================================================== Forms ========================================================================== */ @@ -291,10 +301,11 @@ select.input-sm { background-color: #00cc33; /* xx */ } - +.tacheader-status-pending { + background-color: #bababa; +} /** Service status **/ - .tacheader-status-critical { background-color: #FF3300; } diff --git a/public/img/images/acknowledgement.png b/public/img/icons/acknowledgement.png similarity index 100% rename from public/img/images/acknowledgement.png rename to public/img/icons/acknowledgement.png diff --git a/public/img/icons/active_checks_disabled.png b/public/img/icons/active_checks_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ef86c53227cd9bb924cd2acd9fa64bad4dbab537 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`JjfNVYkRJy3o5gTC|P^-e{yOB^#g zcGSkoJu2JjePJgce%xxo$vU+ zg*B_WElJ&TNV%kKN4!B}?4I*G|9y;ha(U&lM0n3J_Zla8c8f#)Zyu_OUFh{F4p@4n zt~+$i)0lkm2dsG?W%h6ASGT-wymViOZqAkqhs%9jm)Jj9sJUKCy3=E=(tE!6)ypzn zmMp(neD7bGbHKJCJbXsh{y=$PP%?PB`njxgN@xNAr5LmW literal 0 HcmV?d00001 diff --git a/public/img/icons/active_passive_checks_disabled.png b/public/img/icons/active_passive_checks_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3a44ebcf9d7533df97dc3345ebb4b8bb15251784 GIT binary patch literal 570 zcmV-A0>%A_P)5($9-eVH5`N&mBJ(777bdn#Dagn*0G4l!g2Q5)sPgyP-5Slx!?CBw462 zO(Paq%94dxno??{_ZCtU79wP$crE7r)}5*OHgoFM?L5zOdY<>3Dx!XfoKkzl3aV-1 zDSi#%6Am{`jITgEf&F+Z=PaT=9Z~0q`c}@_QeQ+ZqP}0aM{~})V6Onv0|q=OoMZi7 zm2>V|+lTd-!w9xxExzGBGJd4g&h#~_7scC%9=4SM-Fk&pxZ5=GI;Hjx<{dOmj9{t| zu3$GV;(6)q!FjyII5y#UO6^P)QD49)#!_mhN|X=yii7xvC)k`)J6!NXn8b}Ce8z8V zZJOv>u1e-y{{I&7P>J^wbNvWAa1UEbgt|m{QN(+39q(`!UvMI&_T%C$9KbmYV}YF_ zp2f|S+Gk5`VMEFG2D{2*5(?3fcK@^7Z-@X1T3|MFt3$1oqQ`n_Sn}DT73PDiBG$~Tp_yr_E1(PbN zLfY6^h!8X>?NX$et)p0q;UdJCNpWZKvbl?TVBqXI?>@X|4%130fe?yKywn^^F_!P^ z#lfEZ30Cj}tz1j_Jj8Yg#aWEyUK5~&!x+o5R}exmgm+lP=MakLF_ybkzg=@Q+Q<4h z=3*@O@fe>%DCU{~{o)TEgix$uIy-rDAHaDY;SpwWj84@Ytcg>ec_@Ehqa9=UsuF}y z%;0Ym;0lMB%%U+|gis_5-~>x(w%>+F75~TooBwv4nAf#!??T) zpoJGW#Q_$wgDGs>1(2|v9gO3H?q!bT+O2?5-8XT9Bdp>=_YSK4rzSuLU$LG?`Ht5) zPr298u!V%Dc&lg6wP@p66W|MW8h)(DW|jN{bB0(BSX>O300000NkvXXu0mjfia60r literal 0 HcmV?d00001 diff --git a/public/img/images/dashboard.png b/public/img/icons/dashboard.png similarity index 100% rename from public/img/images/dashboard.png rename to public/img/icons/dashboard.png diff --git a/public/img/images/disabled.png b/public/img/icons/disabled.png similarity index 100% rename from public/img/images/disabled.png rename to public/img/icons/disabled.png diff --git a/public/img/icons/downtime_end.png b/public/img/icons/downtime_end.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d0d97234ed45b214f5a2c8dc477f1c863e5bd6 GIT binary patch literal 550 zcmV+>0@?kEP)R5*>5)4gkyK@bM;-^ELWXo_?qf|Wakg@s@dQ%KSZ5+q=RAlM3OFZdr=D5)*% zBz_f|);1y{A`)k(~pfQclZGm~L;SpY7sfjX=Ni0W{^DX`uCc90PW0=KkW_{gCa~zvEj01Qa zQRXu13VJXSQI?vNKjH0Qj|S{9JdG&R_{q*7UBj)+dOEXi?<3F`xrc4&lyYJn-|dX= zXhRyob$rB+ri4CvxPUKM?P97~6U}8m>Q}qxWD6HF>qR07*qoM6N<$f+RHKsQ>@~ literal 0 HcmV?d00001 diff --git a/public/img/icons/downtime_start.png b/public/img/icons/downtime_start.png new file mode 100644 index 0000000000000000000000000000000000000000..8e33280fb833dbcaef959bc017965156ad53b448 GIT binary patch literal 524 zcmV+n0`vWeP);ER2OxC<_Z~Dav1<$$vmi zk`RA@MnXB4G-boeiiE~(;hMU8p8FYdcGr3Np5HmAYtXi>VT)+C;w3g!*R9NQZ6p!P z`kc6m4>*J=oQr5SF9{IQ3~(IRGt2YLGL1P*_5qgn_;zC>rXrd%n8!Ly;LcJ22e1;S zhWtAtnr)e7?tg$u+{9z7!rH20m!6Ra-77>i+wlsg{hRw|X33r=V-@VjdOWD_7dRNv z+^?~-ndRYP3Laq#-eV2!RoL&E@(V{Y%aaj6M6(04*qd42bf6pXrS1cMU?Q_Tqb?<) zxs2C%i+797T$Rm4H2bGU<~9o_ACGrS0b8YSW$~wT*Rjyz&vhr65(!WcUQ5?td*S%LELxr}6hFZ=SB#{QEg#L!0Ap;j7S|SJ3PlMt7NoX#^jv^2D6@&BGM8b;=*|KFo7RA zSKpvl*R_Z=kB`{JG5Y0kTXl&^JjQCy)&4}eOxVl0dfkzIq=@vPc=r3{>;k_c(vygk zBhvam7$>+?`f19W#dkczVMOWz42ow2IKoRj#aTI@>;T-smp0%wwy=iZn8Hj4;60|> zfIfZ}(>v_sTy2kYN2Fo#XolD;r4L)trPJaWRd9?IJSZ)^h)AzG0FUtY?-qtQaI+!a zZ>nzqx9~ORY9k`u#bM6X`8ao3@l=zUtDT-kq(ywjn~v;F;%ool5_9;3=NLq!g$}?y q?6m<$ST1o>ZMIt&{D-m80R8}&u2X!rI^^g80000;6(;Txm^PPEiwrbl}2=y!;_`eonY;Ki@ zL+Lw<+jy1Y4YZxSMNMTR{Fmi6Cu=VDXwrM#^zZDwAj}H&tnm9 zQ*w(R*n?jb0xqVBt`|077?1E6XSx>hm@~MB)zWLyF)ZO_hIauK-r*1) z#@I}k)gjcM@ipZt0b4kLv-l7~eNXQavks=>o%3Bq!Vo^;HGU7U@lQb>|0llSIZnpd z%=fV{h8Nw&88D2~7{MftgiudmvtW$tt@SU!eO$m%T*5~z_pvyF_qJbZ1y$SjRvkk9 z23PStzskbGIG*4s&c)cAC_8+^6z-PAN$WU_Y24{I!K&>otYcJX-%0y17GpD6-a%G{ fQv5(=lsQK@`RD-&+y{vyIwWS%K(~3~%_~JBM?bdCg=p0TF2vclGOb&gI!OTlQ`wSYq$+?tnLquA{7H;81M7o)C*>3BDsYFXNqMyN9&gB)Z z;(0_`>ob_85rz?I1Ltaz2mfR6xsGrNSMU~J+Tudbp?3CB&gCoab@)Y$=O&0qmvMll zh%}5yA1iCs-cs)fH?WVRy7nvkOVb8FBGO5$VlU?+=K_0Jt+mlSgF~#~8XkA}R%I)- zr`O;VcCd|&4!>X74o=TAXlmqLEJvh4L>gcjyS3K%^}J^q9M$hr9OqodIhQexD{Fgx z-$K**8{gpx-s2m-W7s*gh!Z%E^_%VsUq!$sV7W7>XlHFFD2Nio#>P&9SVfCeHYqGs6e~qb ziy+!)DTsD9BEme4|A3(QK_n9LEZoSt=EZ?2hI{64?z#8$+P1Y>WyT~{s+tYY`~O)! ziI>>Xg_+o7`3N3h6*Naz8T`@eXhNHtb$ib7e%~=rhe^#)Ycp2QFcD z0y8*)=h#-&d>oTID*qa84f_K=t$VO;(zkI>Mysm%j+Nm!iLHGs;yPZTGUH+wL1vu7 z*Wq{=YyGO`H1^>Dj$y({`(WFn%9|e6i+jw*Wt_Es^&BFy26wh$M6t8vA3%EvJtK`OjXSjoW)YxwyRyZ iP6Z=Mwqv;~&c6T`{f@(>zqCRC00004nJ za0`JjH55;QC3$i9`Si79% z;Qps737Vi!IkK%lyNCOI)zXFW7SVN1h_T{*R)@hb`s`K9bE@AbC`J zhQjkNT;Dge$j^|Nsqp;D%CzYpcX5e*WDh=k5tlZPTf?gE=VbzceoCjfzI|j3&)VB4VfD0QQ)l`Q+fxr>TI-(7(OW1Uc+7YQ bM?GWt-uMSAN;>ZX1DnCq)z4*}Q$iB}DFDi- literal 0 HcmV?d00001 diff --git a/public/img/icons/pdf.png b/public/img/icons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..eefcef63bc5242eabdd64ac028f5667770408861 GIT binary patch literal 507 zcmV5(od_6Q547V&*3n+j1*CHM|+jRQ3i@qB$Hd`1(+#iNG4u^88;=R#KfJ6 z5;3_M=uYn3VC{)abf<*KpU2=lr%tEmIk9TjZmqR{>$}$4gQjUfL|MgE{dPICKA3k7 zXYOZl1@ACueNB4~;7&x@%B(N?1O|AMS?g>;Eo>@0>IJ4f?ZC~_k xp~3lxvKQYX%BhY5aI{Zg9d~=G&fDtr@)vJHTICfG64C$w002ovPDHLkV1fV&)?5Gp literal 0 HcmV?d00001 diff --git a/public/img/images/remove.png b/public/img/icons/remove.png similarity index 100% rename from public/img/images/remove.png rename to public/img/icons/remove.png diff --git a/public/img/images/save.png b/public/img/icons/save.png similarity index 100% rename from public/img/images/save.png rename to public/img/icons/save.png diff --git a/public/img/images/service.png b/public/img/icons/service.png similarity index 100% rename from public/img/images/service.png rename to public/img/icons/service.png diff --git a/public/img/icons/servicegroup.png b/public/img/icons/servicegroup.png new file mode 100644 index 0000000000000000000000000000000000000000..38ee3529ab4dbe06c477a89aaa89d25e42563f55 GIT binary patch literal 599 zcmV-d0;v6oP)ZBp$cw3s`LB>u_!<)-DF{Am?hfDW+78Vj}Kpj9^1b<-uqv@C}c;Q5fzceu%I5 z6!~w=V5&v19;>^3Kq-|)5bnsi`m&Vl=o`nAqAbU1jN=gY#QvlB9FxTwMVv#phs&64 z6nw`v9K~}z1D6Hp7k&hA09$bySLm4tyV1d1&eeRM)Rj1c6FFB4DV1wNWg$S*IE&5r z8K9w*%1&@h;y4aR-VCjwlXG=M@0s3UFr~7K_qY&^Q^+`$Qn@UK)D1yV*L5THDOO;M lv5jkAywiKq|B1h<{s5==eX%T5w#@(l002ovPDHLkV1nw;3w8hi literal 0 HcmV?d00001 diff --git a/public/img/images/submit.png b/public/img/icons/submit.png similarity index 100% rename from public/img/images/submit.png rename to public/img/icons/submit.png diff --git a/public/img/icons/success.png b/public/img/icons/success.png new file mode 100644 index 0000000000000000000000000000000000000000..2f95639dd4442087c1040273434abad307a3e159 GIT binary patch literal 509 zcmV5)3HldQ5eVZ&#MuV)es?3U`w25b!ybvXc2^ns44mvA_!WV8X8+lXjT_# zaEVrhoE%;_mo{A^FzAI$Z^Jz|FUfty9~?O6@I2r1d(Lytpss8GD+kbM5LXZtF;#J8`EWeRE7fC$9~s#MEZ=oSZnJWl+n(6>yAj*O7gl+;OXbsueP*x89%Vq1x(;)CulSVa2tC$S0hf^cz~A?X{hP*i-Rj-wySNtY8QV28jf1JW^xuD00000NkvXXu0mjfy0X(f literal 0 HcmV?d00001 diff --git a/public/img/icons/uebersicht.png b/public/img/icons/uebersicht.png new file mode 100644 index 0000000000000000000000000000000000000000..e94c443e3819649d7f5d6de19a0cdce5ebf6db3d GIT binary patch literal 16518 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 literal 0 HcmV?d00001 diff --git a/public/img/images/unhandled.png b/public/img/icons/unhandled.png similarity index 100% rename from public/img/images/unhandled.png rename to public/img/icons/unhandled.png diff --git a/public/img/images/user.png b/public/img/icons/user.png similarity index 100% rename from public/img/images/user.png rename to public/img/icons/user.png
StatusServiceHostOutput
+ + - service_icon_image) : ?> - - - service_handled && $service->service_state > 0): ?> - {{UNHANDLED_ICON}} + service_acknowledged && !$service->service_in_downtime): ?> - {{ACKNOWLEDGED_ICON}} + service_is_flapping): ?> - {{FLAPPING_ICON}} + service_notifications_enabled): ?> - {{NOTIFICATIONS_DISABLED_ICON}} + service_in_downtime): ?> - {{IN_DOWNTIME_ICON}} + service_active_checks_enabled): ?> service_passive_checks_enabled): ?> - {{ACTIVE_PASSIVE_CHECKS_DISABLED_ICON}} + - {{ACTIVE_CHECKS_DISABLED_ICON}} + service_last_comment !== null): ?> - {{COMMENT_ICON}} + -
- service_state_type == 0): ?> - - {{SOFTSTATE_ICON}} - - - monitoringState($service, 'service')); ?> - Since  - timeSince($service->service_last_state_change); ?> + monitoringState($service, 'service')); ?>
+ +
+ Since timeSince($service->service_last_state_change); ?> + service_state): ?> +
+ Attempt: + service_current_check_attempt; ?>/service_max_check_attempts; ?> + (service_state_type === '1') ? 'Hard' : 'Soft'; ?>) + +
- - service_display_name; ?> - -
- - service_action_url)): ?> - Action - - - service_notes_url)): ?> - Notes - -
- host_handled && $service->host_state > 0): ?> - - {{UNHANDLED_ICON}} - + service_icon_image): ?> +
+ +
- - host_name; ?> - host_state != 0): ?> - (monitoringState($service, 'host')); ?>) - -
host_address ?> -
-
+ service_display_name; ?> + + on + host_name; ?> + host_state != 0): ?> + (monitoringState($service, 'host')); ?>) + + + +
escape(substr(strip_tags($service->service_output), 0, 10000)); ?> +