2025-12-18 22:00:31 +01:00
|
|
|
|
"""
|
|
|
|
|
|
sn_basis/modules/linkpruefer.py – Prüfung von URLs und lokalen Links.
|
2025-12-19 14:29:52 +01:00
|
|
|
|
Verwendet Wrapper und gibt pruef_ergebnis an den Pruefmanager zurück.
|
2025-12-18 22:00:31 +01:00
|
|
|
|
"""
|
|
|
|
|
|
|
2025-12-19 14:29:52 +01:00
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
|
|
from sn_basis.functions import (
|
2025-12-18 22:00:31 +01:00
|
|
|
|
file_exists,
|
|
|
|
|
|
join_path,
|
|
|
|
|
|
network_head,
|
2025-12-17 17:45:18 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2025-12-19 14:29:52 +01:00
|
|
|
|
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis, PruefAktion
|
2025-12-17 17:45:18 +01:00
|
|
|
|
|
2025-12-02 20:55:51 +01:00
|
|
|
|
|
|
|
|
|
|
class Linkpruefer:
|
2025-12-18 22:00:31 +01:00
|
|
|
|
"""
|
|
|
|
|
|
Prüft URLs und lokale Pfade.
|
|
|
|
|
|
Die eigentliche Nutzerinteraktion übernimmt der Pruefmanager.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, basis_pfad: str | None = None):
|
|
|
|
|
|
"""
|
|
|
|
|
|
basis_pfad: optionaler Basisordner für relative Pfade.
|
|
|
|
|
|
"""
|
|
|
|
|
|
self.basis = basis_pfad
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
# Hilfsfunktionen
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
|
2025-12-19 14:29:52 +01:00
|
|
|
|
def _pfad(self, relativer_pfad: str) -> Path:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Erzeugt einen OS‑unabhängigen Pfad relativ zum Basisverzeichnis.
|
|
|
|
|
|
"""
|
2025-12-18 22:00:31 +01:00
|
|
|
|
if not self.basis:
|
2025-12-19 14:29:52 +01:00
|
|
|
|
return Path(relativer_pfad)
|
2025-12-18 22:00:31 +01:00
|
|
|
|
return join_path(self.basis, relativer_pfad)
|
|
|
|
|
|
|
|
|
|
|
|
def _ist_url(self, text: str) -> bool:
|
2025-12-19 14:29:52 +01:00
|
|
|
|
"""
|
|
|
|
|
|
Einfache URL-Erkennung.
|
|
|
|
|
|
"""
|
2025-12-18 22:00:31 +01:00
|
|
|
|
return text.startswith("http://") or text.startswith("https://")
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
# Hauptfunktion
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
def pruefe(self, eingabe: str) -> pruef_ergebnis:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Prüft einen Link (URL oder lokalen Pfad).
|
|
|
|
|
|
Rückgabe: pruef_ergebnis
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
if not eingabe:
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=False,
|
|
|
|
|
|
meldung="Es wurde kein Link angegeben.",
|
|
|
|
|
|
aktion="leer",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=None,
|
2025-12-18 22:00:31 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------
|
|
|
|
|
|
# 1. Fall: URL
|
|
|
|
|
|
# -----------------------------------------------------
|
|
|
|
|
|
if self._ist_url(eingabe):
|
|
|
|
|
|
return self._pruefe_url(eingabe)
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------
|
|
|
|
|
|
# 2. Fall: lokaler Pfad
|
|
|
|
|
|
# -----------------------------------------------------
|
|
|
|
|
|
return self._pruefe_dateipfad(eingabe)
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
# URL‑Prüfung
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
def _pruefe_url(self, url: str) -> pruef_ergebnis:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Prüft eine URL über einen HEAD‑Request.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
reply = network_head(url)
|
|
|
|
|
|
|
|
|
|
|
|
if reply is None:
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=False,
|
|
|
|
|
|
meldung=f"Die URL '{url}' konnte nicht geprüft werden.",
|
|
|
|
|
|
aktion="netzwerkfehler",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=url,
|
2025-12-18 22:00:31 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if reply.error != 0:
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=False,
|
|
|
|
|
|
meldung=f"Die URL '{url}' ist nicht erreichbar.",
|
|
|
|
|
|
aktion="url_nicht_erreichbar",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=url,
|
2025-12-18 22:00:31 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=True,
|
|
|
|
|
|
meldung="URL ist erreichbar.",
|
|
|
|
|
|
aktion="ok",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=url,
|
2025-12-17 17:45:18 +01:00
|
|
|
|
)
|
2025-12-02 20:55:51 +01:00
|
|
|
|
|
2025-12-18 22:00:31 +01:00
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
# Lokale Datei‑/Pfadprüfung
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
def _pruefe_dateipfad(self, eingabe: str) -> pruef_ergebnis:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Prüft einen lokalen Pfad.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
pfad = self._pfad(eingabe)
|
|
|
|
|
|
|
|
|
|
|
|
if not file_exists(pfad):
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=False,
|
|
|
|
|
|
meldung=f"Der Pfad '{eingabe}' wurde nicht gefunden.",
|
|
|
|
|
|
aktion="pfad_nicht_gefunden",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=pfad,
|
2025-12-18 22:00:31 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return pruef_ergebnis(
|
|
|
|
|
|
ok=True,
|
|
|
|
|
|
meldung="Dateipfad ist gültig.",
|
|
|
|
|
|
aktion="ok",
|
2025-12-19 14:29:52 +01:00
|
|
|
|
kontext=pfad,
|
2025-12-18 22:00:31 +01:00
|
|
|
|
)
|