#!/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 wizards; 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 %all_wizards = ( apache2 => [ 'Apache', N("Apache2 web server"), { ver => 2 } ], samba => [ 'Samba', N("Samba server") ], sambashare => [ 'Sambashare', N("Manage Samba share") ], sambaprint => [ 'Sambaprint', N("Manage Samba print") ], postfix => [ 'Postfix', N("Mail server") ], if_(all($::Wiz_more_dir), nisautofs => [ 'Nisautofs', N("NIS server autofs map") ], installsrv => [ 'Installsrv', N("Linux Install server") ], ldap => [ 'Ldap', N("ldap server") ], squid => [ 'Squid', N("Proxy") ], sshd => [ 'Sshd', N("OpenSSH daemon configuration") ], ntp => [ 'Ntp', N("Time server") ], dhcp => [ 'Dhcp', N("DHCP server") ], bind => [ 'Bind', N("DNS server") ], inn => [ 'Inn', N("News server") ], nfs => [ 'NFS', N("NFS server") ], kolab => [ 'Kolab', N("Kolab server") ], proftpd => [ 'Proftpd', N("FTP server") ], ), ); foreach my $file (glob_("$::Wiz_more_dir/*.conf")) { next unless -f $file; my %tmp=getVarsFromSh($file); $all_wizards{lc($file)} = [ $tmp{NAME}, $tmp{DESCRIPTION} ]; } @ARGV = grep { ! /^--/ } @ARGV; if (!defined($all_wizards{$ARGV[0]})) { $in->ask_from( N("Drakwizard wizard selection"), N("Please select a wizard"), [{ val => \$ARGV[0], list => [sort { $all_wizards{$a}[1] cmp $all_wizards{$b}[1] } keys %all_wizards], format => sub { $all_wizards{$_[0]}[1] }}] ); push @ARGV, @{$all_wizards{$ARGV[0]}}[0,2]; } require "MDK/Wizard/$all_wizards{$ARGV[0]}[0].pm"; my ($wiz, $err) = "MDK::Wizard::$all_wizards{$ARGV[0]}[0]"->new($all_wizards{$ARGV[0]}[2]); if ($err) { $::Wizard_finished = 1; $in->ask_okcancel(N("Error"), translate($err)); $in->exit; } $::in = $in; if ($wiz->{o}{use_new_data_structure}) { my $wizard = wizards->new($wiz->{o}); $wizard->safe_process($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(); } wizards::check_rpm($o->{needed_rpm}) if $o->{needed_rpm} && !$::testing; 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} } }