diff options
Diffstat (limited to 'type')
| -rw-r--r-- | type/Default.class.php | 142 | ||||
| -rw-r--r-- | type/GenericIO.class.php | 51 | ||||
| -rw-r--r-- | type/GenericStacked.class.php | 59 |
3 files changed, 147 insertions, 105 deletions
diff --git a/type/Default.class.php b/type/Default.class.php index 6b1ab5c..0c992e2 100644 --- a/type/Default.class.php +++ b/type/Default.class.php | |||
| @@ -5,7 +5,8 @@ | |||
| 5 | class Type_Default { | 5 | class Type_Default { |
| 6 | var $datadir; | 6 | var $datadir; |
| 7 | var $args; | 7 | var $args; |
| 8 | var $data_sources; | 8 | var $seconds; |
| 9 | var $data_sources = array('value'); | ||
| 9 | var $order; | 10 | var $order; |
| 10 | var $ds_names; | 11 | var $ds_names; |
| 11 | var $colors; | 12 | var $colors; |
| @@ -16,6 +17,29 @@ class Type_Default { | |||
| 16 | var $width; | 17 | var $width; |
| 17 | var $heigth; | 18 | var $heigth; |
| 18 | 19 | ||
| 20 | var $files; | ||
| 21 | var $tinstances; | ||
| 22 | var $identifiers; | ||
| 23 | |||
| 24 | function __construct($datadir) { | ||
| 25 | $this->datadir = $datadir; | ||
| 26 | $this->parse_get(); | ||
| 27 | $this->rrd_files(); | ||
| 28 | $this->identifiers = $this->file2identifier($this->files); | ||
| 29 | } | ||
| 30 | |||
| 31 | # parse $_GET values | ||
| 32 | function parse_get() { | ||
| 33 | $this->args = array( | ||
| 34 | 'host' => $_GET['h'], | ||
| 35 | 'plugin' => $_GET['p'], | ||
| 36 | 'pinstance' => $_GET['pi'], | ||
| 37 | 'type' => $_GET['t'], | ||
| 38 | 'tinstance' => $_GET['ti'], | ||
| 39 | ); | ||
| 40 | $this->seconds = $_GET['s']; | ||
| 41 | } | ||
| 42 | |||
| 19 | function validate_color($color) { | 43 | function validate_color($color) { |
| 20 | if (!preg_match('/^[0-9a-f]{6}$/', $color)) | 44 | if (!preg_match('/^[0-9a-f]{6}$/', $color)) |
| 21 | return '000000'; | 45 | return '000000'; |
| @@ -46,26 +70,41 @@ class Type_Default { | |||
| 46 | return $c[r].$c[g].$c[b]; | 70 | return $c[r].$c[g].$c[b]; |
| 47 | } | 71 | } |
| 48 | 72 | ||
| 49 | function identifier($host, $plugin, $pinst, $type, $tinst) { | 73 | function rrd_files() { |
| 50 | $identifier = sprintf('%s/%s%s%s/%s%s%s', $host, | 74 | $files = $this->get_filenames(); |
| 51 | $plugin, strlen($pinst) ? '-' : '', $pinst, | ||
| 52 | $type, strlen($tinst) ? '-' : '', $tinst); | ||
| 53 | 75 | ||
| 54 | if (is_file($this->datadir.'/'.$identifier.'.rrd')) | 76 | foreach($files as $filename) { |
| 55 | return $identifier; | 77 | preg_match("#^$this->datadir/{$this->args['host']}/[\w\d]+-?([\w\d-]+)?/[\w\d]+-?([\w\d-]+)?\.rrd#", $filename, $matches); |
| 56 | else | 78 | |
| 57 | return FALSE; | 79 | $this->tinstances[] = $matches[2]; |
| 80 | $this->files[$matches[2]] = $filename; | ||
| 81 | } | ||
| 82 | |||
| 83 | sort($this->tinstances); | ||
| 84 | ksort($this->files); | ||
| 58 | } | 85 | } |
| 59 | 86 | ||
| 60 | function get_filename($tinstance=NULL) { | 87 | function get_filenames() { |
| 61 | if (!is_array($this->args['tinstance']) && $tinstance == NULL) | 88 | $identifier = sprintf('%s/%s%s%s/%s%s%s', $this->args['host'], |
| 62 | $tinstance = $this->args['tinstance']; | 89 | $this->args['plugin'], strlen($this->args['pinstance']) ? '-' : '', $this->args['pinstance'], |
| 90 | $this->args['type'], strlen($this->args['tinstance']) ? '-' : '', $this->args['tinstance']); | ||
| 91 | |||
| 92 | $wildcard = strlen($this->args['tinstance']) ? '' : '*'; | ||
| 63 | 93 | ||
| 64 | $identifier = $this->identifier($this->args['host'], | 94 | $files = glob($this->datadir .'/'. $identifier . $wildcard . '.rrd'); |
| 65 | $this->args['plugin'], $this->args['pinstance'], | ||
| 66 | $this->args['type'], $tinstance); | ||
| 67 | 95 | ||
| 68 | return $this->datadir.'/'.$identifier.'.rrd'; | 96 | return $files; |
| 97 | } | ||
| 98 | |||
| 99 | function file2identifier($files) { | ||
| 100 | foreach($files as $key => $file) { | ||
| 101 | if (is_file($file)) { | ||
| 102 | $files[$key] = preg_replace("#^$this->datadir/#", '', $files[$key]); | ||
| 103 | $files[$key] = preg_replace('#\.rrd$#', '', $files[$key]); | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | return $files; | ||
| 69 | } | 108 | } |
| 70 | 109 | ||
| 71 | function rrd_graph($debug=false) { | 110 | function rrd_graph($debug=false) { |
| @@ -96,48 +135,57 @@ class Type_Default { | |||
| 96 | return $rrdgraph; | 135 | return $rrdgraph; |
| 97 | } | 136 | } |
| 98 | 137 | ||
| 99 | function rrd_gen_graph() { | 138 | function rrd_get_sources() { |
| 100 | $filename = $this->get_filename(); | 139 | # is the source spread over multiple files? |
| 140 | if (is_array($this->files) && count($this->files)>1) { | ||
| 141 | # and must it be ordered? | ||
| 142 | if (is_array($this->order)) { | ||
| 143 | $this->tinstances = array_intersect($this->order, $this->tinstances); | ||
| 144 | } | ||
| 145 | # use tinstances as sources | ||
| 146 | $sources = $this->tinstances; | ||
| 147 | } | ||
| 148 | # or one file with multiple data_sources | ||
| 149 | else { | ||
| 150 | # use data_sources as sources | ||
| 151 | $sources = $this->data_sources; | ||
| 152 | } | ||
| 153 | return $sources; | ||
| 154 | } | ||
| 101 | 155 | ||
| 156 | function rrd_gen_graph() { | ||
| 102 | $rrdgraph = $this->rrd_options(); | 157 | $rrdgraph = $this->rrd_options(); |
| 103 | 158 | ||
| 104 | if (is_array($this->args['tinstance'])) | 159 | $sources = $this->rrd_get_sources(); |
| 105 | $array = is_array($this->order) ? $this->order : $this->args['tinstance']; | ||
| 106 | else | ||
| 107 | $array = $this->data_sources; | ||
| 108 | 160 | ||
| 109 | $i=0; | 161 | $i=0; |
| 110 | foreach ($array as $value) { | 162 | foreach ($this->tinstances as $tinstance) { |
| 111 | if (is_array($this->args['tinstance'])) { | 163 | foreach ($this->data_sources as $ds) { |
| 112 | $filename = $this->get_filename($value); | 164 | $rrdgraph[] = sprintf('DEF:min_%s=%s:%s:MIN', $sources[$i], $this->files[$tinstance], $ds); |
| 113 | $ds = $this->data_sources[0]; | 165 | $rrdgraph[] = sprintf('DEF:avg_%s=%s:%s:AVERAGE', $sources[$i], $this->files[$tinstance], $ds); |
| 114 | } else { | 166 | $rrdgraph[] = sprintf('DEF:max_%s=%s:%s:MAX', $sources[$i], $this->files[$tinstance], $ds); |
| 115 | $filename = $this->get_filename(); | 167 | $i++; |
| 116 | $ds = $value; | ||
| 117 | } | 168 | } |
| 118 | $rrdgraph[] = sprintf('DEF:min%s=%s:%s:MIN', $i, $filename, $ds); | ||
| 119 | $rrdgraph[] = sprintf('DEF:avg%s=%s:%s:AVERAGE', $i, $filename, $ds); | ||
| 120 | $rrdgraph[] = sprintf('DEF:max%s=%s:%s:MAX', $i, $filename, $ds); | ||
| 121 | $i++; | ||
| 122 | } | 169 | } |
| 123 | 170 | ||
| 124 | if (!is_array($this->args['tinstance'])) { | 171 | if(count($this->files)<=1) { |
| 125 | $rrdgraph[] = sprintf('AREA:max0#%s', $this->get_faded_color($this->colors[$this->data_sources[0]])); | 172 | foreach ($sources as $source) { |
| 126 | $rrdgraph[] = sprintf('AREA:min0#%s', 'ffffff'); | 173 | $rrdgraph[] = sprintf('AREA:max_%s#%s', $source, $this->get_faded_color($this->colors[$source])); |
| 174 | $rrdgraph[] = sprintf('AREA:min_%s#%s', $source, 'ffffff'); | ||
| 175 | break; # only 1 area to draw | ||
| 176 | } | ||
| 127 | } | 177 | } |
| 128 | 178 | ||
| 129 | $i=0; | 179 | foreach ($sources as $source) { |
| 130 | foreach ($array as $value) { | 180 | $dsname = $this->ds_names[$source] != '' ? $this->ds_names[$source] : $source; |
| 131 | $dsname = $this->ds_names[$value] != '' ? $this->ds_names[$value] : $value; | 181 | $color = is_array($this->colors) ? $this->colors[$source]: $this->colors; |
| 132 | $color = is_array($this->colors) ? $this->colors[$value]: $this->colors; | 182 | $rrdgraph[] = sprintf('LINE1:avg_%s#%s:\'%s\'', $source, $this->validate_color($color), $dsname); |
| 133 | $rrdgraph[] = sprintf('LINE1:avg%d#%s:\'%s\'', $i, $this->validate_color($color), $dsname); | 183 | $rrdgraph[] = sprintf('GPRINT:min_%s:MIN:\'%s Min,\'', $source, $this->rrd_format); |
| 134 | $rrdgraph[] = sprintf('GPRINT:min%d:MIN:\'%s Min,\'', $i, $this->rrd_format); | 184 | $rrdgraph[] = sprintf('GPRINT:avg_%s:AVERAGE:\'%s Avg,\'', $source, $this->rrd_format); |
| 135 | $rrdgraph[] = sprintf('GPRINT:avg%d:AVERAGE:\'%s Avg,\'', $i, $this->rrd_format); | 185 | $rrdgraph[] = sprintf('GPRINT:max_%s:MAX:\'%s Max,\'', $source, $this->rrd_format); |
| 136 | $rrdgraph[] = sprintf('GPRINT:max%d:MAX:\'%s Max,\'', $i, $this->rrd_format); | 186 | $rrdgraph[] = sprintf('GPRINT:avg_%s:LAST:\'%s Last\\l\'', $source, $this->rrd_format); |
| 137 | $rrdgraph[] = sprintf('GPRINT:avg%d:LAST:\'%s Last\\l\'', $i, $this->rrd_format); | ||
| 138 | $i++; | ||
| 139 | } | 187 | } |
| 140 | 188 | ||
| 141 | return $rrdgraph; | 189 | return $rrdgraph; |
| 142 | } | 190 | } |
| 143 | } | 191 | } |
diff --git a/type/GenericIO.class.php b/type/GenericIO.class.php index e91cb16..ee04316 100644 --- a/type/GenericIO.class.php +++ b/type/GenericIO.class.php | |||
| @@ -5,45 +5,54 @@ require_once 'Default.class.php'; | |||
| 5 | class Type_GenericIO extends Type_Default { | 5 | class Type_GenericIO extends Type_Default { |
| 6 | 6 | ||
| 7 | function rrd_gen_graph() { | 7 | function rrd_gen_graph() { |
| 8 | $filename = $this->get_filename(); | ||
| 9 | |||
| 10 | $rrdgraph = $this->rrd_options(); | 8 | $rrdgraph = $this->rrd_options(); |
| 11 | 9 | ||
| 10 | $sources = $this->rrd_get_sources(); | ||
| 11 | |||
| 12 | if ($this->scale) | 12 | if ($this->scale) |
| 13 | $raw = '_raw'; | 13 | $raw = '_raw'; |
| 14 | foreach($this->data_sources as $ds) { | 14 | $i=0; |
| 15 | $rrdgraph[] = sprintf('DEF:min_%s%s=%s:%s:MIN', $ds, $raw, $filename, $ds); | 15 | foreach ($this->tinstances as $tinstance) { |
| 16 | $rrdgraph[] = sprintf('DEF:avg_%s%s=%s:%s:AVERAGE', $ds, $raw, $filename, $ds); | 16 | foreach ($this->data_sources as $ds) { |
| 17 | $rrdgraph[] = sprintf('DEF:max_%s%s=%s:%s:MAX', $ds, $raw, $filename, $ds); | 17 | $rrdgraph[] = sprintf('DEF:min_%s%s=%s:%s:MIN', $sources[$i], $raw, $this->files[$tinstance], $ds); |
| 18 | $rrdgraph[] = sprintf('DEF:avg_%s%s=%s:%s:AVERAGE', $sources[$i], $raw, $this->files[$tinstance], $ds); | ||
| 19 | $rrdgraph[] = sprintf('DEF:max_%s%s=%s:%s:MAX', $sources[$i], $raw, $this->files[$tinstance], $ds); | ||
| 20 | $i++; | ||
| 21 | } | ||
| 18 | } | 22 | } |
| 19 | if ($this->scale) { | 23 | if ($this->scale) { |
| 20 | foreach($this->data_sources as $ds) { | 24 | $i=0; |
| 21 | $rrdgraph[] = sprintf('CDEF:min_%s=min_%s_raw,%s,*', $ds, $ds, $this->scale); | 25 | foreach ($this->tinstances as $tinstance) { |
| 22 | $rrdgraph[] = sprintf('CDEF:avg_%s=avg_%s_raw,%s,*', $ds, $ds, $this->scale); | 26 | foreach ($this->data_sources as $ds) { |
| 23 | $rrdgraph[] = sprintf('CDEF:max_%s=max_%s_raw,%s,*', $ds, $ds, $this->scale); | 27 | $rrdgraph[] = sprintf('CDEF:min_%s=min_%1$s_raw,%s,*', $sources[$i], $this->scale); |
| 28 | $rrdgraph[] = sprintf('CDEF:avg_%s=avg_%1$s_raw,%s,*', $sources[$i], $this->scale); | ||
| 29 | $rrdgraph[] = sprintf('CDEF:max_%s=max_%1$s_raw,%s,*', $sources[$i], $this->scale); | ||
| 30 | $i++; | ||
| 31 | } | ||
| 24 | } | 32 | } |
| 25 | } | 33 | } |
| 26 | 34 | ||
| 27 | $rrdgraph[] = sprintf('CDEF:overlap=avg_%s,avg_%s,LT,avg_%1$s,avg_%2$s,IF', | 35 | $rrdgraph[] = sprintf('CDEF:overlap=avg_%s,avg_%s,LT,avg_%1$s,avg_%2$s,IF', |
| 28 | $this->data_sources[0], $this->data_sources[1]); | 36 | $sources[0], $sources[1]); |
| 29 | 37 | ||
| 30 | foreach($this->data_sources as $ds) { | 38 | foreach($sources as $source) { |
| 31 | $rrdgraph[] = sprintf('AREA:avg_%s#%s', $ds, $this->get_faded_color($this->colors[$ds])); | 39 | $rrdgraph[] = sprintf('AREA:avg_%s#%s', $source, $this->get_faded_color($this->colors[$source])); |
| 32 | } | 40 | } |
| 33 | 41 | ||
| 34 | $rrdgraph[] = sprintf('AREA:overlap#%s', | 42 | $rrdgraph[] = sprintf('AREA:overlap#%s', |
| 35 | $this->get_faded_color( | 43 | $this->get_faded_color( |
| 36 | $this->get_faded_color($this->colors[$this->data_sources[0]]), | 44 | $this->get_faded_color($this->colors[$sources[0]]), |
| 37 | $this->get_faded_color($this->colors[$this->data_sources[1]]) | 45 | $this->get_faded_color($this->colors[$sources[1]]) |
| 38 | ) | 46 | ) |
| 39 | ); | 47 | ); |
| 40 | 48 | ||
| 41 | foreach($this->data_sources as $ds) { | 49 | foreach($sources as $source) { |
| 42 | $rrdgraph[] = sprintf('LINE1:avg_%s#%s:\'%s\'', $ds, $this->colors[$ds], $this->ds_names[$ds]); | 50 | $dsname = $this->ds_names[$source] != '' ? $this->ds_names[$source] : $source; |
| 43 | $rrdgraph[] = sprintf('GPRINT:min_%s:MIN:\'%s Min,\'', $ds, $this->rrd_format); | 51 | $rrdgraph[] = sprintf('LINE1:avg_%s#%s:\'%s\'', $source, $this->colors[$source], $dsname); |
| 44 | $rrdgraph[] = sprintf('GPRINT:avg_%s:AVERAGE:\'%s Avg,\'', $ds, $this->rrd_format); | 52 | $rrdgraph[] = sprintf('GPRINT:min_%s:MIN:\'%s Min,\'', $source, $this->rrd_format); |
| 45 | $rrdgraph[] = sprintf('GPRINT:max_%s:MAX:\'%s Max,\'', $ds, $this->rrd_format); | 53 | $rrdgraph[] = sprintf('GPRINT:avg_%s:AVERAGE:\'%s Avg,\'', $source, $this->rrd_format); |
| 46 | $rrdgraph[] = sprintf('GPRINT:avg_%s:LAST:\'%s Last\l\'', $ds, $this->rrd_format); | 54 | $rrdgraph[] = sprintf('GPRINT:max_%s:MAX:\'%s Max,\'', $source, $this->rrd_format); |
| 55 | $rrdgraph[] = sprintf('GPRINT:avg_%s:LAST:\'%s Last\l\'', $source, $this->rrd_format); | ||
| 47 | } | 56 | } |
| 48 | 57 | ||
| 49 | return $rrdgraph; | 58 | return $rrdgraph; |
diff --git a/type/GenericStacked.class.php b/type/GenericStacked.class.php index f024336..7595385 100644 --- a/type/GenericStacked.class.php +++ b/type/GenericStacked.class.php | |||
| @@ -3,56 +3,41 @@ | |||
| 3 | require_once 'Default.class.php'; | 3 | require_once 'Default.class.php'; |
| 4 | 4 | ||
| 5 | class Type_GenericStacked extends Type_Default { | 5 | class Type_GenericStacked extends Type_Default { |
| 6 | 6 | ||
| 7 | function rrd_gen_graph() { | 7 | function rrd_gen_graph() { |
| 8 | $rrdgraph = $this->rrd_options(); | 8 | $rrdgraph = $this->rrd_options(); |
| 9 | 9 | ||
| 10 | if (is_array($this->args['tinstance'])) | 10 | $sources = $this->rrd_get_sources(); |
| 11 | if (is_array($this->order)) | ||
| 12 | $array = array_intersect($this->order, $this->args['tinstance']); | ||
| 13 | else | ||
| 14 | $array = $this->args['tinstance']; | ||
| 15 | else | ||
| 16 | $array = $this->data_sources; | ||
| 17 | 11 | ||
| 18 | $i=0; | 12 | $i=0; |
| 19 | foreach ($array as $value) { | 13 | foreach ($this->tinstances as $tinstance) { |
| 20 | if (is_array($this->args['tinstance'])) { | 14 | foreach ($this->data_sources as $ds) { |
| 21 | $filename = $this->get_filename($value); | 15 | $rrdgraph[] = sprintf('DEF:min_%s=%s:%s:MIN', $sources[$i], $this->files[$tinstance], $ds); |
| 22 | $ds = $this->data_sources[0]; | 16 | $rrdgraph[] = sprintf('DEF:avg_%s=%s:%s:AVERAGE', $sources[$i], $this->files[$tinstance], $ds); |
| 23 | } else { | 17 | $rrdgraph[] = sprintf('DEF:max_%s=%s:%s:MAX', $sources[$i], $this->files[$tinstance], $ds); |
| 24 | $filename = $this->get_filename(); | 18 | $i++; |
| 25 | $ds = $value; | ||
| 26 | } | 19 | } |
| 27 | $rrdgraph[] = sprintf('DEF:min%s=%s:%s:MIN', $i, $filename, $ds); | ||
| 28 | $rrdgraph[] = sprintf('DEF:avg%s=%s:%s:AVERAGE', $i, $filename, $ds); | ||
| 29 | $rrdgraph[] = sprintf('DEF:max%s=%s:%s:MAX', $i, $filename, $ds); | ||
| 30 | $i++; | ||
| 31 | } | 20 | } |
| 32 | 21 | ||
| 33 | for ($i=count($array)-1 ; $i>=0 ; $i--) { | 22 | for ($i=count($sources)-1 ; $i>=0 ; $i--) { |
| 34 | if ($i == (count($array)-1)) | 23 | if ($i == (count($sources)-1)) |
| 35 | $rrdgraph[] = sprintf('CDEF:cdef%d=avg%d', $i, $i); | 24 | $rrdgraph[] = sprintf('CDEF:area_%s=avg_%1$s', $sources[$i]); |
| 36 | else | 25 | else |
| 37 | $rrdgraph[] = sprintf('CDEF:cdef%d=cdef%d,avg%d,+', $i, $i+1, $i); | 26 | $rrdgraph[] = sprintf('CDEF:area_%s=area_%s,avg_%1$s,+', $sources[$i], $sources[$i+1]); |
| 38 | } | 27 | } |
| 39 | 28 | ||
| 40 | $i=0; | 29 | foreach ($sources as $source) { |
| 41 | foreach ($array as $value) { | 30 | $color = $this->get_faded_color($this->colors[$source]); |
| 42 | $color = $this->get_faded_color($this->colors[$value]); | 31 | $rrdgraph[] = sprintf('AREA:area_%s#%s', $source, $color); |
| 43 | $rrdgraph[] = sprintf('AREA:cdef%d#%s', $i, $color); | ||
| 44 | $i++; | ||
| 45 | } | 32 | } |
| 46 | 33 | ||
| 47 | $i=0; | 34 | foreach ($sources as $source) { |
| 48 | foreach ($array as $value) { | 35 | $dsname = $this->ds_names[$source] != '' ? $this->ds_names[$source] : $source; |
| 49 | $dsname = $this->ds_names[$value] != '' ? $this->ds_names[$value] : $value; | 36 | $rrdgraph[] = sprintf('LINE1:area_%s#%s:\'%s\'', $source, $this->validate_color($this->colors[$source]), $dsname); |
| 50 | $rrdgraph[] = sprintf('LINE1:cdef%d#%s:\'%s\'', $i, $this->validate_color($this->colors[$value]), $dsname); | 37 | $rrdgraph[] = sprintf('GPRINT:min_%s:MIN:\'%s Min,\'', $source, $this->rrd_format); |
| 51 | $rrdgraph[] = sprintf('GPRINT:min%d:MIN:\'%s Min,\'', $i, $this->rrd_format); | 38 | $rrdgraph[] = sprintf('GPRINT:avg_%s:AVERAGE:\'%s Avg,\'', $source, $this->rrd_format); |
| 52 | $rrdgraph[] = sprintf('GPRINT:avg%d:AVERAGE:\'%s Avg,\'', $i, $this->rrd_format); | 39 | $rrdgraph[] = sprintf('GPRINT:max_%s:MAX:\'%s Max,\'', $source, $this->rrd_format); |
| 53 | $rrdgraph[] = sprintf('GPRINT:max%d:MAX:\'%s Max,\'', $i, $this->rrd_format); | 40 | $rrdgraph[] = sprintf('GPRINT:avg_%s:LAST:\'%s Last\\l\'', $source, $this->rrd_format); |
| 54 | $rrdgraph[] = sprintf('GPRINT:avg%d:LAST:\'%s Last\\l\'', $i, $this->rrd_format); | ||
| 55 | $i++; | ||
| 56 | } | 41 | } |
| 57 | 42 | ||
| 58 | return $rrdgraph; | 43 | return $rrdgraph; |
