vb_book/app/Controllers/LogViewer.php

167 lines
4.5 KiB
PHP

<?php
namespace App\Controllers;
class LogViewer extends BaseController
{
protected $logsPath;
public function __construct()
{
$this->logsPath = WRITEPATH . 'logs/';
}
public function index()
{
$files = [];
if (is_dir($this->logsPath)) {
$items = scandir($this->logsPath);
foreach ($items as $item) {
if ($item === '.' || $item === '..') {
continue;
}
$fullPath = $this->logsPath . $item;
if (is_file($fullPath)) {
$files[] = [
'name' => $item,
'size' => $this->formatSize(filesize($fullPath)),
'modified' => date('Y-m-d H:i:s', filemtime($fullPath)),
];
}
}
}
usort($files, function ($a, $b) {
return strcmp($b['modified'], $a['modified']);
});
$showPayment = $this->request->getGet('payment') === '1';
$entries = [];
$lineCount = 0;
if ($showPayment) {
foreach ($files as $file) {
$fullPath = $this->logsPath . $file['name'];
$lines = $this->extractPaymentLogLines($fullPath);
if (!empty($lines)) {
$entries[] = [
'file' => $file['name'],
'lines' => $lines,
];
$lineCount += count($lines);
}
}
}
$data['files'] = $files;
$data['showPayment'] = $showPayment;
$data['entries'] = $entries;
$data['lineCount'] = $lineCount;
$data['page_name'] = $showPayment ? 'Payment Logs' : 'Log Files';
$this->render_page('logviewer/index', $data);
}
public function view($filename = null)
{
$filename = $this->sanitizeFilename($filename);
if (!$filename) {
return redirect()->to('/logs')->with('error', 'Invalid file name.');
}
$fullPath = $this->logsPath . $filename;
if (!is_file($fullPath)) {
return redirect()->to('/logs')->with('error', 'File not found.');
}
$showPayment = $this->request->getGet('payment') === '1';
$content = file_get_contents($fullPath);
if ($showPayment) {
$lines = $this->extractPaymentLogLines($fullPath);
$content = !empty($lines) ? implode("\n", $lines) : '';
}
$data['filename'] = $filename;
$data['content'] = $content;
$data['showPayment'] = $showPayment;
$data['page_name'] = $showPayment ? 'Payment Logs' : 'View Log';
$this->render_page('logviewer/view', $data);
}
public function download($filename = null)
{
$filename = $this->sanitizeFilename($filename);
if (!$filename) {
return redirect()->to('/logs')->with('error', 'Invalid file name.');
}
$fullPath = $this->logsPath . $filename;
if (!is_file($fullPath)) {
return redirect()->to('/logs')->with('error', 'File not found.');
}
return $this->response->download($fullPath, null);
}
private function extractPaymentLogLines(string $fullPath): array
{
if (!is_readable($fullPath)) {
return [];
}
$lines = [];
$handle = fopen($fullPath, 'r');
if ($handle === false) {
return [];
}
while (($line = fgets($handle)) !== false) {
if (strpos($line, '[PAYMENT]') !== false) {
$lines[] = rtrim($line, "\r\n");
}
}
fclose($handle);
return $lines;
}
private function sanitizeFilename($filename)
{
if (!$filename) {
return false;
}
$filename = basename($filename);
if (!preg_match('/^[A-Za-z0-9_\-\.]+\.(log|php|txt|html)$/', $filename)) {
return false;
}
return $filename;
}
private function formatSize($bytes)
{
if ($bytes >= 1073741824) {
return number_format($bytes / 1073741824, 2) . ' GB';
} elseif ($bytes >= 1048576) {
return number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
return number_format($bytes / 1024, 2) . ' KB';
}
return $bytes . ' bytes';
}
}