diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2007-04-25 12:26:16 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2007-04-25 12:26:16 +0000 |
commit | 126777bc019a54afb4ec51299f2cf9d2841698aa (patch) | |
tree | 97f76e571902ead55ba138f1156a4b4f00b9b779 /perl-install/network/pxe.pm | |
parent | f1f67448efc714873378dfeb8279fae68054a90a (diff) | |
download | drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.gz drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.bz2 drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.tar.xz drakx-126777bc019a54afb4ec51299f2cf9d2841698aa.zip |
re-sync after the big svn loss
Diffstat (limited to 'perl-install/network/pxe.pm')
-rw-r--r-- | perl-install/network/pxe.pm | 286 |
1 files changed, 0 insertions, 286 deletions
diff --git a/perl-install/network/pxe.pm b/perl-install/network/pxe.pm deleted file mode 100644 index 1bc625ad0..000000000 --- a/perl-install/network/pxe.pm +++ /dev/null @@ -1,286 +0,0 @@ -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'; -my $pxelinux_config_root = $pxelinux_client_root . '/pxelinux.cfg'; -our $pxelinux_config_file = $pxelinux_config_root . '/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 auto_install); -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 ($help_file) = @_; - my %info; - foreach (cat_($help_file)) { - /^(\w+)\s*:\s*(.*)$/ and $info{$1} = $2; - } - \%info; -} - -sub read_pxelinux_conf { - my ($conf_file, $help_file) = @_; - my (%conf); - my $info = read_pxelinux_help($help_file); - my $entry = {}; - foreach (cat_($conf_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}}; - push @{$conf{entries}}, $entry; - $entry = {}; - } - } - \%conf; -} - - -sub list_pxelinux_labels { - my ($conf) = @_; - map { $_->{label} } @{$conf->{entries}}; -} - -sub write_pxelinux_conf { - my ($conf, $conf_file) = @_; - - output($conf_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, <<EOF); - - Welcome to Mandriva 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 write_default_pxe_help() { - output($pxelinux_help_file, <<EOF); -Available images are: ---------------------- -local: local boot -EOF -} - -sub add_in_help { - my ($NAME, $INFO) = @_; - if (!any { /$NAME/ } cat_($pxelinux_help_file)) { - append_to_file($pxelinux_help_file, <<EOF); -$NAME : $INFO -EOF - - } else { - substInFile { - s/$NAME.*/$NAME : $INFO/; - } $pxelinux_help_file; - } -} - -sub change_label_in_help { - my ($NAMEOLD, $NEWNAME) = @_; - substInFile { - s/$NAMEOLD\s(.*)/$NEWNAME $1/; - } $pxelinux_help_file; -} - -# remove entry in help.txt -sub remove_in_help { - my ($NAME) = @_; - substInFile { - s/^$NAME\s:.*//x; - s/^\s*$//; - } $pxelinux_help_file; -} - -# adjust pxe confi with good value -sub write_pxe_conf { - my ($net, $interface) = @_; - if (!-f "$pxe_config_file.orig") { cp_af($pxe_config_file, "$pxe_config_file.orig") } - my $domainname = $net->{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; -} - - -sub get_pxelinux_config_file_for_mac_address { - my ($mac_address) = @_; - #- 01 is the hardware type: Ethernet (ARP type 1) - $pxelinux_config_root . "/" . join('-', '01', split(/:/, $mac_address)); -} - -sub set_profile_for_mac_address { - my ($profile, $to_install, $mac_address) = @_; - if ($profile) { - symlinkf("profiles/" . ($to_install ? "install/" : "boot/") . $profile, get_pxelinux_config_file_for_mac_address($mac_address)); - } else { - unlink get_pxelinux_config_file_for_mac_address($mac_address); - } -} - -#- returns (profile_type, profile_name) -sub profile_from_file { - my ($file) = @_; - $file =~ m!(?:^|/)profiles/(\w+)/(.*)?$!; -} - -sub read_profiles() { - my %profiles_conf; - - foreach (all($pxelinux_config_root)) { - my $file = $pxelinux_config_root . '/' . $_; - if (-l $file && /^01(?:-([0-9a-z]{2}))+$/) { - #- per MAC address settings - #- the filename looks like 01-aa-bb-cc-dd-ee-ff - #- where AA:BB:CC:DD:EE:FF is the MAC address - my ($type, $name) = profile_from_file(readlink($file)); - tr/-/:/; - my $mac_address = substr($_, 3); - $profiles_conf{per_mac}{$mac_address} = { profile => $name, to_install => $type eq 'install' }; - } - } - - foreach my $type (qw(boot install)) { - my $root = $pxelinux_config_root . '/profiles/' . $type; - mkdir_p($root); - $profiles_conf{profiles}{$type}{$_} = 1 foreach all($root); - } - - \%profiles_conf; -} - -#- returns (pxelinux entries file, help file) -sub get_pxelinux_profile_path { - my ($profile, $type) = @_; - my $root = $pxelinux_config_root . '/profiles/' . $type; - "$root/$profile", "$root/help-$profile.txt"; -} - -sub list_profiles { - my ($profiles_conf) = @_; - sort(uniq(map { keys %{$profiles_conf->{profiles}{$_}} } qw(boot install))); -} - -sub profile_exists { - my ($profiles_conf, $profile) = @_; - member($profile, network::pxe::list_profiles($profiles_conf)); -} - -sub find_next_profile_name { - my ($profiles_conf, $prefix) = @_; - my $i; - /^$prefix(\d*)$/ && $1 >= $i and $i = $1 + 1 foreach network::pxe::list_profiles($profiles_conf); - "$prefix$i"; -} - -sub add_empty_profile { - my ($profiles_conf, $profile, $to_install) = @_; - $to_install and $profiles_conf->{profiles}{install}{$profile} = 1; - $profiles_conf->{profiles}{boot}{$profile} = 1; -} - -sub copy_profile_for_type { - my ($profile, $clone, $type) = @_; - my ($pxe, $help) = get_pxelinux_profile_path($profile, $type); - my ($clone_pxe, $clone_help) = get_pxelinux_profile_path($clone, $type); - -r $pxe and cp_f($pxe, $clone_pxe); - -r $help and cp_f($help, $clone_help); -} - -sub clone_profile { - my ($profiles_conf, $profile) = @_; - my $clone = find_next_profile_name($profiles_conf, $profile); - if (exists $profiles_conf->{profiles}{install}{$profile}) { - $profiles_conf->{profiles}{install}{$clone} = 1; - copy_profile_for_type($profile, $clone, 'install'); - } - $profiles_conf->{profiles}{boot}{$clone} = 1; - copy_profile_for_type($profile, $clone, 'boot'); -} - -sub remove_profile { - my ($profiles_conf, $profile) = @_; - foreach my $type (qw(boot install)) { - delete $profiles_conf->{profiles}{$type}{$profile}; - unlink(get_pxelinux_profile_path($profile, $type)); - } -} - -1; |