From 2af513f0ad0e6b692e95bf9f0ec1ba9dc4501ed0 Mon Sep 17 00:00:00 2001 From: brettp Date: Wed, 27 Apr 2011 19:47:24 +0000 Subject: Fixes #3253. Merged in Shashank's patch. git-svn-id: http://code.elgg.org/elgg/trunk@9033 36083f99-b078-4883-b0ff-0f9b5a30f544 --- mod/logrotate/start.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) (limited to 'mod/logrotate/start.php') diff --git a/mod/logrotate/start.php b/mod/logrotate/start.php index 25c01d45b..c05506d83 100644 --- a/mod/logrotate/start.php +++ b/mod/logrotate/start.php @@ -9,6 +9,7 @@ elgg_register_event_handler('init', 'system', 'logrotate_init'); function logrotate_init() { $period = elgg_get_plugin_setting('period', 'logrotate'); + $time = elgg_get_plugin_setting('time', 'logrotate'); switch ($period) { case 'weekly': case 'monthly' : @@ -18,14 +19,16 @@ function logrotate_init() { $period = 'monthly'; } - // Register cron hook - elgg_register_plugin_hook_handler('cron', $period, 'logrotate_cron'); + // Register cron hook for archival of logs + elgg_register_plugin_hook_handler('cron', $period, 'logrotate_archive_cron'); + // Register cron hook for deletion of selected archived logs + elgg_register_plugin_hook_handler('cron', $time, 'logrotate_delete_cron'); } /** * Trigger the log rotation. */ -function logrotate_cron($hook, $entity_type, $returnvalue, $params) { +function logrotate_archive_cron($hook, $entity_type, $returnvalue, $params) { $resulttext = elgg_echo("logrotate:logrotated"); $day = 86400; @@ -51,3 +54,69 @@ function logrotate_cron($hook, $entity_type, $returnvalue, $params) { return $returnvalue . $resulttext; } + +/** + * Trigger the log deletion. + */ +function logrotate_delete_cron($hook, $entity_type, $returnvalue, $params) { + $resulttext = elgg_echo("logrotate:logdeleted"); + + $day = 86400; + + $offset = 0; + $period = elgg_get_plugin_setting('time', 'logrotate'); + switch ($period) { + case 'weekly': + $offset = $day * 7; + break; + case 'yearly': + $offset = $day * 365; + break; + case 'monthly': + default: + // assume 28 days even if a month is longer. Won't cause data loss. + $offset = $day * 28; + } + + if (!log_browser_delete_log($offset)) { + $resulttext = elgg_echo("logrotate:lognotdeleted"); + } + + return $returnvalue . $resulttext; +} + +/** + * This function deletes archived copies of the system logs that are older than specified. + * + * @param int $time_of_delete An offset in seconds from now to delete (useful for log deletion) + */ + +function log_browser_delete_log($time_of_delete) { + global $CONFIG; + + $offset = (int)$time_of_delete; + $now = time(); + + $ts = $now - $offset; + + $FLAG = 1; + $result = mysql_query("SHOW TABLES like '{$CONFIG->dbprefix}system_log_%'"); + while ($showtablerow = mysql_fetch_array($result)) { + //To obtain time of archival + $log_time = explode("{$CONFIG->dbprefix}system_log_", $showtablerow[0]); + if ($log_time < $ts) { + //If the time of archival is before the required offset then delete + if (!mysql_query("DROP TABLE $showtablerow[0]")) { + $FLAG = 0; + } + } + } + + //Check if the appropriate tables have been deleted and return true if yes + if ($FLAG) { + return true; + } else { + return false; + } + +} -- cgit v1.2.3