Nachdem ich PHP/fcgi nach dem Tutorial wunderbar (wenn auch leicht abgewandelt) von Hand an's Laufen bekommen habe musste eine Lösung her, dass für alle Benutzer auch automatisch die entsprechenden Ordner mit dem php-"binary" und den richtigen Rechten angelegt wurde.
In den httpd-Spezial-Einstellungen von Confixx habe ich für alle Anbieter (auch die bestehenden) den folgenden Eintrag hinzugefügt:
Code: Select all
ScriptAlias /php /www/php-fcgi-scripts/##user##/
<Directory "/www/php-fcgi-scripts/##user##/">
AllowOverride None
Options +ExecCGI -MultiViews -Indexes
Order allow,deny
Allow from all
</Directory>
* Die Werte müssen natürlich entsprechend an die lokalen Pfade auf jedem Server angepasst werden.
Um Ordner und Kopiervorgänge zu automatisieren habe ich, mangels Perl-Kenntnissen, mit PHP ein lokales Skript geschrieben, das mir neben den Maildirs für neue POP3-Konten auch die PHP-FCGI-Dateien erstellt. Wer Verbesserungs- oder ganz andere Vorschläge hat - nur her damit!
Code: Select all
<?php
require 'DB.php';
function isclientdir($file){
if(preg_match("/kunde/i", $field)) return true;
}
$dsn = "mysql://xxxxxx:xxxxxxx@localhost/confixx";
$options = array('debug' => $debug, 'portability' => DB_PORTABILITY_ALL,);
$db = &DB::connect($dsn, $options);
$getusersdata = "SELECT kunde FROM `kunden` WHERE php = '1';";
$sql_usersdata = $db->getAll($getusersdata, $fetchmode = DB_FETCHMODE_ASSOC);
//print $sql_usersdata[1][kunde];
// create maildirs
$handle = opendir ('/home/');
while (false !== ($file = readdir ($handle))) {
if ($file != "." && $file != ".." && $file != "quaratine") {
if (! file_exists("/home/$file/Maildir") and isclientdir($file)) {
system ("maildirmake /home/$file/Maildir");
system ("chown $file:poponly /home/$file/Maildir -R");
}else{
// debug
}
}
}
closedir($handle);
// create php fcgi files and folders
$handle = opendir ('/www/php-fcgi-scripts');
$max = count($sql_usersdata);
$base = "/www/php-fcgi-scripts";
for ($i = 0; $i < $max; $i++) {
$file = $base."/".$sql_usersdata[$i][kunde]."/php";
$folder = $base."/".$sql_usersdata[$i][kunde];
$client = $sql_usersdata[$i][kunde];
if (!file_exists($file)){
//echo "mkdir $base/$client && cp $base/template/php $base/$client && chown $client.$client $base/$client/phpn";
system ("mkdir $base/$client && cp $base/template/php $base/$client && chown $client.$client $base/$client -R");
echo "Verzeichnis angelegt für $clientn";
}else{
$uid = fileowner($folder);
$pwd = posix_getpwuid($uid);
if ( $uid == 0){
system ("chown $client.$client $base/$client -R");
echo "Rechte bei $client geändertn";
}
}
}
closedir($handle);
?>
Das erledigt das bei uns auf dem Server via Cronjob dann alle 2 Minuten. Lastprobleme (auf dem Server liegen 150 Kunden) hat es keine bisher gegeben - das sollte bei einem popeligen PHP-Script wohl auch kein Thema sein.
Damit Confixx nicht meckert wurde mod_php4 ganz normal kompiliert und wird auch geladen, aber nicht eingesetzt. Aber sonst gibt's Haue vom Apache wegen dem ganzen Schund, den Confixx in die Vhosts an php-Einstellungen fummelt.
Zusätzlich wurde php als cgi kompliert um das Skript auszuführen - denn:
Kleine Anmerkung: Für alle Kunden sind system, exec etc natürlich über eine alternative php.ini gesperrt. PHP wurde parallel als CGI erstellt und hat eine eigene php.ini, wo system und Co aktiviert sind.
Ich hoffe damit eventuell einigen bei dem Thema helfen zu können. Mit einem apache als worker-multithread und php-fcgi geht definitiv die Post ab - man muss natürlich ein wenig mit den Instanzen spielen.