BenBE's humble thoughts Thoughts the world doesn't need yet …

14.06.2011

Komponenten-Update mit sehr viel Fail

Filed under: Software — Schlagwörter: , , , — BenBE @ 01:50:56

Heute gibt es wiedermal ein Leckerli aus der Kategorie „Soviel Fail gibt’s nur bei Joomla“. Wer also schon immer über Joomla lästert, findet hier nun genau einen weiteren Punkt, wie Software nicht aussehen sollte. Aber gehen wir einmal der Reihe nach.

Für ein Projekt baue ich derzeit eine Komponente in Joomla, die eine Reihe von Erweiterungen in der Oberfläche implementiert. Die Komponente ist auch soweit fast fertig und ist im Backend wunderbar angebunden. Da im Laufe der Entwicklung noch zwei Menüpunkte zu ergänzen waren, musste diese kurzzeitig deinstalliert und wieder neuinstalliert werden, was an sich auch kein Problem darstellt, wäre da nicht … ähhhm … Joomla.

Die Komponente implementiert im Frontend nämlich die Erzeugung von SEO-freundlichen Links, die – aus einem Vorgängerprojekt stammend – auch bereits wunderbar funktionierten und im Produktiveinsatz keinerlei Probleme zeigten. Seitdem die Komponente jedoch zwischenzeitlich neu im Joomla eingebunden wurde, um die Anpassungen im Menü des Backends zu übernehmen, sah man nur die Joomla-typischen ItemId-Parameter in der Adresszeile. Die vormals funktionierenden Routen (wie die SEO-URLs im Joomla-Slang heißen) wurden nicht einmal mehr noch beachtet. Aufrufbar waren die Links dennoch. Auch ein erneutes Abspeichern der Menüeinträge, nachdem der Item-Type neu gesetzt wurde, bewegte Joomla nicht dazu, wieder SEO-URLs anzuzeigen.

Also fängt das Debugging an. Und wer jetzt als Admin nicht zumindest die Postfix-Konfiguration oder eine Einsendung zum IOCCC gewohnt ist, sollte u.U. erstmal was essen; auf nüchternen Magen verträgt man das nämlich sonst nicht. Also gut: Schauen wir zuerst einmal in die Joomla-Datenbank, um zu sehen, was Joomla bei der Komponenten-Installation so feines anstellt. Als erster Kandidat erweist sich hier die Tabelle jos_extensions. In dieser stehen alle Komponenten, Themes, Plugins und wie die Teile im Joomla-Slang wohl noch so alle heißen. U.a. findet sich hier auch ein Eintrag unserer Komponente, die nicht mehr geht. Nunja: Normal wäre ein Eintrag, seltsamer Weise hat es Joomla aber geschafft, hier mehrere Einträge draus zu machen, weshalb die Komponente zwei Mal auftaucht. Auch übrigens im Admin-Panel. Naja, passiert. Löschen wir also beide Einträge, deinstallieren die Dateien aus dem Joomla-Verzeichnis, die unsere Komponente betreffen und spielen die Update-Datei erneut ein.

Wer nun mit einer Meldung „Juhu, erfolgreich installiert“ gerechnet hat, darf bitte noch einmal das Thema dieses Posts verinnerlichen: Joomla! Stattdessen wirft einem Joomla eine Meldung „Error building admin menu“ an den Kopf. Naja, schauen wir noch mal in die Datenbank und finden da eine Tabelle jos_menu. Ja, hier handelt es sich, wie der Name vermuten lässt, um die Tabelle, in der jegliche Menüeinträge aufgeführt werden. Und wie es sich für ein unsauber konzipiertes System wie Joomla gehört, auch anwendungsübergreifend Frontend und Backend gemischt. Wer also mal so richtig sein Backend zerschießen will, darf in der jos_menu-Tabelle gerne anfangen. In besagter Tabelle fanden sich nun die von der Komponente in der XML-Datei registrierten Menü-Punkte. Jedoch nicht von der aktuellen Installation, sondern – fein säuberlich aufgehoben – von der Erstinstallation der Komponente. Also jos_menu aufräumen, die Komponente aus jos_extensions deinstallieren UND die Komponente wieder aus der Joomla-Installation entfernen.

Womit wir den nächsten Anlauf starten können. Komponenten-Package hochladen und auf die Meldung warten. Diese teilte uns diesmal (rot untermalt) mit, dass kein Fehler aufgetreten sei … bei der Ausführung einer Datenbank-Funktion. Womit wir bei vielsagenden Fehlermeldungen wären, denn in einer Fehlermeldung mitzuteilen, dass kein Fehler aufgetreten sei, ist nur bei Status-Code 0 unter Windows witzig, weil es dort zumindest der Erwartungshaltung des Anwenders entspricht. Denn wenn kein Fehler aufgetreten ist, obwohl man einen erwartet, spricht das entweder dafür, dass man sein Programm in die Tonne hauen sollte, oder etwas schief gelaufen ist, was einfach nicht bedacht wurde. Da die Fehlermeldung leider den Informationsgehalt einer Nachricht über einen umgefallenen Sack Reis in China hatte, ging der Weg erstmal zur Suchmaschine der Wahl, wo gleich der 3. Treffer aus einer Bündelung von Forendiskussionen zu dieser Fehlermeldung auf die 3. Tabelle in der Joomla-Datenbank verwies: jos_asset, die manchmal, unter nicht ganz nachvollziehbaren Umständen, noch Datenmüll beinhaltet, den Joomla selber nicht aufräumen will. Also auch hier kurz mit dem Datenbank-Tool der Wahl kurz gekehrt, die beiden anderen Tabellen wieder gereinigt und die Komponente nochmals installiert. Überraschenderweise diesmal sogar ohne Fehlermeldung.

Einzig die SEO-URLs, wegen derer ich diesen ganzen Aufriss angestellt hatte, waren immer noch nicht in Sichtweite.

Wobei, nicht ganz. Ich erwähnte ja besagte Tabelle jos_menu, in der Joomla jeglichen Datenmüll, der Menüeinträge betrifft, hinterlegt. Unter anderem finden sich hier die URL des Menüeintrags, die Art des Menüeintrags, sowie eine seltsame Zahl, die mit der Spaltenüberschrift component_id versehen ist. Wie jetzt? Sagt euch nix? Naja, schauen wir mal, ob sich da was finden lässt?

Ein Ansatzpunkt für die Lösung des Rätsels stellte – nahezu offensichtlich, wenn man sich die Werte anguckte – die Tabelle jos_extensions dar. Ja, DIE Tabelle jos_extensions, in der wir vorhin angefangen haben. Und nein, wir haben vorhin auch nicht die falsche der doppelten Komponenten-Registrierungen gelöscht, wie man zuerst vermuten könnte. Das ließ sich nämlich recht einfach anhand der – richtig – component_id feststellen, die es zum Ausgangszeitpunkt nämlich auch schon nicht (mehr) gab.

Was passiert war, ist an sich nämlich recht einfach – und genauso hirnrissig so zu implementieren; aber wir reden ja grad über Joomla, die tun sowas einfach: Menüeinträge sind statt auf den component_name (also ‚com_foo‘) auf die (installationsabhängige) component_id fixiert. Diese wird jedoch nicht aktualisiert, wenn eine Komponente nicht über den Upgrade-Mechanismus aktualisiert werden kann. Stattdessen zeigt diese dann ins Leere, obwohl anhand der URL die Beziehung zur zuständigen Komponente wieder hergestellt werden kann. Auch ein erneutes Speichern des Menüeintrags sorgt bei Joomla nicht dafür, dass dieser offensichtliche Integritätsfehler korrigiert wird. Wenn Joomla also die SEO-URL für diese URL erzeugen soll, beachtet es ein Feld, dessen Integrität offensichtlich defekt ist, statt die im Router eh ausgewertete Information zur Komponente heranzuziehen. Ändert man manuell für alle Menüeinträge, die noch auf eine alte, ungültige component_id zeigen, diese auf die aktuelle Kennung, so geht es. Ach ja: Wer Spaß haben will, darf das Routing übrigens auch sein Template machen lassen; man muss nur die richtigen IDs in die DB und Dateien auf die Platte schreiben.

Was immer die bei Joomla rauchen: Das Zeug muss gut sein!

Flattr this!

19.05.2011

ARP-Roaming: Infrastruktur ohne Infrastruktur

Filed under: Software — Schlagwörter: , , — BenBE @ 23:18:12

Eine der anspruchvollsten Aufgaben in einem Netzwerk ist die Verwaltung der Teilnehmer und das Routing von Informationen zwischen diesen. Ist diese Aufgabe in klassischen verdrahteten Netzwerken noch vergleichsweise einfach zu bewerkstelligen, da sich die Netztopologie nur selten ändert und daher in den meisten Fällen statisch behandelt werden kann, herrschen in WLANs sehr dynamische Bedingungen vor. Zu jedem Zeitpunkt kann ein Client dem Netzwerk beitreten, zu einem anderen Zeitpunkt wieder verlassen, oder bei größeren Netzwerken, wie sie z.B. in Firmen und Universitäten vorkommen sogar von einem Zugangspunkt zu einem anderen umziehen.

Bei diesen vergleichsweise komplexen Netzwerken, handelt es sich immer in der Regel um Infrastruktur-Netzwerke, also solche, bei denen ein zentraler Zugangspunkt den Zugriff der Teilnehmer verwaltet, Zeitscheiben für die Datenübertragung zuteilt oder andere Management-Aufgaben, wie die Sitzungsverwaltung übernimmt. Aber nicht in jedem drahtlosen Netzwerk gibt es diese zentrale Instanz. Ein sehr gutes Beispiel hierfür sind sogenannte Ad-hoc-Netzwerke, die wie ihr Name bereits vermuten lässt ad-hoc aus dem Nichts aus aufgebaut werden können. Nehmen an solch einem Netzwerk wenige Clients teil, sehen sich diese in den meisten Fällen und abgesehen von der Vergabe der passenden Netzwerk-Parameter (BSSID, ESSID, IP der Clients, Netmask und Gateway) ist nicht sonderlich viel zu beachten.

Spannender wird es jedoch, wenn nicht mehr alle Teilnehmer jeden anderen sehen und das Ad-hoc-Netzwerk als ein Mesh-Netzwerk zu betrachten ist. Ein Projekt, was sich mit dem Betrieb solcher Mesh-Netzwerke beschäftigt, ist Freifunk, dass in einer ganzen Reihe von Städten bereits meist kleinere, teils aber auch größere Ad-hoc-Netzwerke aufzuweisen hat. In diesen Netzen muss typischerweise jeder am Routing teilnehmen, um ein Datenpaket vom Absender zum Empfänger zu befördern, da es im Gegensatz zu Infrastruktur-Netzwerken kein zentrales Routing gibt und daher sich die Clients untereinander kooperativ um alle Verwaltungsaufgaben kümmern müssen. Die Aufgabe des Routings ist dabei relativ unproblematisch über eine Reihe von Protokollen geregelt, von denen OSPF, OLSR und BATMAN die am Häufigsten eingesetzten sind. Diese funktionieren aber allesamt nur, wenn alle zu routenden Clients sich auch am Protokoll beteiligen und regelmäßig ihre Informationen dem Netz mitteilen.

Ein relativ neuer Weg, der derzeit vom Freifunk Chemnitz beschritten wird, ist es nun, auch Clients ohne Routing-Software den Zugang zum Netz zu ermöglichen. Die hierfür eingesetzte Technik des ARP-Roaming ähnelt ein wenig dem Vorgehen in Infrastruktur-Netzwerken, denn der Client wird von den Routern „verwaltet“ und wenn nötig zwischen diesen umgezogen, wenn sich seine Position im Netzwerk ändert. Damit dies auch ohne Infrastruktur-Modus in einem Ad-hoc-Netzwerk funktioniert, müssen jedoch eine Reihe von Bedingungen erfüllt sein.

Eine der wichtigsten Bedingungen, damit man einen Client ohne Probleme von einem zum anderen Router umziehen kann, ist, dass der Client möglichst wenig davon mitbekommt. Insbesondere der Standard-Gateway sollte aus Sicht des Clients an jeder Stelle des Netzes identisch sein. Zu diesem Zweck wird beim Freifunk Chemnitz im Ad-hoc-WLAN-Teil des Netzes mit einer Anycast-IP für den Standard-Gateway gearbeitet, die unabhängig vom Router, der die Anfrage des Clients empfängt immer identisch ist. Somit entfällt bei einem Handover eines Clients die Umkonfiguration von Netzwerk-Parametern.

Ein weiteres Problem, was sowohl mit dem Routing zusammenhängt, aber auch die Verwaltung der Clients betrifft ist zudem die IP-Adress-Vergabe. Man könnte theoretisch zwar einen zentralen DHCP-Server nehmen und auf Layer 2 (Ethernet-Ebene) routen, hätte dann aber sofort einen Netzausfall, wenn der Client sich in einem Teil des Netzwerkes anmeldet, der gerade keine Verbindung zum DHCP-Server besitzt. Der gegenteilige Weg, also dass jeder Router auch gleichzeitig DHCP-Server spielt, scheint zwar übertrieben, birgt aber andererseits einen Reihe essentieller Vorteile, die man für die Netzwerk-Verwaltung benutzen kann. Damit nun auch ein einzelner, nicht gerade mit dem Rest des Netzwerkes verbundener Knoten noch operativ bleibt, muss jeder der DHCP-Server autark und autoritiv entscheiden können. Da er dies für den gesamten im Netzwerk verwendeten Adressbereich nicht autark tun kann, muss jedem DHCP-Server ein eigener Adressbereich zugeteilt werden, den dieser autonom verwalten darf. Zu diesem Zweck wird der gesamte für das WLAN vorgesehene Adressbereich noch einmal in Subnetze unterteilt. Im Fall von Freifunk Chemnitz handelt es sich hierbei um ein /17-Netz für WLAN, welches in /28-Netze für jeden Router aufgeteilt wird. Da sich einige Clients etwas zickig haben, wenn der DHCP-Server aus einem anderen Subnetz kommt, ist eine der IPs dieses /28-Netzes für den DHCP-Server des Routers zugewiesen.

Wäre noch ein letzter Aspekt kurz zu erwähnen: Nämlich das Backbone-Netzwerk, welches von den Nodes untereinander verwendet wird, um das Netz auch beim Zusammenbruch direkter Funkstrecken (z.B. Sichverbindungen, Richtfunk) über alternative Wege, wie eine VPN-Verbindung über UMTS) am Leben zu halten. Da auch diese Struktur sehr dynamisch sich ändert, wird dieser gesamte Netzbereich (beim Freifunk Chemnitz ein /21) mit OLSR verwaltet.

Somit besitzt jeder Node, der am Routing teilnimmt folgende 4 Angaben:

  1. Seine Node-IP: z.B. 10.8.40.42
  2. DHCP-Range: z.B. 10.8.130.144/28
  3. DHCP-Server-IP: z.B. 10.8.130.145
  4. Gateway-Anycast: z.B. 10.8.255.254

Diese gehören zu den folgenden 2 Netzwerken:

  1. Backbone/Routing: 10.8.40.0/21
  2. WLAN/Roaming: 10.8.128.0/17

Betrachtet man sich das Netzwerk bisher, so ist dieses noch sehr unflexibel: Möchte ein Client umziehen, muss er, trotz dem er an jedem Router Pakete in das Netzwerk senden kann, zum Empfang der Antwort immer in Reichweite des Knotens bleiben, der ihm seine IP zugeteilt hat, da bedingt durch die im Routing bekanntgegebenen Subnetze alle Pakete des WLAN immer wieder zu dem Knoten, der die IP vergeben hat, zurück geroutet werden.

Soviel zum Vorgeplänkel; tut mir echt leid, dass ich etwas ausholen musste, aber der spannende Teil kommt nun!

OLSR bietet nun die Möglichkeit, die an jedem Knoten angeschlossenen „Netzwerke“ – sogenannte Host-Network Associations – bekanntzugeben. Neben ganzen Subnetzen funktioniert dieser Mechanismus nun auch für einzelne IPs, womit es möglich wird, einen Client, der von seinem Heimat-Knoten entfernt im Netzwerk lebt – ähnlich dem Roaming im Telefonnetzen – an seiner fremden Basisstation zu erreichen. Dies funktioniert, weil Hostrouten immer Vorrang vor Netzwerk-Routen haben und diese somit überschreiben.

Wenn man nun einen Client von einem zum anderen Knoten im Netzwerk umziehen kann, ist als letzter Schritt für eine Automatisierung dieses Vorgangs zu sorgen, da der Client möglichst nichts davon mitbekommen soll. Damit man aber von Seite der WLAN-Knoten weiß, dass nun plötzlich ein Knoten in Reichweite ist, muss eine Möglichkeit gefunden werden, die Clients der Umgebung zu beobachten und die Verbindungsqualität zu bewerten. Ein einfacher Ansatz ist derzeit bereits im Netz von Freifunk Chemnitz umgesetzt und betrachtet den Inhalt der ARP-Tabelle der Router als Quelle für neue Clients. Wird dort ein neuer Client entdeckt, wird durch einen ARP-Ping geprüft, ob dieser wirklich in der Nähe ist und im Erfolgsfall als Client im OLSR registriert, um dem Netzwerk Bescheid zu geben, dass dieser Knoten den neu gesichteten Client empfangen kann. Schlegt ein ARP-Ping fehl, so wird nach einem Timeout erneut versucht diesen Client zu erreichen bzw. nach einer einstellbaren Anzahl Fehlversuche der Client als unerreichbar wieder entfernt.

Auch wenn dieser bisher noch recht passive Versuch der Client-Erkennung beim Umzug von Clients eine Reihe kleinerer Nebenwirkungen besitzt, was sich i.d.R. durch Nicht-Erreichbarkeit des Clients äußert, funktioniert dieser Ansatz in der Praxis bereits vergleichsweise gut für das noch sehr frühe Entwicklungsstadium: Immerhin wird hier auf Software-Ebene nachgebildet, was typischerweise die Netzwerk-Hardware erledigt. Weitere Ausbaustufen umfassen daher auch Dinge wie eine verbesserte Erkennung neuer Clients bereits anhand ihres Traffics, bzw. ein dem ARP-Spoofing entlehntes zwangsweises Umziehen des Standard-Gateway für einzelne Clients. Auch eine proaktive Erkennung der Bewegung eines Clients zwischen den Routern und eine dieser Bewegung angepasste vorausschauendes Handover des Clients sind Dinge, die auf der Wunschliste bereits heiß diskutiert werden und in spätere Versionen durchaus einfließen werden. Mehr dazu aber in einem gesonderten Beitrag, da jedes dieser Themen eine ganze Menge Aspekte berührt, die weit über den Umfang dieses Eintrags hinausgehen würden.

Flattr this!

10.04.2011

Dropbox und Verzeichnis-Listings

Filed under: Software — Schlagwörter: , , , — BenBE @ 00:13:45

Manche Leute nutzen ja ihre Dropbox ja als Fileserver. Was in dem Zusammenhang aber etwas störend ist, sind die Fehlenden Directory-Indizes. Aber da lässt sich, auch ohne einen lauffähigen Apache, schnell Abhilfe schaffen. (more…)

Flattr this!

08.04.2011

Sichere Updates

Filed under: Software — Schlagwörter: , , , , , , , , , , , — BenBE @ 20:45:40

Heute hatte ich wieder einmal eine recht spannende Diskussion. Anlass dieser war, dass Palemoon in Version 4 einen Bug im Updater hat, der dazu führt, dass auch vorhandene Updates nicht gefunden werden. An sich nicht weiter schlimm, könnte man meinen, denn das mit den Updatern haben schon ganz andere Leute nicht hinbekommen. Was mich an der Stelle aber etwas aufgeregt hat, war „die Lösung“ bzw. der vorgeschlagene Würgaround: „Schaltet einfach SSL ab“. Gute Nacht, Sicherheit! (more…)

Flattr this!

11.03.2011

SMS/MMS auch ohne Handy

Filed under: Software — Schlagwörter: , — BenBE @ 21:45:38

Nachdem mich das ständige Offline-Sein beim Bewegen von A nach B irgendwie ein wenig gestört hat, habe ich mich jetzt die Tage dazu durchgerungen, die seit Monaten angedachte SIM-Karte eines von einem Kumpel für diese Zwecke empfohlenen Anbieters zu organisieren. Da die Vertragsbedingungen des Anbieters aber vorsehen, dass man in regelmäßigen Abständen auf bestimmte SMS reagieren muss, hätte es nun zwei Lösungen gegeben: Entweder ständig die Karte aus dem Netbook ständig herausnehmen, oder aber versuchen, direkt über das GSM-Modem im Netbook einen adequaten Ersatz zu finden, der mir die vom Anbieter (oder anderen) zugesandten SMS auf dem Netbook verfügbar macht. (more…)

Flattr this!

04.03.2011

mIRC 6 mit IPv6

Filed under: Software — Schlagwörter: , , , , , , — BenBE @ 16:53:21

ein relativ guter, wenn auch teilweise bereits in die Jahre gekommener IRC-Client für Windows ist mIRC in der Version 6. Dieser tut selbst auf etwas älteren Systemen noch genau das, was er soll: Funktionieren. Da ich jedoch so langsam aber sicher versuche, überall wo möglich auf IPv6 umzustellen, war die Frage, wie man mIRC dazu bewegt bekommt, mit dem neuen Protokoll zu arbeiten. (more…)

Flattr this!

01.03.2011

Parser-Bau für Einsteiger

Filed under: Software — Schlagwörter: , , , — BenBE @ 17:56:05

Wenn man in seinem Programm mathematische Ausdrücke, die vom Nutzer eingegeben wurden, auswerten möchte, so kann man dies entweder mit Hilfe bösartiger Konstrukte tun, oder aber, mit Hilfe eines Parsers, die Ausdrücke selber auswerten und dann in einer kontrollierten Umgebung ausführen. Die Möglichkeit einer solchen kontrollierten Ausführung ist in Script-Sprachen wie JavaScript notwendig, kann aber auch in Template-Systemen gute Dienste leisten, wenn mit den dem Template übergebenen Daten noch Berechnungen zu erledigen sind, oder einfache Transformationen zu implementieren sind. (more…)

Flattr this!

20.11.2010

Türen öffnen

Filed under: Software — Schlagwörter: — BenBE @ 05:16:53

Böse Zungen behaupten ja immer, Twitter sei zu nix anderem gut, als der Welt mitzuteilen, welche Farbe der Output des eigenen Stoffwechsels besitzt. Nunja, das stimmt so nicht ganz. Neben der Färbung der Stoffwechselprodukte erfährt man noch zahlreiche Tipps, wie man die Produktion dieser verbessern, oder die Präsentation globaler gestalten kann, um auch jedem zu ermöglichen, die richtige Farbe für seine Stoffwechselendprodukte zu finden.

Was viele aber nicht wissen, ist, dass Twitter sogar noch mehr kann. Nein, keine Links zu niedlichem Katzencontent transportieren; das geht auch anders. Was ich meine ist: Türen öffnen! (more…)

Flattr this!

24.10.2010

Skype unter Ubuntu 10.04 installieren

Filed under: Software — Schlagwörter: , , — BenBE @ 19:08:17

Nach dem ich für meine Reise ein frisches Ubuntu aufgesetzt hatte, stellte sich die Frage, wie Skype einzurichten war. Die Installation selber geht zwar im Wesentlichen nach Plan, aber die Nachbereitung ist doch etwas umfangreicher. (more…)

Flattr this!

18.10.2010

Kasperle-Theater mit dem W-LAN

Filed under: Software — Schlagwörter: , , , — BenBE @ 00:58:40

Ich habe mir die Tage ein neues Netbook zugelegt und dabei viel es mit ab, dass die vorinstallierte Windows 7 Starter Edition durch was vernünftiges ersetzt werden wollte, was dazu führte, dass aus der Starter ein Professional wurde, was durch ein Ubuntu abgerundet wurde. Unter Ubuntu funktionierte auch alles sofort auf Anhieb einwandfrei, auch in Sachen W-LAN, was man von Windows 7 nicht behaupten konnte. (more…)

Flattr this!

« Newer PostsOlder Posts »

Powered by WordPress