Schrift
[thread]632[/thread]

Virtuelle Hosts hinzufügen/löschen with a CGI: concerning Apache?s vhosts.conf file



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
pearl-man
 2005-12-21 09:45
#6408 #6408
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Sers,

möchte per CGI-Script neue V-Hosts anlegen bzw. löschen. Dies geschieht durch das editieren der Datei vhosts.conf des Apache-Webservers. Ein Beispiel einer vhosts.conf wäre:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
...
<VirtualHost 10.0.0.1>
ServerName www.domain.tld
ServerAlias domain.tld
DocumentRoot /var/www/domain.tld/html
User domain.tld-user
Group ftpuser
RewriteEngine On
RewriteCond %|{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
ScriptAlias /cgi-bin /var/www/domain.tld/cgi-bin
php_admin_value open_basedir /var/www/domain.tld/
php_admin_value upload_tmp_dir /var/www/domain.tld/temp
php_admin_value session_save_path /var/www/domain.tld/temp
php_admin_value safe_mode on
CustomLog /var/www/domain.tld/log/bocks.de-access.log combined
ErrorLog /var/www/domain.tld/log/bocks.de-error.log
ErrorDocument 404 /404.html
</VirtualHost>

<VirtualHost 10.0.0.1>
ServerName www.domain2.tld
ServerAlias domain2.tld
DocumentRoot /var/www/domain2.tld/html
User domain2.tld-user
Group ftpuser
RewriteEngine On
RewriteCond %|{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
ScriptAlias /cgi-bin /var/www/domain2.tld/cgi-bin
php_admin_value open_basedir /var/www/domain2.tld/
php_admin_value upload_tmp_dir /var/www/domain2.tld/temp
php_admin_value session_save_path /var/www/domain2.tld/temp
php_admin_value safe_mode on
CustomLog /var/www/domain2.tld/log/bocks.de-access.log combined
ErrorLog /var/www/domain2.tld/log/bocks.de-error.log
ErrorDocument 404 /404.html
</VirtualHost>

<VirtualHost 10.0.0.1>
ServerName www.domain3.tld
ServerAlias domain3.tld
DocumentRoot /var/www/domain3.tld/html
User domain3.tld-user
Group ftpuser
RewriteEngine On
RewriteCond %|{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
ScriptAlias /cgi-bin /var/www/domain3.tld/cgi-bin
php_admin_value open_basedir /var/www/domain3.tld/
php_admin_value upload_tmp_dir /var/www/domain3.tld/temp
php_admin_value session_save_path /var/www/domain3.tld/temp
php_admin_value safe_mode on
CustomLog /var/www/domain3.tld/log/bocks.de-access.log combined
ErrorLog /var/www/domain3.tld/log/bocks.de-error.log
ErrorDocument 404 /404.html
</VirtualHost>
...


Das hinzufügen eines neues VirtualHosts stellt kein Problem dar, doch was wenn ich einen vorhandenen Eintrag wie den von der Domain domain2.tld (im oberen Beispiel) aus der vhosts.conf entfernen will. Zumal ja nicht in jeder Zeile des vhosts (also alles zwischen <VirtualHost> und </VirtualHost> den Domainnamen enthält und einige Zeilen (z.B. 'ErrorDocument 404 /404.html') in mehreren Vhost Einträgen auftauchen.
Wie kann ich also einen Text-Filter bzw. eine Maske erstellen, die mir bei gegebenen Domainnamen und zuständigen User den entsprechenden Eintrag aus der Vhosts.conf file löscht?

mfg pearl-man
nepos
 2005-12-21 10:08
#6409 #6409
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du koenntest das Modul CPAN:Config::General mal testen. Das liest Konfigurationen in Apache-Format und bietet einige Funktionen, um die eingelesen Konfig zu bearbeiten. Dann muesstest du nur noch den entsprechenden Key loeschen und die Konfig wieder speichern.
pearl-man
 2005-12-21 16:13
#6410 #6410
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Das Modul Config::General ist eventl. ne Lösung, habs jedoch so gmacht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub del_vhost # ($_[0] = $domain)
{
open(VHOSTS, "<$vhosts_file") || &error("Kann die Datei $vhosts_file nicht lesen!", 1);
my $content = "";
while (<VHOSTS>){
$content.=$_;
}
close(VHOSTS);
my @vhosts = split(/\n\n/, $content);
open(OUT, ">$vhosts_file") || &error("Kann nicht in die Datei $vhosts_file schreiben!");
flock(OUT, LOCK_EX);
foreach my $vhost (@vhosts){
if (!($vhost =~ /ServerName\s*www.$domain/)){
print OUT $vhost."\n\n";
}
}
close(OUT);
&info("VHOST", "Entferne Virtuellen Host($_[0]).");
}
murphy
 2005-12-21 16:42
#6411 #6411
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Der erste Teil des Codes lässt sich vereinfachen. Statt
Code: (dl )
1
2
3
4
5
6
7
open(VHOSTS, "<$vhosts_file") || &error("Kann die Datei $vhosts_file nicht lesen!", 1);
my $content = "";
while (<VHOSTS>){
      $content.=$_;
}
close(VHOSTS);
my @vhosts = split(/\n\n/, $content);

könntest du etwas einfacher und effizienter
Code: (dl )
1
2
3
4
open(VHOSTS, '<', $vhosts_file) || &error("Kann die Datei $vhosts_file nicht lesen!", 1);
my @vhosts;
{ local $/ = "\n\n"; @vhosts = <VHOSTS>; }
close(VHOSTS);

schreiben. Oder noch etwas genereller anwendbar, was die Eingabedaten angeht:
Code: (dl )
1
2
3
4
open(VHOSTS, '<', $vhosts_file) || &error("Kann die Datei $vhosts_file nicht lesen!", 1);
my @vhosts;
{ local $/ = ''; @vhosts = <VHOSTS>; }
close(VHOSTS);


Siehe zur Erklärung perldoc perlvar, Abschnitt über $/.\n\n

<!--EDIT|murphy|1135176707-->
When C++ is your hammer, every problem looks like your thumb.
pearl-man
 2005-12-22 13:27
#6412 #6412
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Vilen Dank für den Tip. Werd ich gleich in die Tat umsetzen.

mfg pearl-man
Strat
 2005-12-22 17:12
#6413 #6413
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wie gefaellt euch eigentlich folgendes?
Code: (dl )
1
2
3
4
5
6
7
open (VHOSTS, "<", $vhosts_file)
or &error("Kann die Datei '$vhosts_file' nicht lesen: $!", 1);
my @vhosts = do {
local $/ = "\n\n";
<VHOSTS>;
};
close(VHOSTS);
\n\n

<!--EDIT|Strat|1135264409-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
murphy
 2005-12-22 17:40
#6414 #6414
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Strat: Das ist natürlich stilistisch ausgefeilt ;)
When C++ is your hammer, every problem looks like your thumb.
pq
 2005-12-22 18:41
#6415 #6415
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,22.12.2005, 16:12]wie gefaellt euch eigentlich folgendes?
Code: (dl )
1
2
3
4
5
6
7
open (VHOSTS, "<", $vhosts_file)
 or &error("Kann die Datei '$vhosts_file' nicht lesen: $!", 1);
my @vhosts = do {
 local $/ = "\n\n";
 <VHOSTS>;
};
close(VHOSTS);
[/quote]
naja... =)
Code: (dl )
1
2
3
4
5
6
my @vhosts = do {
 open my $vhosts, '<', $vhosts_file
   or error("Kann die Datei '$vhosts_file' nicht lesen: $!", 1);
 local $/ = '';
 <$vhosts>;
};

spart das close, und setzt $/ noch etwas sinnvoller.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2005-12-22 20:27
#6416 #6416
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Den Eingabedatensatztrenner auf den leeren String zu setzten schlug ich auch schon vor.

Aber ist es wirklich garantiert, dass die Datei genau am Ende des Blockes, wenn der Referenzzähler für $vhosts auf Null fällt geschlossen wird, oder könnte es sein, dass das erst irgendwann später passiert? Ich habe nicht genug Ahnung von den Perl Interna um mir diese Frage selbst zu beantworten, hätte aber immer close von Hand aufgerufen, denn sicher ist sicher. Unter Java bekommt man mit ähnlichen Konstruktionen zum Beispiel Probleme, weil die Datei sonstwann geschlossen wird -- aber Java verwendet auch einen konservativen Garbagecollector und keine Referenzzähler.
When C++ is your hammer, every problem looks like your thumb.
Strat
 2005-12-22 23:24
#6417 #6417
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn man eine my-variable als filehandle verwendet, wird die der garbage-collection zugefuehrt, sobald der do-block beendet wird. und da wird dann automatisch geclosed. bei open (VHOSTS, "<", $xxx) hingegen nicht, weil VHOSTS global ist.

@pq: stimmt, macht sinn, das open da auch gleich noch reinzupacken. allerdings wuerde ich persoenlich das close hinschreiben (aber auch lexikalische $fh verwenden)\n\n

<!--EDIT|Strat|1135287308-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-12-21 09:45.