use pxelinux;
use File::Slurp;
-sub shared {
- my ($name, $value) = @_;
-
- my $path ="$server::base_dir/conf/$server::ip/$name";
- if ( defined $value ) {
- write_file $path, $value;
- } else {
- $value = read_file $path if -e $path;
- }
- return $value;
-}
-
sub debian_live {
$dhcpd::file = "pxelinux.0";
$pxelinux::path_prefix = 'live-helper/tftpboot/';
$pxelinux::config_file = 'pxelinux.cfg/default';
}
-use LWP::Simple qw/mirror RC_NOT_MODIFIED/;
-sub webconverger {
- $dhcpd::file = "pxelinux.0";
- $pxelinux::path_prefix = 'webconverger/';
-
- my $dir = "$server::base_dir/tftp/$pxelinux::path_prefix";
-
- mkdir $dir unless -d $dir;
-
- my $cfg = "$dir/pxelinux.cfg";
- return 1 if -e $cfg;
+use upstream;
- mkdir $cfg;
-
- my $iso = '/srv/pxelator/iso/webc-5.2.iso';
- my $url = 'http://download.webconverger.com/webc-5.2.iso';
-
- print STDERR "mirror $url";
- mirror( $url, $iso)
- == RC_NOT_MODIFIED
- && warn(" not modified\n")
- || warn(" done ", -s $iso, " bytes\n")
- ;
-
- mkdir "$dir/iso" unless -e "$dir/iso";
-
- system "mount -t iso9660 | grep webc-5.2 || sudo mount $iso $dir/iso/ -o loop -t iso9660 -v";
+sub webconverger {
+ my $ip = shift;
- symlink "/usr/lib/syslinux/pxelinux.0", "$dir/$dhcpd::file";
+ upstream::iso( 'http://download.webconverger.com/webc-5.2.iso' );
- $cfg .= '/default';
+ pxelinux::config_for_ip( $ip, qq{
- write_file $cfg, qq{
+default webconverger
label webconverger
kernel iso/live/vmlinuz-2.6.30-backports.1-486
append initrd=iso/live/initrd.img-2.6.30-backports.1-486 fetch=http://172.16.10.1/pxelator/webconverger/iso/live/filesystem.squashfs boot=live quiet homepage=http://172.16.10.1:7777/ nonetworking nosudo splash video=vesa:ywrap,mtrr vga=788 nopersistent username=webc hostname=webconverger union=aufs
- };
-# $pxelinux::config_file = $cfg;
+ });
+
}
sub for_ip {
my $ip = shift;
# debian_live();
- webconverger();
+ webconverger($ip);
# $tftp::dir = "$server::base_dir/tftp/$pxelinux::path_prefix";
}
package pxelinux;
+use warnings;
+use strict;
+use autodie;
+
our $magic = 0xF100747E;
our $config_file; #= 'pxelinux.cfg/default';
our $path_prefix;
our $reboot_time; # 300 s
+use server;
+use File::Slurp;
+use Carp qw/confess/;
+
+sub config_for_ip {
+ my ($ip,$config) = @_;
+ confess "$ip not IP" unless $ip =~ m{^\d+\.\d+\.\d+\.\d+$};
+
+ $path_prefix = (caller(1))[3];
+ $path_prefix =~ s{config::}{} || die "caller isn't package config !";
+ $path_prefix .= '/';
+
+ warn "# $ip $path_prefix";
+
+ my $dir = "$server::base_dir/tftp";
+ $dhcpd::file = 'pxelinux.0';
+ symlink "/usr/lib/syslinux/pxelinux.0", "$dir/$dhcpd::file" unless -e "$dir/$dhcpd::file";
+
+ $dir .= "/$path_prefix";
+ mkdir $dir unless -d $dir;
+
+ mkdir "$dir/pxelinux.cfg" unless -e "$dir/pxelinux.cfg";
+
+ $config_file = 'pxelinux.cfg/' . uc sprintf "%02x%02x%02x%02x", split(/\./, $ip, 4);
+ warn "$ip config_file $config_file";
+
+ my $path = "$dir/$config_file";
+ write_file $path, $config;
+
+ warn "# config: $path ", -s $path;
+
+
+}
+
1;
use warnings;
use strict;
-use Module::Refresh qw//;
-sub refresh { Module::Refresh->refresh };
our $ip = '172.16.10.1';
our $netmask = '255.255.255.0';
our $base_dir = '/srv/pxelator';
-use config;
+use Module::Refresh qw//;
+sub refresh { Module::Refresh->refresh };
+
+use File::Slurp;
+sub shared {
+ my ($name, $value) = @_;
+
+ my $path ="$base_dir/conf/$server::ip/$name";
+ if ( defined $value ) {
+ write_file $path, $value;
+ } else {
+ $value = read_file $path if -e $path;
+ }
+ return $value;
+}
-our $debug;
-sub debug { $debug = config::shared('debug', @_) || 0 }
+sub debug { shared('debug', @_) || 0 }
warn "loaded";
use strict;
use autodie;
-use Test::More tests => 4;
+use Test::More tests => 2;
use Data::Dump qw/dump/;
use_ok 'config';
-ok( my $test = config::shared( 'test', 42 ), 'set shared' );
-diag $test;
-cmp_ok( $test, '==', config::shared( 'test' ), 'get shared' );
+sub test { config::webconverger( '172.0.0.1' ) };
-ok( config::webconverger(), 'webconverger' );
+ok( test(), 'webconverger' );
--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use autodie;
+
+use Test::More tests => 3;
+use Data::Dump qw/dump/;
+
+use_ok 'server';
+
+ok( my $test = server::shared( 'test', 42 ), 'set shared' );
+diag $test;
+cmp_ok( $test, '==', server::shared( 'test' ), 'get shared' );
+
--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use autodie;
+
+use Test::More tests => 3;
+use Data::Dump qw/dump/;
+
+use_ok 'upstream';
+
+ok( config::test(), 'iso' );
+ok( system("sudo umount -t iso9660 -a") == 0, 'umount' );
+
+package config;
+sub test { upstream::iso( 'http://download.webconverger.com/webc-5.2.iso' ) };
+
+1;
}
}
+use config;
+
sub tftp_request {
my $request = shift;
warn 'request: ', dump( $request ) if $debug;
- config::for_ip();
+ config::for_ip( $request->{_REQUEST_}->{PeerAddr} );
if ( $request->{RootDir} ne $dir ) {
$request->{RootDir} = $dir;
--- /dev/null
+package upstream;
+
+use warnings;
+use strict;
+use autodie;
+
+use LWP::Simple qw/mirror RC_NOT_MODIFIED/;
+use server;
+
+our $just_once;
+
+sub iso {
+ my $url = shift;
+
+ return if $just_once->{$url}++;
+
+ my $name = (caller(1))[3];
+ $name =~ s{config::}{} || die "caller isn't package config !";
+
+ warn "$name $url";
+
+ my $dir = "$server::base_dir/iso";
+ mkdir $dir unless -e $dir;
+
+ my $file = $1 if $url =~ m{/([^/]+\.iso$)}i;
+ die "can't find iso file in $url" unless $file;
+
+ my $iso = "$dir/$file";
+
+ print STDERR "$name mirror $url";
+ mirror( $url, $iso )
+ == RC_NOT_MODIFIED
+ && warn(" not modified\n")
+ || warn(" done ", -s $iso, " bytes\n")
+ ;
+
+ $file =~ s{\.iso$}{}i;
+ my $mnt = "$server::base_dir/tftp/$name";
+ mkdir $mnt unless -d $mnt;
+ $mnt .= '/iso';
+ mkdir $mnt unless -d $mnt;
+
+ system("mount -t iso9660 | grep $mnt || sudo mount $iso $mnt -o loop -t iso9660 -v") == 0;
+}
+
+1;