diff options
-rw-r--r-- | drakpxelinux.pl | 128 |
1 files changed, 83 insertions, 45 deletions
diff --git a/drakpxelinux.pl b/drakpxelinux.pl index 70c8f11..17c4118 100644 --- a/drakpxelinux.pl +++ b/drakpxelinux.pl @@ -22,7 +22,7 @@ # thx R1 for test and some debug # cvs.mandrakesoft.com module: /soft/drakpxelinux -my $version = "1.1.0"; +my $version = "1.2.0"; # i18n: IMPORTANT: to get correct namespace (drakpxelinux instead of libDrakX) BEGIN { unshift @::textdomains, 'drakpxelinux' } @@ -42,8 +42,7 @@ use mygtk2 qw(gtknew); use Gtk2::SimpleList; use Gtk2::Helper; use run_program; -use IO::Socket; -use Data::Dumper; +#use Data::Dumper; our $model = create_model(); our $treeview = Gtk2::TreeView->new_with_model($model); @@ -176,10 +175,10 @@ foreach (@ARGV) { } } -my ($config_file, $help_file) = $profile && $type ? - network::pxe::get_pxelinux_profile_path($profile, $type) : - ($network::pxe::pxelinux_config_file, $network::pxe::pxelinux_help_file); -my $pxelinux_conf = network::pxe::read_pxelinux_conf($config_file, $help_file); +my ($config_file, $help_file);# = $profile && $type ? +# network::pxe::get_pxelinux_profile_path($profile, $type) : +# ($network::pxe::pxelinux_config_file, $network::pxe::pxelinux_help_file); +my $pxelinux_conf; # = network::pxe::read_pxelinux_conf($config_file, $help_file); sub update_pxelinux_conf_from_treeview { @@ -214,6 +213,7 @@ sub update_pxelinux_conf_from_treeview { sub write_conf { + print "write conf PXE\n"; my ($pxelinux_conf, $treeview) = @_; update_pxelinux_conf_from_treeview($pxelinux_conf, $treeview); network::pxe::write_pxelinux_conf($pxelinux_conf, $config_file); @@ -247,16 +247,18 @@ sub create_model() { return $model; } -sub add_local_entry { - my ($_widget, $treeview, $pxelinux_conf) = @_; - my $model = $treeview->get_model; - if (test_similar_label("local", $pxelinux_conf)) { - my $entry = { - label => "local", - kernel => "LOCALBOOT 0", - }; - push @{$pxelinux_conf->{entries}}, $entry; - set_pxelinux_entry_at_iter($model, $model->append, $entry); + +sub add_local_profil_entry { + my $local_conf = $network::pxe::pxelinux_client_root . "/pxelinux.cfg/profiles/boot/local"; + if (!-f $local_conf) { + output($local_conf, <<EOF); +PROMPT 10 +DEFAULT local +TIMEOUT 50 + +label local + LOCALBOOT 0 +EOF } } @@ -327,7 +329,6 @@ sub wizard_add_entry { }; push @{$pxelinux_conf->{entries}}, $entry; set_pxelinux_entry_at_iter($model, $model->append, $entry); -# write_conf(); undef $w; return; }, @@ -359,7 +360,7 @@ sub remove_item { my $i = ($path->get_indices)[0]; my $entry = $pxelinux_conf->{entries}[$i]; - # $entry->{label} =~ /local/ and info_dialog(N("Local"), N("You can't remove local entry.")) and return 0; + $entry->{label} =~ /local/ and info_dialog(N("Local"), N("You can't remove local entry.")) and return 0; ask_okcancel("Info", "Remove $entry->{label} PXE entry ?") or return; network::pxe::remove_in_help($entry->{label}); my $ke = $network::pxe::pxelinux_client_root . "/$entry->{kernel}"; @@ -385,6 +386,39 @@ sub test_similar_label { } else { return 1 } } +sub clone_box_item { + my ($_widget, $treeview, $pxelinux_conf) = @_; + $::isWizard = 0; + my $model = $treeview->get_model; + my $iter = $treeview->get_selection->get_selected; + if ($iter) { + my $path = $model->get_path($iter); + my $i = ($path->get_indices)[0]; + my $entry = $pxelinux_conf->{entries}[$i]; + my $w = ugtk2->new(N("Clone %s entry", $entry->{label})); + my ($entry_box); + $w->{window}->set_position('center'); + $w->{ok_clicked} = sub { + my $new_entry = $entry_box->get_text; + if ($new_entry !~ m/^\w+$/) { err_dialog(N("Error!"), N("PXE label should be an ASCII word/number without space. Please adjust")) and return } + test_similar_label($new_entry, $pxelinux_conf) or return; + my $newentry_data = $entry; + $newentry_data->{label} = $new_entry; + push @{$pxelinux_conf->{entries}}, $newentry_data; + set_pxelinux_entry_at_iter($model, $model->append, $newentry_data); +# write_conf($pxelinux_conf, $treeview); + Gtk2->main_quit; + }; + gtkadd($w->{window}, + gtknew('VBox', children_loose => [ + $entry_box = gtknew('Entry', text => ''), + create_okcancel($w), + ]) + ); + $w->main; + } +} + # dialog box to edit a PXE entry sub edit_box_item { my ($_widget, $treeview, $pxelinux_conf) = @_; @@ -600,7 +634,6 @@ sub edit_box_item { # update value in cells set_pxelinux_entry_at_iter($model, $iter, $entry); - write_conf($pxelinux_conf, $treeview); $dialog->destroy; network::pxe::add_in_help($entry->{label}, $entry->{info}); }, @@ -861,8 +894,8 @@ my $profiles_conf = network::pxe::read_profiles(); sub create_systems_list() { my $systems = Gtk2::SimpleList->new( N("MAC address") => 'text', - N("Profil 1") => 'text', - N("Profil 2") => 'text', + N("Boot Profil 1") => 'text', + N("Boot Profil 2") => 'text', N("Computer Name") => 'text', ); @@ -1013,19 +1046,19 @@ sub refresh_menu { } sub add_profile() { - my $w = ugtk2->new(N("Deployment center")); - my ($entry, $to_install); + my $w = ugtk2->new(N("Add profile")); + my ($entry); + $w->{window}->set_position('center'); $w->{ok_clicked} = sub { my $profile = $entry->get_text; - network::pxe::profile_exists($profiles_conf, $profile) and err_dialog(N("Deployment center"), N("The %s profile already exists!", $profile)), return; - network::pxe::add_empty_profile($profiles_conf, $profile, $to_install->get_active); + network::pxe::profile_exists($profiles_conf, $profile) and err_dialog(N("Add profile"), N("The %s profile already exists!", $profile)), return; + network::pxe::add_empty_profile($profiles_conf, $profile); # refresh_profiles(); Gtk2->main_quit; }; gtkadd($w->{window}, gtknew('VBox', children_loose => [ - $entry = gtknew('Entry', text => network::pxe::find_next_profile_name($profiles_conf, 'profile')), - $to_install = gtknew('CheckButton', text => 'This profile needs an installation'), + $entry = gtknew('Entry', text => network::pxe::find_next_profile_name($profiles_conf, 'profile_name')), create_okcancel($w), ])); $w->main; @@ -1117,7 +1150,7 @@ my $okcancel = create_okcancel({ # main interface gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ 0, $menu, - if_(!$::isEmbedded, 0, Gtk2::Banner->new('drakgw', N("Drakpxelinux manage your PXE server"))), + if_(!$::isEmbedded, 0, Gtk2::Banner->new('IC-Dhost-48', N("Drakpxelinux manage your PXE server"))), if_($::isEmbedded, 0, Gtk2::Label->new("Here you can manage your PXE server.")), 1, gtknew('Notebook', children => [ gtknew('Label', text => N("PXE configuration file")), @@ -1130,14 +1163,18 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ 0, gtknew('VButtonBox', layout => 'start', children_loose => [ gtksignal_connect(gtknew('Button', text => N("Add profile")), clicked => \&add_profile), gtksignal_connect(gtknew('Button', text => N("Clone profile")), clicked => sub { - network::pxe::clone_profile($profiles_conf, $profiles->{data}[$_][0]) foreach $profiles->get_selected_indices; - refresh_profiles(); - }), + foreach ($profiles->get_selected_indices) { + $profiles->{data}[$_][0] !~ /local/ ? network::pxe::clone_profile($profiles_conf, $profiles->{data}[$_][0]) : $in->ask_warn(N("Info"), N("No need to clone local profile.")); + } + refresh_profiles(); + }), gtksignal_connect(gtknew('Button', text => N("Remove profile")), clicked => sub { - network::pxe::remove_profile($profiles_conf, $profiles->{data}[$_][0]) foreach $profiles->get_selected_indices; - refresh_profiles(); - }), - ] + foreach ($profiles->get_selected_indices) { + $profiles->{data}[$_][0] !~ /local/ ? network::pxe::remove_profile($profiles_conf, $profiles->{data}[$_][0]) : $in->ask_warn(N("Info"), N("Can't remove local profile.")); + } + refresh_profiles(); + }), + ] ), 0, gtknew('VButtonBox', layout => 'start', children_loose => [ gtknew('Label', text => N("Default boot:")), @@ -1149,7 +1186,7 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ ] ), 0, gtknew('HButtonBox', layout => 'start', children => [ - 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Add an entry")), 'addpxe'), clicked => sub { + 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Add a PXE entry")), 'addpxe'), clicked => sub { my $pxelinux_conf = get_pxelinux_conf_from_profile(); eval { wizard_add_entry($model, $treeview, $pxelinux_conf); write_conf($pxelinux_conf, $treeview); @@ -1161,19 +1198,19 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ err_dialog(N("Error"), N("The PXE entry wizard has unexpectedly failed:") . "\n\n" . $err); } }), - 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Add PXE local")), 'addpxe'), clicked => sub { + 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Remove PXE entry")), 'removepxe'), clicked => sub { my $pxelinux_conf = get_pxelinux_conf_from_profile(); - add_local_entry($model, $treeview, $pxelinux_conf); + remove_item($model, $treeview, $pxelinux_conf); write_conf($pxelinux_conf, $treeview); }), - 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Remove Entry")), 'removepxe'), clicked => sub { + 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Edit PXE entry")), 'editb'), clicked => sub { my $pxelinux_conf = get_pxelinux_conf_from_profile(); - remove_item($model, $treeview, $pxelinux_conf); + edit_box_item($model, $treeview, $pxelinux_conf); write_conf($pxelinux_conf, $treeview); }), - 0, gtksignal_connect(set_help_tip(Gtk2::Button->new(N("Edit Entry")), 'editb'), clicked => sub { + 0, gtksignal_connect(Gtk2::Button->new(N("Clone PXE entry")), clicked => sub { my $pxelinux_conf = get_pxelinux_conf_from_profile(); - edit_box_item($model, $treeview, $pxelinux_conf); + clone_box_item($model, $treeview, $pxelinux_conf); write_conf($pxelinux_conf, $treeview); }), ]), @@ -1184,7 +1221,7 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ 1, gtknew('ScrolledWindow', child => $systems), 0, gtknew('HBox', children_loose => [ - gtksignal_connect(gtknew('Button', text => N("Set Profile 1")), clicked => sub { + gtksignal_connect(gtknew('Button', text => N("Set Boot Profile 1")), clicked => sub { my $profile = $profiles_combo->get_active_text; my $to_install = exists $profiles_conf->{profiles}{install}{$profile}; foreach ($systems->get_selected_indices) { @@ -1194,7 +1231,7 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ } write_profile_conf(); }), - gtksignal_connect(gtknew('Button', text => N("Set Profile 2")), clicked => sub { + gtksignal_connect(gtknew('Button', text => N("Set Boot Profile 2")), clicked => sub { my $profile = $profiles_combo->get_active_text; foreach ($systems->get_selected_indices) { my $entry = $systems->{data}[$_]; @@ -1214,6 +1251,7 @@ gtkpack($w->{window}, gtknew('VBox', spacing => 0, children => [ ]), ); +add_local_profil_entry(); add_configured_mac_addresses(); get_mac_addresses_from_dhcp_log(); update_systems_data_from_file(); |