Categories
Programmierung

Debug-Modus per Cookie

Jeder Entwickler baut sich wohl seinen eigenen Debug-Modus für seine Anwendungen. Bisher habe ich bei Webanwendungen meist GET Parameter verarbeitet. Mit den prinzipbedingten Nachteilen – z.B. Tracking über mehrere Seiten. Andere Variante ist per Config-Variable den Debugmodus einzuschalten. Oder abhängig von der Source-IP. Oder wie auch immer.

Eine andere Methode habe ich mir von Google abgeschaut: Setzen von Spezialmodi per Cookie über die Adressleiste des Browsers. Google hat schon des öfteren neue Funktionen zunächst nur für einen “eingeweihten” Nutzerkreis zugänglich gemacht. Eingeschaltet wurde die Funktion dann über ein spezielles Cookie. Gesetzt wurde dieses einfach über die Adressleiste des Browsers. So hat z.B. die folgende Eingabe in der Adressleiste auf google.com das “suggest” Feature eingeschaltet:

javascript:document.cookie= "PREF=ID=175eb54605c0202d:U=a14f58424228a2a5:LD=en:
NR=10:CR=2:TM=1240146048:LM=1242596928:DV=AA:GM=1:IG=1:S=zW53HscJwnEL89bQ;
path=/;domain=.google.com";void(0);

Mittlerweile verwende ich auch immer öfter dieses Verfahren:

javascript:document.cookie="xyz_debug=1";window.location.reload();

Das so gesetzte Cookie mit dem Namen “xyz_debug” kann man dann einfach mit bekannten Funktionen serverseitig auswerten (hier PHP):

if ($_COOKIE["xyz_debug"]) {
    var_dump($_POST);
}

Natürlich sollte das verwendete Cookie nicht leicht zu erraten sein. Ich wüste gerne wie viele Debugausgaben in den weiten des Internets darauf warten über versteckte Zugänge, Parameter etc. abgerufen zu werden ;)

Categories
Programmierung

PHP: strpos mit Integern

Wieder 2 Stunden bei der Fehlersuche verplempert…

$string = "X20";
echo (strpos("XYX20", $string) !== false) ? "JA" : "NEIN";

$string = 20;
echo (strpos("XYX20", $string) !== false) ? "JA" : "NEIN";

Output:

JA
NEIN

Erwartet hätte ich 2x “JA”. Leider habe ich nicht in die Doku zu strpos geschaut – hätte mir einiges an Zeit für die Fehlersuche erspart. Es ist aber immer so: Die Funktion strpos habe ich schon 1000 Mal verwendet und den Fehler definitiv nicht dort vermutet.

So geht’s:

$string = 20;
echo (strpos("XYX20", (string)$string) !== false) ? "JA" : "NEIN";

Merke: gerade die viel gelobte/gehasste vermeintlich dynamische Typumwandlung von PHP stellt einem oft ein Bein.

Categories
Allgemein

Piwik unterstützt Anonymisierung

Die neueste Version von Piwik (0.5.5) liefert jetzt ein Plugin (“AnonymizeIP”) für die Anonymisierung von IP-Adressen mit. Dieses muss nur in den Einstellungen aktiviert werden.

Die genaue Rechtslage zur Speicherung von kompletten IP-Adressen zu Statistikzwecken ist meines Wissens noch unklar. Der Düsseldorfer Kreis empfiehlt allerdings diese nicht zu speichern (siehe hier).

Für mein Blog habe ich jedenfalls Google-Analytics abgeschaltet und bei Piwik das entsprechende Plugin aktiviert… Ehrlich gesagt habe ich (für das Blog) eh nie in Google-Analytics reingeschaut und immer nur Piwik verwendet.

Categories
Linux Software Tools

inotifysync: Clusternodes synchronisieren

Möchte man die Daten von Cluster-Nodes auf einem gemeinsamen Stand halten gibt es viele Möglichkeiten. Handelt es sich um eine Read-Only Anwendung werden die zugehörigen Dateien meist über einen Master gepflegt und von dort verteilt. Dafür kann man z.B. rsync nehmen – periodisch ausgeführt synchronisiert es zuverlässig die Nodes mit dem Master. Das Problem mit rsync: Die Synchronisation findet nur periodisch statt und nicht live. Außerdem ist bei größeren Datenmengen die Last während der Synchronisation recht hoch.

Warum also nicht nur das synchronisieren was auch synchronisiert werden muss? Genau dafür gibt die inotify-Schnittstelle am Linux-Kernel. Mit entsprechenden Tools überwacht es ganze Dateibäume auf Änderungen und führt bei Bedarf Aktionen aus.

Also habe ich mir ein Script gebastelt welches 1. ein bestimmtes Verzeichnis überwacht und 2. nur die geänderten Dateien/Verzeichnisse unmittelbar mittels ssh verteilt. Voraussetzungen: ssh, scp und inotifywait (enthalten bei den meisten Distributionen im Paket “inotify-tools”). SSH sollte über public keys authentifizieren. Im Kopf von inotifysync.sh müssen die Ziel-Nodes eingetragen werden (diese ändern sich wohl nicht so häufig). Alternativ kann auch eine Datei mit den Ziel-Nodes verwendet werden.

Download: inotifysync.sh

Folgendes Beispiel überwacht das Verzeichnis /home/cluster/htdocs auf Änderungen und synchronisiert diese in das Verzeichnis /var/www/cluster/htdocs auf dem jeweiligen Node:

./inotifysync.sh /home/cluster/htdocs /var/www/cluster/htdocs \
>> /home/cluster/log &

Die Logausgaben werden in die Datei /home/cluster/log geschrieben und das ganze mittels “&” in den Hintergrund geschickt.

Hinweis: Etwas bash Erfahrung sollte man beim Einsatz dieses Scripts schon haben. Einsatz erfolgt natürlich auf eigene Gefahr ;)

Categories
Trivial

3,5 Fehler im Bild

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\vhosts\xxxxxxx\httpdocs\cms\include\inc_front\front.func.inc.php(2365) : eval()’d code on line 7

Oben stehende Meldung kam soeben auf einer nicht allzu kleinen Webseite.

  • display_errors On
  • eval verwendet
  • der Fehler selber
  • IIS verwendet (OK 0,5 Fehler ;))
Categories
Linux

Mediawiki als Managementoberfläche

In letzter Zeit habe ich das Mediawiki als zentrale Managementplatform entdeckt. Eigentlich war es bisher lediglich zu Dokumentationszwecken gedacht. Dadurch, dass es aber eine einfach zu nutzende XML-Exportfunktion bietet, lassen sich damit auch noch andere Dinge anstellen (oder Kombinieren). Man kann damit z.B. prima eine Nodeliste für OpenNMS verwalten (welche nicht durch autodiscovery erfasst werden). Oder gewisse Steuerungsdaten für Bash-Scripte. Oder was auch immer. Zumindest für Aufgaben wofür es sich nicht lohnt ein eigenes Interface zu stricken.

Bisher habe ich zentrale Einstellungen immer relativ mühsam in ein SVN gesichert. Zugriff für Änderungen war meist nur über die SSH Konsole möglich. Dokumentiert wurde da auch nicht viel…

Das schöne am Mediawiki ist, dass eine Versionierung schon eingebaut ist. Ausserdem lassen sich z.B. Dokumentationen oder Checklisten verlinken. Durch Kategorisierung lassen sich die Daten auch geordnet ablegen. SSL und Authentifizierung sollten natürlich selbstverständlich sein.

Per simplen wget in bash-scripten oder per curl in in perl/php ist der Zugriff in der Regel problemlos möglich. Das xml lässt sich prima mit dem Tool “xml2” in Scripten verarbeiten…

Beispiel zum Einlesen einer Liste mit IP-Adressen:

wget -q -O - --http-user admin --http-passwd secret \
https://wiki.example.com/index.php/Spezial:Exportieren/IP_Plan \
| xml2 \
| awk '/(page\/revision\/text)*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/ {print $2}'
Categories
Linux

Fedora EPEL

Für Pakete welche von RHEL/Centos nicht direkt vertrieben werden: fedoraproject.org/wiki/EPEL.

“Extra Packages for Enterprise Linux (EPEL) is a volunteer-based community effort from the Fedora project to create a repository of high-quality add-on packages for Red Hat Enterprise (RHEL) and its compatible spinoffs such as CentOS or Scientific Linux. Fedora is the upstream of RHEL and add-on packages for EPEL are sourced from the Fedora repository primarily and built against RHEL.”

ich nutze von dort z.B. puppet und syslog-ng.

Categories
Linux

libvirt: Interface hinzufügen

Einfacher und eleganter als das XML zu editieren und dann zu reloaden ist direkt das Interface (in diesem Fall ein Bridge-Device) über libvirt hinzuzufügen:

virsh attach-interface domain-1-22 bridge br0
Categories
Linux

libvirt: XML neu einlesen

Damit liest libvirt die entsprechende Beschreibungsdatei (ohne Neustart von libvirtd) erneut ein:

virsh define /etc/libvirt/qemu/domain-1-22.xml
Categories
Linux Networking

OpenNMS: DRBD überwachen

opennmsDas nette an den vielen Nagios-Scripten ist, dass diese sich relativ einfach remote über SNMP überwachen lassen. Nagios verarbeitet nämlich am besten einzeilige Statusmeldungen. OpenNMS bzw. SNMP profitiert auch davon. Folgend eine Kurzanleitung für das Script check_drbd