diff options
Diffstat (limited to 'mod/logrotate')
| -rw-r--r-- | mod/logrotate/languages/en.php | 29 | ||||
| -rw-r--r-- | mod/logrotate/manifest.xml | 17 | ||||
| -rw-r--r-- | mod/logrotate/start.php | 122 | ||||
| -rw-r--r-- | mod/logrotate/views/default/plugins/logrotate/settings.php | 48 | 
4 files changed, 216 insertions, 0 deletions
diff --git a/mod/logrotate/languages/en.php b/mod/logrotate/languages/en.php new file mode 100644 index 000000000..d785ad50d --- /dev/null +++ b/mod/logrotate/languages/en.php @@ -0,0 +1,29 @@ +<?php +/** + * 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', + +	'logrotate:logrotated' => "Log rotated\n", +	'logrotate:lognotrotated' => "Error rotating log\n", +	 +	'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 new file mode 100644 index 000000000..1aa62e2e7 --- /dev/null +++ b/mod/logrotate/manifest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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 new file mode 100644 index 000000000..f67e419bc --- /dev/null +++ b/mod/logrotate/start.php @@ -0,0 +1,122 @@ +<?php +/** + * 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 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"); +	} + +	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'); +				} +			} +		} +	} + +	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>  | 
