/[pxelator]/lib/PXElator/upstream.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /lib/PXElator/upstream.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 266 - (hide annotations)
Wed Aug 19 17:00:46 2009 UTC (14 years, 8 months ago) by dpavlin
File size: 1881 byte(s)
support for mirroring single file specified as url only
1 dpavlin 138 package upstream;
2    
3     use warnings;
4     use strict;
5     use autodie;
6    
7 dpavlin 266 use Data::Dump qw/dump/;
8 dpavlin 138 use LWP::Simple qw/mirror RC_NOT_MODIFIED/;
9 dpavlin 233 use Storable;
10 dpavlin 138 use server;
11    
12 dpavlin 147 sub mirror_file {
13     my ( $url, $file ) = @_;
14 dpavlin 266 warn "mirror_file $url -> $file\n";
15 dpavlin 147 mirror( $url, $file )
16     == RC_NOT_MODIFIED
17     && warn(" not modified\n")
18     || warn(" done ", -s $file, " bytes\n")
19     ;
20     }
21    
22 dpavlin 233 my $once_path = '/tmp/pxelator.once';
23 dpavlin 242 our $just_once = retrieve $once_path if -e $once_path;
24 dpavlin 233 sub first_time {
25     my $what = shift;
26     return if $just_once->{$what}++;
27     store $just_once, $once_path;
28     return 1;
29     }
30 dpavlin 138
31     sub iso {
32     my $url = shift;
33    
34 dpavlin 233 return if ! first_time($url);
35 dpavlin 138
36     my $name = (caller(1))[3];
37     $name =~ s{config::}{} || die "caller isn't package config !";
38    
39     warn "$name $url";
40    
41     my $dir = "$server::base_dir/iso";
42     mkdir $dir unless -e $dir;
43    
44     my $file = $1 if $url =~ m{/([^/]+\.iso$)}i;
45     die "can't find iso file in $url" unless $file;
46    
47     my $iso = "$dir/$file";
48    
49 dpavlin 147 mirror_file( $url, $iso );
50 dpavlin 138
51     $file =~ s{\.iso$}{}i;
52     my $mnt = "$server::base_dir/tftp/$name";
53     mkdir $mnt unless -d $mnt;
54     $mnt .= '/iso';
55     mkdir $mnt unless -d $mnt;
56    
57 dpavlin 147 system("mount -t iso9660 | grep $name/iso || sudo mount $iso $mnt -o loop -t iso9660 -v") == 0;
58 dpavlin 138 }
59    
60 dpavlin 233 sub files {
61     my $url = shift;
62 dpavlin 266 my @files = @_;
63 dpavlin 233
64 dpavlin 266 if ( ! @files ) {
65     push @files, $1 if $url =~ s{/([^/]+)$}{};
66     }
67    
68 dpavlin 233 my $name = (caller(1))[3];
69     $name =~ s{config::}{} || die "caller isn't package config !";
70    
71     my $path = "$server::base_dir/tftp/$name";
72 dpavlin 266 mkdir $path unless -d $path;
73 dpavlin 233
74 dpavlin 266 warn "# files $url ",dump( @files ), " -> $path\n";
75    
76     foreach my $file ( @files ) {
77     mirror_file( "$url/$file", "$path/$file" )
78     if ! -e "$path/$file" || first_time( "$url/$file" );
79 dpavlin 233 }
80     }
81    
82     sub mkpath {
83     my $file = shift;
84    
85 dpavlin 147 my @file_parts = split m{/}, $file;
86     foreach ( 1 .. $#file_parts - 1 ) {
87     my $path = splice @file_parts, 0, $_;
88     warn "? $path\n";
89     mkdir $path unless -e $path;
90     }
91     }
92    
93 dpavlin 138 1;

  ViewVC Help
Powered by ViewVC 1.1.26