summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/drakautoinst
diff options
context:
space:
mode:
authorDexter Morgan <dmorgan@mageia.org>2011-06-02 20:51:35 +0000
committerDexter Morgan <dmorgan@mageia.org>2011-06-02 20:51:35 +0000
commita9b2bdafaf625d10aef2f476aa4014fd36c846bc (patch)
tree2364afc0ee6739b59a25c44d68c9f003bcaf03d9 /perl-install/standalone/drakautoinst
downloaddrakx-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-xperl-install/standalone/drakautoinst370
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);
+ }
+ )
+ )
+}