Files
2023-03-28 10:34:44 +02:00

389 lines
7.1 KiB
PHP

<?php
if (!defined('PICONTROL')) exit();
class LogController
{
private $logPath;
private $logs = [];
private $sshAvailable = false;
function __construct($path)
{
global $tpl;
// Pruefe SSH
$this->sshAvailable = ($tpl->getSSHResource() instanceof Net_SSH2) ? true : false;
$this->logPath = realpath($path).'/';
if (!file_exists($this->logPath))
return 1;
if (!is_readable($this->logPath))
return 2;
$this->scanDirectory($this->logPath);
}
public function getAll()
{
return $this->logs;
}
public function getAllArray()
{
$output = [];
foreach ($this->logs as $log)
$output[] = $log->toArray();
return $output;
}
public function getGroupFromRelativePath($path)
{
$log = $this->getGroupFromPath($this->logPath.$path);
return $log;
}
public function getLogFromRelativePath($path)
{
if (!($log = $this->getGroupFromPath($this->logPath.$path)))
return false;
$log = $log->getEntry($this->getFilenameFromPath($path));
return $log;
}
private function scanDirectory($path)
{
$path = realpath($path).'/';
foreach (scandir($path) as $name)
{
if (in_array($name, ['.', '..']))
continue;
if (is_dir($path.$name))
{
$this->scanDirectory($path.$name);
continue;
}
elseif (is_file($path.$name))
$this->addLogFromPath($path.$name);
}
}
private function addLogFromPath($path)
{
$path = realpath($path);
if (!file_exists($path))
return 1;
$group = $this->getGroupFromPath($path);
if ($group instanceof LogGroup)
{
$filename = $this->getFilenameFromPath($path);
$newEntry = new LogEntry();
$newEntry->setFilename($filename);
$group->addEntry($newEntry);
}
elseif ($group === false)
{
$groupName = $this->getGroupNameFromPath($path);
$groupPath = $this->getGroupPathFromPath($path);
$newGroup = new LogGroup();
$newGroup->setName($groupName);
$newGroup->setPath($groupPath);
$newGroup->setRelativePath(preg_replace('#^'.preg_quote($this->logPath).'#', '', $groupPath));
$newGroup->setSshAvailable($this->sshAvailable);
$this->logs[] = $newGroup;
// Eintrag hinzufuegen
$filename = $this->getFilenameFromPath($path);
$newEntry = new LogEntry();
$newEntry->setFilename($filename);
$newGroup->addEntry($newEntry);
}
return 1;
}
private function getFilenameFromPath($path)
{
return basename($path);
}
private function getGroupFromPath($path)
{
$path = realpath($path);
$groupName = $this->getGroupNameFromPath($path);
$groupPath = $this->getGroupPathFromPath($path);
foreach ($this->logs as $log)
{
if ($log->name == $groupName && $log->path == $groupPath)
return $log;
}
return false;
}
private function getGroupNameFromPath($path)
{
$path = realpath($path);
$p_match = preg_match('#^(.*\/)?([^\/]*)$#i', $path, $matches);
if ($p_match === false || count($matches) != 3)
return 1;
$p_match = preg_match('#(.+?)(?:\.(?:old|[0-9]+|[0-9]+\.gz))?$#i', $matches[2], $matches);
if ($p_match === false || count($matches) != 2)
return 2;
return $matches[1];
}
private function getGroupPathFromPath($path)
{
$path = realpath($path);
$p_match = preg_match('#^(.*\/)?([^\/]*)$#i', $path, $matches);
if ($p_match === false || count($matches) != 3)
return 1;
return $matches[1];
}
public function setLogPath($path)
{
$this->logPath = $path;
}
public function readLog($path) {
global $tpl;
if ($this->sshAvailable === true)
{
if (substr($path, -3) == '.gz') {
list ($logOutput, , ) = $tpl->executeSSH('zcat '.escapeshellarg($path));
list ($logLines, , ) = $tpl->executeSSH('zcat '.escapeshellarg($path).' | wc -l');
}
else
{
list ($logOutput, , ) = $tpl->executeSSH('cat '.escapeshellarg($path));
list ($logLines, , ) = $tpl->executeSSH('cat '.escapeshellarg($path).' | wc -l');
}
}
else
{
if (substr($path, -3) == '.gz') {
$logOutput = shell_exec('zcat '.escapeshellarg($path));
$logLines = shell_exec('zcat '.escapeshellarg($path).' | wc -l');
}
else {
$logOutput = shell_exec('cat '.escapeshellarg($path));
$logLines = shell_exec('cat '.escapeshellarg($path).' | wc -l');
}
}
return array('output' => $logOutput, 'lines' => trim($logLines));
}
public function isSshAvailable()
{
return $this->sshAvailable;
}
}
class LogGroup
{
public $name;
public $path;
public $relativePath;
private $entries = [];
private $sshAvailable = false;
public function addEntry(LogEntry $entry)
{
$entry->setLogGroup($this);
$this->entries[] = $entry;
}
public function getEntry($entry)
{
if (is_int($entry))
return $this->entries[$entry];
elseif (is_string($entry))
{
foreach ($this->entries as $entry_)
{
if ($entry_->getFilename() == $entry)
return $entry_;
}
}
return false;
}
public function getMain()
{
return $this->entries[0];
}
public function getAll($withoutMain = false)
{
if ($withoutMain === true)
{
$dummy = $this->entries;
unset($dummy[0]);
return $dummy;
}
return $this->entries;
}
public function getCount($withoutMain = false)
{
return count($this->getAll($withoutMain));
}
public function setName($name)
{
$this->name = $name;
}
public function setPath($path)
{
$this->path = realpath($path).'/';
}
public function setRelativePath($relativePath)
{
$this->relativePath = $relativePath;
}
public function getName()
{
return $this->name;
}
public function getPath()
{
return $this->path;
}
public function getRelativePath()
{
return $this->relativePath;
}
public function isSshAvailable()
{
return $this->sshAvailable;
}
public function setSshAvailable($sshAvailable)
{
$this->sshAvailable = $sshAvailable;
}
public function toArray() {
$entries = [];
foreach ($this->entries as $entry)
$entries[] = $entry->toArray();
return [
'name' => $this->name,
'path' => $this->path,
'relativePath' => $this->relativePath,
'entries' => $entries
];
}
}
class LogEntry
{
private $logGroup;
private $filename;
public function setLogGroup(LogGroup $logGroup)
{
$this->logGroup = $logGroup;
}
public function setFilename($filename)
{
$this->filename = $filename;
}
public function getLogGroup()
{
return $this->logGroup;
}
public function getFilename()
{
return $this->filename;
}
public function getReadable()
{
if ($this->logGroup->isSshAvailable())
return true;
return is_readable($this->getPath());
}
public function getFilesize()
{
return filesize($this->getPath());
}
public function getModified()
{
return filemtime($this->getPath());
}
public function getPath()
{
return $this->logGroup->getPath().$this->filename;
}
public function getRelativePath()
{
return $this->logGroup->getRelativePath().$this->filename;
}
public function toArray() {
return [
'filename' => $this->filename,
'readable' => $this->getReadable(),
'filesize' => $this->getFilesize(),
'modified' => $this->getModified(),
'path' => $this->getPath(),
'relativePath' => $this->getRelativePath()
];
}
}
?>