From c130de3109b46c9c0783f9d600c38cea9b5bb46e Mon Sep 17 00:00:00 2001 From: Olivier Blin Date: Fri, 10 Jun 2005 04:39:54 +0000 Subject: - create network::pxe out of drakpxelinux (pxe configuration files management) - get_items() -> network::pxe::read_pxelinux_conf() - don't read comments in pxelinux configuration file - store pxelinux configuration in a hash to avoid multiple cat_() - add network::pxe::list_pxelinux_labels() to get labels from a pxelinux configuration - only overwrite pxelinux settings (prompt, timeout, ...) when pxe is reconfigured - use network::network and network::tools to get hostname, domain name, IP address, net interface - move row creation code in set_pxelinux_entry_at_iter() and factorize - use ensure_is_installed to make sure pxe is installed --- perl-install/network/pxe.pm | 180 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 perl-install/network/pxe.pm diff --git a/perl-install/network/pxe.pm b/perl-install/network/pxe.pm new file mode 100644 index 000000000..90fb30fcc --- /dev/null +++ b/perl-install/network/pxe.pm @@ -0,0 +1,180 @@ +package network::pxe; + +use common; +use network::tools; +use Xconfig::resolution_and_depth; + +our $tftp_root = "/var/lib/tftpboot"; +my $client_path = '/X86PC/linux'; +our $pxelinux_client_root = $tftp_root . $client_path; +our $pxelinux_images = $pxelinux_client_root . '/images'; +our $pxelinux_help_file = $pxelinux_client_root . '/help.txt'; +our $pxelinux_message_file = $pxelinux_client_root . '/messages'; +our $pxelinux_config_file = $pxelinux_client_root . '/pxelinux.cfg/default'; +our $pxe_config_file = '/etc/pxe.conf'; + +my @global_pxelinux_settings = qw(PROMPT DEFAULT DISPLAY TIMEOUT F1); +my @append_settings = qw(initrd ramdisk_size vga display); +my @automatic_settings = qw(method interface network server directory); + +our %vga_bios_to_resolution = ( + 'normal' => "vga", + 'text' => "text", + '' => "automatic", + map { $_->{bios} => "$_->{X}x$_->{Y}" } grep { $_->{Depth} == 16 } Xconfig::resolution_and_depth::bios_vga_modes() + ); +our %vga_resolution_to_bios = reverse %vga_bios_to_resolution; + +sub read_pxelinux_help() { + my %info; + foreach (cat_($pxelinux_help_file)) { + /^(\w+)\s*:\s*(.*)$/ and $info{$1} = $2; + } + \%info; +} + +sub read_pxelinux_conf() { + my (%conf); + my $info = read_pxelinux_help(); + my $entry = {}; + foreach (cat_($pxelinux_config_file)) { + my $global = join('|', @global_pxelinux_settings); + if (/^($global)\s+(.*)/) { + $conf{lc($1)} = $2; + } elsif (/^label\s+(.*)/) { + $entry->{label} = $1; + } elsif (/^\s+LOCALBOOT\s+(\d+)/) { + $entry->{localboot} = $1; + } elsif (/^\s+KERNEL\s+(.*)/) { + $entry->{kernel} = $1; + } elsif (/^\s+APPEND\s+(.*)/) { + my @others; + foreach (split /\s+/, $1) { + my ($option, $value) = /^(.+?)(?:=(.*))?$/; + if (member($option, @append_settings)) { + $entry->{$option} = $value; + } elsif ($option eq 'automatic') { + foreach (split /,/, $value) { + my ($option, $value) = /^(.+?):(.+)$/; + $entry->{$option} = $value; + } + } else { + push @others, $_; + } + } + $entry->{others} = join(' ', @others); + } + if (exists $entry->{label} && (exists $entry->{localboot} || exists $entry->{kernel} && exists $entry->{initrd})) { + $entry->{info} = $info->{$entry->{label}}; + exists $entry->{vga} and $entry->{vga} = $vga_bios_to_resolution{$entry->{vga}}; + push @{$conf{entries}}, $entry; + $entry = {}; + } + } + \%conf; +} + + +sub list_pxelinux_labels { + my ($conf) = @_; + map { $_->{label} } @{$conf->{entries}}; +} + +sub write_pxelinux_conf { + my ($conf) = @_; + + output($pxelinux_config_file, + join("\n", + "# DO NOT EDIT auto_generated by drakpxelinux.pl", + (map { $_ . ' ' . $conf->{lc($_)} } @global_pxelinux_settings), + '', + (map { + my $e = $_; + my $automatic = join(',', map { "$_:$e->{$_}" } grep { $e->{$_} } @automatic_settings); + ("label $e->{label}", + exists $e->{localboot} ? + " LOCALBOOT $e->{localboot}" : + (" KERNEL $e->{kernel}", + " APPEND " . join(' ', + (map { "$_=$e->{$_}" } grep { $e->{$_} } @append_settings), + if_($automatic, "automatic=$automatic"), + $e->{others})), + ''); + } @{$conf->{entries}}))); +} + +sub write_default_pxe_messages { + my ($net) = @_; + my $hostname = $net->{hostname} || chomp_(`hostname`); + output($pxelinux_message_file, <{resolv}{domainname} || chomp_(`dnsdomainname`); + my $ip_address = network::tools::get_interface_ip_address($net, $interface); + + substInFile { + s/default_address.*/default_address=$ip_address/; + s/mtftp_address.*/mtftp_address=$ip_address/; + s/domain.*/domain=$domainname/; + } $pxe_config_file; +} + +1; -- cgit v1.2.1