#!/usr/bin/perl # Drakwizard # Copyright (C) 2003 Mandrakesoft # # Author: 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. use lib qw(/usr/lib/libDrakX); use strict; use standalone; use interactive; use common; #- I18N. push @::textdomains, 'drakwizard'; $::isWizard = 1; $::Wizard_no_previous = 1; $::Wizard_title = "Drakwizard"; $::Wiz_dir = '/usr/share/wizards/'; $::Wiz_more_dir = "/etc/wizard.d/"; my $in = interactive->vnew; my %wiz = ( apache => ['Apache', N("Apache web server")], dhcp => ['Dhcp', N("DHCP server")], bind => ['Bind', N("DNS server")], inn => ['Inn', N("News server")], nfs => ['NFS', N("NFS server")], postfix => ['Postfix', N("Mail server")], proftpd => ['Proftpd', N("FTP server")], samba => ['Samba', N("Samba server")], squid => ['Squid', N("Proxy")], ntp => ['Ntp', N("Time server")], apache2 => ['Apache', N("Apache2 web server"), { ver => 2 }], nisautofs => ['Nisautofs', N("NIS server autofs map")], installsrv => ['Installsrv', N("Mandrake Install server")], pxe => ['Pxe', N("PXE server")], kolab => ['Kolab', N("Kolab server")], ); foreach my $file (glob_("$::Wiz_more_dir/*.conf")) { next unless -f "$file"; my %tmp=getVarsFromSh($file); $wiz{lc($file)}= [ $tmp{'NAME'}, $tmp{'DESCRIPTION'} ]; } @ARGV = grep { ! /^--/ } @ARGV; if (!defined($wiz{$ARGV[0]})) { $in->ask_from( N("Drakwizard wizard selection"), N("Please select a wizard"), [{ val => \$ARGV[0], list => [sort { $wiz{$a}[1] cmp $wiz{$b}[1] } keys %wiz], format => sub { $wiz{$_[0]}[1] }}] ); push @ARGV, @{$wiz{$ARGV[0]}}[0,2]; } require "MDK/Wizard/$wiz{$ARGV[0]}[0].pm"; my ($wiz, $err) = "MDK::Wizard::$wiz{$ARGV[0]}[0]"->new($wiz{$ARGV[0]}[2]); if ($err) { $::Wizard_finished = 1; $in->ask_okcancel(N("Error"), translate($err)); $in->exit; } if ($wiz->{o}{use_new_data_structure}) { require wizards; my $wizard = wizards->new; $::in = $in; $wizard->safe_process($wiz->{o}, $in); } else { wizard($wiz->{o}); } $in->exit; sub wizard { my ($o) = @_; my $page = $o->{pages}{welcome}; $::Wizard_title = $o->{name}; #$::Wizard_pix_up = $o->{defaultimage}; if ($> && !$o->{allow_user} && !$::testing) { require_root_capability(); } check_rpm_local($o->{needed_rpm}) if $o->{needed_rpm}; if (defined $o->{init}) { my ($res, $msg) = &{$o->{init}}; if (!$res) { $in->ask_okcancel(N("Error"), $msg); exit() if ! $::testing } } $::in = $in; # so that steps "complete" callbacks can call interactive->ask_warn() :-( my $next = 'welcome'; my @steps; while (1) { undef $::Wizard_no_previous; undef $::Wizard_no_cancel; $::Wizard_no_previous = $page->{no_back}; $::Wizard_finished = $page->{end}; $::Wizard_no_cancel = $page->{no_cancel} || $page->{end}; defined $page->{pre} and $page->{pre}(); # FIXME or the displaying fails my $data = defined $page->{data} ? ref $page->{data} ? $page->{data} : [ { label => '' } ] : [ { label => '' } ]; my $data2; foreach my $d (@$data) { $d->{fixed_val} and $d->{val} = ${$d->{fixed_val}}; if ($d->{fixed_list}) { $d->{list} = $d->{fixed_list}; } if (ref $d->{boolean_list} && ref ${$d->{boolean_list}}) { my $i; foreach (@{${$d->{boolean_list}}}) { push @$data2, { text => $_, type => 'bool', val => \${$d->{val}}->[$i], disabled => $d->{disabled} }; $i++ } } else { push @$data2, $d } } my $a = $in->ask_from($o->{name}, $page->{name}, $data2, if_($page->{complete}, complete => $page->{complete})); if ($a) { push @steps, $next if !$page->{ignore} && $steps[-1] ne $next; $next = defined $page->{post} ? $page->{post}() : 0; defined $o->{pages}{$next} or $next = $page->{next}; } else { $next = pop @steps } $next or return; $page = $o->{pages}{$next} } } ## fix duplicate check_rpm with /usr/lib/libDrakX/wizards.pm sub check_rpm_local { my ($rpms) = @_; foreach my $rpm (@$rpms) { if (!$in->do_pkgs->is_installed($rpm)) { if ($in->ask_okcancel(N("Error"), N("%s is not installed\nClick \"Next\" to install or \"Cancel\" to quit", c::from_utf8($rpm)))) { $::testing and next; if (!$in->do_pkgs->install($rpm)) { $::Wizard_finished = 1; $in->ask_okcancel(N("Error"), N("Installation failed")); $in->exit; } } else { $in->exit } } } }