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 22require_once dirname(__FILE__).'/include/config.inc.php'; 23require_once dirname(__FILE__).'/include/triggers.inc.php'; 24 25$page['file'] = 'chart4.php'; 26$page['type'] = PAGE_TYPE_IMAGE; 27 28require_once dirname(__FILE__).'/include/page_header.php'; 29 30// VAR TYPE OPTIONAL FLAGS VALIDATION EXCEPTION 31$fields = [ 32 'triggerid' => [T_ZBX_INT, O_MAND, P_SYS, DB_ID, null] 33]; 34if (!check_fields($fields)) { 35 exit(); 36} 37 38/* 39 * Permissions 40 */ 41if (!hasRequest('triggerid')) { 42 fatal_error(_('No triggers defined.')); 43} 44 45$dbTriggers = API::Trigger()->get([ 46 'output' => ['description'], 47 'triggerids' => getRequest('triggerid'), 48 'expandDescription' => true 49]); 50 51if (!$dbTriggers) { 52 access_deny(); 53} 54 55$dbTrigger = reset($dbTriggers); 56 57/* 58 * Display 59 */ 60$startTime = microtime(true); 61 62$sizeX = 900; 63$sizeY = 300; 64 65$shiftX = 12; 66$shiftYup = 17; 67$shiftYdown = 55; 68 69$im = imagecreate($sizeX + $shiftX + 61, $sizeY + $shiftYup + $shiftYdown + 10); 70 71$red = imagecolorallocate($im, 255, 0, 0); 72$darkred = imagecolorallocate($im, 150, 0, 0); 73$green = imagecolorallocate($im, 0, 255, 0); 74$darkgreen = imagecolorallocate($im, 0, 150, 0); 75$bluei = imagecolorallocate($im, 0, 0, 255); 76$darkblue = imagecolorallocate($im, 0, 0, 150); 77$yellow = imagecolorallocate($im, 255, 255, 0); 78$darkyellow = imagecolorallocate($im, 150, 150, 0); 79$cyan = imagecolorallocate($im, 0, 255, 255); 80$black = imagecolorallocate($im, 0, 0, 0); 81$gray = imagecolorallocate($im, 150, 150, 150); 82$white = imagecolorallocate($im, 255, 255, 255); 83$bg = imagecolorallocate($im, 102, 119, 136); 84 85$x = imagesx($im); 86$y = imagesy($im); 87 88imagefilledrectangle($im, 0, 0, $x, $y, $white); 89imagerectangle($im, 0, 0, $x - 1, $y - 1, $black); 90 91$str = _s('%1$s (year %2$s)', $dbTrigger['description'], zbx_date2str(_x('Y', DATE_FORMAT_CONTEXT))); 92$x = imagesx($im) / 2 - imagefontwidth(4) * mb_strlen($str) / 2; 93imageText($im, 10, 0, $x, 14, $darkred, $str); 94 95$now = time(null); 96$count_now = []; 97$true = []; 98$false = []; 99 100$start = mktime(0, 0, 0, 1, 1, date('Y')); 101 102$wday = date('w', $start); 103if ($wday == 0) { 104 $wday = 7; 105} 106$start = $start - ($wday - 1) * SEC_PER_DAY; 107 108$weeks = (int) (date('z') / 7 + 1); 109 110for ($i = 0; $i < $weeks; $i++) { 111 $periodStart = $start + SEC_PER_WEEK * $i; 112 $periodEnd = $start + SEC_PER_WEEK * ($i + 1); 113 114 $stat = calculateAvailability(getRequest('triggerid'), $periodStart, $periodEnd - 1); 115 $true[$i] = $stat['true']; 116 $false[$i] = $stat['false']; 117 $count_now[$i] = 1; 118} 119 120for ($i = 0; $i <= $sizeY; $i += $sizeY / 10) { 121 dashedLine($im, $shiftX, $i + $shiftYup, $sizeX + $shiftX, $i + $shiftYup, $gray); 122} 123 124for ($i = 0, $periodStart = $start; $i <= $sizeX; $i += $sizeX / 52) { 125 dashedLine($im, $i + $shiftX, $shiftYup, $i + $shiftX, $sizeY + $shiftYup, $gray); 126 imageText($im, 6, 90, $i + $shiftX + 4, $sizeY + $shiftYup + 30, $black, zbx_date2str(_('d.M'), $periodStart)); 127 128 $periodStart += SEC_PER_WEEK; 129} 130 131$maxY = max(max($true), 100); 132$minY = 0; 133 134$maxX = 900; 135$minX = 0; 136 137for ($i = 1; $i <= $weeks; $i++) { 138 $x1 = (900 / 52) * $sizeX * ($i - 1 - $minX) / ($maxX - $minX); 139 140 $yt = $sizeY * $true[$i - 1] / 100; 141 if ($yt > 0) { 142 imagefilledrectangle($im, $x1 + $shiftX, $shiftYup, $x1 + $shiftX + 8, $yt + $shiftYup, imagecolorallocate($im, 235, 120, 120)); // red 143 } 144 145 $yf = $sizeY * $false[$i - 1] / 100; 146 if ($yf > 0) { 147 imagefilledrectangle($im, $x1 + $shiftX, $yt + $shiftYup, $x1 + $shiftX + 8, $sizeY + $shiftYup, imagecolorallocate($im, 120, 235, 120)); // green 148 } 149 150 if ($yt + $yf > 0) { 151 imagerectangle($im, $x1 + $shiftX, $shiftYup, $x1 + $shiftX + 8, $sizeY + $shiftYup, $black); 152 } 153} 154 155for ($i = 0; $i <= $sizeY; $i += $sizeY / 10) { 156 imageText($im, 7, 0, $sizeX + 5 + $shiftX, $sizeY - $i - 4 + $shiftYup + 8, $darkred, $i * ($maxY - $minY) / $sizeY + $minY); 157} 158 159imagefilledrectangle($im, $shiftX, $sizeY + $shiftYup + 39, $shiftX + 5, $sizeY + $shiftYup + 44, imagecolorallocate($im, 120, 235, 120)); 160imagerectangle($im, $shiftX, $sizeY + $shiftYup + 39, $shiftX + 5, $sizeY + $shiftYup + 44, $black); 161imageText($im, 8, 0, $shiftX + 9, $sizeY + $shiftYup + 45, $black, _('OK').' (%)'); 162 163imagefilledrectangle($im, $shiftX, $sizeY + $shiftYup + 54, $shiftX + 5, $sizeY + $shiftYup + 59, imagecolorallocate($im, 235, 120, 120)); 164imagerectangle($im, $shiftX, $sizeY + $shiftYup + 54, $shiftX + 5, $sizeY + $shiftYup + 59, $black); 165imageText($im, 8, 0, $shiftX + 9, $sizeY + $shiftYup + 60, $black, _('Problems').' (%)'); 166 167imagestringup($im, 1, imagesx($im) - 10, imagesy($im) - 50, ZABBIX_HOMEPAGE, $gray); 168 169$str = sprintf('%0.2f', microtime(true) - $startTime); 170$str = _s('Generated in %s sec', $str); 171$strSize = imageTextSize(6, 0, $str); 172imageText($im, 6, 0, imagesx($im) - $strSize['width'] - 5, imagesy($im) - 5, $gray, $str); 173 174imageOut($im); 175imagedestroy($im); 176 177require_once dirname(__FILE__).'/include/page_footer.php'; 178