#!/bin/bash
# Yocto ADT Installer
#
# Copyright 2010-2011 by Intel Corp.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy 
# of this software and associated documentation files (the "Software"), to deal 
# in the Software without restriction, including without limitation the rights 
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
# copies of the Software, and to permit persons to whom the Software is 
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in 
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
# THE SOFTWARE.


usage ()
{

  INST_ARCH=`uname -m`
  INST_OS=`uname -o| tr '[A-Z]' '[a-z]'`
  INST_KR=`uname -r| tr '[A-Z]' '[a-z]'`

  echo_info "#########################################################################"
  echo_info "# Welcome to Yocto Application Developement Tools (ADT) Installer"
  echo_info "# "
  echo_info "# Host Machine:\t\t\t\t"$INST_ARCH
  echo_info "# OS info:\t\t\t\t$INST_KR"  
  echo_info "# Yocto ADT version to be installed:\t$YOCTOADT_VERSION"
  echo_info "# supported target architectures:\t$YOCTOADT_SUPPORTED_TARGETS"
  echo_info "# supported target root_fs images:\t$YOCTOADT_SUPPORTED_ROOTFS"
  echo_info "#########################################################################\n"

  echo_info "Systemwide installation. Installation will occur under $INSTALL_FOLDER\n"
  echo_info "############################################################################"
  echo_info "# Your system installation configurations from adt_installer.conf"
  echo_info "############################################################################"

  echo_info "# Cross toolchains:\t\t$YOCTOADT_TARGETS"
  echo_info "# Install Qemu:\t\t\t$YOCTOADT_QEMU"
  echo_info "# Install NFS utilities:\t$YOCTOADT_NFS_UTIL"
  #echo_info "# Install bitbake + UI:\t\t$YOCTOADT_BITBAKE"
  #echo_info "# Install metadata:\t$YOCTOADT_METADATA"
  #echo_info "############################################################################\n"

    echo_info "\n##############################################################################"
    echo_info "# Your rootfs image(s) and target sysroot selections from adt_installer.conf"
    echo_info "##############################################################################"
prompt=1
for arch_type in $YOCTOADT_TARGETS; do
  download_images $arch_type $prompt
done
    echo_info "############################################################################\n"
  select_install_type
}

validate_config()
{

  for selected_arch_type in $YOCTOADT_TARGETS; do
    found=0
    select_machine_var="\$YOCTOADT_TARGET_MACHINE_$selected_arch_type"
    select_machine=`eval echo $select_machine_var`
    show_error_banner=0

    for supported_arch_type in $YOCTOADT_SUPPORTED_TARGETS; do
      if [ "$selected_arch_type" == "$supported_arch_type" ]; then
        found=1
        break
      fi
    done
    if [ $found == 0 ]; then
       echo_info "[ADT_INST] Error: YOCTADT_TARGETS in adt_installer.conf contains invalid entries: $YOCTOADT_TARGETS. Valid values are: $YOCTOADT_SUPPORTED_TARGETS"
       show_error_banner=1
    elif [ -z "$select_machine" ]; then
       echo_info "[ADT_INST] Error: No MACHINE was defined for $selected_arch_type architecture! This is needed to install the toolchain and the correct environment settings."
       echo_info "[ADT_INST] To do that, in adt-installer.conf, set the following variable: YOCTOADT_TARGET_MACHINE_$selected_arch_type"
       show_error_banner=1
    fi

    if [ $show_error_banner == 1 ]; then
       echo -e "\n#############################################################################"
       echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
       echo -e "#############################################################################\n"
       exit -1
    fi
  done

  for arch_type in $YOCTOADT_SUPPORTED_TARGETS; do
    #select_target_var="\$YOCTOADT_TARGET_$arch_type"
    #select_target=`eval echo $select_target_var`

    #if [ "$select_target" != "Y" ] || [ "$selected_target" != "y" ]; then
    #  continue;
    #fi

    target_sysroot_image_var="\$YOCTOADT_TARGET_SYSROOT_IMAGE_$arch_type"
    target_sysroot_image=`eval echo $target_sysroot_image_var`


    select_rootfs_var="\$YOCTOADT_ROOTFS_$arch_type"
    select_rootfs=`eval echo $select_rootfs_var`

    if [ "$select_rootfs" == "" ] && [ "$target_sysroot_image" == "" ]; then
       continue;
    fi

    for image_type in $select_rootfs; do
#validate rootfs type defined in YOCTOADT_ROOTFS_{ARCH} is valid and in YOCTOADT_SUPPORTED_ROOTFS
      found=0
      for supported_rootfs_type in $YOCTOADT_SUPPORTED_ROOTFS; do
        if [ "$image_type" == "$supported_rootfs_type" ]; then
          found=1
          break
        fi
      done
      if [ $found == 0 ]; then
#the rootfs type listed for downloading is not valid
        echo_info "[ADT_INST] Error: Selected YOCTOADT_ROOTFS_$arch_type value: $image_type, is not valid! Valid values are: $YOCTOADT_SUPPORTED_ROOTFS "
       echo -e "\n#############################################################################"
       echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
       echo -e "#############################################################################\n"
        exit -1
      fi
    done

    found=0
    for image_type in $select_rootfs; do
#validate that rootfs to be extracted must be in the item: YOCTOADT_ROOTFS_${ARCH}
      if [ "$target_sysroot_image" == "$image_type" ]; then
        found=1
        break
      fi
    done
# the rootfs image to be extracted is not selected
    if [ $found == 0 ]; then
      echo_info "[ADT_INST] Error: YOCTOADT_TARGET_SYSROOT_IMAGE_$arch_type selection: $target_sysroot_image is not included in YOCTOADT_ROOTFS_$arch_type selections: $select_rootfs"
      echo -e "\n#############################################################################"
      echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
      echo -e "#############################################################################\n"
      exit -1
    fi
  done
}


#detect opkg installed or not, for installing sdk, we will use
#this installed local opkg
install_opkg()
{
if [ ! -x "$LOCAL_OPKG_LOC/bin/opkg" ]; then
  echo_info "OPKG is not setup, setting up opkg in local, which is required for installing yocto ADT...\n"

  if [ -d $LOCAL_OPKG_LOC ]; then
    echo_info "Deleting old OPKG folder, which doesn't contain executables... "
    rm -rf $LOCAL_OPKG_LOC
  fi

  parent_folder=`pwd`
  cd $LOCAL_OPKG_FOLDER
  check_result

  opkg_source_dir=`ls -d opkg-*`

  if [ $opkg_source_dir == "" ]; then
    echo_info "[ADT_INST] Error: OPKG source directory is not found!"
    echo -e "\n#############################################################################"
    echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
    echo -e "#############################################################################\n"
    exit -1
  fi

  cd $opkg_source_dir
  check_result

  echo_info "Configure opkg ...\n"
  autoreconf -i
  ./configure --prefix=$parent_folder/$LOCAL_OPKG_LOC --enable-shared=no --disable-curl --disable-ssl-curl --disable-gpg >> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE
  check_result

  echo_info "Make opkg ...\n"
  make &>> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE
  check_result

  echo_info "Make Install opkg ...\n"
  make install &>> $parent_folder/$YOCTOADT_INSTALL_LOG_FILE
  #if meet error when installing opkg, cancel the installation
  check_result

  cd $parent_folder
  echo_info "Successfully installed OPKG.\n"
fi
}

confirm_download()
{
#avoid repeated reminding
if [ "$override_oldfile" == 1 ]; then
  return $pre_result
else
  override_oldfile=1
fi

while true; do
  #echo_info "[ADT_INST] Files [$1] already exists. If you continue downloading, old files will be overrided."
  #echo_info "[ADT_INST] Further prompts will not be given if there're more existing files to be downloaded."
  #echo_info "[ADT_INST] Do you want to continue downloading? Please enter Y/N:"
  echo_info "\nFile [$1] already exists, which means you've downloaded the qemu kernel and rootfs file(s) before.  If you choose continue downloading, old files will be overridden."
  echo_info "[ADT_INST] Do you want to continue downloading? Please enter Y/N:"
  read YOCTOADT_INSTALL
  YOCTOADT_INSTALL=`tr '[a-z]' '[A-Z]'<<<"$YOCTOADT_INSTALL"`
  if [ "$YOCTOADT_INSTALL" == "Y" ]; then
    pre_result=0
    return 0
  elif [ "$YOCTOADT_INSTALL" == "N" ]; then
    pre_result=1
    return 1
  fi
done
}

download_file()
{
local filename=`echo ${1##*/}`
if [ -f "$LOCAL_DOWNLOAD/$filename" ]; then
  confirm_download $filename
  result="$?"
  if [ ! "$result" == "0" ]; then
    return
  else
    echo "Removing old file [$1]"
    rm -rf "$LOCAL_DOWNLOAD/$filename" 
  fi
fi
echo_info "Downloading file: $filename..."
wget "$YOCTOADT_REPO/rootfs/$1" -P $LOCAL_DOWNLOAD --progress=bar:force 2>&1 | tee -a "$YOCTOADT_INSTALL_LOG_FILE" 
}



#Need three input params:
# $1 arch_type(arm powerpc x86 mips)
# $2 machine(qemuarm beagleboard)
# $3 rootfs_image_type (a list of sdk sato minimal lsb)
get_image()
{
  local machine=$2
 
  if [ "$1" == "x86" ] || [ "$1" == "x86_64" ]; then
    kernel="bzImage-$machine.bin"
  elif [ "$1" == "ppc" ] || [ "$1" == "mips" ]; then
    kernel="vmlinux-$machine.bin"
  else
    kernel="zImage-$machine.bin"
  fi

  #echo_info "[ADT_INST] Downloading qemu kernel binary: $qemu_kernel"
  download_file $machine/$kernel
  check_result
  
  for image_type in $select_rootfs; do
    #echo_info "[ADT_INST] Downloading rootfs file: core-image-$image_type-$machine.tar.bz2"
    filename="core-image-$image_type-$machine.tar.bz2"
    download_file $machine/$filename
    check_result
  done
}

download_images()
{
  select_rootfs_var="\$YOCTOADT_ROOTFS_$1"
  select_sysroot_image_var="\$YOCTOADT_TARGET_SYSROOT_IMAGE_$1"
  select_sysroot_var="\$YOCTOADT_TARGET_SYSROOT_LOC_$1"
  select_machine_var="\$YOCTOADT_TARGET_MACHINE_$1"
  select_rootfs=`eval echo $select_rootfs_var`
  select_sysroot_image=`eval echo $select_sysroot_image_var`
  select_sysroot=`eval echo $select_sysroot_var`
  select_machine=`eval echo $select_machine_var`

  if [ -n "$select_sysroot" ]; then
    select_sysroot=`readlink -m $select_sysroot`
  fi

  if [ "$select_rootfs" != "" ]; then
    if [ $2 ]; then
    #echo_info "\n############################################################################"
    #echo_info "# To be downloaded rootfs image details defined in adt_installer.conf"
    #echo_info "############################################################################"
    echo_info "# Target architecture:\t\t$1"
    echo_info "# Target machine:\t\t$select_machine"
    echo_info "# Root_fs images:\t\t$select_rootfs"
    echo_info "# Target sysroot image:\t\t$select_sysroot_image"
    echo_info "# Target sysroot loc:\t\t$select_sysroot"
    echo_info "\n"
    #echo_info "############################################################################\n"
    else
    get_image $1 $select_machine $select_rootfs
    fi
  fi
}




#Main body of installer

clear

run_path=`dirname $0`
cd $run_path

if [ ! -f "scripts/util" ]; then
  echo -e "[ADT_INST] Error: Script file: util, can't be found under: $run_path!"
  echo -e "\n#############################################################################"
  echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
  echo -e "#############################################################################\n"
  exit -1
fi

if [ ! -f "scripts/adt_installer_internal" ]; then
  echo -e "[ADT_INST] Error: Script file: adt_installer_internal, can't be found under: $run_path!"
  echo -e "\n#############################################################################"
  echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
  echo -e "#############################################################################\n"
  exit -1
fi

config_file="adt_installer.conf"
if [ ! -f "$config_file" ]; then
  echo_info "[ADT_INST] Error: Installation configuration file: adt_installer.conf is not found!\n"
  echo_info "\n##################################################################################"
  echo_info "# Meet error(s) when installing Yocto ADT. Please check log file for details. "
  echo_info "##################################################################################\n"
  exit -1
fi

. scripts/data_define
. scripts/util


if [ -f "$YOCTOADT_INSTALL_LOG_FILE" ]; then
  rm $YOCTOADT_INSTALL_LOG_FILE
fi

echo -n "Please enter the install location (default: $DEFAULT_INSTALL_FOLDER): "
read INSTALL_FOLDER

if [ "$INSTALL_FOLDER" = "" ]; then
    INSTALL_FOLDER=$DEFAULT_INSTALL_FOLDER
fi

eval INSTALL_FOLDER=$(printf "%q" "$INSTALL_FOLDER")
if [ -d "$INSTALL_FOLDER" ]; then
	export INSTALL_FOLDER=$(cd "$INSTALL_FOLDER"; pwd)
else
	export INSTALL_FOLDER=$(readlink -m "$INSTALL_FOLDER")
fi

if [ -n "$(echo $INSTALL_FOLDER|grep ' ')" ]; then
       echo "The target directory path ($INSTALL_FOLDER) contains spaces. Abort!"
       exit 1
fi

clear

usage

user_inst_type="$?"

validate_config
check_result

#check adt_repo exist
wget --spider $YOCTOADT_REPO 2>&1 | tee -a "$YOCTOADT_INSTALL_LOG_FILE"
if grep -q "404 Not Found" $YOCTOADT_INSTALL_LOG_FILE; then
  echo -e "[ADT_INST] Error: YOCTOADT_REPO does not exist: $YOCTOADT_REPO"
  echo -e "\n#############################################################################"
  echo -e "# Meet error(s) when installing Yocto ADT! Please check log file for details. "
  echo -e "#############################################################################\n"
  exit -1
fi

#firstly we need to install opkg host
install_opkg

#Create folders for holding rootfs/qemu images
if [ ! -d "$LOCAL_DOWNLOAD" ]; then
  echo_info "Creating new images downloading folder: $LOCAL_DOWNLOAD ..."
  mkdir -p $LOCAL_DOWNLOAD
fi

#downloading required qemu images/rootfs
if [ "$user_inst_type" == "0" ]; then
  override_oldfile=1
else
  override_oldfile=0
fi

for arch_type in $YOCTOADT_TARGETS; do
  download_images $arch_type
done

scripts/adt_installer_internal $user_inst_type

result="$?"
#echo_info "\n############################################################"
if [ "$result" == "0" ]; then
  echo_info "\n############################################################"
  echo_info "# Yocto ADT has been successfully installed."
  echo_info "############################################################\n"
fi

