Month: August 2013

Notice: wpdb::escape ist seit Version 3.6 veraltet!

Bei der Aktualisierung einer WordPress Installation von 3.5 auf 3.6 erschien folgende Meldung mehrfach auf dem Dashboard


Notice: wpdb::escape is deprecated since version 3.6! Use wpdb::prepare() or esc_sql() instead. in /var/www/web4/html/wordpress/wp-includes/functions.php on line 2871 Notice: wpdb::escape ist seit Version 3.6 veraltet! Benutze stattdessen wpdb::prepare() or esc_sql(). in /var/www/project/wordpress/wp-includes/functions.php on line 2871

In Zeile 2781 der Datei “functions.php” steht jedoch die Funktion, welche die Meldung ausgibt. Von dem escape-Aufruf ist weit und breit keine Spur. Mittels grep habe ich dann nach allem was ” escape(” beinhaltet gesucht und manuell ersetzt.


grep -r ' escape(' ./

Die Herausforderung ist, das als Ersatz für wpdb::escape zwei Funktionen genannt werden. Welche davon jetzt die Richtige ist, habe ich abhängig davon gemacht, ob die Eingabe nur ausgegeben werden sollte, dann wpdb::prepare, oder in die Datenbank gespeichert werden soll, dann esc_sql.

Nachdem ich alle Dateien “behandelt” hatte, mit der Dateiendung php, erschien weiterhin die Meldung auf dem Dashboard. Erst das Auskommentieren der gesamten “escape”-Funktion brachte eine neue Erkenntnis:


Warning: array_map() expects parameter 1 to be a valid callback, class 'wpdb' does not have a method 'escape' in /var/www/project/wordpress/wp-content/plugins/broken-link-checker/includes/link-query.php on line 295
Warning: implode(): Invalid arguments passed in /var/www/project/wordpress/wp-content/plugins/broken-link-checker/includes/link-query.php on line 300

Der eigentliche Übeltäter scheint somit die Erweiterung “Broker link Checker” zu sein. Nachdem diese deaktiviert wurde, verschwand die Meldung. Die angepassten Dateien habe ich unverändert gelassen.

Bei meinem grep wurde die Datei “link-query.php” nicht aufgeführt, da “escape” per array_map aufgerufen wurde:


$s_parser_type = array_map(array(&$wpdb, 'escape'), $s_parser_type);

Shell Tricks

Nachdem ich gestern einen Einzeiler geschrieben hatte, welcher mir rotierend ein Backup macht, inklusive E-Mail Benachrichtigung, habe ich in einem Gespräch weitere Optimierungen erfahren, die ich festhalten möchte.

Berechnungen in doppelten Klammern ausführen

benutzer@client$ echo $((1+1))
2

Ausgabe zusammenfassen in Klammern

benutzer@client$ (ls -al; df -m) > test.txt

bzw. wenn danach ein Programmaufruf folgt

benutzer@client$ (ls -al; df -m) | mail -s "Betreff" mail@example.com

Programme nach einander ausführen

ls -al; df -m

nur im Erfolgsfall den zweiten Befehl ausführen

ls -al && df -m

nur im Fehlerfall den zweiten Befehl ausführen

ls -al || df -m

Rsync über SSH mit E-Mail Benachrichtigung und Rotation

Im Internet finden sich eine Vielzahl von Anleitung bei denen nicht immer klar erkenntlich ist, welches System in welche Richtung synchronisiert bzw. gebackup werden soll. Daher zunächst eine Beschreibung des Versuchsaufbaus.


2 Linux Rechner

1. Server: Beherbergt die Dateien im original.
2. Client: Macht eine Kopie von den Dateien

Wie in der Überschrift genannt, soll das Ganze über SSH ablaufen. Außerdem soll es später automatisiert werden. Also benötigen wir einen SSH-Login ohne Passwort und mit Zertifikat. Es empfiehlt sich ggf. einen neuen Benutzer zu erstellen, der nur eingeschränkte Lese-Rechte auf dem Server hat, falls der Key vom Client mal in die falschen Hände gerät und es nicht sofort gemerkt wird.


benutzer@client$ ssh-keygen -b 2048 -t rsa

Im Prinzip können alle Abfragen mit [Enter] bestätigt werden, außer es existieren ggf. schon Keys bzw. falls der Key in einem anderen Verzeichnis gespeichert werden soll.

Nach der Erstellung sollten sich zwei Dateien im Verzeichnis benutzer/.ssh/ befinden, einmal eine Datei (bspw.: id_rsa.pub) mit dem öffentlichen Schlüssel und eine die den privaten und öffentlichen Schlüssel enthält. Den öffentlichen Schlüssel kopieren jetzt auf den Server:


benutzer@client$ ssh-copy-id -i .ssh/id_rsa.pub AndererBenutzer@server

Wenn der Key kopiert ist, sollte ein Login mittels


benutzer@client$ ssh AndererBenutzer@server

bereits funktionieren.

Als nächstes wird ein Skript benötigt, welches die Synchronisation durchführt. Dabei greifen wir auf das Programm Rsync zurück. Der einfachste Aufruf wäre wie folgt:


benutzer@client$ rsync -avz -e ssh AndererBenutzer@server:/home/Quellverzeichnis /Benutzer/Zielverzeichnis/

-v, --verbose
-a, --archive
-z, --compress

Eine Auflistung aller Parameter gibt es mittels man rsync oder hier http://linux.die.net/man/1/rsync .

Dieser Aufruf könnte noch in die Crontab geschrieben werden. Zusätzlich möchte ich aber noch eine E-Mail Benachrichtigung und eine Rotation haben.

Die Synchronisation soll einmal die Woche durchgeführt werden und die letzten vier Wochen sollen verfügbar sein, falls mal ein längerer Urlaub ansteht. Anbieten würde es sich also, wenn wir die Wochennummer nehmen und durch vier teilen. Damit gäbe es eine Rotation von vier Wochen.


benutzer@client$ $(($(date +%V)%4))

bzw. im Rsync-Skript wäre dies dann:


benutzer@client$ rsync -avz -e ssh AndererBenutzer@server:/home/Quellverzeichnis /Benutzer/Zielverzeichnis_$(($(date +%V)%4))/

Somit würde das Verzeichnis alle vier Wochen rotieren.

Die E-Mail Benachrichtigung können wir auch direkt über die Konsole erledigen:


benutzer@client$ rsync -avz -e ssh AndererBenutzer@server:/home/Quellverzeichnis /Benutzer/Zielverzeichnis_$(($(date +%V)%4))/ && df -hT | mail -s "Erfolg" mail@example.com || df -hT | mail -s "Error" mail@example.com

Der Aufruf ist mit einer Bedingung ausgestattet, die im Fehlerfall den Betreff anpasst. Als Inhalt wird immer der verfügbare Plattenplatz mitgeschickt, damit rechtzeitig reagiert werde kann.

Anregungen und Verbesserungen gerne in den Kommentaren.