diff options
Diffstat (limited to 'web_wizard/Apache.pm')
-rwxr-xr-x | web_wizard/Apache.pm | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/web_wizard/Apache.pm b/web_wizard/Apache.pm new file mode 100755 index 00000000..088ca66e --- /dev/null +++ b/web_wizard/Apache.pm @@ -0,0 +1,278 @@ +#!/usr/bin/perl + +# Drakwizard + +# Copyright (C) 2002, 2005 Mandrakesoft +# +# Authors: Arnaud Desmons <adesmons@mandrakesoft.com> +# Florent Villard <warly@mandrakesoft.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +package MDK::Wizard::Apache; +use strict; + +use common; +use services; +use MDK::Wizard::Wizcommon; +use MDK::Wizard::Varspaceval; + +my $wiz = new MDK::Wizard::Wizcommon; +my $in = interactive->vnew; + +my $file = "/etc/httpd/conf/httpd.conf"; +my $root; + +my $config; +my $o = { + name => N("Web wizard"), + var => { + web_internal => '', + web_external => '', + user_mod => '', + user_dir => '', + shared_dir => '' + }, + needed_rpm => [ 'apache-mpm-prefork', 'apache-mod_userdir' ], + defaultimage => "/usr/share/mcc/themes/default/web_server-mdk.png", + init => sub { + if (-f $file) { + open my $FH, $file or die "$! ($file)"; + local $_; + while (<$FH>) { + if (/^\s*#?\s*DocumentRoot\s+(.*)/) { + close($FH); + $root = $1; + $root =~ s/\"//g; + last; + } + } + close($FH); + } else { + return 0, N("%s does not exist.", $file); + } + 1; + } + }; + +$o->{pages} = { + welcome => { + name => N("Web server configuration wizard") . "\n\n" . N("This wizard will help you configuring the Web server for your network."), + post => sub { $wiz->check_dhcp }, + no_back => 1, + next => 'config', + }, + config => { + name => N("Web server") . "\n\n" . N("Your server can act as a Web server toward your internal network (intranet) and as a Web server for the Internet.") . "\n\n" . N("Select the kind of Web service you want to activate:") . "\n\n" . N("Don't check any box if you don't want to activate your Web server."), + pre => sub { + $o->{var}{web_internal} = 1; + $o->{var}{web_external} = 1; + }, + data => [ + { text => N("Enable the Web server for the intranet"), type => 'bool', val => \$o->{var}{web_internal} }, + { text => N("Enable the Web server for the Internet"), type => 'bool', val => \$o->{var}{web_external} }, + ], + next => 'ask_mod', + }, + dhcp_warning => { + name => N("Warning.") . "\n\n" . N("You are in dhcp, server may not work with your configuration."), + ignore => 1, + next => 'config', + }, + ask_mod => { + name => N("Modules:") . "\n\n" . N("* User module: allows users to have a directory in their home directories available on your http server via http://www.yourserver.com/~user, you will be asked for the name of this directory afterward."), + pre => sub { $o->{var}{user_mod} = is_last_user_mod() }, + data => [ + { text => join("\n", warp_text(N("Allows users to get a directory in their home directories available on your http server via http://www.yourserver.com/~user."), 70)), type => 'bool', val => \$o->{var}{user_mod} }, + ], + post => sub { return 'user_dir' if $o->{var}{user_mod} }, + next => 'ask_dir', + }, + user_dir => { + name => N("Type the name of the directory users should create in their homes (without ~/) to get it available via http://www.yourserver.com/~user"), + pre => sub { + $o->{var}{user_dir} = get_user_dir(); + if ($o->{var}{user_dir} =~ /disabled/ or !$o->{var}{user_dir}) { + $o->{var}{user_dir} = 'public_html'; + } + }, + complete => sub { + if (!$o->{var}{user_dir}) { + $in->ask_warn(N('Error'), N('You must specify a user directory.')); return 1; + } else { return 0; }; }, + data => [ + { label => N("user http sub-directory: ~/"), help => N("Type the name of the directory users should create in their homes (without ~/) to get it available via http://www.yourserver.com/~user"), val => \$o->{var}{user_dir} }, + ], + next => 'ask_dir', + }, + ask_dir => { + name => N("Type the path of the directory you want being the document root."), + pre => sub { $o->{var}{shared_dir} ||= $root }, + data => [ + { label => N("Document root:"), val => \$o->{var}{shared_dir} }, + ], + complete => sub { + if (! -d $o->{var}{shared_dir}) { + $in->ask_warn(N("Error"), N("The path you entered does not exist.")); return 1; } + else { return 0; }; + }, + next => 'summary', + }, + summary => { + name => N("Configuring the Web server") . "\n\n" . N("The wizard collected the following parameters needed to configure your Web server") . "\n\n" . N("To accept these values, and configure your server, click the Next button or use the Back button to correct them."), + pre => sub { + $o->{var}{internal} = $o->{var}{web_internal} ? N("enabled") : N("disabled"); + $o->{var}{external} = $o->{var}{web_external} ? N("enabled") : N("disabled") + }, + data => [ + { label => N("Intranet web server:"), val_ref => \$o->{var}{internal} }, + { label => N("Internet web server:"), val_ref => \$o->{var}{external} }, + { label => N("Document root:"), val_ref => \$o->{var}{shared_dir} }, + { label => N("User directory:"), val_ref => \$o->{var}{user_dir} }, + ], + post => \&do_it, + next => 'end', + }, + end => { + name => N("Congratulations") . "\n\n" . N("The wizard successfully configured your intranet/Internet Web server"), + end => 1, + }, + error_end => { + name => N("Failed"), + data => [ { label => N("Relaunch drakwizard, and try to change some parameters.") } ], + no_back => 1, + end => 1, + }, + }; + +sub new { + my ($class, $conf) = @_; + $config = $conf; +# if ($config->{ver} == 2) { + $file = "/etc/httpd/conf/httpd.conf"; +# $o->{needed_rpm} = [ 'apache2' ]; + $o->{var}{servicecheck} = 'httpd'; +# } else { +# $file = "/etc/httpd/conf/httpd.conf"; +# $o->{needed_rpm} = [ 'apache-1.3' ]; +# $o->{var}{servicecheck} = 'httpd'; +# } + bless $o, $class; +} + +sub chg_docroot { + my $old; + substInFile { + s|(^\s*#?\s*DocumentRoot\s*)(\S*).*|$1$o->{var}{shared_dir}| and $old ||= $2; + } $file; + + substInFile { + s|^(\s*\|)<Directory\s*$old/?>|<Directory $o->{var}{shared_dir}>|; + } $file if $old; + + substInFile { + s|^(\s*\|)<Directory\s*.*|<Directory $o->{var}{shared_dir}>|; + } $file; +} + +sub is_user_mod { + if ($o->{var}{user_mod}) { + return 1; + } + $o->{var}{user_mod} = "disabled"; + 0; +} + +sub is_last_user_mod { + my $root = get_user_dir(); + chomp($root); + !($root eq 'disabled'); +} + +sub get_user_dir { + my %conf = MDK::Wizard::Varspaceval->get($file); + $conf{UserDir}; +} + +sub chg_user_dir { + # disable by default user_mod + if (! any { /<IfModule mod_userdir.c>/ } cat_($file)) { + append_to_file($file, <<EOF); +# add usermod dir support +<IfModule mod_userdir.c> + UserDir disabled +</IfModule> + +<Directory /home/*/> + AllowOverride FileInfo AuthConfig Limit + Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec + <Limit GET POST OPTIONS PROPFIND> + Order allow,deny + Allow from all + </Limit> + <LimitExcept GET POST OPTIONS PROPFIND> + Order deny,allow + Deny from all + </LimitExcept> +</Directory> +EOF + } + + $root = get_user_dir(); + if ($o->{var}{user_mod}) { + substInFile { + s|(\s*)UserDir.*|$1UserDir $o->{var}{user_dir}|g; + s|<Directory\s+/home/\*/.*|<Directory /home/\*/$o->{var}{user_dir}>|g; + } $file; + } else { + substInFile { + s|(\s*)UserDir\s*$root|$1UserDir disabled|g; + } $file; + } +} + +sub do_it { + $::testing and return; + my $in = 'interactive'->vnew('su', 'Apache'); + check_starts_on_boot($in, 'httpd'); + my $w = $in->wait_message(N("Apache server"), N("Configuring your system as Apache server ...")); + + my $that = "localhost"; + if ($o->{var}{web_external} eq "1") { + $that = "all"; + } + elsif ($o->{var}{web_internal} eq "1") { + ($that) = $wiz->{net}->itf_get("IPADDR") =~ qr/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{1,3}$/; + $that .= " 127.0.0.1"; + } + cp_af($file, $file.".orig"); + substInFile { + if (m/^\s*<Directory.*>/s...m!^\s*</Directory>!s) { + { s/^\s*Allow .*$/ Allow from $that\n/s } + } + } $file; + chg_docroot(); + chg_user_dir(); + + if (services::is_service_running('httpd')) { + services::restart('httpd') + } else { + services::start('httpd') + } + undef $w; + check_started($o->{var}{servicecheck}); +} + +1; |