diff options
author | Dexter Morgan <dmorgan@mageia.org> | 2011-06-02 20:51:35 +0000 |
---|---|---|
committer | Dexter Morgan <dmorgan@mageia.org> | 2011-06-02 20:51:35 +0000 |
commit | a9b2bdafaf625d10aef2f476aa4014fd36c846bc (patch) | |
tree | 2364afc0ee6739b59a25c44d68c9f003bcaf03d9 /perl-install/standalone/drakautoinst | |
download | drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.gz drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.bz2 drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.xz drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.zip |
Branch for updates
Diffstat (limited to 'perl-install/standalone/drakautoinst')
-rwxr-xr-x | perl-install/standalone/drakautoinst | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/perl-install/standalone/drakautoinst b/perl-install/standalone/drakautoinst new file mode 100755 index 000000000..5ea9427d5 --- /dev/null +++ b/perl-install/standalone/drakautoinst @@ -0,0 +1,370 @@ +#!/usr/bin/perl + +# +# Guillaume Cottenceau (gc) +# +# Copyright 2001-2008 Mandriva +# +# This software may be freely redistributed under the terms of the GNU +# public license. +# +# 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +use lib qw(/usr/lib/libDrakX); + +use standalone; #- warning, standalone must be loaded very first, for 'explanations' + +use common; +use interactive; +use devices; +use detect_devices; +use install::steps; +use fs; +use Data::Dumper; + + +local $_ = join '', @ARGV; + +my $direct = /-direct/; + +my $in = 'interactive'->vnew('su', 'default'); + +my $imagefile = "/root/drakx/replay_install.img"; +my $imagefile2 = "/root/drakx/replay_install_drivers.img"; +-f $imagefile or $in->ask_warn(N("Error!"), + N("I cannot find needed image file `%s'.", $imagefile), 1), quit_global($in, 0); + +$direct or $in->ask_okcancel(N("Auto Install Configurator"), +N("You are about to configure an Auto Install floppy. This feature is somewhat dangerous and must be used circumspectly. + +With that feature, you will be able to replay the installation you've performed on this computer, being interactively prompted for some steps, in order to change their values. + +For maximum safety, the partitioning and formatting will never be performed automatically, whatever you chose during the install of this computer. + +Press ok to continue."), 1) or quit_global($in, 0); + + +my @manual_steps = qw(doPartitionDisks formatPartitions); +my @all_steps; +my @choices; + +my $st = \%steps::installSteps; + +for (my $f = $st->{first}; $f; $f = $st->{$f}{next}) { + next if member($f, @manual_steps); + my $def_choice = 'replay'; + push @choices, { label => translate($st->{$f}{text}), val => \$def_choice, list => [ N("replay"), N("manual") ] }; + push @all_steps, [ $f, \$def_choice ]; +} + +$in->ask_from(N("Automatic Steps Configuration"), + N("Please choose for each step whether it will replay like your install, or it will be manual"), + \@choices + ) or quit_global($in, 0); + +${$_->[1]} eq N("manual") and push @manual_steps, $_->[0] foreach @all_steps; + +my $mountdir = "/root/tmp/drakautoinst-mountdir"; -d $mountdir or mkdir $mountdir, 0755; +my $floppy = detect_devices::floppy(); +my $dev = devices::make($floppy); +my $again; +do { + $in->ask_okcancel('', N("Insert a blank floppy in drive %s", $floppy), 1) or quit_global($in, 0); + log::explanations(N("Creating auto install floppy")); + my $_w = $in->wait_message('', N("Creating auto install floppy")); + eval { + run_program::run('dd', "if=$imagefile", "of=$dev", "bs=1440", "count=1024"); + common::sync(); + }; + $again = $@; #- grrr... $@ is localized in code block :-( +} while $again; +fs::mount::mount($dev, $mountdir, 'vfat', 0); + +if (-f $imagefile2) { + do { + eval { fs::mount::umount($mountdir) }; + $in->ask_okcancel('', N("Insert another blank floppy in drive %s (for drivers disk)", $floppy), 1) or quit_global($in, 0); + log::explanations(N("Creating auto install floppy (drivers disk)")); + my $_w = $in->wait_message('', N("Creating auto install floppy")); + eval { + run_program::run('dd', "if=$imagefile2", "of=$dev", "bs=1440", "count=1024"); + common::sync(); + }; + $again = $@; #- grrr... $@ is localized in code block :-( + } while $again; + fs::mount::mount($dev, $mountdir, 'ext2', 0); +} + +my $cfgfile = "$mountdir/auto_inst.cfg"; +eval(cat_($cfgfile)); +my $o_old = $o; # BUG (maybe install's $::o ?) +my %struct_gui; + +if (!$::isEmbedded && $in->isa('interactive::gtk')) { + require ugtk2; + ugtk2->import(qw(:helpers :wrappers :create)); + + my %tree; + $struct_gui{$_} = 'General' foreach qw(lang isUpgrade autoExitInstall timezone default_packages); + $struct_gui{$_} = 'Security' foreach qw(crypto security); + $struct_gui{$_} = 'Harddrive' foreach qw(partitions manualFstab useSupermount partitioning); + $struct_gui{$_} = 'Network' foreach qw(intf netc netcnx); + $struct_gui{$_} = 'Users' foreach qw(superuser users authentication); + $struct_gui{$_} = 'Hardware' foreach qw(keyboard mouse X printer wacom nomouseprobe); + + my %pixmap = (lang => 'language', + isUpgrade => '', + security => 'security', + autoExitInstall => '', + timezone => '', + default_packages => '', + partitions => 'harddrive', + manualFstab => 'partition', + useSupermount => '', + partitioning => 'partition', + net => 'network', + superuser => 'user', + users => 'user', + authentication => '', + keyboard => 'keyboard', + mouse => 'mouse', + X => 'X', + printer => 'printer', + wacom => '', + ); + + exists $struct_gui{$_} and push @{$tree{$struct_gui{$_}}}, [ $_ , $pixmap{$_}, h2widget($o->{$_}, "\$o->\{$_}") ] foreach keys %$o; + + my $W = ugtk2->new('$o edition'); + my @box_to_hide; + my $nb_pages=0; + my $notebook = Gtk2::Notebook->new; + $notebook->set_show_border(0); + $notebook->set_show_tabs(0); + $notebook->append_page(gtkpack_(gtkset_border_width(Gtk2::VBox->new(0,0), 10), + 1, Gtk2::VBox->new(0,0), + 0, gtkpack_(Gtk2::HBox->new(0,0), + 1, Gtk2::VBox->new(0,0), + 0, gtkadd(gtkset_shadow_type(Gtk2::Frame->new, 'etched-in'), + gtkcreate_img('mdk_logo')), + 1, Gtk2::VBox->new(0,0), + ), + 0, N("\nWelcome.\n\nThe parameters of the auto-install are available in the sections on the left"), + 1, Gtk2::VBox->new(0,0), + ), undef); + $notebook->show_all; + $notebook->set_current_page(0); + + gtkadd($W->{window}, + gtkpack_(Gtk2::VBox->new(0,5), + 1, gtkpack_(Gtk2::HBox->new(0,0), + 0, gtkadd(gtkset_size_request(gtkset_shadow_type(Gtk2::Frame->new, 'in'), 130, 470), + gtkpack_(Gtk2::VBox->new(0,0), + map { + my $box = Gtk2::VBox->new(0,0); + push @box_to_hide, $box; + $box->{vis} = 0; + my @button_to_hide; + 0, gtksignal_connect(Gtk2::Button->new($_), clicked => sub { + if ($box->{vis}) { $box->hide; $box->{vis} = 0; $notebook->set_current_page(0) } + else { + $_->hide, $_->{vis}=0 foreach @box_to_hide; + $box->show; $box->{vis} = 1; + $box->{active_function} and $box->{active_function}->(); + } + }), 1, gtkpack__($box, + map { + my $button = gtkset_relief(Gtk2::ToggleButton->new, 'none'); + push @button_to_hide, $button; + my $gru = $_->[0]; + $notebook->append_page(gtkshow($_->[2]), undef); + $nb_pages++; + my $local_page = $nb_pages; + my $function = sub { $notebook->set_current_page($local_page) }; + gtksignal_connect($button, toggled => sub { + $button->get_active and $function->() + }); + my $b; + if ($_->[1] ne "") { $b = gtkcreate_img($_->[1]) } else { undef $b }; + gtksignal_connect(gtkadd($button, + gtkpack__(Gtk2::VBox->new(0,3), + $b, + translate($gru), + ) + ), released => sub { + $button->get_active or $button->set_active(1), return; + $_->set_active(0) foreach @button_to_hide; + $button->set_active(1); + $box->{active_function} = $function; + $function->(); + }) + } @{$tree{$_}} + ) + } keys(%tree) + ) + ), + 1, $notebook, + ), + 0, Gtk2::HSeparator->new, + 0, gtkadd(gtkset_border_width(gtkset_layout(Gtk2::HButtonBox->new, 'end'), 5), + gtksignal_connect(Gtk2::Button->new(N("Accept")), clicked => sub { Gtk2->main_quit }), + gtksignal_connect(Gtk2::Button->new(N("Cancel")), clicked => sub { $o = $o_old; Gtk2->main_quit; quit_global($in, 0) }), + ) + ) + ); + $_->hide foreach @box_to_hide; +# $W->{window}->show_all; +# gtkadd($W->{window}, +# gtkpack_($W->create_box_with_title(N("Edit variables")), +# 1, my $notebook = create_notebook( map { h2widget($o->{$_}, "\$o->\{$_\}"), $_ } keys %$o ), +# 0, gtkpack(gtkset_border_width(Gtk2::HBox->new(0,0),5), $W->create_okcancel), +# ), +# ); +# $notebook->set_tab_pos('left'); +# $::isEmbedded and gtkflush(); + $W->main; +# $W->destroy(); +} + +$o->{interactiveSteps} = \@manual_steps; + +my $str = join('', +"#!/usr/bin/perl -cw +# +# Special file generated by ``drakautoinst''. +# +# You should check the syntax of this file before using it in an auto-install. +# You can do this with 'perl -cw auto_inst.cfg.pl' or by executing this file +# (note the '#!/usr/bin/perl -cw' on the first line). +", + Data::Dumper->Dump([$o], ['$o']), "\0"); +$str =~ s/ {8}/\t/g; #- replace all 8 space char by only one tabulation, this reduces file size so much :-) +output($cfgfile, $str); + +fs::mount::umount($mountdir); + +$in->ask_okcancel(N("Congratulations!"), +N("The floppy has been successfully generated. +You may now replay your installation.")); + +quit_global($in, 0); + + +sub quit_global { + my ($in, $exitcode) = @_; + $in->exit($exitcode); +} + + + +sub h2widget { + my ($k, $label) = @_; + my $w; + if (ref($k) =~ /HASH/) { + my $vb; + my @widget_list; + my $i = -1; + my @list_keys = keys(%$k); + if (ref($k->{$list_keys[0]}) =~ /HASH/) { + $i++; + $w = gtkpack_(Gtk2::VBox->new(0,0), + 1, create_scrolled_window(gtkpack__($vb = Gtk2::VBox->new(0,10), + $widget_list[$i] = create_packtable({ col_spacings => 10, row_spacings => 3 }, + map { + my $e; + $e = h2widget($k->{$_}, "$label\{$_}"); + [ "$_ : ", $e ] } @list_keys + ), + ) + ), + control_buttons($k->{$list_keys[0]}, + sub { my ($vb, $widget_list2, $ref_local_k, $i) = @_; + my @widget_list = @$widget_list2; + my $field = $in->ask_from_entry(N("Auto Install"), ("Enter the name of the new field you want to add")) or return undef; + $field eq '' and return undef; + gtkpack__($vb, + $widget_list[$i] = create_packtable({ col_spacings => 10, row_spacings => 3 }, + [ "$field : ", h2widget($ref_local_k, "$label\{$field}") ]) + ); + @$widget_list2 = @widget_list; + }, + $vb, \$i, \@widget_list) + ); + } else { + $w = create_packtable({ col_spacings => 10, row_spacings => 3 }, + map { create_entry_element($k->{$_}, "$label\{$_}", $_) } @list_keys + ) + } + } elsif (ref($k) =~ /ARRAY/) { + my $vb; + my @widget_list; + my $i = -1; + $w = gtkpack_(Gtk2::VBox->new(0,0), + 1, create_scrolled_window( + gtkpack__($vb = Gtk2::VBox->new(0,5), + map { $i++; $widget_list[$i] = h2widget($_, "$label\[$i]") } @$k, + ) + ), + control_buttons($k->[0], + sub { my ($vb, $widget_list2, $ref_local_k, $i) = @_; + my @widget_list = @$widget_list2; + gtkpack__($vb, $widget_list[$i] = h2widget($ref_local_k, "$label\[$i]")); + @$widget_list2 = @widget_list; + }, + $vb, \$i, \@widget_list) + ); + } else { + $w = create_packtable({ col_spacings => 10, row_spacings => 3 }, + create_entry_element($k, $label, $1)) if $label =~ /\$o->\{(.+)\}/; + } + return $w; +} + + +sub create_entry_element { + my ($text, $value, $label) = @_; + my $e; + if (ref $text =~ /HASH/) { + return [ "$label : ", h2widget($text, $label) ]; + } elsif (ref $text =~ /ARRAY/) { + return [ "$label : ", h2widget($text, $label) ]; + } else { + $e = Gtk2::Entry->new; + $e->{value} = $value; + my $_tag = Glib::Timeout->add(1000, sub { $e->set_text($text); 0 }); + gtksignal_connect($e, changed => sub { + my $exe = $e->{value} . "='" . $e->get_text . "'"; + print "EXEC : $exe\n "; + eval $exe; + }); + } + [ $label ? "$label : " : "" , $e ] +} + +sub control_buttons { + my ($ref_local_k, $local_gui, $vb, $j, $widget_list2) = @_; + my @widget_list = @$widget_list2; + my $i = $$j; + ref($ref_local_k) =~ /HASH/ or return(); + my %local_k = %$ref_local_k; + my ($button_remove); + 0, gtkadd(gtkset_border_width(gtkset_layout(Gtk2::HButtonBox->new, 'spread'), 5), + gtksignal_connect(Gtk2::Button->new(N("Add an item")), clicked => sub { + $local_k{$_} = undef foreach keys %local_k; + $i++; + $local_gui->($vb, \@widget_list, \%local_k, $i) or $i--, return; + $i >= 0 and $button_remove->set_sensitive(1); + } + ), + gtksignal_connect($button_remove = Gtk2::Button->new(N("Remove the last item")), clicked => sub { + $i >= 0 or return; + $widget_list[$i]->destroy; + $i--; + $i >= 0 or $button_remove->set_sensitive(0); + } + ) + ) +} |