#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

echo "####################################################"
echo " Note there is a new systemvm build script based on "
echo " Veewee(Vagrant) under tools/appliance."
echo "####################################################"

set -e
set -x

IMAGENAME=systemvm
LOCATION=/var/lib/images/systemvm
PASSWORD=password
#APT_PROXY=192.168.1.115:3142/
APT_PROXY=
HOSTNAME=systemvm
SIZE=2000
DEBIAN_MIRROR=ftp.us.debian.org/debian
MINIMIZE=true
CLOUDSTACK_RELEASE=4.0
offset=4096
baseimage() {
  mkdir -p $LOCATION
  #dd if=/dev/zero of=$IMAGELOC bs=1M  count=$SIZE
  dd if=/dev/zero of=$IMAGELOC bs=1M seek=$((SIZE - 1)) count=1
  loopdev=$(losetup -f)
  losetup $loopdev $IMAGELOC
  parted $loopdev -s 'mklabel msdos'
  parted $loopdev -s 'mkpart primary ext3 4096B -1'
  sleep 2 
  losetup -d $loopdev
  loopdev=$(losetup --show -o $offset -f $IMAGELOC )
  mkfs.ext3  -L ROOT $loopdev
  mkdir -p $MOUNTPOINT
  tune2fs -c 100 -i 0 $loopdev
  sleep 2 
  losetup -d $loopdev
  
  mount -o loop,offset=$offset $IMAGELOC  $MOUNTPOINT
  
  #debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-keyring.gpg wheezy $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
  debootstrap --variant=minbase --arch=i386 wheezy $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
}


fixapt() {
  if [ "$APT_PROXY" != "" ]; then
  cat >> etc/apt/apt.conf.d/01proxy << EOF
Acquire::http::Proxy "http://${APT_PROXY}";
EOF
  fi

  cat > etc/apt/sources.list << EOF
deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.us.debian.org/debian/ wheezy main contrib non-free

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

deb http://ftp.us.debian.org/debian/ wheezy-backports main
deb-src http://ftp.us.debian.org/debian/ wheezy-backports main
EOF

  cat >> etc/apt/apt.conf << EOF
APT::Default-Release "stable"; 
EOF

  cat >> etc/apt/preferences << EOF
Package: *
Pin: release o=Debian,a=stable
Pin-Priority: 900
EOF

  #apt-key exportall | chroot . apt-key add - &&
  chroot . apt-get update &&
  echo "Apt::Install-Recommends 0;" > etc/apt/apt.conf.d/local-recommends

  cat >> usr/sbin/policy-rc.d  << EOF
#!/bin/sh
exit 101
EOF
  chmod a+x usr/sbin/policy-rc.d

  cat >> etc/default/locale  << EOF
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
EOF

  cat >> etc/locale.gen  << EOF
en_US.UTF-8 UTF-8
EOF

  DEBIAN_FRONTEND=noninteractive
  DEBIAN_PRIORITY=critical
  export DEBIAN_FRONTEND DEBIAN_PRIORITY 
  chroot . dpkg-reconfigure debconf --frontend=noninteractive
  chroot . apt-get -q -y install locales
}

network() {

  echo "$HOSTNAME" > etc/hostname &&
  cat > etc/hosts << EOF 
127.0.0.1       localhost
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOF

  cat >> etc/network/interfaces << EOF
auto lo eth0
iface lo inet loopback

# The primary network interface
iface eth0 inet static

EOF
}

install_kernel() {
  DEBIAN_FRONTEND=noninteractive
  DEBIAN_PRIORITY=critical
  export DEBIAN_FRONTEND DEBIAN_PRIORITY

  chroot . apt-get -qq -y --force-yes install grub-legacy &&
  cp -av usr/lib/grub/i386-pc boot/grub
  #for some reason apt-get install grub does not install grub/stage1 etc
  #loopd=$(losetup -f --show $1)
  #grub-install $loopd --root-directory=$MOUNTPOINT
  #losetup -d $loopd
  grub  << EOF &&
device (hd0) $1
root (hd0,0)
setup (hd0)
quit
EOF
   # install a kernel image
   cat > etc/kernel-img.conf << EOF &&
do_symlinks = yes
link_in_boot = yes
do_initrd = yes
EOF
  touch /mnt/systemvm/boot/grub/default
  chroot . apt-get install -qq -y --force-yes linux-image-686-bigmem
  cat >> etc/kernel-img.conf << EOF
postinst_hook = /usr/sbin/update-grub
postrm_hook   = /usr/sbin/update-grub
EOF
}


fixgrub() {
  kern=$(basename $(ls  boot/vmlinuz-*))
  ver=${kern#vmlinuz-}
  cat > boot/grub/menu.lst << EOF
default 0
timeout 2
color cyan/blue white/blue

### BEGIN AUTOMAGIC KERNELS LIST
# kopt=root=LABEL=ROOT ro

## ## End Default Options ##
title		Debian GNU/Linux, kernel $ver
root		(hd0,0)
kernel		/boot/$kern root=LABEL=ROOT ro console=tty0 xencons=ttyS0,115200 console=hvc0 quiet
initrd		/boot/initrd.img-$ver

### END DEBIAN AUTOMAGIC KERNELS LIST
EOF
  (cd boot/grub; ln -s menu.lst grub.conf)
}

fixinittab() {
  cat >> etc/inittab << EOF

vc:2345:respawn:/sbin/getty 38400 hvc0
EOF
}

fixfstab() {
  cat > etc/fstab << EOF
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
LABEL=ROOT      /               ext3    errors=remount-ro,sync,noatime 0       1
EOF
}

fixacpid() {
  mkdir -p etc/acpi/events
  cat >> etc/acpi/events/power << EOF
event=button/power.*
action=/usr/local/sbin/power.sh "%e"
EOF
  cat >> usr/local/sbin/power.sh << EOF
#!/bin/bash
/sbin/poweroff
EOF
  chmod a+x usr/local/sbin/power.sh
}

fixiptables() {
cat >> etc/modules << EOF
nf_conntrack
nf_conntrack_ipv4
EOF
cat > etc/init.d/iptables-persistent << EOF
#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    mountkernfs $local_fs
# Required-Stop:     $local_fs
# Should-Start:      cloud-early-config
# Default-Start:     S
# Default-Stop:     
# Short-Description: Set up iptables rules
### END INIT INFO

PATH="/sbin:/bin:/usr/sbin:/usr/bin"

# Include config file for iptables-persistent
. /etc/iptables/iptables.conf

case "\$1" in
start)
    if [ -e /var/run/iptables ]; then
        echo "iptables is already started!"
        exit 1
    else
        touch /var/run/iptables
    fi

    if [ \$ENABLE_ROUTING -ne 0 ]; then
        # Enable Routing
        echo 1 > /proc/sys/net/ipv4/ip_forward
    fi

    # Load Modules
    modprobe -a \$MODULES

    # Load saved rules
    if [ -f /etc/iptables/rules ]; then
        iptables-restore </etc/iptables/rules
    fi
    ;;
stop|force-stop)
    if [ ! -e /var/run/iptables ]; then
        echo "iptables is already stopped!"
        exit 1
    else
        rm /var/run/iptables
    fi

    if [ \$SAVE_NEW_RULES -ne 0 ]; then
        # Backup old rules
        cp /etc/iptables/rules /etc/iptables/rules.bak
        # Save new rules
        iptables-save >/etc/iptables/rules
    fi

    # Restore Default Policies
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT

    # Flush rules on default tables
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F

    # Unload previously loaded modules
    modprobe -r \$MODULES

    # Disable Routing if enabled
    if [ \$ENABLE_ROUTING -ne 0 ]; then
        # Disable Routing
        echo 0 > /proc/sys/net/ipv4/ip_forward
    fi

    ;;
restart|force-reload)
    \$0 stop
    \$0 start
    ;;
status)
    echo "Filter Rules:"
    echo "--------------"
    iptables -L -v
    echo ""
    echo "NAT Rules:"
    echo "-------------"
    iptables -t nat -L -v
    echo ""
    echo "Mangle Rules:"
    echo "----------------"
    iptables -t mangle -L -v
    ;;
*)
    echo "Usage: \$0 {start|stop|force-stop|restart|force-reload|status}" >&2
    exit 1
    ;;
esac

exit 0
EOF
  chmod a+x etc/init.d/iptables-persistent


  touch etc/iptables/iptables.conf 
  cat > etc/iptables/iptables.conf << EOF
# A basic config file for the /etc/init.d/iptable-persistent script

# Should new manually added rules from command line be saved on reboot? Assign to a value different that 0 if you want this enabled.
SAVE_NEW_RULES=0

# Modules to load:
MODULES="nf_nat_ftp nf_conntrack_ftp"

# Enable Routing?
ENABLE_ROUTING=1
EOF
  chmod a+x etc/iptables/iptables.conf

}

vpn_config() {
  cp -r ${scriptdir}/vpn/* ./
}

packages() {
  DEBIAN_FRONTEND=noninteractive
  DEBIAN_PRIORITY=critical
  DEBCONF_DB_OVERRIDE=’File{/root/config.dat}’
  export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_DB_OVERRIDE

  #basic stuff
  chroot .  apt-get --no-install-recommends -q -y --force-yes install rsyslog logrotate cron chkconfig insserv net-tools ifupdown vim-tiny netbase iptables openssh-server grub-legacy e2fsprogs dhcp3-client dnsmasq tcpdump socat wget  python bzip2 sed gawk diffutils grep gzip less tar telnet ftp rsync traceroute psmisc lsof procps monit inetutils-ping iputils-arping httping dnsutils zip unzip ethtool uuid file iproute acpid iptables-persistent virt-what sudo
  #fix hostname in openssh-server generated keys
  sed -i "s/root@\(.*\)$/root@systemvm/g" etc/ssh/ssh_host_*.pub

  #sysstat
  chroot . echo 'sysstat sysstat/enable boolean true' | chroot . debconf-set-selections
  chroot .  apt-get --no-install-recommends -q -y --force-yes install sysstat
  #apache
  chroot .  apt-get --no-install-recommends -q -y --force-yes install apache2 ssl-cert 
  #haproxy
  chroot . apt-get --no-install-recommends -q -y --force-yes install haproxy 
  #dnsmasq
  chroot . apt-get --no-install-recommends -q -y --force-yes install dnsmasq 
  #nfs client
  chroot . apt-get --no-install-recommends -q -y --force-yes install nfs-common
  #vpn stuff
  chroot .  apt-get --no-install-recommends -q -y --force-yes install xl2tpd openswan bcrelay ppp ipsec-tools tdb-tools
  #vmware tools
  chroot . apt-get --no-install-recommends -q -y --force-yes install open-vm-tools
  #xenstore utils
  chroot . apt-get --no-install-recommends -q -y --force-yes install xenstore-utils libxenstore3.0
  #keepalived and conntrackd
  chroot . apt-get --no-install-recommends -q -y --force-yes install keepalived conntrackd ipvsadm libnetfilter-conntrack3 libnl1
  #ipcalc
  chroot . apt-get --no-install-recommends -q -y --force-yes install ipcalc

  echo "***** getting jre 7 *********"
  chroot .  apt-get --no-install-recommends -q -y install openjdk-7-jre-headless
}


password() {
  chroot . echo "root:$PASSWORD" | chroot . chpasswd
}

apache2() {
   chroot . a2enmod ssl rewrite auth_basic auth_digest
   chroot . a2ensite default-ssl
   cp etc/apache2/sites-available/default etc/apache2/sites-available/default.orig
   cp etc/apache2/sites-available/default-ssl etc/apache2/sites-available/default-ssl.orig
}

services() {
  mkdir -p ./var/www/html
  mkdir -p ./opt/cloud/bin
  mkdir -p ./var/cache/cloud
  mkdir -p ./usr/share/cloud
  mkdir -p ./usr/local/cloud
  mkdir -p ./root/.ssh
  #Fix haproxy directory issue
  mkdir -p ./var/lib/haproxy
  
  /bin/cp -r ${scriptdir}/config/* ./
  chroot . chkconfig xl2tpd off
  chroot . chkconfig --add cloud-early-config
  chroot . chkconfig cloud-early-config on
  chroot . chkconfig --add iptables-persistent
  chroot . chkconfig iptables-persistent off
  chroot . chkconfig --force --add cloud-passwd-srvr
  chroot . chkconfig cloud-passwd-srvr off
  chroot . chkconfig --add cloud
  chroot . chkconfig cloud off
  chroot . chkconfig monit off
}

dhcp_fix() {
  #deal with virtio DHCP issue, copy and install customized kernel module and iptables
  mkdir -p tmp
  cp /tmp/systemvm/xt_CHECKSUM.ko lib/modules/2.6.32-5-686-bigmem/kernel/net/netfilter
  chroot . depmod -a 2.6.32-5-686-bigmem
  cp /tmp/systemvm/iptables_1.4.8-3local1checksum1_i386.deb tmp/
  chroot . dpkg -i tmp/iptables_1.4.8-3local1checksum1_i386.deb
  rm tmp/iptables_1.4.8-3local1checksum1_i386.deb
}

install_xs_tool() {
  #deal with virtio DHCP issue, copy and install customized kernel module and iptables
  mkdir -p tmp
  cp /tmp/systemvm/xe-guest-utilities_5.6.0-595_i386.deb tmp/
  chroot . dpkg -i tmp/xe-guest-utilities_5.6.0-595_i386.deb
  rm tmp/xe-guest-utilities_5.6.0-595_i386.deb
}

cleanup() {
  rm -f usr/sbin/policy-rc.d
  rm -f root/config.dat
  rm -f etc/apt/apt.conf.d/01proxy 

  if [ "$MINIMIZE" == "true" ]
  then
    rm -rf var/cache/apt/*
    rm -rf var/lib/apt/*
    rm -rf usr/share/locale/[a-d]*
    rm -rf usr/share/locale/[f-z]*
    rm -rf usr/share/doc/*
    size=$(df   $MOUNTPOINT | awk '{print $4}' | grep -v Available)
    dd if=/dev/zero of=$MOUNTPOINT/zeros.img bs=1M count=$((((size-150000)) / 1000))
    rm -f $MOUNTPOINT/zeros.img
  fi
}

signature() {
  (cd ${scriptdir}/config;  tar cvf ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar *)
  (cd ${scriptdir}/vpn;  tar rvf ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar *)
  gzip -c ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tar  > ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tgz
  md5sum ${MOUNTPOINT}/usr/share/cloud/cloud-scripts.tgz |awk '{print $1}'  > ${MOUNTPOINT}/var/cache/cloud/cloud-scripts-signature
  echo "Cloudstack Release $CLOUDSTACK_RELEASE $(date)" > ${MOUNTPOINT}/etc/cloudstack-release
}

#check grub version

grub --version | grep "0.9" > /dev/null
if [ $? -ne 0 ]
then
    echo You need grub 0.9x\(grub-legacy\) to use this script!
    exit 1
fi

mkdir -p $IMAGENAME
mkdir -p $LOCATION
MOUNTPOINT=/mnt/$IMAGENAME/
IMAGELOC=$LOCATION/$IMAGENAME.img
scriptdir=$(dirname $PWD/$0)

rm -rf /tmp/systemvm
mkdir -p /tmp/systemvm
#cp ./xt_CHECKSUM.ko /tmp/systemvm
#cp ./iptables_1.4.8-3local1checksum1_i386.deb /tmp/systemvm
#cp ./xe-guest-utilities_5.6.0-595_i386.deb /tmp/systemvm

rm -f $IMAGELOC
begin=$(date +%s)
echo "*************INSTALLING BASEIMAGE********************"
baseimage

cp $scriptdir/config.dat $MOUNTPOINT/root/
cd $MOUNTPOINT

mount -o bind /proc $MOUNTPOINT/proc
mount -o bind /dev $MOUNTPOINT/dev

echo "*************CONFIGURING APT********************"
fixapt  
echo "*************DONE CONFIGURING APT********************"

echo "*************CONFIGURING NETWORK********************"
network
echo "*************DONE CONFIGURING NETWORK********************"

echo "*************INSTALLING KERNEL********************"
install_kernel $IMAGELOC
echo "*************DONE INSTALLING KERNEL********************"

echo "*************CONFIGURING GRUB********************"
fixgrub $IMAGELOC
echo "*************DONE CONFIGURING GRUB********************"


echo "*************CONFIGURING INITTAB********************"
fixinittab
echo "*************DONE CONFIGURING INITTAB********************"

echo "*************CONFIGURING FSTAB********************"
fixfstab
echo "*************DONE CONFIGURING FSTAB********************"

echo "*************CONFIGURING ACPID********************"
fixacpid
echo "*************DONE CONFIGURING ACPID********************"

echo "*************INSTALLING PACKAGES********************"
packages
echo "*************DONE INSTALLING PACKAGES********************"

echo "*************CONFIGURING IPTABLES********************"
fixiptables
echo "*************DONE CONFIGURING IPTABLES********************"

echo "*************CONFIGURING PASSWORD********************"
password

echo "*************CONFIGURING SERVICES********************"
services

echo "*************CONFIGURING APACHE********************"
apache2

echo "*************CONFIGURING VPN********************"
vpn_config

echo "*************FIX DHCP ISSUE********************"
#dhcp_fix

echo "*************INSTALL XS TOOLS********************"
#install_xs_tool

echo "*************CLEANING UP********************"
cleanup 

echo "*************GENERATING SIGNATURE********************"
signature

cd $scriptdir

umount $MOUNTPOINT/proc
umount $MOUNTPOINT/dev
umount $MOUNTPOINT
fin=$(date +%s)
t=$((fin-begin))
echo "Finished building image $IMAGELOC in $t seconds"

