#!/usr/bin/perl # Drakwizard # Copyright (C) 2002, 2003 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::Postfix; use strict; use lib qw(/usr/lib/libDrakX); # required for service package use common; use MDK::Wizard::Wizcommon; use MDK::Wizard::Varspaceval; my $wiz = new MDK::Wizard::Wizcommon; my $wiz_domain_name = $wiz->{net}->network_get("DOMAINNAME"); my $wiz_host_name = $wiz->{net}->network_get("HOSTNAME"); my $o = { name => N("Postfix wizard"), var => { wiz_mail_masquerade => '', wiz_ext_mail_relay => '', wiz_myorigin => $wiz_domain_name, }, init => sub { check_sendmail(); my $t = any { /$wiz_host_name/ } cat_("/etc/hosts"); if ($t == 0) { return 0, N("Error, can't find your hostname in /etc/hosts. Exiting.") } 1 }, needed_rpm => [ 'postfix' ], defaultimage => "$ENV{__WIZ_HOME__}postfix_wizard/images/courrier.png" }; my %level = ( 1 => N("External mail server"), 2 => N("Internal mail server"), ); $o->{pages} = { welcome => { name => N("Internet mail configuration wizard") . "\n\n" . N("This wizard will help you configure an internal mail server for your network, or configure an external mail server."), no_back => 1, pre => sub { $o->{var}{wiz_level} ||= 1; }, post => sub { if ($o->{var}{wiz_level} == 2) { return 'originext' } }, data => [ { label => N("What do you want to do:"), val => \$o->{var}{wiz_level}, list => [ keys %level ], format => sub { $level{$_[0]} } }, ], next => 'external', }, external => { name => N("Outgoing mail address") . "\n\n" . N("You can select the kind of address that outgoing mail will show in the \"From:\" and \"Reply-to\" field.") . "\n\n" . N("This should be chosen consistently with the address you use for incoming mail."), pre => sub { $o->{var}{wiz_mail_masquerade} ||= get_mail_masquerade(); }, complete => sub { print "in is $::in\n"; if ($o->{var}{wiz_mail_masquerade} !~ /\w+\.\w+$/) { $::in->ask_warn(N("Error"), N("Masquerade should be a valid domain name such as \"mydomain.com\"!")); return 1; } }, data => [ { label => N("Masquerade domain name:"), val => \$o->{var}{wiz_mail_masquerade} }, ], next => 'isp', }, warning => { name => N("Warning:") . "\n\n" . N("You entered an empty address for the mail gateway.") . "\n\n" . N("Your choice can be accepted, but this will not allow you to send mail outside your local network. Press next to continue, or back to enter a value."), next => 'summaryext', }, error_sendmail => { name => N("Error, sendmail is installed, please remove it before install and configure Postfix"), no_back => 1, next => 0, end => 1, }, isp => { name => N("Internet mail gateway") . "\n\n" . N("Your server will send the outgoing through a mail gateway, that will take care of the final delivery.") . "\n\n" . N("Internet host names must be in the form \"host.domain.domaintype\"; for example, if your provider is \"provider.com\", the internet mail server is usually \"smtp.provider.com\"."), pre => sub { $o->{var}{wiz_ext_mail_relay} ||= get_mail_relay(); }, post => \&check_relay, data => [ { label => N("Mail server name:"), val => \$o->{var}{wiz_ext_mail_relay} }, ], next => 'originext', }, originext => { name => N("The myorigin parameter specifies the domain that locally-posted mail appears to come from") . "\n\n" . N("The default is to append myhostname which is fine for small sites."), pre => sub { $o->{var}{wiz_myorigin} ||= get_myorigin(); }, data => [ { label => N("myorigin:"), val => \$o->{var}{wiz_myorigin} }, ], post => sub { if ($o->{var}{wiz_level} == 2) { next => 'summaryint' } }, next => 'summaryext', }, summaryext => { name => N("Configuring the external mail server") . "\n\n" . N("The wizard collected the following parameters needed to configure your external mail server:") . "\n\n" . N("To accept these values, and configure your server, click the next button or use the back button to correct them."), data => [ { label => N("Internet mail gateway"), fixed_val => \$o->{var}{wiz_ext_mail_relay} }, { label => N("Form of the address"), fixed_val => \$o->{var}{wiz_mail_masquerade} }, { label => N("myorigin"), fixed_val => \$o->{var}{wiz_myorigin} }, ], post => \&do_it_external, next => 'endext' }, summaryint => { name => N("The wizard now will configure an internal mail server."), post => \&do_it_internal, next => 'endext' }, endext => { name => N("Congratulations") . "\n\n" . N("The wizard successfully configured your external mail server."), end => 1, next => 0 }, error_end => { name => N("Failed"), data => [ { label => N("Please relaunch drakwizard, and try to change some parameters.") } ], no_back => 1, end => 1, next => 0, }, }; sub new { my ($class, $_conf) = @_; bless { o => $o, }, $class; } sub check_sendmail { my $in = 'interactive'->vnew('su', 'Check sendmail'); my $w = $in->wait_message(N("Postfix Server"), N("Check if sendmail is installed, to avoid conflict....")); my $test = any { /sendmail/ } system("rpm -qa sendmail"); !$test or return 'error_sendmail'; undef $w; } sub check_relay { $o->{var}{wiz_ext_mail_relay} or return 'warning'; $o->{var}{wiz_ext_mail_relay} =~ /(\S+)\.(\S+)$/ or return 'warning'; } sub get_mail_masquerade { my $relayhost = `/usr/sbin/postconf -h relayhost`; chomp($relayhost); ($relayhost) = $relayhost =~ /.*\.(.*\..*)/; !length $relayhost and $relayhost = $wiz_domain_name; $relayhost } sub get_mail_relay { my $relayhost = `/usr/sbin/postconf -h relayhost`; chomp $relayhost; !length $relayhost and $relayhost = "smtp.$wiz_domain_name"; $relayhost; } sub get_myorigin { my $myorigin = `/usr/sbin/postconf -h myorigin`; chomp $myorigin; $myorigin; } sub save_config { my @conf = qw(/etc/postfix/aliases /etc/postfix/canonical /etc/postfix/main.cf /etc/postfix/master.cf /etc/postfix/virtual); foreach (@conf) { -f $_ and MDK::Common::cp_af($_, $_.".orig"); } } sub cmd_needed { system("/usr/sbin/postmap -r -w /etc/postfix/canonical"); system("/usr/sbin/postmap /etc/postfix/virtual"); system("/usr/sbin/postalias /etc/postfix/aliases"); system("/usr/sbin/postfix check"); require services; if (services::is_service_running('postfix')) { services::restart('postfix') } else { services::start('postfix') } } sub do_it_internal { $::testing and return; my $in = 'interactive'->vnew('su', 'postfix configuration'); my $w = $in->wait_message(N("Postfix Server"), N("Configuring your Postfix server.....")); save_config(); my @conf = ("myhostname = $wiz_host_name", 'inet_interfaces = $myhostname', 'mydestination = $myhostname, localhost.$mydomain', 'alias_maps = hash:/etc/postfix/aliases', 'alias_database = hash:/etc/postfix/aliases', 'virtual_maps = hash:/etc/postfix/virtual', 'canonical_maps = hash:/etc/postfix/canonical', "mydomain = $wiz_domain_name", "masquerade_domains = $wiz_domain_name", ); # example of internal mail working confoguration #myhostname = xp2400.guibland.com #virtual_maps = hash:/etc/postfix/virtual #canonical_maps = hash:/etc/postfix/canonical #masquerade_domains = guibland.com foreach (@conf) { system("/usr/sbin/postconf -e '$_'"); } cmd_needed(); undef $w; check_started('master'); } sub do_it_external { $::testing and return; my $in = 'interactive'->vnew('su', 'postfix configuration'); my $w = $in->wait_message(N("Postfix Server"), N("Configuring your Postfix server.....")); save_config(); my @conf = ("myhostname = $wiz_host_name", 'inet_interfaces = $myhostname', 'mydestination = $myhostname, localhost.$mydomain', 'alias_maps = hash:/etc/postfix/aliases', 'alias_database = hash:/etc/postfix/aliases', 'virtual_maps = hash:/etc/postfix/virtual', 'canonical_maps = hash:/etc/postfix/canonical', "mydomain = $wiz_domain_name", "relayhost = $o->{var}{wiz_ext_mail_relay}", ); # "myorigin = $o->{var}{wiz_myorigin}", # "masquerade_domains = $o->{var}{wiz_mail_masquerade}", foreach (@conf) { system("/usr/sbin/postconf -e '$_'"); } if (defined $o->{var}{wiz_ext_mail_relay}) { my $file = "/etc/postfix/canonical"; my $canon = "\n\@$wiz_domain_name $o->{var}{wiz_mail_masquerade}"; my $t; foreach (cat_($file)) { if (/^\s*(?!#)\s*\@$wiz_domain_name/) { $t = $_; last; } } if ($t) { substInFile { s|$t|| } } else { append_to_file($file, $canon) } } cmd_needed(); undef $w; check_started('master'); } 1;