Changeset 1375 for trunk/libs/Debug.php


Ignore:
Timestamp:
03/21/10 12:48:36 (3 years ago)
Author:
nick_ramsay
Message:

[Trunk] Hotaru 1.1.3 [Run upgrade script]

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/libs/Debug.php

    r1280 r1375  
    6161    public function openLog($type = 'debug', $mode = 'a+') 
    6262    { 
    63         $this->log[$type] = CACHE . "debug_logs/" . $type . ".txt"; 
    64          
    65         // auto-delete the file after 1 week: 
    66         /* 
    67         $last_modified = filemtime($this->log[$type]); 
    68         $expire = (7 * 24 * 60 * 60); // 1 week 
    69         if ($last_modified < (time() - $expire)) { unlink ($this->log[$type]); } 
    70         */ 
    71          
    72         // open/create a file: 
    73         $this->fh[$type] = fopen($this->log[$type], $mode) or die("can't open file"); 
     63        $this->log[$type] = CACHE . "debug_logs/" . $type . ".php"; 
     64         
     65        // delete file if over 500KB 
     66        if (file_exists($this->log[$type]) && (filesize($this->log[$type]) > 500000)) { 
     67            unlink($this->log[$type]);  
     68        } 
     69         
     70        // If doesn't exist or rewriting, create a new file with die() at the top 
     71        if (!file_exists($this->log[$type]) || ($mode != 'a' && $mode != 'a+')) { 
     72            $this->fh[$type] = fopen($this->log[$type], $mode) or die("Sorry, I can't open cache/debug_logs/" . $type . ".php"); 
     73            fwrite($this->fh[$type], "<?php die(); ?>\r\n"); 
     74        } else { 
     75            // open existing file: 
     76            $this->fh[$type] = fopen($this->log[$type], $mode) or die("can't open file"); 
     77        } 
    7478    } 
    7579     
     
    8387    { 
    8488        if ($string) { 
    85             $string = date('d M Y H:i:s', time()) . ": " . $string . "\n"; 
     89            $string = date('d M Y H:i:s', time()) . " " . $string . "\n"; 
    8690            fwrite($this->fh[$type], $string); 
    8791        } 
     
    97101    { 
    98102        if (isset($this->fh[$type])) { fclose($this->fh[$type]); } 
     103    } 
     104     
     105     
     106    /** 
     107     * Generate a System Report 
     108     * 
     109     * @param string $type 'log', 'email' or 'object' 
     110     */ 
     111    public function generateReport($h, $type = 'log') 
     112    { 
     113        $report = $this->getSystemData($h); 
     114         
     115        if ($type == 'object') { return $report; } 
     116         
     117        if ($type == 'email') { 
     118            $to = "admin@hotarucms.org"; // do not change! 
     119            $subject = "System Report from " . SITE_NAME; 
     120            $body = $this->logSystemReport($h, $report); 
     121            $h->email($to, $subject, $body); 
     122            $h->message = $h->lang['admin_maintenance_system_report_emailed']; 
     123            $h->messageType = 'green'; 
     124            return true; 
     125        } 
     126         
     127        $h->openLog('system_report', 'w'); 
     128         
     129        // convert object to text 
     130        $output = $this->logSystemReport($h, $report); 
     131        if ($output) { 
     132            $h->writeLog('system_report', $output); 
     133            $h->closeLog('system_report'); 
     134             
     135            $h->message = $h->lang['admin_maintenance_system_report_success']; 
     136            $h->messageType = 'green'; 
     137            return true; 
     138        } else { 
     139            $h->message = $h->lang['admin_maintenance_system_report_failure']; 
     140            $h->messageType = 'red'; 
     141            return false; 
     142        } 
     143    } 
     144 
     145    /** 
     146     * Get system data 
     147     * 
     148     * @param string $type 'log' or 'object' 
     149     * @return object 
     150     */ 
     151    public function getSystemData($h) 
     152    { 
     153        // essentials: 
     154         
     155        $report['hotaru_site_name'] = SITE_NAME; 
     156        $report['hotaru_baseurl'] = BASEURL; 
     157         
     158        $report['php_version'] = phpversion(); 
     159        $report['mysql_version'] = $h->db->get_var("SELECT VERSION() AS VE"); 
     160        $report['hotaru_version'] = $h->version; 
     161        $report['php_extensions'] = get_loaded_extensions(); 
     162         
     163        $sql = "SELECT miscdata_value FROM " . TABLE_MISCDATA . " WHERE miscdata_key = %s"; 
     164        $report['hotaru_version_db'] = $h->db->get_var($h->db->prepare($sql, 'hotaru_version')); 
     165         
     166        // default permissions 
     167         
     168        $sql = "SELECT miscdata_value FROM " . TABLE_MISCDATA . " WHERE miscdata_key = %s"; 
     169        $report['hotaru_permissions'] = $h->db->get_var($h->db->prepare($sql, 'permissions')); 
     170         
     171        // default user settings 
     172         
     173        $sql = "SELECT miscdata_value FROM " . TABLE_MISCDATA . " WHERE miscdata_key = %s"; 
     174        $report['hotaru_user_settings'] = $h->db->get_var($h->db->prepare($sql, 'user_settings')); 
     175         
     176        // plugins: folder, enabled, version, order 
     177         
     178        $sql = "SELECT plugin_folder, plugin_enabled, plugin_version, plugin_order FROM " . TABLE_PLUGINS . " ORDER BY plugin_order"; 
     179        $plugins = $h->db->get_results($h->db->prepare($sql)); 
     180        if ($plugins) { 
     181            foreach ($plugins as $plugin) { 
     182                $report['hotaru_plugins'][$plugin->plugin_folder]['enabled'] = $plugin->plugin_enabled; 
     183                $report['hotaru_plugins'][$plugin->plugin_folder]['version'] = $plugin->plugin_version; 
     184                $report['hotaru_plugins'][$plugin->plugin_folder]['order'] = $plugin->plugin_order; 
     185            } 
     186        } 
     187         
     188        // plugin hooks: id, folder, hook name 
     189         
     190        $sql = "SELECT phook_id, plugin_folder, plugin_hook FROM " . TABLE_PLUGINHOOKS; 
     191        $plugins = $h->db->get_results($h->db->prepare($sql)); 
     192        if ($plugins) { 
     193            foreach ($plugins as $plugin) { 
     194                $report['hotaru_plugin_hooks'][$plugin->phook_id]['folder'] = $plugin->plugin_folder; 
     195                $report['hotaru_plugin_hooks'][$plugin->phook_id]['hook'] = $plugin->plugin_hook; 
     196            } 
     197        } 
     198 
     199        // plugin settings: folder, setting (can't use value because might include passwords) 
     200         
     201        $sql = "SELECT plugin_folder, plugin_setting, plugin_value FROM " . TABLE_PLUGINSETTINGS; 
     202        $plugins = $h->db->get_results($h->db->prepare($sql)); 
     203        if ($plugins) { 
     204            foreach ($plugins as $plugin) { 
     205                if (is_serialized($plugin->plugin_value)) { $plugin->plugin_value = unserialize($plugin->plugin_value); } 
     206                $report['hotaru_plugin_settings'][$plugin->plugin_folder][$plugin->plugin_setting] = $this->applyMaskToArrays($h, $plugin->plugin_value); 
     207            } 
     208        } 
     209         
     210        // Settings: Name, value (excluding SMTP PASSWORD) 
     211         
     212        $sql = "SELECT settings_name, settings_value FROM " . TABLE_SETTINGS; 
     213        $settings = $h->db->get_results($h->db->prepare($sql)); 
     214        if ($settings) { 
     215            foreach ($settings as $setting) { 
     216                // mask sensitive data 
     217                switch ($setting->settings_name) { 
     218                    case 'SITE_EMAIL': 
     219                    case 'SMTP_HOST': 
     220                    case 'SMTP_PORT': 
     221                    case 'SMTP_USERNAME': 
     222                    case 'SMTP_PASSWORD': 
     223                        $setting->settings_value = preg_replace("/[a-zA-Z0-9]/", "*", $setting->settings_value); 
     224                        break; 
     225                } 
     226                $report['hotaru_settings'][$setting->settings_name] = $setting->settings_value; 
     227            } 
     228        } 
     229         
     230        // Widgets: plugin, function, args 
     231         
     232        $sql = "SELECT widget_plugin, widget_function, widget_args FROM " . TABLE_WIDGETS; 
     233        $widgets = $h->db->get_results($h->db->prepare($sql)); 
     234        if ($widgets) { 
     235            foreach ($widgets as $widget) { 
     236                $report['hotaru_widgets'][$widget->widget_plugin]['function'] = $widget->widget_function; 
     237                $report['hotaru_widgets'][$widget->widget_plugin]['args'] = $widget->widget_args; 
     238            } 
     239        } 
     240         
     241        // Counts for all tables 
     242         
     243        foreach ( $h->db->get_col("SHOW TABLES",0) as $table_name ) 
     244        { 
     245            $report['hotaru_table_count'][$table_name] = $h->db->get_var("SELECT COUNT(*) FROM " . $table_name); 
     246        } 
     247 
     248        return $report; 
     249    } 
     250 
     251 
     252    /** 
     253     * Recurse through arrays, applying * mask to all values, but not keys 
     254     * 
     255     * @param array $array 
     256     * @return array 
     257     */ 
     258     public function applyMaskToArrays($h, $array) 
     259     { 
     260        //echo "<pre>"; print_r($array); echo "</pre>"; exit; 
     261        if (!is_array($array) && !is_object($array)) { return false; } 
     262         
     263        foreach ($array as $key => $value) { 
     264            if (is_array($value) || is_object($value)) { 
     265                $array[$key] = $this->applyMaskToArrays($h, $value); 
     266            } else { 
     267                $array[$key] = preg_replace("/[a-zA-Z0-9]/", "*", $value); 
     268            } 
     269        } 
     270        return $array; 
     271    } 
     272 
     273     
     274    /** 
     275     * Convert report object to text for logging to file 
     276     * 
     277     * @param object $report 
     278     */ 
     279    public function logSystemReport($h, $report = NULL) 
     280    { 
     281        $output = "\n\n"; 
     282 
     283        $output .= "Name: " . $report['hotaru_site_name'] . "\n"; 
     284        $output .= "URL: " . $report['hotaru_baseurl'] . "\n"; 
     285        $output .= "Hotaru version: " . $report['hotaru_version'] . "\n"; 
     286        $output .= "Hotaru version in database: " . $report['hotaru_version_db'] . "\n"; 
     287        $output .= "PHP version: " . $report['php_version'] . "\n"; 
     288        $output .= "MySQL version: " . $report['mysql_version'] . "\n"; 
     289        $output .= "PHP extensions: " . implode(', ', $report['php_extensions']) . "\n"; 
     290         
     291        $output .= "\n"; 
     292         
     293        $output .= "Default site permissions: \n"; 
     294        $perms = unserialize($report['hotaru_permissions']); 
     295        unset($perms['options']); // don't need to display these 
     296        foreach ($perms as $key => $value) { 
     297            $output .= $key . " => ("; 
     298            foreach ($value as $k => $v) { 
     299                $output .= $k . ": " . $v . ", "; 
     300            } 
     301            $output = rtrim($output, ", "); 
     302            $output .= ")\n"; 
     303        } 
     304         
     305        $output .= "\n"; 
     306         
     307        $output .= "Default user settings: \n"; 
     308        $user_settings = unserialize($report['hotaru_user_settings']); 
     309        foreach ($user_settings as $key => $value) { 
     310            $output .= $key . " => " . $value . "\n"; 
     311        } 
     312         
     313        $output .= "\n"; 
     314         
     315        $output .= "Plugins: \n"; 
     316        if (isset($report['hotaru_plugins'])) { 
     317            foreach ($report['hotaru_plugins'] as $key => $value) { 
     318                $output .= $value['order'] . ". " . $key . " v." . $value['version'] . " "; 
     319                if ($value['enabled']) { $output .= "[enabled] \n"; } else { $output .= "[disabled] \n"; } 
     320            } 
     321        } 
     322         
     323        $output .= "\n"; 
     324         
     325        $output .= "Plugin Hooks: \n"; 
     326        if (isset($report['hotaru_plugin_hooks'])) { 
     327            foreach ($report['hotaru_plugin_hooks'] as $key => $value) { 
     328                $output .= $key . ". " . $value['folder'] . " => " . $value['hook'] . " \n"; 
     329            } 
     330        } 
     331         
     332        $output .= "\n"; 
     333 
     334        $output .= "Plugin Settings: \n"; 
     335        if (isset($report['hotaru_plugin_settings'])) { 
     336            foreach ($report['hotaru_plugin_settings'] as $key => $value) { 
     337                foreach ($value as $k => $v) { 
     338                    if (!is_array($v)) { 
     339                        $output .= "\nPlugin settings for " . $key . ":\n...." . $k . " = " . $v . " \n"; 
     340                    } else { 
     341                        $output .= "\nPlugin settings for " . $key . ":\n"; 
     342                        $output = $this->outputArrays($h, $v, $output); 
     343                    } 
     344                } 
     345            } 
     346        } 
     347         
     348        $output .= "\n"; 
     349 
     350        $output .= "Hotaru Settings: \n"; 
     351        if (isset($report['hotaru_settings'])) { 
     352            foreach ($report['hotaru_settings'] as $key => $value) { 
     353                $output .= $key . " => " . $value . " \n"; 
     354            } 
     355        } 
     356 
     357        $output .= "\n"; 
     358         
     359        $output .= "Widgets: \n"; 
     360        if (isset($report['hotaru_widgets'])) { 
     361            foreach ($report['hotaru_widgets'] as $key => $value) { 
     362                $output .= $key . " => " . $value['function']; 
     363                if ($value['args']) { $output .= " (args: " . $value['args'] . ")"; } 
     364                $output .= "\n"; 
     365            } 
     366        } 
     367         
     368        $output .= "\n"; 
     369         
     370        $output .= "Number of rows in each table: \n"; 
     371        if (isset($report['hotaru_table_count'])) { 
     372            foreach ($report['hotaru_table_count'] as $key => $value) { 
     373                $output .= $key . " => " . $value . " \n"; 
     374            } 
     375        } 
     376         
     377        return $output; 
     378    } 
     379     
     380     
     381    /** 
     382     * Recurse through arrays, adding them to $output for display 
     383     * 
     384     * @param array $array 
     385     * @return array 
     386     */ 
     387     public function outputArrays($h, $array = array(), $output = '') 
     388     { 
     389        if (!is_array($array) && !is_object($array)) { return $output; } 
     390         
     391        foreach ($array as $key => $value) { 
     392            if (is_array($value) || is_object($array)) { 
     393                $output .= "..... " . $key . ":\n"; 
     394                $output = $this->outputArrays($h, $value, $output); 
     395            } else { 
     396                $output .= "..... " . $key . ": " . $value . " \n"; 
     397            } 
     398        } 
     399        return $output; 
    99400    } 
    100401} 
Note: See TracChangeset for help on using the changeset viewer.