Saturday, April 20, 2013

[ Level 3 ] The script for creating virtualbox envrionment (Ubuntu 12.04) with lauch new OS image.

In my company, I need to test it when I build a new image.
Therefore I have to setup my testing environment for integration test.

I wrote a script to automatically setup the environment from new install Ubuntu.
The steps are:
1. Download and setup tftp server.
2. Download and setup dhcp server with netboot option.
3. Install virtualbox.

After that you could create a VM then choose netboot. (the first interface must connect to tap0 to get boot server information)

#!/bin/bash

######## utilities ########
_getTasks() {
  indent="$1"
  cat $0 | grep '()' | grep -v "^_" | grep "^[^ ]" | cut -d'(' -f1 | sed -e "s/^/$indent/"
}

_showUsage() {
  indent="  "
  cat <<EOF
Usage:
  $0 task
Ex.
  $0 `_getTasks | head -1`
tasks:
${indent}[ all ]
`_getTasks "$indent"`
EOF
}

_die() {
  echo "$1"
  exit ${2:-1}
}

_checkID() {
  uid=`id | cut -d'(' -f1 | cut -d'=' -f2`
  [ $uid -ne 0 ] && _die "Need root to execute this command, exit!"
}
######## utilities ########

######## create tftpd configuration ########
TFTP_DIRECTORY=/tftpboot

installTftpd() {
  apt-get -y remove tftpd ## conflict with tftpd-hpa
  apt-get -y install tftpd-hpa tftp
}
#installTftpd

createTftpdConf() {
  echo "Run createTftpdConf()"
  cat > /etc/default/tftpd-hpa <<EOF
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="$TFTP_DIRECTORY"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c --secure"
EOF
}
#createTftpdConf
######## create tftpd configuration ########

######## create /tftpboot content ########
installSyslinux() {
  apt-get -y install syslinux syslinux-common
}

testTftp() {
  test_filename="$1"
  cd /tmp
  rm -f ./$test_filename
  tftp localhost <<EOF
get /$test_filename
EOF
  [ ! ./$test_filename ] && echo "Get file ($test_filename) from tftp server fail..." && exit 1
  rm -f ./$test_filename
}

createTftpbootContent() {
  echo "Run createTftpbootContent()"
  mkdir -p $TFTP_DIRECTORY
  cp /usr/lib/syslinux/pxelinux.0 $TFTP_DIRECTORY
  cp /usr/lib/syslinux/*menu.c32 $TFTP_DIRECTORY
  mkdir -p $TFTP_DIRECTORY/pxelinux.cfg && chmod 777 $TFTP_DIRECTORY/pxelinux.cfg
  mkdir -p $TFTP_DIRECTORY/boot && chmod 777 $TFTP_DIRECTORY/boot 
  cat > $TFTP_DIRECTORY/pxelinux.cfg/default <<EOF
prompt 0
default default_install
timeout 3

label default_install
  kernel boot/vmlinuz-2.6.32.24
  append initrd=boot/default-installer.img
EOF
  chown -R tftp:tftp $TFTP_DIRECTORY
  testTftp "pxelinux.0"
}
#createTftpbootContent

######## create /tftpboot content ########

######## install user-mod linux package ########
installUserModPackages() {
  echo "Run installUserModPackages()"
  apt-get -y install uml-utilities
}
#installUserModPackages

_getRealUserName() {
  tty_filter="`tty | sed -e 's|/dev/||'`"
  who | grep "$tty_filter" | awk '{print($1)}'
}

createTap() {
  echo "Run createTap()"
  user_name="`_getRealUserName`"
  subnet=10.10
  netmask=255.255.255.0
  TIMEOUT=5

  interface_file="/etc/network/interfaces"
  interface_orig="$interface_file.orig"
  [ ! -f $interface_orig ] && cp $interface_file $interface_orig
  if [ -f $interface_orig ]
  then
    read -t $TIMEOUT -p "Do you want to use orig interfaces file ($interface_orig) to be the template? (Timeout for $TIMEOUT seconds)) [Y/n]: " Yn
    [ "$Yn" != "n" ] && [ "$Yn" != "N" ] && cp $interface_orig $interface_file
  fi

  for index in `seq 0 1`
  do
  cat >> $interface_file <<EOF

auto tap$index
iface tap$index inet static
pre-up tunctl -t tap$index -u $user_name
up ifconfig tap$index up
down ifconfig tap$index down
address $subnet.$index.254
netmask $netmask
EOF
  done

  echo "New interfaces file:"
  echo "================================================"
  cat $interface_file
  echo "================================================"
}
#createTap
######## install user-mod linux package ########

######## create dhcpd.conf ########
installDhcpd() {
  apt-get -y install isc-dhcp-server ## isc-dhcp-server replaced dhcp3-server
}

createDhcpdConf() {
  echo "Run createDhcpdConf()"
  subnet=10.10 ## for tap0/tap1
  #subnet=192.168 ## for virtualbox vboxnet0
  netmask=255.255.255.0
  TIMEOUT=5

  dhcpd_conf_file="/etc/dhcp/dhcpd.conf"
  dhcpd_conf_orig="$dhcpd_conf_file.orig"
  [ ! -f $dhcpd_conf_orig ] && cp $dhcpd_conf_file $dhcpd_conf_orig
  if [ -f $dhcpd_conf_orig ]
  then
    read -t $TIMEOUT -p "Do you want to use orig dhcpd file ($dhcpd_conf_file) to be the template? (Timeout for $TIMEOUT seconds)) [Y/n]: " Yn
    [ "$Yn" != "n" ] && [ "$Yn" != "N" ] && cp $dhcpd_conf_orig $dhcpd_conf_file
  fi

  for index in `seq 0 1` ## for tap0/tap1
  #for index in `seq 56 56` ## for virtualbox vboxnet0
  do
  cat >> $dhcpd_conf_file <<EOF

subnet $subnet.$index.0 netmask $netmask {
   option subnet-mask $netmask;
   option broadcast-address $subnet.$index.255;
   option routers $subnet.$index.254;
   range $subnet.$index.210 $subnet.$index.220;
 
   filename "/pxelinux.0";
}
EOF
  done
  echo "New dhcpd config file:"
  echo "================================================"
  cat $dhcpd_conf_file
  echo "================================================"
}
#createDhcpdConf

checkDhcpService() {
  netstat -tlunp | grep dhcp || _die "Cannot find binding address of dhcp!"
}
#checkDhcpService

######## install virtualbox ########
installVBox() {
  echo "Run installVBox()"

  ## Url for virtualbox 4.2.12 to download
  vbox_binary_url_4_2_12_for_12_10="http://download.virtualbox.org/virtualbox/4.2.12/virtualbox-4.2_4.2.12-84980~Ubuntu~quantal_amd64.deb"
  ## Url for virtualbox extension pack 4.2.12 to download
  vbox_extpack_url_4_2_12="http://dlc.sun.com.edgesuite.net/virtualbox/4.2.12/Oracle_VM_VirtualBox_Extension_Pack-4.2.12.vbox-extpack "

  ## download virtualbox and install it
  vbox_binary_url=$vbox_binary_url_4_2_12_for_12_10
  vbox_binary_filename=${vbox_binary_url##*/}
  wget $vbox_binary_url
  dpkg -i ./$vbox_binary_filename

  ## setup vbox driver
  apt-get -y install linux-headers-3.5.0-27 linux-headers-3.5.0-27-generic
  /etc/init.d/vboxdrv setup

  ## download virtualbox extension and install it
  vbox_extpack_url=$vbox_extpack_url_4_2_12
  vbox_extpack_filename=${vbox_extpack_url##*/}
  wget $vbox_extpack_url
  vboxmanage extpack install ./$vbox_extpack_filename
}
#installVBox
######## install virtualbox ########

######## main ########
_checkID

## Start install vm
echo "Start install vm..."
if [ -z "$1" ]
then
  _showUsage
elif [ "$1" == "all" ]
then
  task_list="$@"
else
  task_list="$1"
fi

for task in $task_list
do
  eval $task
done
## Install done
echo "Install vm done! Please restart the machine~"


Wish this helps.

regards,
Stanley Huang