moved first_tile check to mount image if needed
[pxelator] / lib / PXElator / upstream.pm
index 3b6b431..2e4ef62 100644 (file)
@@ -4,12 +4,14 @@ use warnings;
 use strict;
 use autodie;
 
+use Data::Dump qw/dump/;
 use LWP::Simple qw/mirror RC_NOT_MODIFIED/;
+use Storable;
 use server;
 
 sub mirror_file {
        my ( $url, $file ) = @_;
-       print STDERR "mirror $url";
+       warn "mirror_file $url -> $file\n";
        mirror( $url, $file )
                == RC_NOT_MODIFIED
                && warn(" not modified\n")
@@ -17,13 +19,18 @@ sub mirror_file {
                ;
 }
 
-our $just_once;
+my $once_path = '/tmp/pxelator.once';
+our $just_once = retrieve $once_path if -e $once_path;
+sub first_time {
+       my $what = shift;
+       return if $just_once->{$what}++;
+       store $just_once, $once_path;
+       return 1;
+}
 
 sub iso {
        my $url = shift;
 
-       return if $just_once->{$url}++;
-
        my $name = (caller(1))[3];
        $name =~ s{config::}{} || die "caller isn't package config !";
 
@@ -37,7 +44,7 @@ sub iso {
 
        my $iso = "$dir/$file";
 
-       mirror_file( $url, $iso );
+       mirror_file( $url, $iso ) if first_time $url;
 
        $file =~ s{\.iso$}{}i;
        my $mnt = "$server::base_dir/tftp/$name";
@@ -48,16 +55,26 @@ sub iso {
        system("mount -t iso9660 | grep $name/iso || sudo mount $iso $mnt -o loop -t iso9660 -v") == 0;
 }
 
-sub file {
-       my ( $url, $file ) = @_;
-       my $path = "$server::base_dir/$file";
-       my @file_parts = split m{/}, $file;
-       foreach ( 1 .. $#file_parts - 1 ) {
-               my $path = splice @file_parts, 0, $_;
-               warn "? $path\n";
-               mkdir $path unless -e $path;
+sub files {
+       my $url = shift;
+       my @files = @_;
+
+       if ( ! @files ) {
+               push @files, $1 if $url =~ s{/([^/]+)$}{};
+       }
+
+       my $name = (caller(1))[3];
+       $name =~ s{config::}{} || die "caller isn't package config !";
+
+       my $path = "$server::base_dir/tftp/$name";
+       mkdir $path unless -d $path;
+
+       warn "# files $url ",dump( @files ), " -> $path\n";
+
+       foreach my $file ( @files ) {
+               mirror_file( "$url/$file", "$path/$file" )
+                       if ! -e "$path/$file" || first_time( "$url/$file" );
        }
-       mirror_file( $url, "$server::base_dir/$file" );
 }
 
 1;