diff options
Diffstat (limited to 'pxe_wizard')
-rw-r--r-- | pxe_wizard/Pxe.pm | 258 |
1 files changed, 216 insertions, 42 deletions
diff --git a/pxe_wizard/Pxe.pm b/pxe_wizard/Pxe.pm index b06a8c8d..4066c8cb 100644 --- a/pxe_wizard/Pxe.pm +++ b/pxe_wizard/Pxe.pm @@ -30,39 +30,41 @@ use MDK::Wizard::Wizcommon; my $wiz = new MDK::Wizard::Wizcommon; +#my $INSTALLDIR = "/var/install/pxe"; +#my $IA64PATH = '/IA64PC'; + my $TMPDIR = '/tmp'; -my $CLIENTPATH = 'PXEClient'; -my $IA64PATH = 'IA64PC'; +my $HOSTNAME = chomp_(`hostname`); my $TFTPDIR = "/var/lib/tftpboot"; -my $INSTALLDIR = "/var/install/pxe"; +my $CLIENTPATH = '/X86PC/linux'; +my $X86 = $TFTPDIR . $CLIENTPATH; +my $IMGPATH = $X86 . '/images'; +my $PXEHELP = $X86 . '/help.txt'; +my $PXEMESSAGE = $X86 . '/messages'; +my $PXEDEFAULT = $X86 . '/pxelinux.cfg/default'; + my $CONF = '/etc/pxe.conf'; my $SYSLINUXPATH = '/usr/lib/syslinux/'; -my $PXEDEFAULT = 'pxelinux.cfg/default'; - -my $PXEMENU = "$TMPDIR/default.pxe"; -my $PXEMESSAGE = "$TMPDIR/message.pxe"; -my $PXEMENU = "$TMPDIR/default.pxe"; -my $PXEMESSAGE = "$TMPDIR/message.pxe"; -my $PXEHELP = "$TMPDIR/help.txt.pxe"; +my $MEMDISK = $SYSLINUXPATH . '/memdisk'; +my $XINETDDIR = "/etc/xinetd.d"; my $o = { - name => N("PXE Wizard"), + name => N("PXE Wizard (devel)"), var => { - - + IMG => '/tmp/t.img', + PXENAME => '92', + DESCR => 'install 9.2', }, - needed_rpm => [ 'pxe', 'tftp-server' ], + needed_rpm => [ 'pxe', 'tftp-server', 'xinetd' ], }; my %level = ( 1 => N("PXE - Set PXE server"), 2 => N("add - Add image in PXE"), 3 => N("remove - remove image in PXE"), - 4 => N("Modify - Modify image in PXE"), +# 4 => N("Modify - Modify image in PXE"), ); - - $o->{pages} = { welcome => { name => N("PXE wizard") . "\n\n" . N("Set a PXE server.") . "\n\n" . N("This wizard will help you configuring the PXE server. This configuration will provide a pxe services, and ability to add/remove/modify boot images."), @@ -71,13 +73,13 @@ $o->{pages} = { $o->{var}{wiz_level} ||= 1; }, post => sub { - if ($o->{var}{wiz_level} == 2) { + if ($o->{var}{wiz_level} == 2) { return 'addimg' } elsif ($o->{var}{wiz_level} == 3) { return 'removeimg' } elsif ($o->{var}{wiz_level} == 4) { return 'modifyimg' } - }, + }, data => [ { label => N("Which operation:"), val => \$o->{var}{wiz_level}, list => [ keys %level ], format => sub { $level{$_[0]} } }, ], @@ -85,51 +87,78 @@ $o->{pages} = { next => 'pxeserver', }, addimg => { - name => N("Add a boot Image") . "\n\n" . N("Where is that boot image ?"), + name => N("Add a boot Image") . "\n\n" . N("Path to image: Full path to image") . "\n\n" . N("PXE Name: Name in PXE menu (one word/number, no space)"), data => [ - { label => "", val => \$o->{var}{dummy} }, + { label => "PXE Name:", val => \$o->{var}{PXENAME} }, + { label => "PXE Description:", val => \$o->{var}{DESCR} }, + { label => "Full Path to image:", val => \$o->{var}{IMG} }, ], + post => \&test_data, next => 'summaryadd', }, removeimg => { - name => N("Remove a boot Image") . "\n\n" . N("Which one ?"), - data => [ - { label => "", val => \$o->{var}{dummy} }, - ], - next => 'summaryremove', + name => N("Remove a boot Image") . "\n\n" . N("Which one ?"), + data => [ + { label => "Wich one ?", val => \$o->{var}{PXENAME} }, + ], + next => 'summaryremove', }, modifyimg => { name => N("Add Option to boot image") . "\n\n" . N("on Which image ?"), data => [ - { label => "", val => \$o->{var}{dummy} }, + { label => "Wich one ?", val => \$o->{var}{PXENAME} }, ], next => 'summarymodify', }, pxeserver => { - name => N("Set PXE server") . "\n\n" . N("We will use a special dhcpd.conf"), - data => [ - { label => "", val => \$o->{var}{dummy} }, - ], - next => 'summaryserver', + name => N("Set PXE server") . "\n\n" . N("We will use a special dhcpd.conf"), + next => 'summaryserver', }, error_dir => { name => N('Error Should be a directory'), next => '', }, - summaryserver => { - name => N(''), - next => 'endserver', + error_img => { + name => N('Please provide a Bootable image...'), + next => 'addimg', + }, + error_name => { + name => N('Please provide a correct name in PXE entry (one word)'), + next => 'addimg', }, + simmilar_entry => { + name => N('Similar Name is already used in PXE menu entry') . "\n\n" . N("Please provide another Pxe Menu Name"), + next => 'addimg', + }, + summaryserver => { + name => N('Now will prepapre all default files to get PXE server'), + data => [ + { label => N("Tftp directory"), fixed_val => \$TFTPDIR }, + { label => N("Image path"), fixed_val => \$IMGPATH }, + { label => N("PXE \'default\' file "), fixed_val => \$PXEDEFAULT }, + { label => N("PXE \'help\' file"), fixed_val => \$PXEHELP }, + ], + post => \&do_it_pxe, + next => 'endserver', + }, summarymodify => { - name => N(''), - next => 'endmodify', + name => N('Now will Modify boot options in image'), + post => \&do_it_modify, + next => 'endmodify', }, summaryremove => { - name => N(''), - next => 'endremove', + name => N('Now will remove your PXE boot image'), + post => \&do_it_remove, + next => 'endremove', }, summaryadd => { - name => N(''), + name => N('Now will add your PXe boot image'), + data => [ + { label => "PXE Name:", fixed_val => \$o->{var}{PXENAME} }, + { label => "PXE Description:", fixed_val => \$o->{var}{DESCR} }, + { label => "Path to image:", fixed_val => \$o->{var}{IMG} }, + ], + post => \&do_it_add, next => 'endadd', }, endadd => { @@ -162,16 +191,161 @@ $o->{pages} = { }, }; -sub syslinux_prep { - # cp_af( "/memdisk", $FULLINTEL); +sub memlinux_prep { + if (!-f "$X86/memdisk") { + cp_af($MEMDISK, $X86); + } +} + +sub test_data { + $o->{var}{PXENAME} =~ /^\w+$/ or return 'error_name'; + if (!-f $o->{var}{IMG}) { + return 'error_img' + } + if (any { /^$o->{var}{PXENAME}/ } cat_($PXEHELP)) { + return 'simmilar_entry' + } +} + +sub enable_tftps { + substInFile { s/disable.*/disable = no/ } "$XINETDDIR/tftp"; +} + +sub tftp_blksize { + # $o should be with W or not N + my ($o) = @_; + if ($o =~ /W/) { + substInFile { s/server_args.*/server_args = -r blksize -s $TFTPDIR/ } "$XINETDDIR/tftp"; + } else { + substInFile { s/server_args.*/server_args = -s $TFTPDIR/ } "$XINETDDIR/tftp"; + } } + sub crea_wdir { if (-e $TMPDIR) { rm_rf($TMPDIR); } mkdir_p($TMPDIR); } +sub add_in_default { + my ($NAME) = @_; + if (!any { /${NAME}_BEGIN/ } cat_($PXEDEFAULT)) { + append_to_file($PXEDEFAULT ,<<EOF); +# TAG: ${NAME}_BEGIN +label $NAME + KERNEL memdisk + APPEND initrd=images/$NAME.img +# TAG: ${NAME}_END +EOF + } +} + +sub add_in_help { + my ($NAME, $DESCR) = @_; + append_to_file($PXEHELP ,<<EOF); +$NAME : $DESCR +EOF +} + +sub add_img { + my ($SIMG, $PXENAME) = @_; + cp_af($SIMG, $IMGPATH . "/" . $PXENAME . '.img'); +} + +sub get_menu_entry { + my ($NAME) = @_; + my ($NAME_bloc) = $PXEDEFAULT =~ /# TAG: ${NAME}_BEGIN(.*?)# TAG: ${NAME}_END/s or die "unable to find Menu entry section"; + $NAME_bloc; +} + +sub remove_in_menu { + my ($NAME) = @_; + substInFile { + s/${NAME}_BEGIN.* \n\n\n//; + } $PXEDEFAULT; +} + +sub remove_in_help { + my ($NAME) = @_; + substInFile { + s/^$NAME//; + } $PXEHELP; +} + +sub remove_img { + my ($PXENAME) = @_; + rm_rf($IMGPATH . "/" . $PXENAME . '.img'); +} + +sub default_pxe_menu { + output($PXEHELP, <<EOF); +Available images are: +--------------------- +local: local boot +EOF + + output($PXEDEFAULT, <<EOF); +PROMPT 1 +DEFAULT local +DISPLAY messages +TIMEOUT 50 +F1 help.txt +label local + LOCALBOOT 0 + +EOF +} + +sub default_pxe_messages { + output($PXEMESSAGE, <<EOF); + + Welcome to Mandrake Linux PXE Server + Pxelinux + . .-----------------------------------. + /|\\ / Press F1 for available images \\ + /_|_\\ \\ Hosted by $HOSTNAME + \\ | / _ /'-----------------------------------' + \\|/ (') / + '. U / (O__ + . '. / (o_ (o_ (0_ //\\ + {o_ (o_ (o_ (o_ (o_ //\\ //\\ //\\ // ) + (')_ (`)_ (/)_ (/)_ (/)_ V_/_ V_/_ V_/_ V__/_ + --------------------------------------------------------- + + press F1 for help +EOF + +} + +sub do_it_add { + return if $::testing; + add_in_help($o->{var}{PXENAME}, $o->{var}{DESCR}); + add_in_default($o->{var}{PXENAME}); + add_img($o->{var}{IMG}, $o->{var}{PXENAME}); +} + +sub do_it_remove { + return if $::testing; +} + +sub do_it_modify { + return if $::testing; +} + +sub do_it_pxe { + return if $::testing; + my $in = 'interactive'->vnew('su', 'PXE server'); + my $w = $in->wait_message(N("PXE server"), N("Configuring PXE server on your system...")); + memlinux_prep(); + default_pxe_menu(); + default_pxe_messages(); + enable_tftps(); + tftp_blksize('N'); + map { system("service $_ restart"); $_ } qw(xinetd pxe); + undef $w; +} + sub new { my ($class, $conf) = @_; |