/[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

Contents of /lib/PXElator/config.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 271 - (show 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 package config;
2
3 use warnings;
4 use strict;
5 use autodie;
6
7 use server;
8 use pxelinux;
9 use client;
10 use file;
11
12 use File::Slurp;
13
14 sub available { qw/debian_live webconverger debirf tinycore nfsroot/ };
15
16 sub debian_live {
17 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 my $hostname = client::conf( $ip => 'hostname' ) || 'debian-live';
27
28 pxelinux::config_for_ip( $ip, qq{
29
30 default debian_live
31 label debian_live
32 kernel vmlinuz1
33 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 });
35
36 }
37
38 use upstream;
39
40 =head1 webconverger
41
42 Webconverger - the opensource Web Kiosk
43
44 L<http://webconverger.org/>
45
46 =cut
47
48 sub webconverger {
49 my ($ip) = @_;
50
51 upstream::iso( 'http://download.webconverger.com/webc-5.2.iso' );
52
53 my $homepage = client::conf( $ip => 'homepage', default => "http://${server::ip}:7777/client" );
54 my $hostname = client::conf( $ip => 'hostname' ) || 'webconverger';
55
56 pxelinux::config_for_ip( $ip, qq{
57
58 default webconverger
59 label webconverger
60 kernel iso/live/vmlinuz-2.6.30-backports.1-486
61 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
63 });
64
65 }
66
67 =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 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 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 sub nfsroot {
112 my $ip = shift;
113
114 my $nfsroot = "$server::base_dir/tftp/nfsroot";
115 my $debian_mirror = server::conf_default( 'debian_mirror', 'http://ftp.debian.org/debian' );
116
117 if ( ! -e $nfsroot ) {
118 system "sudo apt-get install nfs-kernel-server debootstrap aufs-modules-`uname -r` aufs-tools";
119 mkdir $nfsroot;
120 }
121
122 my $debootstrap = "$nfsroot/debootstrap";
123
124 if ( ! -e $debootstrap ) {
125
126 system "sudo debootstrap --arch i386 lenny $debootstrap $debian_mirror";
127
128 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
132 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
136 file::append "$debootstrap/etc/rsyslog.d/pxelator.conf", "*.*\t\@$server::ip\n";
137 file::append "$debootstrap/etc/network/interfaces", qq{
138
139 auto lo
140 iface lo inet loopback
141
142 allow-hotplug eth0
143 iface eth0 inet dhcp
144
145 };
146
147 }
148
149 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 pxelinux::config_for_ip( $ip, qq{
170
171 default nfsroot
172 label nfsroot
173 kernel debootstrap/vmlinuz
174 append initrd=debootstrap/initrd.img root=/dev/nfs nfsroot=$server::ip:$export ro ip=dhcp
175
176 });
177 }
178
179 sub for_ip {
180 my $ip = shift;
181 my $deploy = client::conf( $ip => 'deploy', default => 'webconverger' );
182 eval $deploy . '($ip)';
183 # $tftp::dir = "$server::base_dir/tftp/$pxelinux::path_prefix";
184 }
185
186 warn 'loaded';
187
188 1;

  ViewVC Help
Powered by ViewVC 1.1.26