#!/bin/bash
#
# tcos-buildchroot This script creates a chroot to build TCOS 32bits images
#
# Copyright (C) 2006-2011  mariodebian at gmail
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#


if [ $(id -u) != 0 ]; then
  echo "Error: need to exec as root user" >&2
  exit 1
fi

. /etc/tcos/tcos.conf
[ -e /var/lib/tcos/version.conf ] && . /var/lib/tcos/version.conf
. ${TCOS_DIR}/tcos-generation-functions.sh

for tpl in $(tcos_get_templates); do
  . $tpl
done

# load forced settings for derivatives
if [ -d /etc/tcos/conf.d/ ]; then
  for file in /etc/tcos/conf.d/tcos*conf; do
    [ -e $file ] && . $file
  done
fi


export LC_ALL=C
export LC_MESSAGES=C
export DEBCONF_FRONTEND="noninteractive"
export DEBIAN_FRONTEND="noninteractive"

# default settings
TCOS_ARCH=i386
TCOS_FLAVOUR=standard
#TCOS_MIRROR="http://www.tcosproject.org"
TCOS_MIRROR=

TCOS_PACKAGES="initramfs-tools-tcos p910nd fgetty"
TCOS_PACKAGES="${TCOS_PACKAGES} binutils acpid alsa-utils twm dropbear mbr file"
TCOS_PACKAGES="${TCOS_PACKAGES} rdesktop pulseaudio pulseaudio-module-x11"
TCOS_PACKAGES="${TCOS_PACKAGES} pulseaudio-utils pulseaudio-esound-compat libasound2-plugins"
TCOS_PACKAGES="${TCOS_PACKAGES} dbus dbus-x11 avahi-daemon"


DISTRO_PACKAGES="xserver-xorg xutils xfonts-base xfonts-100dpi libgl1-mesa-dri libgl1-mesa-glx libglu1-mesa mtools xterm wget dosfstools"
DISTRO_PACKAGES="${DISTRO_PACKAGES} x11-utils debootstrap eject debconf syslinux squashfs-tools"
DISTRO_PACKAGES="${DISTRO_PACKAGES} python python-dbus alsa-base xauth xserver-xorg-input-all xserver-xorg-input-mouse"


# apt options (force-yes)
APT_OPTS="-y --force-yes"
ACTION=
GENTCOS_OPTS="-tftp"
MIRROR_EXTRAS=""
TCOS_EXPERIMENTAL=""

UBUNTU_DEF_MIRROR=http://archive.ubuntu.com/ubuntu/
UBUNTU_DEF_MIRROR2=http://security.ubuntu.com/ubuntu/
DEBIAN_DEF_MIRROR=http://ftp.de.debian.org/debian/


set_conf() {
    if [ "${DISTRIBUTION}" = "ubuntu" ]; then
      if [ ! $MIRROR ]; then MIRROR=$UBUNTU_DEF_MIRROR ; fi
      if [ ! $MIRROR2 ]; then MIRROR2=$UBUNTU_DEF_MIRROR2 ; fi
      MIRROR_EXTRAS="universe restricted multiverse"
      #DISTRO_PACKAGES="console-setup ${DISTRO_PACKAGES}"
    else
      if [ ! $MIRROR ]; then MIRROR=$DEBIAN_DEF_MIRROR ; fi
      #DISTRO_PACKAGES="console-data ${DISTRO_PACKAGES} libltdl3 "
      #DISTRO_PACKAGES="console-tools console-data ${DISTRO_PACKAGES}"
    fi
}

# load forced settings for derivatives
if [ -d /etc/tcos/conf.d/ ]; then
  for file in /etc/tcos/conf.d/tcos*conf; do
    [ -e $file ] && . $file
  done
fi

usage() {
  cat << EOF
tcos-buildchroot usage:

     Actions:
        --create                     (Create chroot)
        --update                     (Update chroot)
        --install=package1,package2  (Install some packages in chroot)
        --update-images              (Update chroot TCOS images)

     Options:
        --arch=xxx           (Set Architecture of chroot, default: $TCOS_ARCH)
        --flavour=xxx        (Set flavour of chroot, default: $TCOS_FLAVOUR)  
        --version=xxx        (Set version of chroot, default: $TCOS_DISTRO)
        --forcedistro=xxx    (Set distro of chroot, default: $DISTRIBUTION)
        --dir=xxx            (Set dir of chroot, default: $TCOS_CHROOT)
        --tcos-exp           (Enable experimental TCOS branch)
EOF
if [ "$DISTRIBUTION" = "ubuntu" ]; then
cat << EOF
        --mirror=xxx         (Set mirror of chroot, default: $UBUNTU_DEF_MIRROR)
        --securitymirror=xxx (Set security mirror of chroot, default: $UBUNTU_DEF_MIRROR2)
EOF
else
cat << EOF
        --mirror=xxx         (Set mirror of chroot, default: $DEBIAN_DEF_MIRROR)
EOF
fi
cat << EOF
        --tcosmirror=xxx     (Set mirror of TCOS, default: $TCOS_MIRROR)
        --kversion=xxx       (Set kernel version of chroot, default: $TCOS_KERNEL)
        --gentcos="xxx"      (Set gentcos cmdline options)

EOF
}

createEmptyCMD() {
cat << CMD > ${TCOS_CHROOT}/$1
#!/bin/sh
#echo " * Fake $1 called: '\$@'"
exit 0
CMD
  chmod +x ${TCOS_CHROOT}/$1
}

chrootcreate() {
  mkdir -p ${TCOS_CHROOT}
 
  debootstrap --arch "${TCOS_ARCH}" ${TCOS_DISTRO} ${TCOS_CHROOT} ${MIRROR}


  if [ $? != 0 ]; then echo "Error running debootstrap." ; exit $?; fi

  # Add TCOS mirror
  [ "x${TCOS_MIRROR}" != "x" ] && echo "deb ${TCOS_MIRROR} ${TCOS_DISTRO} main ${TCOS_EXPERIMENTAL}" >> ${TCOS_CHROOT}/etc/apt/sources.list
  [ "x${TCOS_MIRROR}" != "x" ] && TCOS_PACKAGES="${TCOS_PACKAGES} tcos-keyring"

  # add extras (universe and multiverse repos)
  if [ "${MIRROR_EXTRAS}" != "" ]; then
    echo "deb ${MIRROR} ${TCOS_DISTRO} ${MIRROR_EXTRAS}" >> ${TCOS_CHROOT}/etc/apt/sources.list
    echo "deb ${MIRROR2} ${TCOS_DISTRO}-security main" >> ${TCOS_CHROOT}/etc/apt/sources.list
    echo "deb ${MIRROR} ${TCOS_DISTRO}-updates main ${MIRROR_EXTRAS}" >> ${TCOS_CHROOT}/etc/apt/sources.list
  fi
  
  # add extra source include in forced settings
  if [ ! -z ${MIRROR_EXTRA} ];then
    echo ${MIRROR_EXTRA} >> ${TCOS_CHROOT}/etc/apt/sources.list
  fi

  # add /etc/resolv.conf (some versions of cdebootstrap don't create it)
  cat /etc/resolv.conf > ${TCOS_CHROOT}/etc/resolv.conf

  # avoid to use a shell script in chroot
  chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \
                                    --add --rename --quiet \
                                    --divert /sbin/start-stop-daemon.original \
                                    /sbin/start-stop-daemon

  chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \
                                    --add --rename --quiet \
                                    --divert /usr/sbin/invoke-rc.d.original \
                                    /usr/sbin/invoke-rc.d

#  # avoid calling udevadm inside chroot
#  # http://bugs.debian.org/627790
#  chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \
#                                    --add --rename --quiet \
#                                    --divert /sbin/udevadm.original \
#                                    /sbin/udevadm
#  createEmptyCMD /sbin/udevadm


  cat << EOF > ${TCOS_CHROOT}/etc/apt/apt.conf
APT::Install-Recommends "false";
APT::Install-Suggests "false";
EOF

  mount --bind /proc ${TCOS_CHROOT}/proc
  mount --bind /sys ${TCOS_CHROOT}/sys

  # preseed linux-image message
  cat << EOF > ${TCOS_CHROOT}/preseed
linux-image-${TCOS_KERNEL}	linux-image-${TCOS_KERNEL}/preinst/lilo-initrd-${TCOS_KERNEL}	boolean	false
linux-image-${TCOS_KERNEL}	linux-image-${TCOS_KERNEL}/preinst/bootloader-initrd-${TCOS_KERNEL}	boolean	false
linux-image-${TCOS_KERNEL}	linux-image-${TCOS_KERNEL}/postinst/create-kimage-link-${TCOS_KERNEL}	boolean	false
linux-image-${TCOS_KERNEL}	shared/kernel-image/really-run-bootloader	boolean	false
console-common	console-data/keymap/policy	select	Don't touch keymap
console-data	console-data/keymap/policy	select	Don't touch keymap
console-setup	console-setup/variant	select	USA
console-setup	console-setup/charmap	select	UTF-8
console-setup	console-setup/layoutcode	string	us
console-setup	console-setup/compose	select	No compose key
console-setup	console-setup/fontsize-text	select	16
console-setup	console-setup/optionscode	string	
console-setup	console-setup/layout	select	USA
console-setup	console-setup/detect	detect-keyboard	
console-setup	console-setup/detected	note	
console-setup	console-setup/variantcode	string	
console-setup	console-setup/codesetcode	string	Uni1
console-setup	console-setup/dont_ask_layout	error	
console-setup	console-setup/modelcode	string	pc105
console-setup	console-setup/ask_detect	boolean	false
console-setup	console-setup/altgr	select	No AltGr key
console-setup	console-setup/ttys	string	/dev/tty[1-6]
console-setup	console-setup/model	select	Generic 105-key (Intl) PC
console-setup	console-setup/fontsize-fb	select	16
console-setup	console-setup/switch	select	No temporary switch
console-setup	console-setup/codeset	select	. Combined - Latin; Slavic Cyrillic; Hebrew; basic Arabic
console-setup	console-setup/toggle	select	No toggling
console-setup	console-setup/fontface	select	Fixed
console-setup	console-setup/fontsize	string	16
dash	dash/sh	boolean	false
EOF

  createEmptyCMD /sbin/start-stop-daemon
  createEmptyCMD /usr/sbin/invoke-rc.d

  cat << EOC | chroot ${TCOS_CHROOT}
apt-get $APT_OPTS update
apt-get $APT_OPTS dist-upgrade
grep "tcosproject" /etc/apt/sources.list && apt-get install $APT_OPTS tcos-keyring
apt-get $APT_OPTS update
apt-get install $APT_OPTS ${DISTRO_PACKAGES} 
apt-get clean
debconf-set-selections /preseed
rm -f /preseed
apt-get $APT_OPTS upgrade
apt-get $APT_OPTS remove --purge grub grub-pc
EOC



  if [ "${DISTRIBUTION}" = "ubuntu" ]; then

  cat << EOC | chroot ${TCOS_CHROOT}
apt-get install $APT_OPTS linux-image-${TCOS_KERNEL} 
apt-get install $APT_OPTS ${TCOS_PACKAGES}
apt-get clean
/etc/init.d/dropbear stop || true
EOC

  ######################################
  else # DISTRO != ubuntu
  cat << EOC | chroot ${TCOS_CHROOT}
apt-get install $APT_OPTS linux-image-${TCOS_KERNEL}
apt-get install $APT_OPTS ${TCOS_PACKAGES}
apt-get clean
/etc/init.d/dropbear stop || true
rm -f /preseed
EOC
  fi

  touch ${TCOS_CHROOT}/etc/tcos/chroot
  umount -l ${TCOS_CHROOT}/proc
  umount -l ${TCOS_CHROOT}/sys
  # remove udevadm diversion
  chrootexit
} # end of chrootcreate()

###############################################################################

chrootenter() {
cat /etc/resolv.conf > ${TCOS_CHROOT}/etc/resolv.conf
[ ! -e ${TCOS_CHROOT}/sbin/start-stop-daemon ] &&   createEmptyCMD /sbin/start-stop-daemon
[ ! -e ${TCOS_CHROOT}/usr/sbin/invoke-rc.d ] && createEmptyCMD /usr/sbin/invoke-rc.d

#if [ ! -e /sbin/udevadm.original ]; then
#  chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \
#                                    --add --rename --quiet \
#                                    --divert /sbin/udevadm.original \
#                                    /sbin/udevadm
#  createEmptyCMD /sbin/udevadm
#fi
}

chrootexit() {
return
#if [ -e ${TCOS_CHROOT}/sbin/udevadm.original ]; then
#  rm -f ${TCOS_CHROOT}/sbin/udevadm
#  chroot ${TCOS_CHROOT} dpkg-divert --package initramfs-tools-tcos \
#                                    --remove --rename --quiet \
#                                    --divert /sbin/udevadm.original \
#                                    /sbin/udevadm
#fi
}

chrootupdate() {
  chrootenter

# copy console keymap
if [ -e /etc/console/boottime.kmap.gz ]; then
	mkdir -p ${TCOS_CHROOT}/etc/console
	cp /etc/console/boottime.kmap.gz ${TCOS_CHROOT}/etc/console
fi
if [ -e /etc/console-setup/boottime.kmap.gz ]; then
	mkdir -p ${TCOS_CHROOT}/etc/console-setup
	cp /etc/console-setup/boottime.kmap.gz ${TCOS_CHROOT}/etc/console-setup/
fi
if [ -e /etc/console-setup/cached*.kmap.gz ]; then
	mkdir -p ${TCOS_CHROOT}/etc/console-setup
	cp /etc/console-setup/cached*.kmap.gz ${TCOS_CHROOT}/etc/console-setup/
fi

if [ -e /etc/console-setup/cached_UTF-8_del.kmap.gz ]; then
	mkdir -p ${TCOS_CHROOT}/etc/console-setup
	cp /etc/console-setup/cached_UTF-8_del.kmap.gz ${TCOS_CHROOT}/etc/console-setup/
fi

  cat << EOC | chroot ${TCOS_CHROOT}
apt-get update
apt-get $APT_OPTS dist-upgrade
apt-get install $APT_OPTS ${TCOS_PACKAGES}
apt-get install $APT_OPTS ${DISTRO_PACKAGES}
apt-get clean
EOC

touch ${TCOS_CHROOT}/etc/tcos/chroot
chrootexit
}

###############################################################################

chrootinstallpkg() {
  chrootenter

  cat << EOC | chroot ${TCOS_CHROOT}
apt-get update
apt-get $APT_OPTS install $@
apt-get clean
EOC
  chrootexit
}

###############################################################################
chrootcp() {
  if [ -e "$1" ]; then
    mkdir -p "${TCOS_CHROOT}/$(dirname $1)"
    cp "$1" "${TCOS_CHROOT}/$(dirname $1)/"
  fi
}
chrootupdateimages() {
chrootenter
# remove udevadm diversion before gentcos
chrootexit

# copy some files
chrootcp /usr/share/tcos-core/lockscreen-custom.png
chrootcp /etc/default/console-setup
chrootcp /etc/default/keyboard
chrootcp /etc/adjtime
chrootcp /etc/hosts

TCOS_KERNEL=$(awk -F"=" '/^TCOS_KERNEL=/ {print $2}' ${TCOS_CHROOT}/etc/tcos/tcos.conf | sed 's/"//g')
if [ -f /etc/tcos/templates/tcosconfig.conf ]; then
  mkdir -p ${TCOS_CHROOT}/etc/tcos/templates/
  cp /etc/tcos/templates/tcosconfig.conf ${TCOS_CHROOT}/etc/tcos/templates/
  if grep -q "TCOS_KERNEL" ${TCOS_CHROOT}/etc/tcos/templates/tcosconfig.conf; then
    TCOS_KERNEL=$(awk -F"=" '/^TCOS_KERNEL=/ {print $2}' ${TCOS_CHROOT}/etc/tcos/templates/tcosconfig.conf | sed 's/"//g')
  fi
fi


mount --bind /proc ${TCOS_CHROOT}/proc

  cat << EOC | chroot ${TCOS_CHROOT}
gentcos ${GENTCOS_OPT}
EOC

umount -l ${TCOS_CHROOT}/proc

# this is exec outside chroot
rm -rf /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL} \
       /var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs \
       /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} \
       /var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi \
       /var/lib/tcos/fs-${TCOS_KERNEL}

# new Ubuntus chmod 600 vmlinuz, copy vmlinuz to tcos/tftp/
[ ! -e /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL} ] && \
	cp ${TCOS_CHROOT}/boot/vmlinuz-${TCOS_KERNEL} /var/lib/tcos/tftp/ && \
	chmod 644 /var/lib/tcos/tftp/vmlinuz-${TCOS_KERNEL}

[ ! -e /var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs ] && \
	ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/usr-${TCOS_KERNEL}.squashfs /var/lib/tcos/tftp/

[ ! -e /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} ] && \
	[ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} ] && \
	ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL} /var/lib/tcos/tftp/

[ ! -e /var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi ] && \
	[ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi ] && \
	ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/linux-${TCOS_KERNEL}.nbi /var/lib/tcos/tftp/

# NFS files and dirs
[ ! -e /var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs ] && \
	[ -e ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs ] && \
	ln -s ${TCOS_CHROOT}/var/lib/tcos/tftp/initramfs-${TCOS_KERNEL}-nfs /var/lib/tcos/tftp/

[ ! -d /var/lib/tcos/fs-${TCOS_KERNEL} ] && \
	[ -d ${TCOS_CHROOT}/var/lib/tcos/fs-${TCOS_KERNEL} ] && \
	ln -s ${TCOS_CHROOT}/var/lib/tcos/fs-${TCOS_KERNEL} /var/lib/tcos/

# generate pxelinux.cfg/default
parse_pxelinuxcfg
}

###############################################################################

#
# Script begins here
#

if [ "$#" = 0 ]; then
  echo "No parameters !!"
  usage
  exit 1
fi


OPTIONS=`getopt -o d:ko:r:v --long create,update,install:,update-images,help,version:,forcedistro:,arch:,flavour:,dir:,mirror:,securitymirror:,tcosmirror:,kversion:,gentcos:,debug,quiet,verbose,tcos-exp -n "$0" -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$OPTIONS"


while true; do
        case "$1" in
                --help) usage ; exit 0              ;;
                --version) TCOS_DISTRO=$2; shift 2 ;;
                --forcedistro) DISTRIBUTION=$2; shift 2;;
                --arch) TCOS_ARCH=$2 ; shift 2      ;;
                --flavour) TCOS_FLAVOUR=$2; shift 2 ;;
                --mirror) MIRROR=$2; shift 2    ;;
                --securitymirror) MIRROR2=$2; shift 2;;
                --tcosmirror) TCOS_MIRROR=$2; shift 2    ;;
                --dir) TCOS_CHROOT=$2 ; shift 2     ;;
                --kversion) TCOS_KERNEL=$2; shift 2   ;;
                --gentcos) GENTCOS_OPT=$2; shift 2   ;;
                --debug) echo "FIXME DEBUG"; shift  ;;
                --quiet) echo "FIXME QUIET"; shift  ;;
                --verbose) echo "FIXME VERBOSE";shift ;;
                --tcos-exp) TCOS_EXPERIMENTAL="experimental"; shift ;;

                --create) ACTION=create ; shift     ;;
                --update) ACTION=update ; shift     ;;
                --install) ACTION=installpkgs PKGS="$2"; shift 2;;
                --update-images) ACTION=update-images; shift;;

                --) shift ; break ;;
                *) usage; echo "Unknow option $1"; exit -1
                       ;;
        esac
done

# load conf with forces settings
set_conf

# save data in tcos-buildchroot.conf or load if chroot exists
if [ ! -f ${TCOS_CHROOT}/tcos-buildchroot.conf ]; then
    mkdir -p ${TCOS_CHROOT}
    echo "DISTRIBUTION=$DISTRIBUTION" >  ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "MIRROR=$MIRROR"             >> ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "MIRROR2=$MIRROR2"           >> ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "TCOS_MIRROR=$TCOS_MIRROR"   >> ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "TCOS_KERNEL=$TCOS_KERNEL"   >> ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "TCOS_DISTRO=$TCOS_DISTRO"   >> ${TCOS_CHROOT}/tcos-buildchroot.conf
    echo "TCOS_EXPERIMENTAL=$TCOS_EXPERIMENTAL"   >> ${TCOS_CHROOT}/tcos-buildchroot.conf
else
    . ${TCOS_CHROOT}/tcos-buildchroot.conf
fi

if [ "$ACTION" != "" ]; then
  case $ACTION in
     update)
       chrootupdate; exit
       ;;
     create)
       chrootcreate; exit
       ;;
     installpkgs)
       tmp=$(echo $PKGS | sed 's/,/ /g')
       chrootinstallpkg $tmp ; exit
       ;;
     update-images)
       chrootupdateimages; exit
       ;;
     *)
       echo "Error, unknow action: $ACTION"
       exit 1
       ;;
  esac
fi


