Apache Configfile einlesen, Parameter verändern und speichern

cIrCa

Mitglied
Hallo Tutorials.de!

Ich versuche seit Stunden (ja, wirklich!), eine Apache2 Konfiguration mit PHP einzulesen, die Konfiguration zu ändern, und dann wieder zu speichern.

Das Ganze ist aber nicht über ein einziges Textfeld, wo die ganze Datei dann drin ist, sondern über einzelne Felder zu verarbeiten.

Das heisst, wenn die Konfigurationsdate so aussieht:
Code:
<VirtualHost *:80>
ServerName domain.tld
ServerAlias www.domain.tld
ServerAdmin webmaster@domain.tld
[...]
</VirtualHost>
...Soll für 'ServerName', ServerAlias', ServerAdmin' und weitere Angaben ein einzelnes Formularfeld erscheinen.
Dies hab ich nun geschafft - die Daten werden auch einzeln ausgelesen.

Nun das eigentliche Problem, nachdem die Daten ausgelesen sind:
Ich weiss nicht, wie ich diese nun speichere. Dass das File neu geschrieben werden muss, ist mir bewusst - nur, wie ?
Ich bin auch nicht Regex-Profi...

Hm, ja, ich hoffe, es versteht einer mein Problem und kann mir helfen.
Habe mir wirklich schon den Kopf zerbrochen - nach stundenlangem :google:

Vielen Dank für eure Hilfe!

Grüsse aus der Schweiz,
circa
 
Der Zugriff ist das kleinste Problem - ich verwalte die Server.
Ich will damit ein Hosting-Panel machen.

Die schon vorhandenen, fertigen Systeme sind uns zu unflexibel.

Nach den fast 8 Stunden, während denen ich mich um dieses Problem gekümmert habe, bin ich auch bei den Dateisystemfunktionen auf keine Lösung gekommen.
Klar gäbe es eine Lösung, nur habe ich sie nicht vor Augen...

Ich probiere ständig irgendwelches Zeugs aus, und komme auf keine Lösung.
 
Die Frage den Zugriffs bezog sich insbesondere von der Basis PHPs ausgehend, also ob du mit PHP Zugriff auf die Konfigurationsdatei hast. Denn das bezweifle ich.
 
Ich habe nicht direkt via php Zugriff auf /etc/*, nein.
Aber wie gesagt, das ist dann das kleinste Problem.

Mich würde hauptsächlich interessieren, wie ich sowas realisieren kann.
Die Datei kann ich zum realisieren auch einfach im DocumentRoot speichern.

Vielen Dank für deine schnelle Antwort.
 
Ja, diese beiden Funktionen kenne ich.
Ich zeig dir mal, was ich bereits habe...
Aber ist wirklich peinlich, stimmt sicher nichts.

Also, hier:
PHP:
<?php
// Das Config-File wird testweise nicht aus /etc/apache2/sites-available/ ausgelesen
$file = './vhost.conf';

// Neue Angaben
$servername = 'domain.tld';
$serveralias = '*.domain.tld';
$serveradmin = 'webmaster@domain.tld';

// Ab hier sollten dann die alten Angaben ausgelesen werden, und durch die neuen ersetzt werden
   $file = file_get_contents($file);
   $file = preg_match('/<VirtualHost\s(\S+)>(.+)<\/VirtualHost>/ims', $file, $match);
   $host = $match[2];
   preg_match('/(\S+)\s(.+)/i', $match[2], $foo);
     $file = preg_replace('/ServerName\s(\S+)(\s(\S+))*/i', 'ServerName '.$servername, $file);
     $file = preg_replace('/ServerAlias\s(\S+)(\s(\S+))*/i', 'ServerAlias '.$serveralias, $file);
     $file = preg_replace('/ServerAdmin\s(\S+)(\s(\S+))*/i', 'ServerAdmin '.$serveradmin, $file);
   
   $c = count($foo);
   for ($i = 1;$i <= $c; $i++) {
     echo $foo[$i]."\n";  
 }

 ?>

Die Funktion zum Speichern der Daten ist nicht eingebaut - ich bin schon froh, wenn die Ausgabe funktioniert ;-)
 
Probier mal Folgendes:
PHP:
<?php 

	$filename = './vhost.conf';
	$array = array(
		'ServerName'  => 'domain.tld',
		'ServerAlias' => '*.domain.tld',
		'ServerAdmin' => 'webmaster@domain.tld'
	); 

	$file = file_get_contents($filename);
	$file = preg_replace('/(<VirtualHost\s\S+>)(.*?)(<\/VirtualHost>)/eis', '"\1".foobar("\2", $array)."\3"', $file);

	function foobar( $data, $array )
	{
		foreach( $array as $key => $value ) {
			$data = preg_replace('/(\s*'.preg_quote($key).'\s+).*(#.*)?$/im', '\1'.$value.'\2', $data);
		}
		return $data;
	}

	echo htmlspecialchars($file);

?>
 
Herzlichen Dank Gumbo,
soweit funktionierts!

Kannst du evt. mal noch prüfen, ob das mit dem Daten auslesen evt. noch effektiver, kürzer und einfacher ginge ?
Hier der Code:
PHP:
$file = '/etc/apache2/sites-available/user'.$_SESSION['FE_UID'].'.'.$row['domain_name'];
preg_match('/ServerAlias\s(\S+)(\s(\S+))*/i', file_get_contents($file),$serveralias);
preg_match('/ServerName\s(\S+)(\s(\S+))*/i', file_get_contents($file),$servername);
preg_match('/ServerAdmin\s(\S+)(\s(\S+))*/i', file_get_contents($file),$serveradmin);


echo "<FORM action=\"\" method=\"POST\" enctype=\"multipart/form-data\">
ServerName: <INPUT type=\"text\" name=\"servername\" value=\"$servername[1]\"><br>
ServerAlias: <INPUT type=\"text\" name=\"serveralias\" value=\"$serveralias[1]\"><br>
ServerAdmin: <INPUT type=\"text\" name=\"serveradmin\" value=\"$serveradmin[1]\">
</FORM>";

Sorry, etwas unsaubere Code, ich weiss :)
 
Hmm, funktioniert soweit wirklich.
Nun gibts noch ein Problem, wenn ich ScriptAlias ändern will:
PHP:
$array = array(
        'ServerName'  => $servername,
        'ServerAlias' => $serveralias,
        'ServerAdmin' => $serveradmin,
        'SuexecUserGroup' => $user.' '.$user,
        'DocumentRoot' => $documentroot,
        'ScriptAlias /cgi-bin/' => $scriptalias_cgi
    );

Wenn ich /cgi-bin/ drin hab', funktionerts nicht, und es wird folgende Fehlermeldung ausgegeben:
Code:
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in [...]

Und wenn ich in der Config den Eintrag '<Directory "/www/php-fcgi-scripts/user101">' ändern will, gibts ein weiteres Problem:
Was, wenn in der Config mehrere <Directory> Direktiven gesetzt sind?
Das selbe auch bei ScriptAlias.

Hast Du, oder jemand anderes hier eine Idee, wie man dies ändern kann ?
Habe von regex keine Ahnung (würde es gerne lernen..).

Wahrscheinlich ists nur eine kleine Sache - ich vermute die beiden '/' werden vom regex falsch interpretiert.
 
Zuletzt bearbeitet:
Zurück