#!/usr/bin/perl -w use strict; my $target = "/target"; my @datadirs = qw(var home); my $defaultmirror = 'http://mirrors.kernel.org/debian'; my $defaultlocaltime = "EST/EDT"; my @packages = qw( less wget w3m vim libncurses5-dev make gcc mbr bzip2 mdadm ssh finger ); my @failpackages = qw( lilo ); BEGIN { print <)) { /^$/ and warn("Aborted.\n") and exit; /^Zie de maan schijnt door de bomen\.?$/i and last; warn "That's not the correct line.\n"; } } sub SYSTEM { my @copy = @_; s/\bmissing\d\b/missing/ for @copy; # XXX - ugly! TRY: { printf "Executing: %s\n", map "[$_]", @copy; system @copy; if ($?) { warn "Command failed, \$? == $?\n"; print "What do you want to do? ('abort', 'retry', 'ignore')"; for (;;) { print 'Now what? '; my $i = <>; $i =~ /^abort$/ and die "Aborted.\n"; $i =~ /^retry$/ and redo TRY; $i =~ /^ignore$/ and last; } } } } SANITY_CHECKS: { # XXX - need many more! -d $target and die "$target exists, aborted.\n"; SYSTEM "modprobe md"; SYSTEM "modprobe raid1"; SYSTEM "modprobe raid5"; if (not -e "/dev/md0") { SYSTEM "mknod /dev/md$_ b 9 $_" for 0..3; } } print <; for (my @copy = @drives) { if (not -w) { warn "$0: $_: $!\n"; @drives = (); } } } my $raid = @drives < 3 ? 1 : 5; print <; chomp $mirror; $mirror ||= $defaultmirror; print <; chomp $localtime; $localtime ||= $defaultlocaltime; print <; $i =~ /^yes$/ and $dist = "sid"; $i =~ /^no$/ and $dist = "etch"; } print <; chomp $hostname; } my $rootsize = $raid == 1 ? 25 : int(25/@drives) + 1; my $fdisk = <<"END"; new primary 1 default +64M new primary 2 default +1G new extended 3 default default new logical default +${rootsize}G new logical default default activate 1 type 1 FD type 2 FD type 5 FD type 6 FD write END $fdisk =~ s/\bdefault\b/\0/g; $fdisk =~ s/([a-z])\w+/$1/g; # Stupid fdisk won't work with fast pipes... #$fdisk = join '', map "$_\\r", split ' ', $fdisk; #$fdisk =~ tr/\0//d; #SYSTEM "echo -ne '$fdisk' | fdisk $_" for @drives; for (@drives) { print "Executing slowly: [fdisk $_]\n"; open my $fdiskpipe, "|fdisk $_" or die $!; my $o = select $fdiskpipe; $|++; select $o; for (split ' ', $fdisk) { select(undef, undef, undef, 0.3); my $c = $_; $c =~ s/\0//g; print "$_\n"; print $fdiskpipe "$_\n"; } close $fdiskpipe; $? and die "fdisk failed, \$? == $?.\n" } { my @drives = @drives == 1 ? (@drives, 'missing') : @drives; my $ndrives = @drives; SYSTEM "mdadm --create /dev/md0 -e 0.90 -n $ndrives -l 1 ". "@{[ map $_ . 1, @drives ]}"; SYSTEM "mdadm --create /dev/md1 -e 0.90 -n $ndrives -l $raid @{[ map $_ . 2, @drives ]}"; SYSTEM "mdadm --create /dev/md2 -e 0.90 -n $ndrives -l $raid @{[ map $_ . 5, @drives ]}"; SYSTEM "mdadm --create /dev/md3 -e 0.90 -n $ndrives -l $raid @{[ map $_ . 6, @drives ]}"; } SYSTEM "mkfs.ext3 /dev/md0"; SYSTEM "mkswap /dev/md1"; SYSTEM "mkfs.ext3 /dev/md2"; SYSTEM "mkfs.ext3 /dev/md3 -O dir_index"; SYSTEM "mkdir $target"; SYSTEM "mount /dev/md2 $target"; SYSTEM "mkdir $target/boot"; SYSTEM "mount /dev/md0 $target/boot"; SYSTEM "mkdir $target/data"; SYSTEM "mount /dev/md3 $target/data"; for (@datadirs) { SYSTEM "mkdir $target/data/$_"; SYSTEM "mkdir $target/$_"; SYSTEM "mount --bind $target/data/$_ $target/$_"; } SYSTEM "debootstrap etch $target $mirror"; SYSTEM "cd $target/etc; rm -f hostname resolv.conf localtime"; SYSTEM "cp /etc/resolv.conf $target/etc/resolv.conf"; SYSTEM "ln -s /usr/share/zoneinfo/$localtime $target/etc/localtime"; SYSTEM "echo $hostname > $target/etc/hostname"; SYSTEM "perl -i.default -pe's/FSCKFIX=no/FSCKFIX=yes/' $target/etc/default/rcS"; my $fstab = < $target/etc/fstab"; my $sources = < $target/etc/apt/sources.list"; my $lilo = < $target/etc/lilo.conf"; my $interfaces = < $target/etc/network/interfaces"; print "--> chrooting to $target <--\n"; chroot $target or die $!; $ENV{HOSTNAME} = $hostname; SYSTEM "mount -t proc none /proc"; SYSTEM "shadowconfig on"; chdir '/dev'; SYSTEM "MAKEDEV generic"; if ($dist eq 'sid') { SYSTEM "apt-get update"; SYSTEM "apt-get -y --force-yes install dpkg apt"; SYSTEM "apt-get -y --allow-unauthenticated install gnupg debian-keyring"; SYSTEM "gpg --list-keys"; # init ~/.gnupg SYSTEM "echo keyring /usr/share/keyrings/debian-keyring.gpg >> ~/.gnupg/gpg.conf"; } SYSTEM "apt-get update"; # Yes, a second time. SYSTEM "apt-get -y dist-upgrade"; SYSTEM "apt-get -y install @packages"; print "Executing carelessly: [apt-get -y install @failpackages]\n"; system "apt-get -y install @failpackages"; # lilo may fail at this point SYSTEM "install-mbr $_" for @drives; print <