round35: Vollstaendiger Portscan (1-65535) pro Geraet als Option, fuer Geraete mit vielen Diensten auf unueblichen Ports

This commit is contained in:
2026-07-24 21:21:07 +02:00
parent fedb3e9127
commit 645dcf3af8
4 changed files with 63 additions and 21 deletions

View File

@@ -5,6 +5,7 @@ import * as categoryRepo from "../db/repositories/categories.js";
import * as logRepo from "../db/repositories/logs.js";
import * as settingsRepo from "../db/repositories/settings.js";
import { scanDeviceServices } from "../scanner/networkScanner.js";
import { fullPortRange } from "../scanner/ports.js";
import { fetchFritzBoxHosts, type FritzBoxHost } from "../scanner/fritzbox.js";
import {
startJob,
@@ -26,14 +27,14 @@ import type { Device } from "@launchpad/shared";
* Einzelgerät-Endpunkt als auch der Sammel-Scan (siehe /api/scan/devices/all
* weiter unten) dieselbe Logik nutzen, ohne sie zu duplizieren.
*/
async function performDeviceScan(device: Device) {
async function performDeviceScan(device: Device, fullScan = false) {
// Bestehende Dienste dieses Geräts VOR dem Scan merken, um danach zu
// erkennen, welche davon diesmal nicht mehr gefunden wurden ("stale").
const servicesBeforeScan = serviceRepo.listServicesByDevice(device.id);
const { services: discovered, suggestedHostname } = await scanDeviceServices(
device,
undefined,
fullScan ? fullPortRange() : undefined,
servicesBeforeScan.map((s) => s.port)
);
@@ -138,6 +139,7 @@ async function performDeviceScan(device: Device) {
export async function scanRoutes(app: FastifyInstance): Promise<void> {
app.post("/api/scan/devices/:id", async (request, reply) => {
const { id } = request.params as { id: string };
const { full } = request.query as { full?: string };
const device = deviceRepo.getDevice(id);
if (!device) {
return reply.code(404).send({ error: "Gerät nicht gefunden" });
@@ -148,7 +150,7 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
}
try {
return await performDeviceScan(device);
return await performDeviceScan(device, full === "true");
} catch (err) {
const detail = err instanceof Error ? err.message : String(err);
logRepo.logScan({