#!/usr/bin/perl # Drakwizard # Copyright (C) 2002, 2005 Mandrakesoft # # Authors: Arnaud Desmons # Florent Villard # # 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 $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/wizards/web_wizard/images/apache.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; } }; $::Wizard_pix_up = "/usr/share/mcc/themes/default/web_server-mdk.png"; $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:"), fixed_val => \$o->{var}{internal} }, { label => N("Internet web server:"), fixed_val => \$o->{var}{external} }, { label => N("Document root:"), fixed_val => \$o->{var}{shared_dir} }, { label => N("User directory:"), fixed_val => \$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, next => 0, }, error_end => { name => N("Failed"), data => [ { label => N("Relaunch drakwizard, and try to change some parameters.") } ], no_back => 1, end => 1, next => 0, }, }; 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*\|)|{var}{shared_dir}>|; } $file if $old; substInFile { s|^(\s*\|){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 { // } cat_($file)) { append_to_file($file, < UserDir disabled AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Order allow,deny Allow from all Order deny,allow Deny from all EOF } $root = get_user_dir(); if ($o->{var}{user_mod}) { substInFile { s|(\s*)UserDir.*|$1UserDir $o->{var}{user_dir}|g; s|{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'); 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*/s...m!^\s*!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;