+ trigger_error($this->rrd_file.' - rrd graph error: '.$return, E_USER_WARNING);
+ $return = $graph_cmd."\n\n".$return;
+ }
+ $return = 'file:'.$fname."\n".$return;
+ return $return;
+ }
+
+ function graph_plus($timeframe = 'day', $sub = null, $extra = null) {
+ // create a RRD graph and return meta info as a ready-to-use array
+ $gmeta = array('filename'=>null);
+ $ret = $this->graph($timeframe, $sub, $extra);
+ if (strpos($ret, "\n\n") !== false) { $gmeta['graph_cmd'] = substr($ret, 0, strpos($ret, "\n\n")); $ret = substr($ret, strpos($ret, "\n\n")+2); }
+ else { $gmeta['graph_cmd'] = null; }
+ $grout = explode("\n", $ret);
+ foreach ($grout as $gline) {
+ if (preg_match('/^file:(.+)$/', $gline, $regs)) {
+ $gmeta['filename'] = $regs[1];
+ }
+ elseif (preg_match('/^(\d+)x(\d+)$/', $gline, $regs)) {
+ $gmeta['width'] = $regs[1]; $gmeta['height'] = $regs[2];
+ }
+ elseif (preg_match('/^([^\|]+)\|([^|]+)\|([^\|]*)$/', $gline, $regs)) {
+ $gmeta['data'][$regs[1]][$regs[2]] = $regs[3];
+ }
+ elseif (preg_match('/^([^\|]+)\|([^\|]*)$/', $gline, $regs)) {
+ $gmeta['var'][$regs[1]] = $regs[2];
+ }
+ elseif (strlen(trim($gline))) {
+ $gmeta['info'][] = $gline;
+ }
+ }
+ if (is_null($gmeta['filename'])) {
+ $gmeta['filename'] = $this->basename.(!is_null($sub)?'-'.$sub:'').'-'.$timeframe.'.png';
+ }
+ return $gmeta;
+ }
+
+ function page($sub = null, $page_extras = null, $graph_extras = null) {
+ // create a (HTML) page and return it in a string
+
+ // assemble configuration
+ $pconf = (array)$page_extras;
+ if (!is_null($sub) && is_array($this->config_raw['page.'.$sub])) {
+ $pconf = $pconf + $this->config_raw['page.'.$sub];
+ }
+ $pconf = $pconf + (array)$this->config_page;
+
+ $return = null;
+ switch (@$pconf['type']) {
+ case 'index':
+ $return = $this->page_index($pconf);
+ break;
+ case 'overview':
+ $return = $this->page_overview($pconf, $graph_extras);
+ break;
+ case 'simple':
+ default:
+ $return = $this->page_simple($pconf, $graph_extras);
+ break;
+ }
+ return $return;
+ }
+
+ function simple_html($sub = null, $page_extras = null, $graph_extras = null) {
+ // create a simple (MRTG-like) HTML page and return it in a string
+ // XXX: this is here temporarily for compat only, it's preferred to use page()!
+
+ // assemble configuration
+ $pconf = (array)$page_extras;
+ if (!is_null($sub) && is_array($this->config_raw['page.'.$sub])) {
+ $pconf = $pconf + $this->config_raw['page.'.$sub];
+ }
+ $pconf = $pconf + (array)$this->config_page;
+
+ return $this->page_simple($pconf, $graph_extras);
+ }
+
+ function page_index($pconf) {
+ // create a bare, very simple index list HTML page and return it in a string
+ $td = $this->mod_textdomain;
+ $ptitle = isset($pconf['title_page'])?$pconf['title_page']:dgettext($td, 'RRD statistics index');
+
+ $out = '<html><head>';
+ $out .= '<title>'.$ptitle.'</title>';
+ $out .= '<style>';
+ if (isset($pconf['style_base'])) { $out .= $pconf['style_base']; }
+ else {
+ $out .= 'h1 { font-weight: bold; font-size: 1.5em; }';
+ $out .= '.footer { font-size: 0.75em; margin: 0.5em 0; }';
+ $out .= 'li.scanfile { font-style: italic; }';
+ }
+ if (isset($pconf['style'])) { $out .= $pconf['style']; }
+ $out .= '</style>';
+ $out .= '</head>';
+ $out .= '<body>';
+
+ $out .= '<h1>'.$ptitle.'</h1>';
+ if (isset($pconf['text_intro']) && strlen($pconf['text_intro'])) {
+ $out .= '<p class="intro">'.$pconf['text_intro'].'</p>';
+ }
+ elseif (!isset($pconf['text_intro'])) {
+ $out .= '<p class="intro">'.dgettext($td, 'The following RRD stats are available:').'</p>';
+ }
+
+ $stats = $this->h_page_statsArray($pconf);
+
+ if (isset($pconf['stats_url'])) { $sURL_base = $pconf['stats_url']; }
+ else { $sURL_base = '?stat=%i%a'; }
+
+ if (isset($pconf['stats_url_add'])) { $sURL_add = $pconf['stats_url_add']; }
+ else { $sURL_add = '&sub=%s'; }
+
+ $out .= '<ul class="indexlist">';
+ foreach ($stats as $stat) {
+ $out .= '<li'.(isset($stat['class'])?' class="'.$stat['class'].'"':'').'>';
+ $sURL = str_replace('%i', $stat['name'], $sURL_base);
+ $sURL = str_replace('%a', '', $sURL);
+ $sURL = str_replace('%s', '', $sURL);
+ $out .= '<a href="'.$sURL.'">'.$stat['name'].'</a>';
+ if (isset($stat['sub']) && count($stat['sub'])) {
+ $sprt = array();
+ foreach ($stat['sub'] as $ssub) {
+ $sURL = str_replace('%i', $stat['name'], $sURL_base);
+ $sURL = str_replace('%a', $sURL_add, $sURL);
+ $sURL = str_replace('%s', $ssub, $sURL);
+ $sprt[] = '<a href="'.$sURL.'">'.$ssub.'</a>';
+ }
+ $out .= ' <span="subs">('.implode(', ', $sprt).')</span>';
+ }
+ $out .= '</li>';
+ }
+ $out .= '</ul>';
+
+ $out .= $this->h_page_footer();
+ $out .= '</body></html>';
+ return $out;
+ }
+
+ function page_overview($pconf, $graph_extras = null) {
+ // create an overview HTML page (including graphs) and return it in a string
+ $td = $this->mod_textdomain;
+ $ptitle = isset($pconf['title_page'])?$pconf['title_page']:dgettext($td, 'RRD statistics overview');
+
+ $out = '<html><head>';
+ $out .= '<title>'.$ptitle.'</title>';
+ $out .= '<style>';
+ if (isset($pconf['style_base'])) { $out .= $pconf['style_base']; }
+ else {
+ $out .= 'h1 { font-weight: bold; font-size: 1.5em; }';
+ $out .= 'h2 { font-weight: bold; font-size: 1em; margin: 0.5em 0; }';
+ $out .= '.footer { font-size: 0.75em; margin: 0.5em 0; }';
+ $out .= 'img.rrdgraph { border: none; }';