====== Projekte ====== ===== Software ===== * **ipinfo**: Schlanke Webseite mit der Nutzer ihre IP-Adresse ermitteln können * [[https://ip.malte70.de|ip.malte70.de]]: Aktuellste Version von ipinfo als meine persönliche IP-Info-Seite * [[https://git.rt3x.de/?p=ip.malte70.de.git;a=summary|gitolite-Repository als Web-Ansicht via gitweb]] //aktueller Stand der Entwicklung von ip.malte70.de// * Veraltetes Github-Repository: [[https://github.com/rolltreppe3/ipinfo|rolltreppe3/ipinfo]] //Schon länger nicht mehr aktualisiert// * Auch wenn es schon etliche Webseiten gibt, die einem die eigene globale IP-Adresse anzeigen, wollte ich für mich selbst eine deutlich einfachere, aber nicht zu minimalistische Variante einer solchen Seite. \\ Neben der Startseite mit nicht viel mehr als der aktuellen IP-Adresse (entweder IPv4 oder IPv6, je nachdem was der Client bevorzugt), werden auf der Detail-Seite zusätzliche Infos angezeigt: * IP-Adresse und falls vorhanden der Hostname * User-Agent * Browser und Betriebssystem \\ (selbst gebaute Erkennung via RegExp, unterstützt auch einige mehr oder weniger exotische Browser wie [[https://www.palemoon.org/|Pale-Moon]], [[http://kmeleonbrowser.org/|K-Meleon]], [[https://otter-browser.org/|Otter]], [[https://www.netsurf-browser.org/|NetSurf]] und [[http://elinks.or.cz/|ELinks]]) * Bevorzugte Sprache * //Aktuell funktioniert die Abfrage des Standortes der IP aus einer GeoIP-Datenbank nicht. Durch die Verwendung von eingeschränkten, kostenlos verfügbaren Datenbanken war der Standort jedoch noch nie wirklich genau; dafür müsste ich als Server-Betreiber für viel Geld Zugang zu einer genaueren/aktuelleren GeoIP-Datenbank mieten.// * Diese Informationen können zudem [[https://ip.malte70.de/api-doc.php|über eine einfache HTTP-GET-API]] abgefragt werden. * Zum Einbinden in eine andere Webseite gibt es ein Widget, genauer gesagt ein dynamisch erzeugtes PNG-Bild: [[https://ip4.malte70.de/widget.png|widget.png]] //Aktuell werden nur IPv4-Adressen korrekt dargestellt, die teilweise erheblich längeren IPv6-Adressen sind zu lang und werden am Bildrand abgeschnitten.// * Für die gleichzeitige Abfrage der IPv4- und IPv6-Adressen auf der Detailseite, und um über die API gezielt eine der beiden abzufragen, ist ipinfo über drei verschiedene Subdomains erreichbar: * [[https://ip.malte70.de|ip.malte70.de]]: Sowohl über IPv4 als auch über IPv6 erreichbar * [[https://ip4.malte70.de|ip4.malte70.de]]: Nur IPv4 * [[https://ip6.malte70.de|ip6.malte70.de]]: Nur IPv6 * **Flying Paste**: Ein Nopaste-Service * [[https://github.com/malte70/flyingpaste|Github-Repository: malte70/flyingpaste]] * [[https://nopaste.rt3x.de|Mein persönlicher Nopaste-Dienst: nopaste.rt3x.de]] * **OSDetect**: Python-Modul für grundlegende Infos zum aktuellen Betriebssystem * [[https://malte70.github.io/OSDetect/|Webseite]] * [[https://github.com/malte70/OSDetect|Github-Repository: malte70/OSDetect]] * [[https://pypi.org/project/OSDetect/|PyPI-Paket: OSDetect]] * **DNS-Tools**: DNS-Einträge im Browser abfragen * [[https://github.com/malte70/dns-tools|Github-Repository: malte70/dns-tools]] * [[https://app.malte70.de/dns-tools/|DNS-Tools auf meinem Webserver ausprobieren]] * Fragt für einen Hostnamen den angegebenen DNS-Record-Typ ab. \\ Es gibt einige Online-Tools für DNS-Abfragen; aber ich wollte weder eine überladene Seite, noch zu detaillierte Infos (dafür würde ich statt einer Webseite eh ''host'' oder ''dig'' nutzen), sondern einfach nur genau einen DNS-Record-Typ für einen Hostnamen abfragen. * Das Ergebnis der Abfrage wird als einzelne Zeile angezeigt, ähnlich wie von ''host -v'' ausgegeben. * **Discogs Random Vinyl**: Zeigt eine zufällige Schallplatte aus der eigenen Discogs-Sammlung an * [[https://github.com/malte70/discogs|Github-Repository: malte70/discogs]] * PHP-Skripte, die über die Discogs-API die eigene Sammlung abfragen * Verzichtet auf OAuth, da für den Eigengebrauch entwickelt * verwendet für den Zugriff auf die API ein User-Token, mit dem man nur auf seine eigene Sammlung sowie allgemeine Informationen wie Release-Infos anfragen kann * Die angezeigten Alben-Cover werden herunter geladen, sodass sie in meinem Fall nur von einem Rechner im LAN statt aus dem Internet geladen werden * Die Sammlungs-Daten werden für eine in der ''config.inc.php'' angegebene Dauer zwischengespeichert, um die API nicht bei jedem Aufruf der Seite neu abzufragen * **Elektronik-Tools**: Kleine Rechen-Helfer für Elektronik-Bastler * [[https://github.com/malte70/elektronik-tools|Github-Repository malte70/elektronik-tools]] * [[https://malte70.github.io/elektronik-tools/|Webseite]] * Eine kleine nicht mehr aktiv gepflegte Sammlung von Helfern für Elektronik-Projekte, wie z.B. ein Farbcode-Rechner für Widerstände. * Die Berechnungen erfolgen ausschließlich via JavaScript im Browser * **startseite**: Generierung einer Browser-Startseite mit Links zu den wichtigen Webseiten * [[https://github.com/malte70/startseite|Github-Repository: malte70/startseite]] * Ein kleines Python-Skript, dass aus einer Liste von Links eine HTML-Seite mit als Kacheln angeordneten Links generiert. * Kann z.B. auch als minimalistisches Homelab-Dashboard genutzt werden, über das auf in Docker-Containern laufende Web-Apps zugegriffen werden kann * **Wurde schon lange nicht mehr aktualisiert; ich arbeite aktuell aber daran das Skript zu überarbeiten, u.a. mit Unterstützung von verschiedenen Themes, und mit deutlich weniger Hard-Coding …** * Wurde als von mir genutzte Browser-Startseite von ''startseite.malte70.de'' (siehe nächster Eintrag) abgelöst * **startseite.malte70.de** * [[https://git.rt3x.de/?p=startseite.malte70.de.git;a=summary|gitolite-Repository als Web-Ansicht via gitweb]] * [[https://startseite.malte70.de|Meine Browser-Startseite: startseite.malte70.de]] * Im Gegensatz zu ''startseite'' basiert meine aktuelle Startseite auf PHP * Features: - Anzeige von Webseiten-Links (Konfiguration via ''config.inc.php'') - Suchleiste (unterstützt entweder Google oder eine beliebige SearXNG-Instanz) - Überschrift im Format ''@'' oder ''\\HOST\User'' \\ Speicherung von Benutzername, Hostname und Format Client-seitig in LocalStorage; beim ersten Aufruf der Seite werden diese Einstellungen mittels ''window.prompt()'' abgefragt. - Über einen Button im Footer kann ein Einstellungsdialog geöffnet werden. - Ein eingebauter kleiner Notiz-Zettel, dessen Inhalt ebenfalls in LocalStorage gespeichert wird. * //Langfristig soll die Seite und alle Features Teil von ''startseite'' werden// * **error-document**: Minimale Fehler-Seiten für die häufigsten Webserver-Fehler * [[https://github.com/malte70/error-document|Github-Repository: malte70/error-document]] * [[https://malte70.github.io/error-document/|Webseite und Vorschau der Fehlerseiten]] * Fehler-Seiten mit einfach gehaltenem Design als Ersatz für die nicht wirklich schönen Standard-Fehlerseiten des Apache HTTPd * Enthält Fehlerseiten für die HTTP-Status-Codes 401, 403, 404 und 500 * Die Fehlerseiten informieren den Nutzer auch, wieso der Fehler möglicherweise aufgetreten ist, statt nur den Status-Code und -Namen zu zeigen * Verwendet Icons des Tango-Projekts (Public Domain/gemeinfrei) * **Apache VHost Generator**: Erzeugt Konfigurationsdateien für Apache VirtualHosts aus Templates * [[https://git.un-hack-bar.de/malte70/rt3x-apache-vhost-creator|Forgejo-Git-Repository]] * Da die meisten meiner VirtualHost - Ordered List Item-Konfigurationen sich nur beim Hostnamen und DocumentRoot unterscheiden, wollte ich neue VHosts aus Templates generieren, statt eine vorhandene Konfiguration zu duplizieren und abzuändern. * Als Template-Engine kommt das Python-basierte Jinja2 zum Einsatz * Das Projekt dient für mich auch dazu, mich mit Jinja2 vertraut zu machen * Geplant ist auch unterschiedliche Arten von VHosts zu unterstützen, indem das Haupt-Template je nach Bedarf das Template für ein lokales DocumentRoot oder einen Reverse-Proxy einbindet. * **MAPID**: „Maltes Arduino-powered Info Display“ * [[https://git.un-hack-bar.de/malte70/mapid|Forgejo-Git-Repository]] * [[https://malte70.de/blog/mapid/|Mein Blog-Beitrag zu MAPID]] //Erklärt das Ziel des Projekts und Schritt für Schritt den Quellcode// * Zeigt mithilfe eines Arduinos auf einem 16×2-Zeichen-LCD wichtige Benachrichtigungen an (z.B. nach Fertigstellung eines lange laufenden Shell-Skripts) * Besteht aus mehreren Komponenten: - Der Arduino-Sketch ''MAPID/CP'' (CP steht für „Control Program“) steuert einen seriell angesteuerten LCD basierend auf Befehlen, die er über eine einfache Kommandozeile auf der seriellen Konsole erhält - Auf dem angeschlossenen PC stellt das Python-Skript ''fifo_bridge.py'' eine Verbindung zur seriellen Schnittstelle des Arduino her, und stellt eine Brücke zwischen einer FIFO-Datei und der seriellen Konsole her. \\ Während einzelne Zugriffe auf die Gerätedatei des seriellen Terminals jedes Mal den Arduino neu starten, bleibt durch die durch diese Proxy-Lösung die serielle Schnittstelle durchgehend geöffnet; außerdem können so aus Shell-Skripten ganz einfach Befehle an MAPID/CP auf dem Arduino gesendet werden. - Das Skript ''notification.sh'' sendet über die FIFO-Bridge die notwendigen Befehle, um zwei von //STDIN// gelesene Zeilen auf dem Display anzuzeigen, eine LED kurz aufblitzen zu lassen und nach einiger Zeit den Display wieder auszuschalten. * **bbs**: Einige Oldschool-Netzwerk-Dienste wie Telnet oder Finger * [[https://git.rt3x.de/?p=bbs.git;a=summary|gitolite-Repository als Web-Ansicht via gitweb]] * Gestartet als Fake-Shell mit einigen eingebauten Befehlen, die über inetd via Telnet erreichbar ist * Später kamen (ebenfalls über inetd gestartete) Dienste für QOTD und Finger dazu * Der QOTD-Dienst nutzt ''fortune'' zum Anzeigen eines zufälligen Spruchs. Dieser wird Standardmäßig aus einer Auswahl von deutschsprachigen Datenbanken (//fortunes-de//) ausgewählt, und Umlaute und Sonderzeichen sogar wie möglich ersetzt (die aktuelle Implementierung über inetd erlaubt nur US-ASCII, kein UTF-8 oder ISO 8859-15) * Der Finger-Dienst zeigt statt potentiell sensibler Daten zu realen Nutzern nur Einträge aus einer Datenbank an, die dort vorher eingetragen wurden. * Als Datenbank wird der Key-Value-Speicher [[https://pypi.org/project/pickleDB/|pickleDB]] verwendet * Neben Einträgen für die Benutzer (oder andere Informationen, mein GnuPG-Key kann z.B. im Text-Format via Finger abgefragt werden) gibt es ein paar besondere Datenbank-Einträge: - ''@'': Da pickleDB keine leeren Keys erlaubt, wird stattdessen dieser Eintrag angezeigt, wenn der Client keinen Benutzernamen sendet (''finger @rt3x.de'') - ''404'': Enthält eine Fehlermeldung, die zurückgegeben wird falls der abgefragte Benutzer nicht existiert * Um die Datenbankeinträge einfach zu verwalten kann das Skript ''fingerinfo-admin'' genutzt werden. Es kann in der Datenbank vorhandene Benutzernamen auflisten, und einzelne Einträge Löschen; und ihren Inhalt auf //STDOUT// anzeigen oder einen vorhandenen/neu erstellten Eintrag mit Daten von //STDIN// überschreiben (Damit Einträge z.B. mit ''sed'' überarbeitet werden können)