1 |
dpavlin |
129 |
package pxelinux; |
2 |
|
|
|
3 |
dpavlin |
138 |
use warnings; |
4 |
|
|
use strict; |
5 |
|
|
use autodie; |
6 |
|
|
|
7 |
dpavlin |
129 |
our $magic = 0xF100747E; |
8 |
|
|
|
9 |
|
|
our $config_file; #= 'pxelinux.cfg/default'; |
10 |
|
|
our $path_prefix; |
11 |
|
|
our $reboot_time; # 300 s |
12 |
|
|
|
13 |
dpavlin |
138 |
use server; |
14 |
dpavlin |
467 |
use client; |
15 |
dpavlin |
138 |
use File::Slurp; |
16 |
|
|
use Carp qw/confess/; |
17 |
|
|
|
18 |
|
|
sub config_for_ip { |
19 |
|
|
my ($ip,$config) = @_; |
20 |
|
|
confess "$ip not IP" unless $ip =~ m{^\d+\.\d+\.\d+\.\d+$}; |
21 |
|
|
|
22 |
|
|
$path_prefix = (caller(1))[3]; |
23 |
dpavlin |
463 |
$path_prefix = (caller(2))[3] unless $path_prefix =~ m{config::}; |
24 |
|
|
$path_prefix =~ s{config::}{} || warn "# caller isn't package config !"; |
25 |
dpavlin |
138 |
$path_prefix .= '/'; |
26 |
|
|
|
27 |
|
|
warn "# $ip $path_prefix"; |
28 |
|
|
|
29 |
|
|
my $dir = "$server::base_dir/tftp"; |
30 |
|
|
$dhcpd::file = 'pxelinux.0'; |
31 |
|
|
symlink "/usr/lib/syslinux/pxelinux.0", "$dir/$dhcpd::file" unless -e "$dir/$dhcpd::file"; |
32 |
|
|
|
33 |
|
|
$dir .= "/$path_prefix"; |
34 |
|
|
mkdir $dir unless -d $dir; |
35 |
|
|
|
36 |
|
|
mkdir "$dir/pxelinux.cfg" unless -e "$dir/pxelinux.cfg"; |
37 |
|
|
|
38 |
|
|
$config_file = 'pxelinux.cfg/' . uc sprintf "%02x%02x%02x%02x", split(/\./, $ip, 4); |
39 |
|
|
warn "$ip config_file $config_file"; |
40 |
|
|
|
41 |
|
|
my $path = "$dir/$config_file"; |
42 |
|
|
write_file $path, $config; |
43 |
|
|
|
44 |
|
|
warn "# config: $path ", -s $path; |
45 |
|
|
|
46 |
dpavlin |
153 |
return $config; |
47 |
dpavlin |
138 |
} |
48 |
|
|
|
49 |
dpavlin |
463 |
sub config_ip_boot { |
50 |
|
|
my ( $ip, $boot, $append ) = @_; |
51 |
|
|
|
52 |
dpavlin |
467 |
my $default = client::conf $ip => 'default'; |
53 |
dpavlin |
463 |
my $config; |
54 |
|
|
|
55 |
|
|
foreach my $kernel ( glob "$boot/vmlinuz*" ) { |
56 |
|
|
my $ver = $1 if $kernel =~ m{vmlinuz(.+)}; |
57 |
dpavlin |
469 |
$default ||= 'boot' . $ver; |
58 |
dpavlin |
463 |
|
59 |
|
|
$config .= qq{ |
60 |
|
|
|
61 |
|
|
label boot$ver |
62 |
|
|
kernel $ip/boot/vmlinuz$ver |
63 |
|
|
append initrd=$ip/boot/initrd.img$ver $append |
64 |
|
|
|
65 |
|
|
}; |
66 |
|
|
} |
67 |
|
|
|
68 |
|
|
config_for_ip( $ip, qq{ |
69 |
|
|
|
70 |
dpavlin |
469 |
default $default |
71 |
dpavlin |
468 |
prompt 1 |
72 |
|
|
timeout 30 |
73 |
dpavlin |
463 |
|
74 |
|
|
$config |
75 |
|
|
|
76 |
|
|
}); |
77 |
|
|
|
78 |
|
|
} |
79 |
|
|
|
80 |
dpavlin |
129 |
1; |