mirror of
https://github.com/getnamingo/registry.git
synced 2025-05-15 09:07:00 +02:00
151 lines
No EOL
5.1 KiB
PHP
151 lines
No EOL
5.1 KiB
PHP
<?php
|
|
|
|
require_once 'vendor/autoload.php';
|
|
|
|
use Monolog\Logger;
|
|
use MonologPHPMailer\PHPMailerHandler;
|
|
use Monolog\Formatter\HtmlFormatter;
|
|
use Monolog\Handler\FilterHandler;
|
|
use Monolog\Handler\WhatFailureGroupHandler;
|
|
use Monolog\Handler\StreamHandler;
|
|
use Monolog\Handler\RotatingFileHandler;
|
|
use Monolog\Formatter\LineFormatter;
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
/**
|
|
* Sets up and returns a Logger instance.
|
|
*
|
|
* @param string $logFilePath Full path to the log file.
|
|
* @param string $channelName Name of the log channel (optional).
|
|
* @return Logger
|
|
*/
|
|
function setupLogger($logFilePath, $channelName = 'app') {
|
|
$log = new Logger($channelName);
|
|
|
|
// Load email & pushover configuration
|
|
$config = include('/opt/registry/automation/config.php');
|
|
|
|
// Console handler (for real-time debugging)
|
|
$consoleHandler = new StreamHandler('php://stdout', Logger::DEBUG);
|
|
$consoleFormatter = new LineFormatter(
|
|
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
|
|
"Y-m-d H:i:s.u",
|
|
true,
|
|
true
|
|
);
|
|
$consoleHandler->setFormatter($consoleFormatter);
|
|
$log->pushHandler($consoleHandler);
|
|
|
|
// File handler - Rotates daily, keeps logs for 14 days
|
|
$fileHandler = new RotatingFileHandler($logFilePath, 14, Logger::DEBUG);
|
|
$fileFormatter = new LineFormatter(
|
|
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
|
|
"Y-m-d H:i:s.u"
|
|
);
|
|
$fileHandler->setFormatter($fileFormatter);
|
|
$log->pushHandler($fileHandler);
|
|
|
|
// Archive logs older than 14 days
|
|
archiveOldLogs($logFilePath);
|
|
|
|
// Pushover Handler (For CRITICAL, ALERT, EMERGENCY)
|
|
if (!empty($config['pushover_key'])) {
|
|
$pushoverHandler = new PushoverHandler($config['pushover_key'], Logger::ALERT);
|
|
$log->pushHandler($pushoverHandler);
|
|
}
|
|
|
|
// Email Handler (For CRITICAL, ALERT, EMERGENCY)
|
|
if (!empty($config['mailer_smtp_host'])) {
|
|
// Create a PHPMailer instance
|
|
$mail = new PHPMailer(true);
|
|
try {
|
|
$mail->isSMTP();
|
|
$mail->Host = $config['mailer_smtp_host'];
|
|
$mail->SMTPAuth = true;
|
|
$mail->Username = $config['mailer_smtp_username'];
|
|
$mail->Password = $config['mailer_smtp_password'];
|
|
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
|
$mail->Port = $config['mailer_smtp_port'];
|
|
$mail->setFrom($config['mailer_from'], 'Registry System');
|
|
$mail->addAddress($config['iana_email']);
|
|
|
|
// Attach PHPMailer to Monolog
|
|
$mailerHandler = new PHPMailerHandler($mail);
|
|
$mailerHandler->setFormatter(new HtmlFormatter);
|
|
|
|
$filteredMailHandler = new FilterHandler($mailerHandler, Logger::ALERT, Logger::EMERGENCY);
|
|
$safeMailHandler = new WhatFailureGroupHandler([$filteredMailHandler]);
|
|
$log->pushHandler($safeMailHandler);
|
|
} catch (Exception $e) {
|
|
error_log("Failed to initialize PHPMailer: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
return $log;
|
|
}
|
|
|
|
function archiveOldLogs($logFilePath) {
|
|
$logDir = dirname($logFilePath);
|
|
$backupDir = '/opt/backup';
|
|
$lockFile = $backupDir . '/log_archive.lock';
|
|
|
|
// Prevent multiple processes from running archive at the same time
|
|
if (file_exists($lockFile)) {
|
|
return; // Another process is already archiving
|
|
}
|
|
touch($lockFile); // Create lock file
|
|
|
|
if (!is_dir($backupDir)) {
|
|
mkdir($backupDir, 0755, true);
|
|
}
|
|
|
|
$logFiles = glob($logDir . '/*.log'); // Get all log files
|
|
$thresholdDate = strtotime('-14 days'); // Logs older than 14 days
|
|
|
|
foreach ($logFiles as $file) {
|
|
if (filemtime($file) < $thresholdDate) {
|
|
$filename = basename($file);
|
|
$monthYear = date('F-Y', filemtime($file));
|
|
$zipPath = $backupDir . "/logs-{$monthYear}.zip";
|
|
|
|
// Open or create ZIP archive
|
|
$zip = new ZipArchive();
|
|
if ($zip->open($zipPath, ZipArchive::CREATE) === true) {
|
|
if (!$zip->locateName($filename)) { // Prevent duplicate addition
|
|
$zip->addFile($file, $filename);
|
|
unlink($file); // Delete original log after archiving
|
|
}
|
|
$zip->close();
|
|
}
|
|
}
|
|
}
|
|
|
|
unlink($lockFile); // Remove lock when done
|
|
}
|
|
|
|
function isIpWhitelisted($ip, $pdo) {
|
|
$stmt = $pdo->prepare("SELECT COUNT(*) FROM registrar_whitelist WHERE addr = ?");
|
|
$stmt->execute([$ip]);
|
|
$count = $stmt->fetchColumn();
|
|
return $count > 0;
|
|
}
|
|
|
|
// Function to update the permitted IPs from the database
|
|
function updatePermittedIPs($pool, $permittedIPsTable) {
|
|
$pdo = $pool->get();
|
|
$query = "SELECT addr FROM registrar_whitelist";
|
|
$stmt = $pdo->query($query);
|
|
$permittedIPs = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
|
|
$pool->put($pdo);
|
|
|
|
// Manually clear the table by removing each entry
|
|
foreach ($permittedIPsTable as $key => $value) {
|
|
$permittedIPsTable->del($key);
|
|
}
|
|
|
|
// Insert new values
|
|
foreach ($permittedIPs as $ip) {
|
|
$permittedIPsTable->set($ip, ['addr' => $ip]);
|
|
}
|
|
} |