diff options
Diffstat (limited to 'mod/logrotate')
| -rw-r--r-- | mod/logrotate/languages/en.php | 47 | ||||
| -rw-r--r-- | mod/logrotate/manifest.xml | 25 | ||||
| -rw-r--r-- | mod/logrotate/start.php | 172 | ||||
| -rw-r--r-- | mod/logrotate/views/default/plugins/logrotate/settings.php | 48 | ||||
| -rw-r--r-- | mod/logrotate/views/default/settings/logrotate/edit.php | 20 |
5 files changed, 207 insertions, 105 deletions
diff --git a/mod/logrotate/languages/en.php b/mod/logrotate/languages/en.php index 27e43edca..d785ad50d 100644 --- a/mod/logrotate/languages/en.php +++ b/mod/logrotate/languages/en.php @@ -1,24 +1,29 @@ <?php - /** - * Elgg log rotator language pack. - * - * @package ElggLogRotate - * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 - * @author Curverider Ltd - * @copyright Curverider Ltd 2008-2009 - * @link http://elgg.com/ - */ +/** + * Elgg log rotator language pack. + * + * @package ElggLogRotate + */ - $english = array( - 'logrotate:period' => 'How often should the system log be archived?', - - 'logrotate:weekly' => 'Once a week', - 'logrotate:monthly' => 'Once a month', - 'logrotate:yearly' => 'Once a year', +$english = array( + 'logrotate:period' => 'How often should the system log be archived?', + + 'logrotate:weekly' => 'Once a week', + 'logrotate:monthly' => 'Once a month', + 'logrotate:yearly' => 'Once a year', + + 'logrotate:logrotated' => "Log rotated\n", + 'logrotate:lognotrotated' => "Error rotating log\n", - 'logrotate:logrotated' => "Log rotated\n", - 'logrotate:lognotrotated' => "Error rotating log\n", - ); - - add_translation("en",$english); -?>
\ No newline at end of file + 'logrotate:delete' => 'Delete archived logs older than a', + + 'logrotate:week' => 'week', + 'logrotate:month' => 'month', + 'logrotate:year' => 'year', + 'logrotate:never' => 'never', + + 'logrotate:logdeleted' => "Log deleted\n", + 'logrotate:lognotdeleted' => "No logs deleted\n", +); + +add_translation("en", $english); diff --git a/mod/logrotate/manifest.xml b/mod/logrotate/manifest.xml index 06e055207..1aa62e2e7 100644 --- a/mod/logrotate/manifest.xml +++ b/mod/logrotate/manifest.xml @@ -1,10 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> -<plugin_manifest> - <field key="author" value="Curverider Ltd" /> - <field key="version" value="1.5" /> - <field key="description" value="Rotate the system log at specific intervals" /> - <field key="website" value="http://www.elgg.org/" /> - <field key="copyright" value="(C) Curverider 2008-2009" /> - <field key="licence" value="GNU Public License version 2" /> - <field key="elgg_version" value="2009030702" /> -</plugin_manifest>
\ No newline at end of file +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> + <name>Log Rotate</name> + <author>Core developers</author> + <version>1.5</version> + <category>bundled</category> + <category>admin</category> + <description>Rotate the system log at specific intervals</description> + <website>http://www.elgg.org/</website> + <copyright>See COPYRIGHT.txt</copyright> + <license>GNU General Public License version 2</license> + <requires> + <type>elgg_release</type> + <version>1.8</version> + </requires> + <activate_on_install>true</activate_on_install> +</plugin_manifest> diff --git a/mod/logrotate/start.php b/mod/logrotate/start.php index a65805b92..f67e419bc 100644 --- a/mod/logrotate/start.php +++ b/mod/logrotate/start.php @@ -1,60 +1,122 @@ <?php - /** - * Elgg log rotator. - * - * @package ElggLogRotate - * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 - * @author Curverider Ltd - * @copyright Curverider Ltd 2008-2009 - * @link http://elgg.com/ - */ - - /** - * Initialise the plugin. - * - */ - function logrotate_init() - { - $period = get_plugin_setting('period','logrotate'); - switch ($period) - { - case 'weekly': - case 'monthly' : - case 'yearly' : +/** + * Elgg log rotator. + * + * @package ElggLogRotate + */ + +elgg_register_event_handler('init', 'system', 'logrotate_init'); + +function logrotate_init() { + $period = elgg_get_plugin_setting('period', 'logrotate'); + $delete = elgg_get_plugin_setting('delete', 'logrotate'); + switch ($period) { + case 'weekly': + case 'monthly' : + case 'yearly' : break; - default: $period = 'monthly'; - } - - // Register cron hook - register_plugin_hook('cron', $period, 'logrotate_cron'); + default: + $period = 'monthly'; + } + + // Register cron hook for archival of logs + elgg_register_plugin_hook_handler('cron', $period, 'logrotate_archive_cron'); + + if ($delete != 'never') { + // Register cron hook for deletion of selected archived logs + elgg_register_plugin_hook_handler('cron', $delete, 'logrotate_delete_cron'); + } +} + +/** + * Trigger the log rotation. + */ +function logrotate_archive_cron($hook, $entity_type, $returnvalue, $params) { + $resulttext = elgg_echo("logrotate:logrotated"); + + $day = 86400; + + $offset = 0; + $period = elgg_get_plugin_setting('period', '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 (!archive_log($offset)) { + $resulttext = elgg_echo("logrotate:lognotrotated"); } - - /** - * Trigger the log rotation. - * - */ - function logrotate_cron($hook, $entity_type, $returnvalue, $params) - { - $resulttext = elgg_echo("logrotate:logrotated"); - - $day = 86400; - - $offset = 0; - $period = get_plugin_setting('period','logrotate'); - switch ($period) - { - case 'weekly': $offset = $day * 7; break; - case 'yearly' : $offset = $day * 365; break; - case 'monthly' : // assume 28 days even if a month is longer. Won't cause data loss. - default: $offset = $day * 28;; + + 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('delete', '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 log tables + * @return bool Were any log tables deleted + */ +function log_browser_delete_log($time_of_delete) { + global $CONFIG; + + $cutoff = time() - (int)$time_of_delete; + + $deleted_tables = false; + $results = get_data("SHOW TABLES like '{$CONFIG->dbprefix}system_log_%'"); + if ($results) { + foreach ($results as $result) { + $data = (array)$result; + $table_name = array_shift($data); + // extract log table rotation time + $log_time = str_replace("{$CONFIG->dbprefix}system_log_", '', $table_name); + if ($log_time < $cutoff) { + if (delete_data("DROP TABLE $table_name") !== false) { + // delete_data returns 0 when dropping a table (false for failure) + $deleted_tables = true; + } else { + elgg_log("Failed to delete the log table $table_name", 'ERROR'); + } + } } - - if (!archive_log($offset)) - $resulttext = elgg_echo("logrotate:lognotrotated"); - - return $returnvalue . $resulttext; } - - // Initialise plugin - register_elgg_event_handler('init','system','logrotate_init'); -?>
\ No newline at end of file + + return $deleted_tables; +} diff --git a/mod/logrotate/views/default/plugins/logrotate/settings.php b/mod/logrotate/views/default/plugins/logrotate/settings.php new file mode 100644 index 000000000..9fd3e08df --- /dev/null +++ b/mod/logrotate/views/default/plugins/logrotate/settings.php @@ -0,0 +1,48 @@ +<?php +/** + * Elgg log rotator plugin settings. + * + * @package ElggLogRotate + */ + +$period = $vars['entity']->period; +$delete = $vars['entity']->delete; +if (!$period) { + $period = 'monthly'; +} + +if (!$delete) { + $delete = 'monthly'; +} +?> +<div> + <?php + + echo elgg_echo('logrotate:period') . ' '; + echo elgg_view('input/dropdown', array( + 'name' => 'params[period]', + 'options_values' => array( + 'weekly' => elgg_echo('logrotate:weekly'), + 'monthly' => elgg_echo('logrotate:monthly'), + 'yearly' => elgg_echo('logrotate:yearly'), + ), + 'value' => $period, + )); + ?> +</div> +<div> + <?php + + echo elgg_echo('logrotate:delete') . ' '; + echo elgg_view('input/dropdown', array( + 'name' => 'params[delete]', + 'options_values' => array( + 'weekly' => elgg_echo('logrotate:week'), + 'monthly' => elgg_echo('logrotate:month'), + 'yearly' => elgg_echo('logrotate:year'), + 'never' => elgg_echo('logrotate:never'), + ), + 'value' => $delete, + )); + ?> +</div> diff --git a/mod/logrotate/views/default/settings/logrotate/edit.php b/mod/logrotate/views/default/settings/logrotate/edit.php deleted file mode 100644 index 19b92c320..000000000 --- a/mod/logrotate/views/default/settings/logrotate/edit.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - $period = $vars['entity']->period; - if (!$period) $period = 'monthly'; - -?> -<p> - <?php echo elgg_echo('logrotate:period'); ?> - - <?php - echo elgg_view('input/pulldown', array( - 'internalname' => 'params[period]', - 'options_values' => array( - 'weekly' => elgg_echo('logrotate:weekly'), - 'monthly' => elgg_echo('logrotate:monthly'), - 'yearly' => elgg_echo('logrotate:yearly'), - ), - 'value' => $period - )); - ?> -</p> |
