php4 mime_magic errors unter Debian 5

Nachdem das Debian 5.0 Update unserer Server problemlos durchlief und auch php4 weiterhin mit mysql funktionstüchtig blieb, tauchten im Apache error Log vereinzelt folgende Meldungen auf:

PHP Warning: mime_magic: type search/400 \\input text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type search/400 \\section text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type search/400 \\setlength text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type search/400 \\documentstyle text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type search/400 \\chapter text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type search/400 \\documentclass text/x-tex invalid in Unknown on line 0
PHP Warning: mime_magic: type regex [Cc]onstant[[:space:]]+[Ss]tory text/x-inform invalid in Unknown on line 0

Durch diesen Blog Eintrag wusste ich wo zu suchen ist und hab kurzerhand das ganze mit in die Aktualisierung eingebaut:

ln=$(grep -o -n "TeX documents, from Daniel Quinlan" /usr/share/misc/magic.mime|cut -f 1 -d:); \
sed "$ln,$(($ln+11))s/^/#/" /usr/share/misc/magic.mime |cat > /usr/share/file/magic.mime.new && \
mv /usr/share/file/magic.mime{.new,}

[confixx] Update / Install schlägt fehl

Das Confixx Update oder die Installation schlägt fehl, mit folgender Meldung:

/usr/bin/ld: crti.o: No such file: No such file or directory

Das besagt nur, dass die libc6-dev Bibliotek nicht installiert ist.

Debian / Ubuntu:

aptitude install libc6-dev

oder

yum install glibc6-devel

Debian Lenny Upgrade mit php4-mysql

Das Problem ist, dass das alte etch php4-mysql modul mit der neuen libaprutil1 inkompatibel ist.
Da wir unseren Kunden, welche es nach 4 Jahren PHP5 natürlich immernoch nicht alle geschafft haben Ihre PHP4 Anwendungen zu entsorgen, es nicht zumuten können auf einmal alles umzustellen, werden wir vorerst das php4-mysql modul und die libarputil1 einfach auf dem Stand von Etch holden.

Damit können wir problemlos auf Lenny Upgraden und behalten die PHP4 Version aus Etch bei.

Im einfachsten Fall einfach:

perl -pi -e 's/etch/lenny/g' /etc/apt/sources.list

oder c&p-ready sieht das dann so aus:

 scp -r ***server-01.de:/etc/apt/ /etc/
scp ***server-01.de:/etc/default/saslauthd /etc/default/

Dann gehts mit dem eigentlichen Update los:

echo libaprutil1 hold | dpkg --set-selections
perl -pi -e 's/--sql-config/--sql-config -u nobody/g' /etc/default/spamassassin

noch mehr Altlasten loswerden aus alten Standardinstallationen

aptitude remove tk8.4 ppp pppoeconf pppconfig pppoe \
ding x11proto-xext-dev libxv-dev libxmu-dev libxi-dev libt1-dev libxaw7-dev \
libxext-dev x11proto-video-dev x11proto-kb-dev x11proto-input-dev \
x11proto-fonts-dev x11proto-core-dev libx11-dev xlibs-static-dev x-dev \
libxt-dev libxpm-dev libxmu-headers libxfont-dev libxdmcp-dev libxcb1-dev \
libxcb-xlib0-dev libxau-dev libsm-dev libice-dev automake1.4 \
automake1.7 automake1.8 automake1.9 autoconf-archive \
autoconf  dhcp3-client dhcp-client xtrans-dev xcursor-themes \
xbitmaps wngerman wamerican usbutils stunnel4 slang1a-utf8 \
reportbug nvi ocaml-nox libgmp-ocaml libgmp-ocaml-dev bison \
flex m4 lpr linux-modules-2.6.18-6-xen-686 \
linux-image-2.6.18-6-xen-686 linux-2.6.23.1hosting-2 \
linux-2.6.24.2hosting-2 linux-2.6.25.1hosting-2 libxv1 libxtst6 \
libxtrap6 libxp6 libxaw7 libxmu6  libxmuu1 libxaw7 laptop-detect \
ispell iamerican ibritish ingerman ipchains gnu-efi eject \
dictionaries-common aspell aspell-de aspell-en myspell-de-at \
myspell-de-ch myspell-de-de php5-dev libgd2-xpm-dev \
libapache2-mod-php4 libapache2-mod-php5

aptitude update && apt-get dist-upgrade

apache meckert noch etwas, da suexec nicht standardmäßig mitinstalliert wird, dafür:
aptitude install apache2-suexec
Und da php5 wieder als Modul enabled wird, deinstallieren wir es nochmal!
aptitude remove libapache2-mod-php5
Da Confixx eine extra Listen Direktive in seiner mhost.conf hat, kommentieren wir dies in der port.conf einfach aus und sollten problemlos wieder apache starten können:

perl -pi -e 's/Listen 443/#Listen 443/g' /etc/apache2/ports.conf
/etc/init.d/apache2 restart

Wie hier beschrieben, müssen noch einige Änderungen an magic.mime vorgenommen werden:

ln=$(grep -o -n "TeX documents, from Daniel Quinlan" /usr/share/misc/magic.mime|cut -f 1 -d:); \
sed "$ln,$(($ln+11))s/^/#/" /usr/share/misc/magic.mime |cat > /usr/share/file/magic.mime.new && \
mv /usr/share/file/magic.mime{.new,}

Dann die SSL Protokoll Version von 3 auf 2 & 3 umstellen, damit auch nagios und alte Clients problemlos connecten können.

perl -pi -e 's/=SSL3/=SSL23/' /etc/courier/imapd-ssl /etc/courier/pop3d-ssl
/etc/init.d/courier-imap-ssl restart && /etc/init.d/courier-pop-ssl restart

Zuletzt noch phpmyadmin ins Confixx Verzeichnis kopieren und entsprechende Rechte und Ownerships setzen:

[ ! -x /root/confixx/ ] && exit || cd /var/www/confixx/html && \
rm -r phpmyadmin && cp -a /usr/share/phpmyadmin/ . && \
chown confixx.confixx phpmyadmin && chown -R confixx.confixx phpmyadmin/*

und da wir gerade aktualisieren, machen wir das ganze mit confixx auch gleich noch :-)
Sollte confixx in Version 3.3.6 schon draufsein reicht es auch, das Update Script laufen zu lassen und die Perl Module neu zu installieren:
echo 0 | /root/confixx/admin/updates/update_3.x.pl
alternativ, holen wir es uns von unserem internen Server und aktualisieren das Ganze:

rm confixx_*.tgz; scp ***:confixx_*.tgz .
mv /root/confixx/admin /root/confixx/admin_336/
tar -C /root/confixx -xzvf confixx_*.tgz
echo "0" | /root/confixx/admin/updates/update_3.x.pl

xen vhost install

just a reminder for a short xen vhost debootstrap install on a xen server with lvm volumegroup named vg
replace the *.*.*.* stuff with the ip and network address and *.domain.tld with the host- and domainname

xen-create-image --hostname=*.domain.tld --lvm vg \
--size=80Gb --swap=2GB --ip=*.*.*.102 --memory=1000Mb \
--arch=i386 --role=udev --netmask=255.255.255.0 --gateway=*.*.*.1 \
--fs=ext3 --install --install-method=debootstrap --dist=lenny \
--mirror=http://ftp.de.debian.org/debian --force --passwd

optimize mysql database tables

how to run a optimized table – query for a whole database?

for MyISAM databases you can use the following code:

cd /var/lib/mysql/$DBNAME
for i in `find . -maxdepth 1 -type f -name "*.MYI"`; do j=${i#./}; mysql -u root \
-p`cat /root/.mysql_shadow` $(basename `pwd`) -e "OPTIMIZE TABLE ${j%.MYI};"; done

[Plesk] Dateien aus Plesk Backups Dumps

Zunächst benötigen wir munpack oder alternativ dazu ripmime. Beides funktioniert ähnlich, für Debian / Ubuntu ist allerdings mpack zu empfehlen, da dies schon im repository zu finden ist.
Installiert wird mit:
# sudo aptitude install mpack
Danach noch schnell ein Verzeichnis für das entpackte Backup anlegen und dort entpacken

# mkdir backup
# cd backup
~/backup# zcat ../domain.tld_2010.01.01_12.00 | munpack

Und schon haben wir alles was wir suchen:

~/backup/# ls
domain.tld-1.mysql domain.tld.anon-ftpstat domain.tld.cgi-bin
domain.tld.error-docs domain.tld.ftpstat domain.tld.httpdocs
domain.tld.httpsdocs domain.tld.logs domain.tld.private
domain.tld.webstat domain.tld.webstat-ssl dump.xml httpdocs
mailname@domain.tld.attach mailname@domain.tld.mdir smime.p7s

Die einzelnen Dateien kann man dann einfach mit tar entpacken:

# mkdir httpdocs
# cd httpdocs
~/backup/httpdocs# tar xvf ../domain.tld.httpdocs

weird doctrine overrides

I found a little strange behaviour when trying to override the
constructor of a class in the doctrine ORM framework.

I have this really small example, a party with guests n:m

class Guest extends Doctrine_Record
{
    public function __construct($firstname=null, $lastname=null)
    {
        parent::__construct();
        if ($firstname)
            $this->firstname = $firstname;
        if ($lastname)
            $this->lastname = $lastname;
    }

    public function setTableDefinition()
    {
        $this->hasColumn('firstname', 'string', 100);
        $this->hasColumn('lastname', 'string', 100);
    }
    public function setUp()
    {
        $this->hasMany('Party as Parties', array(
                'local' => 'guest_id',
                'foreign' => 'party_id',
                'refClass' => 'GuestList'
            )
        );
    }
}

In my code I do something like:

$g = new Guest("Hans", "Hansen");
echo "firstname: ".$g->firstname;

result is:

Fatal error: Uncaught exception 'Doctrine_Table_Exception' with message
'Unknown relation alias firstname'
in /usr/share/php/Doctrine/lib/Doctrine/Relation/Parser.php:237
Stack trace:
#0 /usr/share/php/Doctrine/lib/Doctrine/Relation/Parser.php(235): Doctrine_Relation_Parser->getRelation('firstname', false)
#1 /usr/share/php/Doctrine/lib/Doctrine/Table.php(1001): Doctrine_Relation_Parser->getRelation('firstname', true)
#2 /usr/share/php/Doctrine/lib/Doctrine/Record.php(1544): Doctrine_Table->getRelation('firstname')
#3 /usr/share/php/Doctrine/lib/Doctrine/Record.php(1478): Doctrine_Record->coreSetRelated('firstname', Object(Doctrine_Table))
#4 /usr/share/php/Doctrine/lib/Doctrine/Record.php(1435): Doctrine_Record->_set('firstname', Object(Doctrine_Table), true)
#5 /usr/share/php/Doctrine/lib/Doctrine/Access.php(60): Doctrine_Record->set('firstname', Object(Doctrine_Table))
#6 /home/micha/svn/*/models/Guest.php(10): Doctrine_Access->__set('firstname', Object(Doctrine_Table))
#7 /usr/share/php/Doctrine/lib/Doc in /usr/share/php/Doctrine/lib/Doctrine/Relation/Parser.php on line 237

I thought maybe se setup() or another function is called and i’m new to doctrine so maybe i just missed something.
The suprising thing is, when I create a setFirstname($firstname) setter, all works as expected. Also when I remove the firstname part from the __constructor, and leave the lastname part in there. I can set the
lastname w/o any setter function.

$g = new Guest("Hans", "Hansen");
echo "lastname: ".$g->lastname;

works fine.

My yaml scheme looks like:

Guest:
  connection: 0
  tableName: guest
  columns:
    id:
      type: integer(8)
      autoincrement: true
      primary: true
    firstname: string(100)
    lastname: string(100)
  relations:
    Parties:
      refClass: GuestList
      class: Party
      local: guest_id
      foreign: party_id
      type: many
    GuestList:
      local: id
      foreign: guest_id
      type: many

Maybe one of you can give me a hint, how to find a solution or could me explain WHY this happens.

[Plesk] recover mail passwords

Eine einfache und elegante Möglichkeit Plesk Mailpasswörter aus der Datenbank zu holen:

mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e \
"select concat(mail_name,'@',name) as email_address,accounts.password
from mail left join domains on (domains.id=mail.dom_id)
left join accounts on (accounts.id=mail.account_id);"

[Plesk] “Recipient address rejected: User unknown in virtual alias table”

Trotz korrekt eingerichteter E-Mail Adresse erscheint diese Meldung im Log?
Oder nachdem aus Versehen ein Benutzer gelöscht und dann aus dem Backup wiederhergestellt wurde, werden die Mailkonten, trotz import aus der psa Datenbank nicht korrekt angelegt?
Der Fehler kommt von den entsprechend Fehlenden Einträgen in der Datei:
/var/spool/postfix/plesk/virtual.db
Man kann dies ganz gut mittels:
# strings /var/spool/postfix/plesk/virtual.db|grep 0x23.de
überprüfen. Sollte der Mailaccount unter Plesk eingerichtet sein, aber dort nicht aufgeführt werden, so werden die Mails mit entsprechender Meldung zurückgehen.
Man kann die Accounts wieder aktivieren mit folgendem Befehl (z.Bsp: webmaster@0×23.de)
# /opt/psa/admin/sbin/mailmng --add-mailname --domain-name=0x23.de --mailname=webmaster

doctrine generate php script

a sample script to build your database or models

// generate.php
require_once('bootstrap_build.php');
if (!in_array($argv[1], array("yaml", "models")))
        exit(1);
Doctrine_Core::dropDatabases();
Doctrine_Core::createDatabases();
if ($argv[1] == "models") {
        Doctrine_Core::generateModelsFromYaml('schema.yml', 'models');
}
if ($argv[1] == "yaml") {
        Doctrine_Core::generateYamlFromModels('schema.yml', 'models');
}
Doctrine_Core::createTablesFromModels('models');