PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Linux’ Category

PHP und HTTP AUTH bei 1und1 Webhosting

with one comment

Um das Zend Framework in der Webhosting-Umgebung bei 1und1 ans Laufen zu bekommen, gibt es ein paar Kleinigkeiten zu beachten:

Als erstes muss man bei 1und1 in der .htaccess-Datei angeben welche PHP-Version man benutzen möchte. Dies macht man mit der Zeile

AddType x-mapp-php5 .php

Außerdem muß man noch die folgenden 2 Zeilen hinzufügen, sonst erhält man einen 500er Fehler:

Options -MultiViews
RewriteBase /

Die RewriteBase gilt es natürlich anzupassen falls das Projekt über einen anderen Pfad erreicht werden muss.

Da PHP bei 1und1 als CGI läuft, muß man für die HTTP-Authentifizierung auch noch einen kleinen Workaround einbauen:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Damit wird die Authentifizierungsinformation in die Variable $_SERVER[‚REDIRECT_HTTP_AUTHORIZATION‘] geschrieben. Das sieht dann ungefähr so aus:

echo $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
//  Basic: d2lraTpwZWRpYQ==

Das ist die Base64-Darstellung von „Username:Passwort“.

Die entgültige .htaccess sieht dann so aus:

AddType x-mapp-php5 .php
Options -MultiViews

RewriteEngine On
RewriteBase /

# workaround for 1und1 php cgi mode
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Und so kommt man an Username + Passwort heran:

if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
 list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));
}

Written by Michael Kliewe

Februar 6th, 2010 at 10:53 am

eMail-Postfächer synchronisieren mit imapsync

with 5 comments

Einer der wenigen Artikel, die sich nicht um PHP drehen, aber trotzdem sehr interessant sind 😉

So häufig braucht es der Normalanwender nicht, aber wenn man mal seinen Email-Provider wechselt oder eine Kopie aller seiner Mails auf einem anderen Server haben möchte, gibt es nichts einfacheres als das imapsync-Script von Gilles Lamiral.

imapsync ist ein Perl-Script, das unter Linux, Windows und Mac läuft und die Emails zweier IMAP-Konten abgleichen kann. Dabei kopiert es nicht nur die Emails selbst, sondern auch deren Flags und das Interne Datum der Mails. Jede Nachricht wird auch nur einmal kopiert, sodass möglichst wenig Datentransfer stattfindet. Es ist also sowohl für Backupzwecke als auch Migrationszwecke von großem Nutzen, denn es unterstützt eine Vielzahl von verschiedenen IMAP-Servern.

Wenn ich hier alle Optionen aufzählen würde, die das Script unterstützt, würde der Artikel sehr lang werden. Das lassen wir also schön bleiben, nur ein paar Stichworte seien verraten: Es unterstützt SSL, Ordner können übersprungen werden, man kann Quellordner auf andere Zielordner mappen, Mails können nach der Synchronisierung gelöscht werden (dann ist es eher ein Verschieben von Mails statt einer Synchronisierung), Mails die größer als ein Limit sind können übersprungen werden, nur Mails der letzten X Tage können synchronisiert werden usw usw.

Genug Informationen, um es mal auszuprobieren? Dann los:

sudo apt-get install imapsync

Schon ist es installiert und wir können anfangen zu synchronisieren. Erstmal machen wir einen Trockendurchlauf (–dry), es wird also nur simuliert:

imapsync --dry --host1 10.0.0.2 --user1 "mkliewe@mail.de" --password1 "Passwort1" --host2 10.0.0.3 --user2 "backup@mail.de" --password2 "Passwort2"

Die Ausgabe sieht dann beispielsweise so aus:

$RCSfile: imapsync,v $ $Revision: 1.286 $ $Date: 2009/07/24 15:53:04 $
Here is a [linux] system (Linux xxxxx01 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64)
with perl 5.10.0
Mail::IMAPClient  3.21
IO::Socket        1.30_01
IO::Socket::SSL
Digest::MD5       2.36_01
Digest::HMAC_MD5
Term::ReadKey
Date::Manip
 and the module Mail::IMAPClient version used here is 3.21
Command line used:
/usr/bin/imapsync --dry --host1 10.0.0.2 --user1 mkliewe@mail.de --password1 MASKED --host2 10.0.0.3 --user2 backup@mail.de --password2 MASKED
Turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
TimeZone:[europe/berlin]
Will try to use CRAM-MD5 authentication on host1
Will try to use CRAM-MD5 authentication on host2
From imap server [10.0.0.2] port [143] user [mkliewe@mail.de]
To   imap server [10.0.0.3] port [143] user [backup@mail.de]
Banner: * OK mail.de Dovecot ready.
Host 10.0.0.2 says it has CAPABILITY for AUTHENTICATE CRAM-MD5
Success login on [10.0.0.2] with user [mkliewe@mail.de] auth [CRAM-MD5]
Banner: * OK mail.de Dovecot ready.
Host 10.0.0.3 says it has CAPABILITY for AUTHENTICATE CRAM-MD5
Success login on [10.0.0.3] with user [backup@mail.de] auth [CRAM-MD5]
host1: state Authenticated
host2: state Authenticated
From separator and prefix: [.][]
To   separator and prefix: [.][]
++++ Calculating sizes ++++
From Folder [INBOX]                             Size:     37258 Messages:     3
From Folder [Test2]                             Size:         0 Messages:     0
From Folder [Trash]                             Size:         0 Messages:     0
Total size: 37258
Total messages: 3
Time: 0 s
++++ Calculating sizes ++++
To   Folder [INBOX]                             Size:         0 Messages:     0
To   Folder [Test2]                            does not exist yet
To   Folder [Trash]                            does not exist yet
Total size: 0
Total messages: 0
Time: 0 s
++++ Listing folders ++++
From folders list: [INBOX] [Test2] [Trash]
To   folders list: [INBOX]
++++ Looping on each folder ++++
From Folder [INBOX]
To   Folder [INBOX]
++++ From [INBOX] Parse 1 ++++
++++ To   [INBOX] Parse 1 ++++
++++ Verifying [INBOX] -> [INBOX] ++++
+ NO msg #1 [jM2q9dB8TAvtUZDi0mNMyQ:30262] in INBOX
+ Copying msg #1:30262 to folder INBOX
flags from: [$notjunk]["21-Dec-2009 15:15:25 +0100"]
+ NO msg #2 [0RLbKdGjywBv4mLEANRUtg:5553] in INBOX
+ Copying msg #2:5553 to folder INBOX
flags from: [$notjunk]["21-Dec-2009 17:19:02 +0100"]
+ NO msg #3 [ctDrRzmFgf4W2lUbu/KlBQ:1443] in INBOX
+ Copying msg #3:1443 to folder INBOX
flags from: [$notjunk]["19-Dec-2009 19:34:30 +0100"]
Time: 1 s
From Folder [Test2]
To   Folder [Test2]
To   Folder Test2 does not exist
Creating folder [Test2]
From Folder [Trash]
To   Folder [Trash]
To   Folder Trash does not exist
Creating folder [Trash]
++++ End looping on each folder ++++
++++ Statistics ++++
Time                   : 1 sec
Messages transferred   : 0 (could be 3 without dry mode)
Messages skipped       : 0
Total bytes transferred: 0
Total bytes skipped    : 0
Total bytes error      : 0
Detected 0 errors

In diesem Fall gibt es also 3 Ordner auf dem Quellserver. Die Ordner „Trash“ und „Test2“ gibt es auf dem Zielserver noch nicht, sie würden also angelegt. Es existieren auch 3 Emails in der INBOX, die synchronisiert werden.

Wenn man den selben Befehl nochmal ohne –dry ausführt, dann wird wirklich synchroniert von host1 nach host2.

Um dann die Synchronisation stündlich zu wiederholen eignet sich ein Cronjob:

sudo crontab -u root -e

mit dem Inhalt

0 * * * 1-5 /usr/local/bin/myimapsync.sh

wobei in der myimapsync.sh natürlich der Befehl stehen sollte, beispielsweise:

#!/bin/bash

imapsync --dry --host1 imap.domain.de --user1 "user@domain.de" --password1 "Passwort1" --host2 10.0.0.3 --user2 "backup@domain.de" --password2 "Passwort2" >> /var/log/myimapsync.log

Hier für Administratoren noch ein kleines hilfreichen Script, welches mehrere Konten synchronisiert:

#!/bin/bash

inputfile="/etc/imapsyncbatch.conf"
host1="imap.domain.de"
host2="10.0.0.3"
logfile="/var/log/imapsyncbatch.log"

if [ ! -f $inputfile ]
then
{
	echo "The input file does not exist! Exiting..." >> $logfile
	exit;
}
fi

date=`date +%X_-_%x`
echo "$date IMAPSync started..." >> $logfile

tr "," " " <$inputfile | while read u1 p1 u2 p2
do
	date=`date +%X_-_%x`
	echo "$date Start Syncing User $u1 to $u2" >> $logfile
	imapsync $1 --buffersize 8192000 --nosyncacls --syncinternaldates \
		--host1 $host1 --user1 "$u1" --password1 "$p1" --ssl1 --port1 993 \
		--host2 $host2 --user2 "$u2" --password2 "$p2" --ssl2 --port2 993 \
		--noauthmd5
	date=`date +%X_-_%x`
	echo "$date Finished $u1 to $u2" >> $logfile
done

date=`date +%X_-_%x`
echo "$date IMAPSync Finished..." >> $logfile
echo "$date ------------------------------------" >> $logfile

wobei in der /etc/imapsyncbatch.conf die Zugangsdaten stehen:

user1@domain.de,Passwort1,user2@domain.de,Passwort2
bernd@domain.de,PasswortBernd,backup@domain.de,PasswortBernd

Falls mehrere Personen Zugriff auf diesen Rechner haben, sollte diese Datei gut geschützt werden (beispielsweise mit „sudo chmod 700 /etc/imapsyncbatch.conf“). Da das Script selbst keinen Root-Zugriff auf den Rechner braucht, kann man es auch mit einem normalen Benutzeraccount starten, dann muß allerdings der Lesezugriff auf die /etc/imapsyncbatch.conf und der Schreibzugriff auf /var/log/imapsyncbatch.log gewährleistet sein.

Written by Michael Kliewe

Dezember 21st, 2009 at 7:15 pm

Virtualisierung: ESXi ausprobieren auf dem Mac

with 3 comments

Wer sich mit Virtualisierung beschäftigt, kommt um VMWare nicht herum. VMWare Workstation haben sicherlich einige von euch schon ausprobiert, sobald es dann aber in Richtung „Server-Virtualisierung“ geht wird die Luft schon dünner.

Wenn man Virtualisierungssoftware (auch Hypervisor genannt) grob unterteilen möchte, gibt es 2 Arten:

  1. Hypervisor, die direkt auf der Hardware laufen („bare metal“, also selbst eine Art Minibetriebssystem) und kein Host-Betriebssystem benötigen. Bekannte Produkte sind hier VMWare ESX, der kostenlose VMWare ESXi, XenServer Hypervisor, Microsofts Hyper-V, Sie werden auch als „Type 1“ oder „Native VM“ bezeichnet.
  2. Applikationen, die auf einem Betriebssystem installiert werden, und dann als Programm gestartet werden. Bekannte Vertreter sind da Sun’s Open Source VirtualBox, VMWare Workstation/Server, Microsoft Virtual PC, KVM, UML, Linux VServer, OpenVZ, Virtuozzo und viele weitere. Sie werden auch als „Type 2“ oder „Hosted VM“ bezeichnet.

In der zweiten Kategorie unterscheidet man dann zwischen „Full Virtualization“ und „Paravirtualization“. Ersteres kann unveränderte Gäste starten, sprich jedes Betriebssystem auf dem Markt, während bei Paravirtualization das Gastbetriebssystem weiß, dass es virtualisiert wird und es angepasst sein muss an diese Situation, es geht also nicht mit jedem Betriebssystem.

Bei den Bare-Metal-Hypervisor gibt es natürlich Hardware-Einschränkungen, da sie direkt auf der Hardware laufen und nicht eine so große Treiber-Unterstützung mitbringen können wie moderne Windows- oder Linux-Betriebssysteme. Daher sollte man sich vorher informieren, ob beispielsweise ESXi auf seiner Hardware überhaupt läuft.

Um etwas mit ESXi zu testen, habe ich mir für zuhause mal einen USB-Stick erstellt mit der ESXi-Software drauf, und davon gebootet. Der Hypervisor bootete auch erfolgreich, jedoch bliebt er beim Laden der USB-Module stecken. Mein Mainboard (ein MSI 790FX GD70) wird also nicht unterstützt. Um trotzdem zu testen, startete ich es in der Firma mal testweise in VMWare Fusion. VMWare Fusion ist quasi das selbe wie VMWare Workstation, nur für Mac. Doch auch hier startete der Hypervisor nicht vernünftig, da ein Hypervisor innerhalb eines Hypervisors nicht unterstützt wird. Doch Dank eines Blog-Artikels habe ich es dennoch ans Laufen bekommen, und nun kann ich ESXi ausgiebig testen.

Ich habe also ein Mac OS X, darauf VMWare Fusion, darin wiederum ESXi installiert, und auf dem ESXi laufen dann weitere Betriebssysteme (aktuell ein Ubuntu 9.10 und Debian Lenny). Damit ich den ESXi administrieren kann, benötigt man VMWare vSphere, welches wiederum nur unter Windows läuft. Also habe ich unter Fusion noch eine Windows Virtual Machine laufen.

Ihr merkt schon, es macht Spass, soviele Betriebssysteme, teilweise verschachtelt, laufen zu lassen 😉

Written by Michael Kliewe

Dezember 10th, 2009 at 5:08 pm

Zuhause im IPv6 Web surfen (Teil1: Ubuntu)

with 4 comments

Das neue Internet Protokoll in der Version 6 wird kommen, soviel ist sicher. Da es ein langsamer Umstieg ist, leben wir aktuell in einer zweigeteilten Welt: Der alten IPv4 Welt und der neuen IPv6 Welt. Einige Länder sind bei der Umstellung schneller, andere müssen noch mehr oder weniger dazu gezwungen werden.

Ganz getrennt sind die beiden Welten jedoch nicht. Mit Hilfe von Tunnel-Protokollen und -Servern kann man zwischen den jeweiligen Netzen vermitteln.

Da die meisten von euch wohl noch IPv4 zuhause haben werden (kein großer deutscher Provider bietet aktuell IPv6 DSL-Anschlüsse an, es gibt nur ein paar kleinere), will ich hier kurz eine Anleitung schreiben, wie ich es zuhause nutze.

So sieht es vorher aus, wenn man noch keine IPv6 Verbindung hat (so sollte es bei euch auch aussehen):

$ ping6 ipv6.google.com
connect: Network is unreachable

(Diese komplette Anleitung ist für Linux/Ubuntu, für Windows gibt es auch Software und eine Anleitung, also einfach weiterlesen)

without_ipv6

Alles was wir brauchen ist eine Client-Software, die uns auf unserem Rechner hilft, ein Tunnel-Device zu erstellen, welches dann den IPv6-Traffic zum Tunnel-Server leitet. Ich habe zuhause die Software „gogoClient“(gw6c) genutzt, um mich mit einem kostenlosen IPv6 Tunnelbroker zu verbinden.

Es gibt verschiedene Möglichkeiten, je nach Betriebssystem, das grundlegende Vorgehen ist dabei: Download der Client Software und Starten der Sofware 😉

Und das müßt ihr dafür tun:

Ihr registriert euch kostenlos auf dieser Seite: http://gogonet.gogo6.com/

Jedes Mitglied dort erhält nämlich die Möglichkeit, die Software herunterzuladen und eine IPv6-Adresse (bzw. ein Netz) zu erhalten. Unten in diesem Artikel gibt es noch einige interessante Links, die man sich durchlesen kann, falls man Probleme hat oder wissen möchte, was alles hinter dem Service steckt. Oder gar eine feste IPv6-Adresse haben möchte.

Nach der Registrierung kann man hier den Client herunterladen:

http://gogonet.gogo6.com/page/download-1

Es gibt Versionen für Windows, Linux, *BSD, OpenWRT etc, alles was das Herz begehrt.

Nach dem Download entpackt man das entsprechende Archiv (Unter Windows startet man den Installer).

$ tar -xzvf gw6c-linux.tar.gz
gw6c/
gw6c/template/
gw6c/template/README
gw6c/template/linux.sh
gw6c/bin/
gw6c/bin/gw6c.conf
gw6c/bin/gw6c
gw6c/bin/gw6c.conf.sample
gw6c/man/
gw6c/man/man5/
gw6c/man/man5/gw6c.conf.5
gw6c/man/man8/
gw6c/man/man8/gw6c.8

In meinem Fall mußte ich nur noch eine kleine Einstellung in der gw6c/bin/gw6c.conf machen, nämlich den Pfad korrekt angeben, wohin ich gw6c entpackt habe:

gw6_dir=/usr/local/gw6c

Danach einfach starten via

sudo /usr/local/gw6c/bin/gw6c

Dann sollte der Tunnel aufgebaut sein:

$ ifconfig tun
tun       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet6 addr: 2001:5c0:1000:a::539/128 Scope:Global
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
          RX packets:17 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:1032 (1.0 KB)  TX bytes:608 (608.0 B)

Falls das nicht der Fall ist, kann man das Logging aktivieren, indem man in der gw6c.conf die folgenden Einstellungen abändert:

log_file=3
log_filename=gw6c.log

Sobald nun also der Tunnel aufgebaut ist, können wir IPv6 nutzen:

$ ping6 ipv6.google.com
PING ipv6.google.com(fx-in-x68.1e100.net) 56 data bytes
64 bytes from fx-in-x68.1e100.net: icmp_seq=1 ttl=56 time=42.3 ms
64 bytes from fx-in-x68.1e100.net: icmp_seq=2 ttl=56 time=44.8 ms
64 bytes from fx-in-x68.1e100.net: icmp_seq=3 ttl=56 time=44.4 ms
64 bytes from fx-in-x68.1e100.net: icmp_seq=4 ttl=56 time=48.3 ms
64 bytes from fx-in-x68.1e100.net: icmp_seq=5 ttl=56 time=43.6 ms
$ host ipv6.google.com

ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2001:4860:a003::68
whois 2001:4860:a003::68

OrgName:    Google Inc.
OrgID:      GOGL
Address:    1600 Amphitheatre Parkway
City:       Mountain View
StateProv:  CA
PostalCode: 94043
Country:    US

NetRange:   2001:4860:0000:0000:0000:0000:0000:0000 - 2001:4860:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
CIDR:       2001:4860:0000:0000:0000:0000:0000:0000/32
OriginAS:   AS15169
NetName:    GOOGLE-IPV6

Oder im Firefox:

with_ipv6

Ihr surft nun also transparent in beiden Netzen. Falls eine Adresse ins IPv6 führt, wird es über gogo6 geroutet, bei IPv4 bleibt alles beim alten.

Man kann nun auch noch bei gogo6 den Freenet6 Tunnel Service nutzen und eine feste IPv6 Adresse bekommen. Dazu mußt man sich auf einer Seite registrieren, und mit diesen Registrierungsdaten die gw6c.conf anpassen. Und schon hat man eine statische IPv6 Adresse, unter der man auch seinen Rechner zuhause erreichen kann und Dienste anbieten kann.

Für Windows gibt es hier die Anleitung mit vielen Screenshots 🙂

Weitere Seiten, die man mit IPv6 Zugangn besuchen kann:

http://www.six.heise.de

http://www.ipv6.bieringer.de (mit Informationen über die eigene IPv6-Adresse)

http://www.kame.net Die tanzende IPv6-Schildkröte aus Japan

ACHTUNG: Mit einem solchen Tunnel erhaltet ihr eine öffentliche IPv6-Adresse. Ihr umgeht damit euren Router/NAT und seid direkt aus dem Internet erreichbar. Achtet also darauf, welche Dienste ihr ins Internet zur Verfügung stellt! Eventuell müßt ihr eine lokale Firewall installieren/konfigurieren, damit ihr nicht zu einer Spam-Drohne werdet oder gar schlimmeres. Achtet auf Freigaben, lokale Entwickler-Webserver etc etc.

=======================================================

Interessante Kurzvideos über ping6, traceroute6, whois usw: http://ipv6.he.net/presentations.php

http://gogonet.gogo6.com/page/freenet6-tunnelbroker

http://gogonet.gogo6.com/page/help-center

http://gogonet.gogo6.com/page/service-status

Diese Anleitung sieht einfacher aus, hat bei mir aber nicht funktioniert: http://unquietwiki.blogspot.com/2009/10/go-go-dancing-on-internet-ipv6-anyway.html

Written by Michael Kliewe

November 17th, 2009 at 11:34 pm

Posted in Linux

Tagged with , , , , ,