package upstream;

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 ) = @_;
	warn "mirror_file $url -> $file\n";
	mirror( $url, $file )
		== RC_NOT_MODIFIED
		&& warn(" not modified\n")
		|| warn(" done ", -s $file, " bytes\n")
		;
}

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 ! first_time($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";

	mirror_file( $url, $iso );

	$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 $name/iso || sudo mount $iso $mnt -o loop -t iso9660 -v") == 0;
}

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" );
	}
}

sub mkpath {
	my $file = shift;

	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;
	}
}

1;
