/[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 271 - (hide annotations)
Wed Aug 19 22:48:54 2009 UTC (14 years, 8 months ago) by dpavlin
File size: 1677 byte(s)
first semi-complicated setup to show off some of sysadmin DSL in PXElator

implement nfs root boot with writable snapshot directories for each
client which are rolled out on demand using aufs on server side.

So, client can implement additional layer of aufs if needed
(for /tmp and things like that) and offload more important files
(configuration changes) back to server via NFS.

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 dpavlin 138 1;

  ViewVC Help
Powered by ViewVC 1.1.26