diff options
Diffstat (limited to 'drakpxelinux.pl')
-rw-r--r-- | drakpxelinux.pl | 165 |
1 files changed, 114 insertions, 51 deletions
diff --git a/drakpxelinux.pl b/drakpxelinux.pl index ea720ad..270b161 100644 --- a/drakpxelinux.pl +++ b/drakpxelinux.pl @@ -38,9 +38,10 @@ use constant TRUE => 1; # KERNEL images/vmlinuz # APPEND initrd=images/all.rdz automatic=method:http,interface:eth0,network:dhcp,server:10.0.1.33,directory:/install/ ramdisk_size=64000 root=/dev/ram3 rw vga=788 display=:0 + + my $conf = "/var/lib/tftpboot/X86PC/linux/pxelinux.cfg/default"; #my $conf = "/tmp/tr"; -my $pxeconf = "/etc/pxe.conf"; my $HOSTNAME = chomp_(`hostname`); my $TFTPDIR = "/var/lib/tftpboot"; my $CLIENTPATH = '/X86PC/linux'; @@ -74,7 +75,7 @@ VGA: if you encounter any problem with VGA, please adjust my $date = chomp_(`date +%d-%m-20%y`); if (!-f $conf) { - err_dialog("Error !", "missing $conf\n\nPlease install pxe package.") and die; + err_dialog(N("Error !", "missing $conf\n\nPlease install pxe package.")) and die; } else { cp_af($conf, "$conf-$date"); } @@ -118,7 +119,6 @@ sub get_items() { $network or my ($networ) = m!\bnetwork\b:(dhcp|10.0.1.33)!; $server or my ($serve) = m!\bserver\b:(.*?),!; $directory or my ($director) = m!\bdirectory\b:(.*?)\s!; - my $information = "$label $automati"; my $initall; my $ramdiskall; my $autoall; my $vgaall; my $displayall; my $interfaceall; my $networkall; my $serverall; my $directoryall; if ($initrd) { $initall = $initrd } else { $initall = $init } if ($ramdisk) { $ramdiskall = $ramdisk } else { $ramdiskall = $ramdis } @@ -133,7 +133,9 @@ sub get_items() { my ($autocomp) = m!\bautomatic\b=(.*?)\s!; my ($devram) = m!root=/dev/ram3\srw!; my $optionsall = join(' ', grep { ! /$devram/ and ! /initrd=$initall/ and ! /display=$displayall/ and ! /ramdisk_size=$ramdiskall/ and ! /automatic=$autocomp/ and ! /vga=$vgaall/ } split(' ', $allopt)); - + my $information; + foreach (cat_($PXEHELP)) { my ($information) = /$label\s:\s(\.*)/; } +# my ($information) = cat_($PXEHELP) =~ /$label\s:\s(\.*)/;# or my $information = "install $label"; if ($label and $kernel and $initall) { push @listpxe, { label => $label, @@ -191,7 +193,7 @@ sub write_conf_pxe { my $prompt = get_default_prompt; my $time = get_default_timeout; output($conf, <<EOF); -# DO NOT EDIT auto_generated by drakpxe2.pl +# DO NOT EDIT auto_generated by drakpxelinux.pl PROMPT 10 DEFAULT $default DISPLAY messages @@ -249,7 +251,7 @@ sub create_model { } sub add_item { - my ($button, $model) = @_; + my ($model, $treeview) = @_; my @a; push @a, { label => "cooker", @@ -283,11 +285,12 @@ sub add_item { COLUMN_DISPLAY, $a[-1]{display}, COLUMN_OPTION, $a[-1]{option}, ); -# write_conf_pxe; +# edit_box_item($model, $treeview, "-1"); } sub remove_item { my ($widget, $treeview) = @_; + $::isWizard = 0; my $model = $treeview->get_model; my $selection = $treeview->get_selection; my $iter = $selection->get_selected; @@ -297,12 +300,14 @@ sub remove_item { ask_okcancel("Remove $listpxe[$i]{label} PXE entry ?") or return; $model->remove($iter); splice @listpxe, $i, 1; + remove_in_help($listpxe[$i]{label}); + write_conf_pxe; } - write_conf_pxe; } sub edit_box_item { - my ($widget, $treeview) = @_; + my ($widget, $treeview, $indice) = @_; + $::isWizard = 0; my $model = $treeview->get_model; my $selection = $treeview->get_selection; @@ -324,7 +329,7 @@ sub edit_box_item { my $kernel = Gtk2::Entry->new; $kernel->set_text($listpxe[$i]{kernel}); # file selection for kernel - my $file_dialogk = new Gtk2::FileSelection("File Selection"); + my $file_dialogk = new Gtk2::FileSelection(N("File Selection")); $file_dialogk->set_modal(TRUE); $file_dialogk->signal_connect("destroy", sub { $file_dialogk->hide }); $file_dialogk->ok_button->signal_connect(clicked => sub { @@ -334,13 +339,13 @@ sub edit_box_item { }, $file_dialogk); $file_dialogk->cancel_button->signal_connect(clicked => sub { $file_dialogk->hide }); # button kernel - my $buttonkernel = Gtk2::Button->new("Select kernel"); + my $buttonkernel = Gtk2::Button->new(N("Select kernel")); $buttonkernel->signal_connect(clicked => sub { $file_dialogk->show }); my $initrd = Gtk2::Entry->new; $initrd->set_text($listpxe[$i]{initrd}); # file selection for initrd - my $file_dialog = new Gtk2::FileSelection("File Selection"); + my $file_dialog = new Gtk2::FileSelection(N("File Selection")); $file_dialog->set_modal(TRUE); $file_dialog->signal_connect("destroy", sub { $file_dialog->hide }); $file_dialog->ok_button->signal_connect(clicked => sub { @@ -396,19 +401,19 @@ sub edit_box_item { }; gtkpack_($dialog->vbox, - 0, gtkadd(Gtk2::Frame->new(("Descrition")), + 0, gtkadd(Gtk2::Frame->new(N("Descrition")), gtkpack_(gtkset_border_width(Gtk2::VBox->new, 3), 0, $label_and_widgets->(N("Label"), $label, ""), 0, $label_and_widgets->(N("Info"), $info, ""), ), ), - 0, gtkadd(Gtk2::Frame->new(("Boot image")), + 0, gtkadd(Gtk2::Frame->new(N("Boot image")), gtkpack_(gtkset_border_width(Gtk2::VBox->new, 3), 0, $label_and_widgets->(N("Kernel"), $kernel, $buttonkernel), 0, $label_and_widgets->(N("Initrd"), $initrd, $buttoninitrd), ), ), - 0, gtkadd(Gtk2::Frame->new(("Automatic Options")), + 0, gtkadd(Gtk2::Frame->new(N("Automatic Options")), gtkpack_(gtkset_border_width(Gtk2::VBox->new, 3), 0, $label_and_widgets->(N("Automatic"), $automatic, ""), 0, $label_and_widgets->(N("Interface"), $interface, ""), @@ -417,13 +422,13 @@ sub edit_box_item { 0, $label_and_widgets->(N("Directory"), $directory, ""), ), ), - 0, gtkadd(Gtk2::Frame->new(("Display")), + 0, gtkadd(Gtk2::Frame->new(N("Display")), gtkpack_(gtkset_border_width(Gtk2::VBox->new, 3), 0, $label_and_widgets->(N("Vga"), $vga, ""), 0, $label_and_widgets->(N("Display"), $display, ""), ), ), - 0, gtkadd(Gtk2::Frame->new(("Other options")), + 0, gtkadd(Gtk2::Frame->new(N("Other options")), gtkpack_(gtkset_border_width(Gtk2::VBox->new, 3), 0, $label_and_widgets->(N("Ramdisk"), $ramdisk, ""), 0, $label_and_widgets->(N("Option"), $option, ""), @@ -465,6 +470,7 @@ sub edit_box_item { ); $dialog->destroy; write_conf_pxe; + add_in_help($listpxe[$i]{label}, $listpxe[$i]{info}); }, }, ), @@ -473,6 +479,37 @@ sub edit_box_item { } } +# add in help.txt +sub add_in_help { + my ($NAME, $DESCR) = @_; + if (!any { /$NAME/ } cat_($PXEHELP)) { + append_to_file($PXEHELP, <<EOF); +$NAME : install $DESCR +EOF + + } else { + substInFile { + s/$NAME.*/$NAME : $DESCR/; + } $PXEHELP; + } +} + +sub change_label_in_help { + my ($NAMEOLD, $NEWNAME) = @_; + substInFile { + s/$NAMEOLD\s(.*)/$NEWNAME $1/; + } $PXEHELP; +} + +# remove entry in help.txt +sub remove_in_help { + my ($NAME) = @_; + substInFile { + s/^$NAME\s:.*//x; + s/^\s*$//; + } $PXEHELP; +} + sub cell_edited { my ($cell, $path_string, $new_text, $model) = @_; my $path = Gtk2::TreePath->new_from_string($path_string); @@ -481,6 +518,9 @@ sub cell_edited { if ($column == COLUMN_LABEL) { my $i = ($path->get_indices)[0]; + my $oldname = $listpxe[$i]{label}; + my $newname = $new_text; + change_label_in_help($oldname, $newname); $listpxe[$i]{label} = $new_text; $model->set($iter, $column, $listpxe[$i]{label}); } elsif ($column == COLUMN_INFO) { @@ -569,15 +609,15 @@ sub pxe_conf { } sub wizard_pxe_server { - my $in = 'interactive'->vnew('su'); local $::isEmbedded = 0; + my $in = 'interactive'->vnew('su'); + undef $::WizardTable; + undef $::WizardWindow; $::isWizard = 1; use wizards; my $w = wizards->new; my $wiz = { - defaultimage => "logdrake.png", name => N("PXE Wizard"), - needed_rpm => [ 'pxe', 'tftp-server', 'xinetd' ], init => sub { if (member($DOMAINNAME, qw(localdomain (none)))) { return 0, N("You need to readjust your domainname, not equal to localdomain or none. Please launch drakconnect to adjust it.") @@ -591,17 +631,19 @@ sub wizard_pxe_server { }, pxeserver => { name => N("Set PXE server") . "\n\n" . N("We need to use a special dhcpd.conf file with PXE parameter. To set up such a DHCP server, launch the DHCP wizard and check the box 'Enable \PXE'. If you don't do that, PXE query will not be answered by this server.") . "\n" . N("Now the wizard will configure all needed default configuration files to allow computers to boot through the network."), + no_back => 1, next => 'summaryserver', }, summaryserver => { name => N("The wizard will now prepare all default files to set your PXE server"), data => [ - { label => N("TFTP directory:"), fixed_val => \$TFTPDIR }, - { label => N("Boot image path:"), fixed_val => \$IMGPATH }, - { label => N("PXE 'default' file:"), fixed_val => \$pxeconf }, - { label => N("PXE 'help' file:"), fixed_val => \$PXEHELP }, + { label => N("TFTP directory:"), val => \$TFTPDIR }, + { label => N("Boot image path:"), val => \$IMGPATH }, + { label => N("PXE 'default' file:"), val => \$pxeconf }, + { label => N("PXE 'help' file:"), val => \$PXEHELP }, ], post => \&do_it_pxe, + no_back => 1, next => 'endserver', }, endserver => { @@ -613,8 +655,20 @@ sub wizard_pxe_server { }, }, }; + $w->process($wiz, $in); +} + +sub save_config { + my ($old) = @_; + my $DATE = chomp_(`date +%d-%m-20%y`); + if (-f $old) { + print " - Backup of $old configuration\n"; + cp_af($old, $old . '.' . $DATE); + } + return($old . '.' . $DATE); } + sub default_pxe_messages { save_config($PXEMESSAGE); output($PXEMESSAGE, <<EOF); @@ -643,18 +697,6 @@ Available images are: --------------------- local: local boot EOF - - save_config($pxeconf); - output($pxeconf, <<EOF); -PROMPT 1 -DEFAULT local -DISPLAY messages -TIMEOUT 50 -F1 help.txt -label local - LOCALBOOT 0 - -EOF } sub tftp_blksize { @@ -667,12 +709,24 @@ sub tftp_blksize { } } +sub enable_tftps { + substInFile { s/disable.*/disable = no/ } "$XINETDDIR/tftp"; +} + sub memlinux_prep { if (!-f "$X86/memdisk") { cp_af($MEMDISK, $X86); } } +sub check_started { + my ($service) = @_; + my ($isrunning) = chomp_(`pidof $service`) =~ /(\d+)/m; + if (!$isrunning) { + return 1; + } +} + sub do_it_pxe { return if $::testing; my $in = 'interactive'->vnew('su', 'PXE server'); @@ -750,26 +804,35 @@ my $okcancel = create_okcancel({ ; $okcancel ="" unless $::isEmbedded; - $W->add(gtkpack_(Gtk2::VBox->new(0,0), 0, $banner, 1, create_scrolled_window($treeview), 0, gtkpack_(gtkset_border_width(Gtk2::HBox->new, 3), + 0, Gtk2::Label->new(N("default boot:")), 0, $labels, - 0, gtksignal_connect(Gtk2::Button->new("set PXE server"), clicked => sub { - \&wizard_pxe_server; }), - 0, gtkpack(gtkset_layout(new Gtk2::HButtonBox, 'spread'), - 0, (map { - my ($label, $sub, $widg) = @$_; - gtksignal_connect(Gtk2::Button->new($label), clicked => sub { - $sub->($model, $widg); }), - } ([ ("Help"), \&show_help ], - [ ("Add a PXE entry"), \&add_item, $model ], - [ ("Remove PXE entry"), \&remove_item, $treeview ], - [ ("Edit a PXE entry"), \&edit_box_item, $treeview ], - ) - ), - ), + 0, gtksignal_connect(new Gtk2::Button(N("PXE server")), + clicked => sub { + eval { wizard_pxe_server() }; + my $err = $@; + $::WizardWindow->destroy if defined $::WizardWindow; + undef $::WizardWindow; + if ($err && $err !~ /wizcancel/) { + err_dialog(N("Error"), N("The PXE server wizard had unexpectly failled:") + . "\n\n" . $err); + } + }), + 0, gtksignal_connect(new Gtk2::Button(N("Help")), + clicked => sub { show_help } + ), + 0, gtksignal_connect(Gtk2::Button->new(N("Add a PXE entry")), clicked => sub { + add_item($model, $treeview); } + ), + 0, gtksignal_connect(Gtk2::Button->new((N"Remove a PXE entry")), clicked => sub { + remove_item($model, $treeview); } + ), + 0, gtksignal_connect(Gtk2::Button->new(N("Edit a PXE entry")), clicked => sub { + edit_box_item($model, $treeview); } + ), ), 0, $okcancel, ), |