# # # use strict; use libinstall; use installvars; use emutil; my $MFSTARBALL = "tftpboot-elabinelab.tar.gz"; my $MFSURL = "http://www.emulab.net/downloads/$MFSTARBALL"; my $MFSCONSOLE = $NODECONSOLE; my $MFSDESCRIPTORS = "$TOP_SRCDIR/install/descriptors-mfs.xml"; my $LOCALIZE_MFS = "$PREFIX/sbin/localize_mfs"; my $ZONEINFO = "/usr/share/zoneinfo"; sub Install($$$) { my ($server, $isupdate, $impotent) = @_; # Replace if this script does an update for ip/domain. return 0 if ($isupdate); # Configure can override setting it here. if ($MFSVERSION eq "") { if ($FBSD_MAJOR >= 7.2) { $MFSVERSION = "72"; } else { $MFSVERSION = "62"; } } Phase "mfs", "Setting up MFSs", sub { my $localfile = "$TFTP_DIR/tftpboot.tar.gz"; Phase "mfsfetch", "Fetching MFS tarball", sub { DoneIfExists($localfile); FetchFileFatal($MFSURL, $localfile); }; Phase "mfsunpack", "Unpacking MFS tarball", sub { DoneIfExists("$TFTP_DIR/README"); ExecQuietFatal("$TAR xzf $localfile -C $TFTP_DIR"); }; # # Its the generic stuff; must localize. # my $fv = $MFSVERSION; if (! -e "$TFTP_DIR/freebsd${fv}") { $fv = "47"; } my $pdir = "."; if (-d "$TFTP_DIR/pxeboot${fv}") { $pdir = "pxeboot${fv}"; } elsif (-d "$TFTP_DIR/pxeboot72") { $pdir = "pxeboot72"; } my $cons = $MFSCONSOLE; if (! -e "$TFTP_DIR/$pdir/pxeboot.emu-${cons}") { $cons = "sio"; } Phase "pxemv", "Using ${cons} version of pxeboot", sub { DoneIfExists("$TFTP_DIR/pxeboot.emu"); ExecQuietFatal("cd $TFTP_DIR; ". "$MV $pdir/pxeboot.emu-${cons} pxeboot.emu"); }; Phase "freemv", "Using freebsd${fv} version of admin MFS", sub { DoneIfExists("$TFTP_DIR/freebsd"); ExecQuietFatal("cd $TFTP_DIR; $MV freebsd${fv} freebsd"); }; Phase "frismv", "Using frisbee${fv} version of disk load MFS", sub { DoneIfExists("$TFTP_DIR/frisbee"); ExecQuietFatal("cd $TFTP_DIR; $MV frisbee${fv} frisbee"); }; # # Older tarballs didn't have FBSD-specific versions of newnode MFS. # if (! -e "$TFTP_DIR/freebsd.newnode") { Phase "newnode", "Using freebsd${fv} version of newnode MFS", sub { DoneIfExists("$TFTP_DIR/freebsd.newnode"); ExecQuietFatal("cd $TFTP_DIR; ". "$MV freebsd${fv}.newnode freebsd.newnode"); }; } # # Fix the console device in the MFSes # Phase "mfsconsole", "Setting the console for MFSes", sub { my %consmap = ( "sio" => "com", "sio2" => "com", "vga" => "vid", "null" => "null" ); my $consdev = $consmap{$cons} . "console"; foreach my $mfs ("frisbee", "freebsd", "freebsd.newnode") { AppendToFileFatal("$TFTP_DIR/$mfs/boot/loader.conf.orig", "console=\"$consdev\""); } }; # # Before we localize, need to set the MFS password sitevar, # since localize will break otherwise. # Phase "password", "Setting up MFS password", sub { my $passhash; my ($status, @output) = ExecQuiet("$PREFIX/sbin/setsitevar -c $IMAGEPASSWORDSITEVAR"); PhaseFail("setsitevar failed") if ($status); if (@output) { chomp($output[0]); PhaseSkip("already set") if ($output[0] ne ""); } # # Use the same password for everything. # if (defined($password)) { $passhash = PassWordHash($password); } else { # # Use current root password, since we know people will # choose reasonable root passwords. # ($status,@output) = ExecQuiet("egrep '^root:' /etc/master.passwd"); PhaseFail("egrep failed") if ($status); if (@output && $output[0] ne '' && $output[0] =~ /^root:([^:]*)/) { $passhash = $1; } } PhaseFail("Could not determine image password") if (!defined($passhash)); ExecQuietFatal("$PREFIX/sbin/setsitevar ". " $IMAGEPASSWORDSITEVAR '$passhash'"); }; # # Localize the MFSs # Phase "localize", "Localizing the MFSes", sub { foreach my $mfs ("frisbee", "freebsd", "freebsd.newnode") { Phase "$mfs", "Localizing $mfs", sub { DoneIfExists("$TFTP_DIR/$mfs/boot/mfsroot.gz"); ExecQuietFatal("$LOCALIZE_MFS $TFTP_DIR/$mfs"); }; } }; # # Load the descriptors into the DB. Inside an elabinelab these are # already loaded, but the script will just skip over them without # raising an error. # Phase "descriptors", "Loading the Image and OS IDS", sub { ExecQuietFatal("cd $TOP_OBJDIR/install; ". " $SUDO -u $PROTOUSER $WAP ". " perl load-descriptors $MFSDESCRIPTORS"); }; PhaseSucceed("done"); }; return 0; } # Local Variables: # mode:perl # End: