1<?php
2
3use LibreNMS\Config;
4
5$dest = device_by_id_cache($_GET['dest']);
6
7// This is my translation of Smokeping's graphing.
8// Thanks to Bill Fenner for Perl->Human translation:>
9$scale_min = 0;
10$scale_rigid = true;
11
12require 'includes/html/graphs/common.inc.php';
13require 'includes/html/graphs/device/smokeping_common.inc.php';
14
15$i = 0;
16$pings = Config::get('smokeping.pings');
17$iter = 0;
18$colourset = 'mixed';
19
20if ($width > '500') {
21    $descr_len = 18;
22} else {
23    $descr_len = (12 + round(($width - 275) / 8));
24}
25
26if ($width > '500') {
27    $rrd_options .= " COMMENT:'" . substr(str_pad($unit_text, ($descr_len + 5)), 0, ($descr_len + 5)) . " RTT      Loss    SDev   RTT\:SDev                              \l'";
28} else {
29    $rrd_options .= " COMMENT:'" . substr(str_pad($unit_text, ($descr_len + 5)), 0, ($descr_len + 5)) . " RTT      Loss    SDev   RTT\:SDev                              \l'";
30}
31
32$filename_dir = generate_smokeping_file($device);
33if ($device['hostname'] == Config::get('own_hostname')) {
34    $filename = $filename_dir . $dest['hostname'] . '.rrd';
35    if (! Rrd::checkRrdExists($filename)) {
36        // Try with dots in hostname replaced by underscores
37        $filename = $filename_dir . str_replace('.', '_', $dest['hostname']) . '.rrd';
38    }
39} else {
40    $filename = $filename_dir . $dest['hostname'] . '~' . $device['hostname'] . '.rrd';
41    if (! Rrd::checkRrdExists($filename)) {
42        // Try with dots in hostname replaced by underscores
43        $filename = $filename_dir . str_replace('.', '_', $dest['hostname']) . '~' . $device['hostname'] . '.rrd';
44    }
45}
46
47if (! Config::has("graph_colours.$colourset.$iter")) {
48    $iter = 0;
49}
50
51$colour = Config::get("graph_colours.$colourset.$iter");
52  $iter++;
53
54  $descr = \LibreNMS\Data\Store\Rrd::fixedSafeDescr($source, $descr_len);
55
56  $rrd_options .= " DEF:median$i=" . $filename . ':median:AVERAGE ';
57  $rrd_options .= " DEF:loss$i=" . $filename . ':loss:AVERAGE';
58  $rrd_options .= " CDEF:ploss$i=loss$i,$pings,/,100,*";
59  $rrd_options .= " CDEF:dm$i=median$i";
60// $rrd_options .= " CDEF:dm$i=median$i,0,".$max->{$start}.",LIMIT";
61  // start emulate Smokeping::calc_stddev
62foreach (range(1, $pings) as $p) {
63    $rrd_options .= ' DEF:pin' . $i . 'p' . $p . '=' . $filename . ':ping' . $p . ':AVERAGE';
64    $rrd_options .= ' CDEF:p' . $i . 'p' . $p . '=pin' . $i . 'p' . $p . ',UN,0,pin' . $i . 'p' . $p . ',IF';
65}
66
67  unset($pings_options, $m_options, $sdev_options);
68
69foreach (range(2, $pings) as $p) {
70    $pings_options .= ',p' . $i . 'p' . $p . ',UN,+';
71    $m_options .= ',p' . $i . 'p' . $p . ',+';
72    $sdev_options .= ',p' . $i . 'p' . $p . ',m' . $i . ',-,DUP,*,+';
73}
74
75  $rrd_options .= ' CDEF:pings' . $i . '=' . $pings . ',p' . $i . 'p1,UN' . $pings_options . ',-';
76  $rrd_options .= ' CDEF:m' . $i . '=p' . $i . 'p1' . $m_options . ',pings' . $i . ',/';
77  $rrd_options .= ' CDEF:sdev' . $i . '=p' . $i . 'p1,m' . $i . ',-,DUP,*' . $sdev_options . ',pings' . $i . ',/,SQRT';
78  // end emulate Smokeping::calc_stddev
79  $rrd_options .= " CDEF:dmlow$i=dm$i,sdev$i,2,/,-";
80  $rrd_options .= " CDEF:s2d$i=sdev$i";
81  $rrd_options .= " AREA:dmlow$i";
82  $rrd_options .= " AREA:s2d$i#" . $colour . '30::STACK';
83  $rrd_options .= " LINE1:dm$i#" . $colour . ":'$descr'";
84
85// $rrd_options .= " LINE1:sdev$i#000000:$descr";
86  $rrd_options .= " VDEF:avmed$i=median$i,AVERAGE";
87  $rrd_options .= " VDEF:avsd$i=sdev$i,AVERAGE";
88  $rrd_options .= " CDEF:msr$i=median$i,POP,avmed$i,avsd$i,/";
89  $rrd_options .= " VDEF:avmsr$i=msr$i,AVERAGE";
90
91  $rrd_options .= " GPRINT:avmed$i:'%5.1lf%ss'";
92  $rrd_options .= " GPRINT:ploss$i:AVERAGE:'%5.1lf%%'";
93
94  $rrd_options .= " GPRINT:avsd$i:'%5.1lf%Ss'";
95  $rrd_options .= " GPRINT:avmsr$i:'%5.1lf%s\\l'";
96
97  $i++;
98