summaryrefslogtreecommitdiffstats
path: root/web_wizard/Apache.pm
diff options
context:
space:
mode:
Diffstat (limited to 'web_wizard/Apache.pm')
-rwxr-xr-xweb_wizard/Apache.pm278
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;