#!/bin/bash

# Build Privatix Live-System cd-iso
# Version 10.02.07 by Markus Mandalka

# Version of the privatix scripts
version="10.02.07"
# Version of the security-patches from security.debian.org (=today)
version_patches=$(date +"%Y%m%d")

function help() {
  cat<<EOF
USAGE
  ${0} [OPTIONS]

-f|--filename			Filename

-l|--locales			Language (en|de)

-wm|--windowsmanager		GUI (gnome|xfce|kde)

-update-home|--update-home	ISO will include updated /home/privatix/

-c|--cache			Cache (if building more then one iso)

--container-size		Change build-container size (in GB)
				Standard: $build_container_size GB

--no-container			Do not use temporary build-container
				/tmp is a linux-filesystem
				and has enough free space
EOF
}

function parse()
{
    if [ ! "$#" -gt "0" ]; then
	help
        exit 0
    fi

    while [ "$#" -gt "0" ]; do
        case ${1} in
	    -b|--base)
                build_base="${2}"
                shift 2
                ;;
	    -l|--locales)
                build_locales="${2}"
                shift 2
                ;;
	    -f|--filename)
                build_filename="${2}"
                shift 2
                ;;
	    -c|--cache)
                build_cache="${2}"
                shift 2
                ;;
	    -update-home|--update-home)
                build_home="yes"
                shift 1
                ;;
	    --no-container)
                build_container="false"
                shift 1
                ;;
	    --container-size)
                build_container_size="${2}"
                shift 2
                ;;
	    -h|--help|*) #gives you a short help
	       help
 	       exit 0
	       ;;
        esac
    done

    [ -z "${build_base}" ] && echo "You must specify a gui." && help &&  exit 240
    [ -z "${build_locales}" ] && echo "You must specify a language." && help &&  exit 240
    [ -z "${build_filename}" ] && echo "You must specify a filename." && help &&  exit 240
    

}

build_container="true";
build_container_size=6;

if [ ! -f /usr/bin/lh_build ]; then

  echo "Package live-helper is not available!
  
  Please install live-helper first (apt-get install live-helper) !";
  exit 1;

fi;

parse "$@"
echo "Building Privatix $build_base $build_locales -> $build_filename"


# paths
build_source=$(dirname $0)
cd $build_source
build_source=$PWD;
build_dir="/tmp/privatix_build_$$";
mkdir $build_dir

# buildcontainer
if [ $build_container == "true" ]
then

  container_filename="$(dirname $build_filename)/temp_privatix_build_$$"
  if ! dd if=/dev/zero of=$container_filename bs=1 count=1 seek=$(($build_container_size * 10**9))

  then
    echo "Error while writing $container_size GB build-container";
    echo "Maybe there is to few diskspace for $container_filename or the filesystem is not able to handle such big files.";

    if [ -e $container_filename ]
    then
      echo "Removing written part ...";
      rm $container_filename
    fi;

    exit 1;
  fi;

  if ! mkfs.ext2 -F $container_filename
  then
    echo "Failed to format container (mkfs.ext2 -F $container_filename)";
    exit 1;
  fi;

  # mount container
  if ! mount -o loop $container_filename $build_dir
  then
    echo "Error while mounting container (mount -o loop $container_filename $build_dir)";
    exit 1;
  fi;

fi;

# Cache
if [ -n "$build_cache" ]
then
  mkdir $build_dir/cache
  if ! mount --bind $build_cache $build_dir/cache
  then
    echo "Error while mounting cache $build_cache ! Abort.";
    exit 1;
  fi
fi;

cd $build_dir

# buildconfig
echo "Doing lh_config ..."
lh_config --apt-recommends disabled
lh_config --hostname="privatix"
lh_config --iso-application="Privatix Live-System"
lh_config --iso-publisher="Markus Mandalka; http://mandalka.name/privatix/"
lh_config --iso-volume="Privatix $version $version_patches"
lh_config --username="privatix"
lh_config --linux-flavours="486"
lh_config --packages-lists="standard privatix"

if [ "$build_locales" == "de" ]
then
  lh_config --bootappend-live="locale=de"
  lh_config --language="de"
fi;

echo "Writing files to chroot-config ...";


# packageslist

cat $build_source/build_config_packageslist_privatix_$build_base >>$build_dir/config/chroot_local-packageslists/privatix

if [ -f $build_source/build_config_packageslist_privatix_$build_base-$build_locales ]; then
  cat $build_source/build_config_packageslist_privatix_$build_base-$build_locales >>$build_dir/config/chroot_local-packageslists/privatix
fi;
if [ -f $build_source/build_config_packageslist_privatix-$build_locales ]; then
  cat $build_source/build_config_packageslist_privatix-$build_locales >>$build_dir/config/chroot_local-packageslists/privatix
fi;

# hooks
cp $build_source/build_config_hook $build_dir/config/chroot_local-hooks/config
cat $build_source/build_config_hook-$build_locales >>$build_dir/config/chroot_local-hooks/config
chmod +x $build_dir/config/chroot_local-hooks/config

# mkbootiso, cryptrootwait and installer
cp -a $build_source/usr $build_dir/config/chroot_local-includes/

# clone ourselves (build scripts and configs)
mkdir -p $build_dir/config/chroot_local-includes/usr/local/src/privatix/
cp -a $build_source/* $build_dir/config/chroot_local-includes/usr/local/src/privatix/

# doc
cp $build_source/doc/$build_locales/* $build_dir/config/binary_local-includes/

# home
if [ -n "$build_home" ]
then
  echo "Creating new home.tar.bz2 ...";
  rm $build_dir/config/chroot_local-includes/usr/local/src/privatix/home/home.tar.bz2
  tar --atime-preserve --same-owner --numeric-owner --same-permissions -cvjf $build_dir/config/chroot_local-includes/usr/local/src/privatix/home/home.tar.bz2 /home/privatix
fi;

echo "Extracting home to chroot ...";
tar --atime-preserve --same-owner --numeric-owner --same-permissions -xjf $build_dir/config/chroot_local-includes/usr/local/src/privatix/home/home.tar.bz2 --directory=$build_dir/config/chroot_local-includes/

# rights
chown -R 1000:1000 $build_dir/config/chroot_local-includes/home/privatix

# autologin
cp -a $build_source/etc $build_dir/config/chroot_local-includes/

# iso
cd $build_dir

echo "Building privatix - this may take a while ..."
lh_clean
if lh_build
then
  echo "ISO created";
  echo "Moving iso from container to filesystem";
  mv -i binary.iso $build_filename
else
  echo "Error while lh_build! Abort."
  exit;
fi;

# clean
echo "Cleaning ..."
cd $build_source

# umount cache
if [ -n "$build_cache" ]
then
  if ! umount $build_dir/cache
  then
    echo "Error while unmount $build_dir/cache";
  fi;
fi;


# delete container
if [ $build_container == "true" ]
then
  umount $build_dir
  rm $container_filename
fi

rm -R $build_dir
echo "Done."
