domovoy/app/Controllers/DiscoveryController.php

93 lines
3.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Domovoy\Controllers;
use Domovoy\Models\NetworkRange;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class DiscoveryController
{
private \Domovoy\Repositories\NetworkRangeRepository $networkRangeRepository;
private \Domovoy\Repositories\ScanJobRepository $scanJobRepository;
private \Domovoy\Repositories\DiscoveredHostRepository $discoveredHostRepository;
public function __construct(
\Domovoy\Repositories\NetworkRangeRepository $networkRangeRepository,
\Domovoy\Repositories\ScanJobRepository $scanJobRepository,
\Domovoy\Repositories\DiscoveredHostRepository $discoveredHostRepository
) {
$this->networkRangeRepository = $networkRangeRepository;
$this->scanJobRepository = $scanJobRepository;
$this->discoveredHostRepository = $discoveredHostRepository;
}
public function index(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
ob_start();
$username = $_SESSION['username'] ?? 'User';
$ranges = $this->networkRangeRepository->findAll();
$scanJobs = $this->scanJobRepository->findRecent(10);
$newHosts = $this->discoveredHostRepository->findByStatus('new', 20);
require dirname(__DIR__, 2) . '/templates/discovery/index.php';
$body = ob_get_clean();
$response->getBody()->write($body);
return $response;
}
public function startScan(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$data = $request->getParsedBody();
$rangeId = $data['range_id'] ?? null;
// Create scan job(s)
if ($rangeId !== null) {
$range = $this->networkRangeRepository->findById((int)$rangeId);
if ($range === null || !$range->enabled) {
return $response->withStatus(404)->write('Range not found');
}
$this->createScanJob('network_discovery', $range->id);
} else {
// Scan all enabled ranges
$ranges = $this->networkRangeRepository->findEnabled();
foreach ($ranges as $range) {
$this->createScanJob('network_discovery', $range->id);
}
}
return $response
->withHeader('Location', '/discovery')
->withStatus(302);
}
public function ignoreHost(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$data = $request->getParsedBody();
$hostId = $data['host_id'] ?? null;
if ($hostId !== null) {
$host = $this->discoveredHostRepository->findById((int)$hostId);
if ($host !== null) {
$host->status = 'ignored';
$this->discoveredHostRepository->save($host);
}
}
return $response
->withHeader('Location', '/discovery')
->withStatus(302);
}
private function createScanJob(string $type, int $rangeId): void
{
$job = new \Domovoy\Models\ScanJob();
$job->type = $type;
$job->status = 'pending';
$job->networkRangeId = $rangeId;
$job->createdBy = $_SESSION['user_id'] ?? null;
$this->scanJobRepository->save($job);
}
}