/[pxelator]/lib/PXElator/config.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/config.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: 4665 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 74 package config;
2    
3     use warnings;
4     use strict;
5 dpavlin 135 use autodie;
6 dpavlin 74
7     use server;
8 dpavlin 129 use pxelinux;
9 dpavlin 156 use client;
10 dpavlin 271 use file;
11    
12 dpavlin 74 use File::Slurp;
13    
14 dpavlin 268 sub available { qw/debian_live webconverger debirf tinycore nfsroot/ };
15 dpavlin 153
16 dpavlin 129 sub debian_live {
17 dpavlin 232 my ($ip) = @_;
18    
19     upstream::files( qw{
20     http://cdimage.debian.org/cdimage/release/current-live/i386/web/
21     vmlinuz1
22     initrd1.img
23     debian-live-501-i386-standard.squashfs
24     });
25    
26 dpavlin 234 my $hostname = client::conf( $ip => 'hostname' ) || 'debian-live';
27    
28 dpavlin 232 pxelinux::config_for_ip( $ip, qq{
29    
30     default debian_live
31     label debian_live
32 dpavlin 234 kernel vmlinuz1
33 dpavlin 236 append initrd=initrd1.img fetch=http://${server::ip}:7777/debian_live/debian-live-501-i386-standard.squashfs boot=live nopersistent hostname=$hostname union=aufs
34 dpavlin 234 });
35 dpavlin 232
36 dpavlin 129 }
37    
38 dpavlin 138 use upstream;
39    
40 dpavlin 142 =head1 webconverger
41    
42     Webconverger - the opensource Web Kiosk
43    
44     L<http://webconverger.org/>
45    
46     =cut
47    
48 dpavlin 129 sub webconverger {
49 dpavlin 153 my ($ip) = @_;
50 dpavlin 129
51 dpavlin 138 upstream::iso( 'http://download.webconverger.com/webc-5.2.iso' );
52 dpavlin 129
53 dpavlin 156 my $homepage = client::conf( $ip => 'homepage', default => "http://${server::ip}:7777/client" );
54 dpavlin 201 my $hostname = client::conf( $ip => 'hostname' ) || 'webconverger';
55 dpavlin 151
56 dpavlin 138 pxelinux::config_for_ip( $ip, qq{
57 dpavlin 129
58 dpavlin 138 default webconverger
59 dpavlin 135 label webconverger
60     kernel iso/live/vmlinuz-2.6.30-backports.1-486
61 dpavlin 212 append initrd=iso/live/initrd.img-2.6.30-backports.1-486 fetch=http://${server::ip}:7777/webconverger/iso/live/filesystem.squashfs boot=live quiet nosudo splash video=vesa:ywrap,mtrr vga=788 nopersistent username=webc hostname=$hostname union=aufs homepage=$homepage locale=hr
62 dpavlin 135
63 dpavlin 138 });
64    
65 dpavlin 129 }
66    
67 dpavlin 142 =head1 debirf
68    
69     debirf is a system that will create diskless, all-in-ram images (kernel and initramfs) that boot entirely into ram and leave the user in a fully functional Debian system.
70    
71     L<http://cmrg.fifthhorseman.net/wiki/debirf>
72    
73     =cut
74    
75     sub debirf {
76     my $ip = shift;
77    
78     upstream::iso( 'http://cmrg.mayfirst.org/debirf/debirf-rescue_lenny_2.6.26-1-686.iso' );
79    
80     pxelinux::config_for_ip( $ip, qq{
81    
82     default linux
83     label linux
84     kernel iso/vmlinuz-2.6.26-1-686
85     append initrd=iso//debirf-rescue_lenny_2.6.26-1-686.cgz
86    
87     });
88     }
89    
90 dpavlin 145 sub tinycore {
91     my $ip = shift;
92     upstream::iso( 'http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/2.x/release/tinycore_2.2.iso' );
93     pxelinux::config_for_ip( $ip, qq{
94    
95     default linux
96     label linux
97     kernel iso/boot/bzImage
98     append initrd=iso/boot/tinycore.gz
99    
100     });
101     }
102    
103 dpavlin 271 sub in_chroot {
104     my ( $dir, $command ) = @_;
105     write_file "$dir/tmp/inside.sh", $command;
106     system "sudo chroot $dir sh -x /tmp/inside.sh";
107     }
108    
109     our $mounted;
110    
111 dpavlin 268 sub nfsroot {
112     my $ip = shift;
113    
114     my $nfsroot = "$server::base_dir/tftp/nfsroot";
115 dpavlin 270 my $debian_mirror = server::conf_default( 'debian_mirror', 'http://ftp.debian.org/debian' );
116 dpavlin 268
117     if ( ! -e $nfsroot ) {
118 dpavlin 271 system "sudo apt-get install nfs-kernel-server debootstrap aufs-modules-`uname -r` aufs-tools";
119     mkdir $nfsroot;
120     }
121 dpavlin 270
122 dpavlin 271 my $debootstrap = "$nfsroot/debootstrap";
123 dpavlin 268
124 dpavlin 271 if ( ! -e $debootstrap ) {
125 dpavlin 268
126 dpavlin 271 system "sudo debootstrap --arch i386 lenny $debootstrap $debian_mirror";
127 dpavlin 268
128 dpavlin 271 file::append "$debootstrap/etc/kernel-img.conf", "do_initrd = Yes\n" &&
129     in_chroot $debootstrap => 'apt-get install -y --force-yes atl2-modules-2.6-686';
130     in_chroot $debootstrap => 'apt-get -f install -y --force-yes locales'; # linux-image-2.6-686
131 dpavlin 268
132 dpavlin 271 file::append "$debootstrap/etc/initramfs-tools/modules", "atl2\n";
133     file::change("$debootstrap/etc/initramfs-tools/initramfs.conf", 'BOOT=local' => 'BOOT=nfs' ) &&
134     in_chroot $debootstrap => 'update-initramfs -u';
135 dpavlin 268
136 dpavlin 271 file::append "$debootstrap/etc/rsyslog.d/pxelator.conf", "*.*\t\@$server::ip\n";
137     file::append "$debootstrap/etc/network/interfaces", qq{
138 dpavlin 268
139 dpavlin 271 auto lo
140     iface lo inet loopback
141 dpavlin 268
142 dpavlin 271 allow-hotplug eth0
143     iface eth0 inet dhcp
144 dpavlin 268
145 dpavlin 271 };
146 dpavlin 268
147     }
148    
149 dpavlin 271 my $export = "$nfsroot/$ip";
150     my $br = "$nfsroot/br/$ip";
151    
152     my $m = $mounted->{$ip} ||= `mount | grep $export`;
153     if ( ! $m ) {
154     warn "mounting $export";
155    
156     mkdir "$nfsroot/br" unless -e "$nfsroot/br";
157     mkdir $br unless -e $br;
158     mkdir $export unless -e $export;
159    
160     system "sudo mount -t aufs -o br:$br:$debootstrap none $export";
161     system "sudo exportfs -i -o rw,async,no_root_squash,no_subtree_check,fsid=999 $ip:$export";
162    
163     my $hostname = client::conf( $ip => 'hostname' ) || 'nfsroot';
164     write_file "$export/etc/hostname", $hostname;
165     file::append "$export/hosts", '127.0.0.1';
166     }
167    
168    
169 dpavlin 268 pxelinux::config_for_ip( $ip, qq{
170    
171     default nfsroot
172     label nfsroot
173 dpavlin 271 kernel debootstrap/vmlinuz
174     append initrd=debootstrap/initrd.img root=/dev/nfs nfsroot=$server::ip:$export ro ip=dhcp
175 dpavlin 268
176     });
177     }
178    
179 dpavlin 110 sub for_ip {
180     my $ip = shift;
181 dpavlin 156 my $deploy = client::conf( $ip => 'deploy', default => 'webconverger' );
182 dpavlin 154 eval $deploy . '($ip)';
183 dpavlin 129 # $tftp::dir = "$server::base_dir/tftp/$pxelinux::path_prefix";
184 dpavlin 110 }
185    
186 dpavlin 135 warn 'loaded';
187    
188 dpavlin 74 1;

  ViewVC Help
Powered by ViewVC 1.1.26