WordPress Fehler: Connection timed out

Jedes Mal wenn ich bei einer lokalen WordPress Installation das Dashboard aufrief, dauerte dies mehrere Sekunden und es erschien die Fehlermeldung WP HTTP Error: Resolving timed out after 3512 milliseconds. Nach einigem Suchen habe ich die betreffende Stelle in der wp-includes/class-http.php gefunden, die diesen Fehler ausgegeben hat.

Im nächsten Schritt habe ich dann mittels curl_getinfo( $handle ); das Ziel der Anfrage herausgefunden, https://api.wordpress.org/plugins/update-check/1.1/. Nach einigem herumprobieren habe ich versucht die selbe Abfrage im Terminal durchzuführen, also curl -vv --connect-timeout 3 https://api.wordpress.org/plugins/update-check/1.1/. Und siehe da, auch hier reichen 3s (wie von WordPress vorgegeben) nicht aus.

Durch eine Google Suche stieß ich auf eine cURL-Mailingliste wo unter anderem IPv6 als mögliche Ursache genannt wird. Also nochmal die cURL-Doku gewälzt und die Option --ipv4 gefunden. Mit dieser lässt sich die Abfrage problemlos ausführen. Die Ursache für den Fehler war, dass cURL jeweils 15s lang versucht hat per DNS über IPv6 den Hostnamen aufzulösen, was mangels funktionierendem IPv6 am Telekomiker Anschluss nicht ging. Bis cURL auf IPv4 zurückgefallen war, war das von WordPress definierte Timeout (3 Sekunden) abgelaufen.

Ein auf die schnelle eingefügtes curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); in die class-http.php löste den Fehler auch in WordPress. Da Core-Dateien zu verändern immer schlecht ist (Updates und so) gibt es praktischerweise vor der Ausführung des HTTP-Request einen Hook, mit dem sich das $handle manipulieren lässt. Daraus ergibt sich dieses (MU-)Plugin:

[php]

*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/

// Safety first
defined( ‚ABSPATH‘ ) OR die();

/**
* Sets CURLOPT_IPRESOLVE to CURL_IPRESOLVE_V4 for cURL-Handle provided as parameter
*
* @param resource $handle A cURL handle returned by curl_init()
* @return resource $handle A cURL handle returned by curl_init() with CURLOPT_IPRESOLVE set to CURL_IPRESOLVE_V4
*
*/
function gw_curl_setopt_ipresolve( $handle ){
curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
return $handle;
}
// Add function to hook ‚http_api_curl‘ with priority 10 and expecting 1 parameter.
if( function_exists( ‚gw_curl_setopt_ipresolve‘ ) ){
add_action( ‚http_api_curl‘, ‚gw_curl_setopt_ipresolve‘, 10, 1);
}
[/php]

Blacklist für maildrop halbautomatisch erstellen

Auf meinem Uberspace nutze ich eine Kombination aus maildrop und Spamassassin um nervigem Spam schnell und ohne manuelles Eingreifen aus dem Verkehr zuziehen. Manchmal kommt es jedoch vor, dass eine E-Mail nicht als Spam erkannt wird oder – ebenfalls blöd – erwünschte Mails herausgefischt werden.

Mein Setup sieht vor das Mails zunächst gegen eine Whitelist geprüft werden, anschliesend folgt eine Blacklist und zuletzt, wenn weder Whitelist noch Blacklist angeschlagen haben folgt der Spamassassin. Wenn jetzt eine E-Mail von einem Spamabsender doch mal durchkommt habe ich bisher über SSH die Blacklist angepasst. Diese ist mittels der lookup-Funktion von maildrop angebunden.
Diesen Vorgang wollte ich nun Vereinfachen und habe ein kleines Script geschrieben, welches ein bestimmtes Verzeichnis im Maildir einliest und alle Mailadressen im ersten From-Header Zeilenweise in eine Blacklist schreibt. Die Einträge werden alphabetisch Sortiert und Dubletten entfernt.
So muss dann die entsprechende E-Mail nur noch in das Verzeichnis verschoben oder kopiert werden, um einen Blacklist-Eintrag zu erhalten.
Dieses Script, das nebenbei nach dem gleichen Muster auch eine Whitelist erstellt (falls der Spamassassin mal zu übereifrig ist), lasse ich mittels Runwhen einmal täglich ausführen. Nach der dem Durchlauf des Scripts können die Mails dann wieder aus dem Verzeichnis entfernt werden, die Einträge bleiben dabei natürlich erhalten.

Konfigurieren muss man bei Verwendung des Scripts die Variablen OUTPUT und INPUT:

  • OUTPUT – Hier gehört das Verzeichnis hinein wohin das Script die Listen schreiben soll, natürlich muss dieses Beschreibbar sein
  • INPUT – Diese Variable wird erst für den Durchlauf der Blacklist konfiguriert, hier gehört der Pfad zum Blacklist-Maildir hin
  • INPUT –Beim zweiten mal für den Durchlauf der Whitelist gehört der Pfad zum Whitelist-Maildir hin

Hier noch das gesamte Script:

[shell]
#!/bin/bash
#
# autolister.sh
#
# Automatic generation of e-mail black- and whitelists for maildrop from mails in specific (IMAP-)folders by „From“-header
#
# For more information see (German)
#
# Copyright 2014, GOLDERWEB – Jonathan Golder
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see
#

function auto_list(){
# Make sure OUTPUT and INPUT are directories
if [[ ! -d $OUTPUT || ! -d $INPUT ]]
then
echo ‚ERROR: OUTPUT and INPUT must be directories!‘
exit 1
fi

# Warn if other list then black or white
if [[ $1 != ‚black‘ && $1 != ‚white‘ ]]
then
echo „WARNING: $1 normaly need to be ‚black‘ or ‚white'“
fi

# Create empty list if there is none before to prevent errors
if [[ ! -f $OUTPUT/${1}list-auto ]]
then
touch $OUTPUT/${1}list-auto
fi

# Make a copy of current list
cp $OUTPUT/${1}list-auto $OUTPUT/.${1}list-auto.bak

# Grep all „From“-headers width mailadresses from mails in $INPUT and write to $OUTPUT/.raw.tmp
grep -rEo -m 1 „^From: .*\@.*$“ $INPUT/* >$OUTPUT/.raw.tmp

# Grep email adresses and write to $OUTPUT/.done.tmp
grep -oE ‚[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+‘ $OUTPUT/.raw.tmp >$OUTPUT/.done.tmp

# Concatenate old and new list, sort alphabetically ascending and unique entries
cat $OUTPUT/.${1}list-auto.bak $OUTPUT/.done.tmp | sort | uniq -i >$OUTPUT/${1}list-auto

# Remove temporary files
rm $OUTPUT/.raw.tmp
rm $OUTPUT/.done.tmp
rm $OUTPUT/.${1}list-auto.bak
}

# Configure OUTPUT for both black and whitelist
OUTPUT=$HOME/etc/maildrop

#Configure INPUT for blacklist and create it
INPUT=$HOME/users/golderweb/.Spam.Blacklist
auto_list ‚black‘

#Configure INPUT for whitelist and create it
INPUT=$HOME/users/golderweb/.Spam.Whitelist
auto_list ‚white‘
[/shell]

Weitere Informationen zu maildrop und zur Einrichtung eines runwhen-Dienstes finden sich im Wiki der Ubernauten.

Update

Jetzt auch als Gist auf GitHub unter https://gist.github.com/golderweb/e02d405699588af09383 verfügbar, zum einfachen klonen oder forken.

purple

#663399Becca

„Rebecca Alison Meyer was a ray of light. She was six years, eleven and a half hours old when she died.“
––Eric Meyer

Rebecca Meyer war die Tochter von CSS-Experte Eric Meyer und seiner Frau Kat. Sie starb am vergangenen Samstag nach einem Jahr Kampf gegen den Krebs. All die vielen Genesungswünsche, Gebete und Hoffnungsschimmer waren vergebens, der Krebs hat die Medizin besiegt. Eric und Kat haben sich entschieden, die Welt an Ihrem Schiksal teilnehmen zulassen.

Nun ist es Zeit etwas zurück zugeben. Rebeccas Lieblingsfarbe war viollett oder in CSS #663399, daher wurde anlässlich Ihrer Beerdigung am Donnerstag 12. Juni 2014 das Hashtag #663399Becca ins Leben gerufen.

Niemand lebt für sich selber; niemand stirbt für sich allein. Im Leben und im Sterben gehören wir gemeinsam zu Gott, dem Herrn über die Lebenden und die Toten.
Die Bibel, Römer 14,7-9

Happy Birthday WP – 11 Jahre WordPress

Am 27. Mai 2003 wurde WordPress 0.71 veröffentlicht, die erste offizielle WordPress Version. In elf Jahren ist aus dem einfachen Blogging-System ein hochfunktionales und flexibles CMS geworden, das nicht von ungefähr eines der am meisten verwendeten ist.

Meine eigene Geschichte mit WordPress begann Anfang 2010 mit Version 2.9. Seit her hat sich einiges verändert, große Neuerungen waren z. B. die Custom Post Types (WP 3.0), die jährlich neuen Standard-Themes der „Twenty X“-Reihe (ab WP 3.0), die Adminbar (WP 3.1), der neue Uploader (WP 3.3), Autosave (WP 3.6), Automatische Updates (WP 3.7) und nicht zuletzt das Redesign des Admin-Bereichs (WP 3.8).

Was mir an WordPress gefällt ist die große Vielfalt an Aufgabenstellungen für die WordPress einsetzbar ist: Vom Ursprünglichen Zweck der ersten Versionen von WordPress ein simples Weblog zu erstellen über ein vollwertiges Webportal, ggf. mit Social-Komponente über BuddyPress bis zum Web Application Framework. Dazu kommt die einfache Anpassbarkeit, fehlende oder spezielle Funktionen lassen sich über eines der unzähligen Plugins nachrüsten, über Themes kann jeder seinem WordPress einen indiviuellen Anzug anziehen.

Außerdem gefällt mir, dass WordPress freie Open Source Software ist (GPLv2). Die Weiterentwicklung von WordPress folgt damit den Wünschen und Bedürftnissen seiner Community und nicht kommerziellen Interressen.

In diesem Sinne: „Liebes WordPress, ich wünsche dir (mindestens) weitere elf erfolgreiche Jahre als beliebtestes CMS, mit vielen interressanten Neuerungen.“

Kleiner Tipp am Rande, anlässlich dieses Geburtstages lässt das eine oder andere einschlägige Portal etwas springen, z. B. WordPress Deutschland.

Mein persönliches Uberspace-Init Script

Ich habe mir ein kleines Script gebastelt, mit dem ich neuen Uberspaces mit wenigen Befehlen einge Voreinstellungen verpassen kann.

Die Funktion in Kürze:

  • Einen Symlink für das Übergeordnete Verzeichnis der Pseudo-DOCUMENT_ROOTs. Zwar nicht unbedingt notwendig aber cd www ist schneller getippt wie cd /var/www/virtual/$USER
  • Vorbereitung für die Daemontools: uberspace-setup-svscan
  • Ein bin– und ein git-Verzeichnis – benötige ich öfters.
  • E-Mail Weiterleitung zu einer auszuwählenden E-Mail-Adresse, oder ins Maildir.
  • Außerdem hole ich mir noch angepasste bash Konfigurationsdateien, die ich bei github abgelegt habe.

Mit dem Parameter bash-config-update wird nur der letzte Punkt ausgeführt. Mit dem Parameter cleanup werden Sicherungskopien der bash Konfiguration von bash-config-update nach /dev/null befördert.

[shell]
#!/bin/bash
#
# uberspace-init.sh
#
# Init-Script to init new Uberspaces and to Update bash-config
#
#
# Copyright 2014-2015 GOLDERWEB – Jonathan Golder
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see
#

# Make sure we are in $HOME
cd $HOME;

# Download my personal default bash configuration files from github
bash-config-update() {

# Download modified bash-config from github
( test -f .bash_profile && mv .bash_profile .bash_profile.save || test -d . ) && wget -q https://gist.githubusercontent.com/golderweb/d910ae1edbe853377da5/raw/.bash_profile
( test -f .bashrc && mv .bashrc .bashrc.save || test -d . ) && wget -q https://gist.githubusercontent.com/golderweb/e912ccfafda58470e51a/raw/.bashrc
( test -f .bash_functions && mv .bash_functions .bash_functions.save || test -d . ) && wget -q https://gist.github.com/golderweb/3dbb4f897339cf5c74e7/raw/.bash_functions
( test -f .bash_aliases && mv .bash_aliases .bash_aliases.save || test -d . ) && wget -q https://gist.github.com/golderweb/79a4a2cc2cb126d30d4a/raw/.bash_aliases

echo „Test if everything works right, then run \“uberspace-init cleanup\““
}
case „$1″ in

init|““)
# Set up some predefinitions on new uberspace

# Create Symlink for www
test -e ~/www || ln -s /var/www/virtual/$USER www

# Prepare ubespace for using daemontools
test -d ~/service || uberspace-setup-svscan

# Create several dirs
test -d ~/bin || mkdir bin
test -d ~/git || mkdir git

# Enable E-Mail redirection
read -p „Enter E-Mail-Adress for redirection, leave empty for use Maildir of this uberspace:“ mail

if [ -n „$mail“ ]; then
echo -e „#Redirect incomming E-Mails on ${USER} to ${mail}\n$mail“ > .qmail || echo „ERROR: .qmail-file couldn’t be wrote! E-Mails will be delivered to Maildir“
else
echo „No E-Mail-adress was provided, E-Mails will be delivered to Maildir“
fi

#Get bash-config files from github
bash-config-update
;;

bash-config-update)

#Get bash-config files from github
bash-config-update
;;

cleanup)

#Remove backup files
rm .bash_profile.save .bashrc.save .bash_functions.save .bash_aliases.save
;;

*) echo „Invalid parameter“
;;

esac
[/shell]

Wenn dir das Uberspace-Init Script gefällt darfst du es gerne unter den Bedingungen der GNU GPLv3 weiterverwenden. Du findest es unter https://gist.github.com/golderweb/4feb43ed41b49bd7bc27. Einfach den Quelltext kopieren, mit git clonen oder einen Github-Fork erstellen.

Der Herr ist auferstanden!
Er ist wahrhaftig auferstanden!

Frohe Ostern allerseits

Warum ich ein Ubernaut wurde

Dieses Blog wird bei Uberspace.de gehostet. Auf die Ubernauten stieß ich zufällig in diesem Blog-Beitrag von Dominik Schilling auf wpGrafie.de.
Mal kurz weiter gesurft und den wohl flexibelsten Sharedhosting-Provider Deutschlands gefunden. PHP, MySQL, Mail, IMAP, 10 GB Plattenplatz, 100 GB Traffic und ein vollwertiger SSH-Zugang, um nur einige der sehr vielen Feautures zu nennen. 10mal besser als irgendwelche fummeligen Weboberflächen, die überall anders aussehen oder als Dateien schubsen per FTP.
Das alles hat natürlich seinen Preis, doch auch den bestimmst Du selbst. Die einzige Vorgabe ist ein Mindestpreis von gerade mal einem Euro. Doch spätestens wenn Du einmal mit dem Support zu tun hattest willst du ganz von alleine mehr bezahlen. Die Jungs sind alle Admins und Meister ihres Fachs – es ist keine Seltenheit zu jeder Tages und Nachtzeit innerhalb von Minuten eine Antwort zu bekommen.
Wenn Du also zumindest grundlegende Kenntnisse vom Umgang mit einer Konsole hast und keine Angst vor langen, aber sehr informativen Texten im Wiki, dann kannst du unter https://uberspace.de gleich loslegen.

Kleiner Hinweis am Rande, für diesen Artikel bekomme ich von den Ubernauten rein gar nichts. Ich schreibe das aus Überzeugung, das Uberspace ein guter Provider ist und ich möchte das noch mehr Leute den Service kennen lernen dürfen. Die Ubernauten selbst schreiben dazu auf ihrer Website:

Wer sich entscheidet, selbst Ubernaut zu werden, will das oft nicht für sich behalten. Und wir fühlen uns geehrt: Wir haben nämlich kein Referrer-Programm zum Mitverdienen und bezahlen auch niemanden dafür, besonders wohlwollend über uns zu schreiben. Wer uns empfiehlt, tut das aus Überzeugung und steht dafür mit seinem Namen – darauf sind wir dann doch mal ein wenig stolz, denn echtes Lob muss man sich eben verdienen. Bleibt die Frage: Wann stellst du uns selbst auf die Probe?
Eure Meinung – Uberspace.de

Ein neues Sternchen am deutschen Bloghimmel

Hallo und Herzlich Willkommen in meinem neuen Blog unter GOLDERWEB.de, schön dass Du es gefunden hast.
Hier möchte ich mehr oder weniger regelmäßig über Entdeckungen, Lösungen und Unterhaltsames rund um die Welt von WordPress, Linux und anderer freier Software berichten. Gelegentlich können sich auch Beiträge zu anderen Themen einschleichen.
Neben WordPress beschäftige ich mich gerade vor allem mit meinem Raspberry Pi, von dem es hier auch das ein oder andere zu lesen geben wird.