clear_sasl_log.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. require_once "/web/inc/vars.inc.php";
  3. if (file_exists('/web/inc/vars.local.inc.php')) {
  4. include_once('/web/inc/vars.local.inc.php');
  5. }
  6. ini_set('error_reporting', 0);
  7. // Init database
  8. //$dsn = $database_type . ':host=' . $database_host . ';dbname=' . $database_name;
  9. $dsn = $database_type . ":unix_socket=" . $database_sock . ";dbname=" . $database_name;
  10. $opt = [
  11. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  12. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  13. PDO::ATTR_EMULATE_PREPARES => false,
  14. ];
  15. try {
  16. $pdo = new PDO($dsn, $database_user, $database_pass, $opt);
  17. }
  18. catch (PDOException $e) {
  19. echo($e->getMessage() . PHP_EOL);
  20. exit(1);
  21. }
  22. $dateThreshold = new DateTime();
  23. $dateThreshold->modify('-31 days');
  24. $dateThresholdFormatted = $dateThreshold->format('Y-m-d H:i:s');
  25. $batchSize = 1000;
  26. $lastProcessedDatetime = null;
  27. $lastProcessedUsername = "";
  28. $lastProcessedService = "";
  29. $loopCounter = 0;
  30. $rowCounter = 0;
  31. $clearedRowCounter = 0;
  32. try {
  33. do {
  34. $loopCounter++;
  35. echo("Processing batch $loopCounter\n");
  36. $stmt = $pdo->prepare("
  37. SELECT service, real_rip, username, datetime
  38. FROM sasl_log
  39. WHERE datetime < :dateThreshold
  40. AND (:lastProcessedDatetime IS NULL OR datetime >= :lastProcessedDatetime2)
  41. ORDER BY datetime ASC
  42. LIMIT :limit
  43. ");
  44. $stmt->execute(array(
  45. ':dateThreshold' => $dateThresholdFormatted,
  46. ':lastProcessedDatetime' => $lastProcessedDatetime,
  47. ':lastProcessedDatetime2' => $lastProcessedDatetime,
  48. ':limit' => $batchSize
  49. ));
  50. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  51. $rowCount = count($rows);
  52. $rowCounter += $rowCount;
  53. echo("Fetched $rowCount rows (total of $rowCounter)\n");
  54. $pdo->beginTransaction();
  55. foreach ($rows as $row) {
  56. $stmt = $pdo->prepare("
  57. SELECT MAX(datetime) as max_date
  58. FROM sasl_log
  59. WHERE datetime < :dateThreshold AND service = :service AND username = :username
  60. ");
  61. $stmt->execute(array(
  62. ':dateThreshold' => $dateThresholdFormatted,
  63. ':service' => $row['service'],
  64. ':username' => $row['username']
  65. ));
  66. $subrow = $stmt->fetch(PDO::FETCH_ASSOC);
  67. if ($row['datetime'] < $subrow['max_date']) {
  68. $stmt = $pdo->prepare("
  69. DELETE FROM sasl_log
  70. WHERE username = :username AND service = :service AND datetime = :datetime
  71. ");
  72. $stmt->execute(array(
  73. ':username' => $row['username'],
  74. ':service' => $row['service'],
  75. ':datetime' => $row['datetime']
  76. ));
  77. $clearedRowCounter++;
  78. }
  79. }
  80. $pdo->commit();
  81. if ($lastProcessedDatetime == $rows[$rowCount - 1]['datetime'] &&
  82. $lastProcessedUsername == $rows[$rowCount - 1]['username'] &&
  83. $lastProcessedService == $rows[$rowCount - 1]['service'] ||
  84. $rowCount != $batchSize) {
  85. $rowCount = 0;
  86. }
  87. // Update last processed datetime
  88. if ($rowCount > 0) {
  89. $lastProcessedDatetime = $rows[$rowCount - 1]['datetime'];
  90. $lastProcessedUsername = $rows[$rowCount - 1]['username'];
  91. $lastProcessedService = $rows[$rowCount - 1]['service'];
  92. }
  93. } while ($rowCount > 0);
  94. }
  95. catch (PDOException $e) {
  96. echo($e->getMessage() . PHP_EOL);
  97. exit(1);
  98. }
  99. echo("Succesfully cleared $clearedRowCounter rows of $rowCounter rows");
  100. exit(0);