Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Created new drush command for audit trail logs cleaup #534

Merged
merged 10 commits into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions drush.services.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
drush.command.tide_core:
class: Drupal\tide_core\Command\AuditLogCleanupCommand
arguments: ['@config.factory']
tags:
- { name: drush.command }
106 changes: 106 additions & 0 deletions src/Command/AuditLogCleanupCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php

namespace Drupal\tide_core\Command;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Database;
use Drush\Commands\DrushCommands;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
* Custom AuditLog Clean Drush command.
*/
class AuditLogCleanupCommand extends DrushCommands {

/**
* The configuration service.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;

/**
* Constructs a AuditLogCleanupCommand object.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration service.
*/
public function __construct(ConfigFactoryInterface $config_factory) {
$this->configFactory = $config_factory;
}

/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('config.factory')
);
}

/**
* Removes log entries older than the configured retention period.
*
* @command tide_core:auditlog-cleanup
sharmasahil marked this conversation as resolved.
Show resolved Hide resolved
* @aliases tcl
* @description Cleans up audittrail logs older than the configured retention period.
*
* @option force-cleanup Skip confirmation and run the cleanup immediately.
*/
public function cleanupLogs($options = ['force-cleanup' => FALSE]) {
// Check if the user passed the --force-cleanup option.
if (!$options['force-cleanup']) {
// If the force-cleanup flag isn't passed, ask for confirmation.
$confirmation = $this->confirmCleanup();
if (!$confirmation) {
$this->output()->writeln('<comment>Cleanup operation cancelled.</comment>');
return;
}
}

$config = $this->configFactory->get('tide_core.settings');
define('DEFAULT_LOG_RETENTION_DAYS', 30);
$log_retention_days = $config->get('log_retention_days') ?: DEFAULT_LOG_RETENTION_DAYS;
// Get current date and time.
$current_time = new DateTime();
$current_time->sub(new DateInterval("P{$log_retention_days}D"));
$threshold_timestamp = $current_time->getTimestamp();
// Connect to the database.
$database = Database::getConnection();
$deleted = $database->delete('admin_audit_trail')
->condition('created', $threshold_timestamp, '<')
->execute();

// Output the result.
$this->output()->writeln("Deleted $deleted log entries older than $log_retention_days days.");
// Run a database optimization command to recover space.
$this->optimizeDatabase();
}

/**
* Ask for confirmation before proceeding with the cleanup.
*
* @return bool
* TRUE if the user confirms, FALSE if the user cancels.
*/
private function confirmCleanup() {
$question = 'Are you sure you want to delete log entries older than the configured retention period? (y/n): ';
$confirmation = $this->io()->ask($question, 'n');
$confirmation = strtolower($confirmation);
// Return TRUE if the user answers 'y' or 'yes'.
return in_array($confirmation, ['y', 'yes']);
}

/**
* Run database optimization (optional).
*
* @return void
* TRUE write the message.
*/
private function optimizeDatabase() {
$database = Database::getConnection();
$database->query('OPTIMIZE TABLE {admin_audit_trail}');
$this->output()->writeln("Database optimized to recover space.");
}

}
62 changes: 62 additions & 0 deletions src/Form/AuditTrailSettingsForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace Drupal\tide_core\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

/**
* Provides the configuration form for setting the log retention days.
*/
class AuditTrailSettingsForm extends ConfigFormBase {

/**
* {@inheritdoc}
*/
protected function getEditableConfigNames() {
// This returns the name of the config object.
return ['tide_core.settings'];
}

/**
* {@inheritdoc}
*/
public function getFormId() {
// The form ID for this form.
return 'tide_core_log_retention_settings_form';
}

/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Load the configuration data.
$config = $this->config('tide_core.settings');

// Add a text field to specify the number of days for log retention.
$form['log_retention_days'] = [
'#type' => 'number',
'#title' => $this->t('Log retention days'),
'#description' => $this->t('Enter the number of days after which logs should be deleted.'),
// Default to 30 if not set.
'#default_value' => $config->get('log_retention_days', 30),
'#min' => 1,
'#required' => TRUE,
];

return parent::buildForm($form, $form_state);
}

/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->config('tide_core.settings')
->set('log_retention_days', $form_state->getValue('log_retention_days'))
->save();

$this->messenger()->addMessage($this->t('The log retention days have been updated.'));
parent::submitForm($form, $form_state);
}

}
6 changes: 6 additions & 0 deletions tide_core.links.menu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@ tide_core.moderated_content:
parent: system.admin_content
route_name: content_moderation.admin_moderated_content
weight: 100

audit_trail_settings.admin:
title: 'Audit Trail Settings'
description: 'Change audit trail log clean time'
parent: admin_audit_trail.report_form
route_name: audit_trail_settings.admin
8 changes: 8 additions & 0 deletions tide_core.routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,11 @@ tide_core.package_version:
methods: ['GET']
requirements:
_access: 'TRUE'

audit_trail_settings.admin:
path: '/admin/reports/audit-trail/audit-trail-settings'
defaults:
_form: '\Drupal\tide_core\Form\AuditTrailSettingsForm'
_title: 'Audit Trail Settings'
requirements:
_permission: "access admin audit trail"