#!/usr/bin/env bash
#
# package updater call by crond and command execute environment
#

# ----- Constant definition -----
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# -- command path --
APT_GET="/usr/bin/apt-get" 
DPKG="/usr/bin/dpkg"
WGET="/usr/bin/wget"
ECHO="/bin/echo"
RM="/bin/rm"
HEAD="/usr/bin/head"
TR="/usr/bin/tr"
AWK="/usr/bin/awk"
CAT="/bin/cat"
CHMOD="/bin/chmod"
DATE="/bin/date"
SLEEP="/bin/sleep"
REBOOT="/sbin/reboot"
TOUCH="/usr/bin/touch"
SYNC="/bin/sync"
EXPR="/usr/bin/expr"

APT_GET_UPDATE="${APT_GET} update"
APT_GET_INSTALL="${APT_GET} -y install"
DPKG_INSTALL="${DPKG} -i"

# -- work dir --
WORK_DIR="/tmp"
# -- apt repository server--
#SERVER="https://solajit-admin:Veglia0914@homedev.pvsafety.jp:443/"
SERVER="https://solajit-admin:Veglia0914@necommand-01.pvsafety.jp:443/"

FINISHED_FILE_DIR="/var/tmp"
FINISHED_FILE_NAME="logger_reboot"
FINISHED_FILE_VALUE="update"

UPDATE_FAILED_FILE="/var/tmp/update_failed"
RECOVER_FILE_NAME="/etc/rc.local.d/update_recovery"
RECOVER_LOG_NAME="/var/local/update_log/pkg_update_recover_"
RECOVER_BOOT_WAIT="60"

WDT_SUSPEND_CHECK_ALIVE="/tmp/watchdog_stop"

# ----- Function -----

install_apt() {
  ar=( `${ECHO} "$1" | ${AWK} -F'_' '{ print $1" "$2 }'` )
  # pkg-name_version_arch.deb -> 0: pkg-name 1: version 2: arch.deb => 2
  if [ ${#ar[@]} -eq 2 ]; then
    # apt-get install pkg-name=version
    ${ECHO} "---------- update command: ${APT_GET_INSTALL} ${ar[0]}=${ar[1]} --"
    ${APT_GET_INSTALL} ${ar[0]}=${ar[1]}
  fi
}

install_wget() {
  ${ECHO} "---------- update command: ${DPKG_INSTALL} $1$2 --"
  #${WGET} "${SERVER}$1$2"
  ${WGET} "${SERVER}$1$2"
  ${DPKG_INSTALL} $2
  ret=`${ECHO} $?`
  ${RM} -f $2
  return ${ret}
}


# ----- Main -----

${ECHO} "----- EXECUTE DATE : `date` -----"
${ECHO} ""

if [ $# -ne 2 ]; then
  ${ECHO} "wrong argument : $@"
  ${ECHO} "----- Error exit. -----"
  exit 1
fi

pkg_file=$1
call_file=$2

if [ -x ${pkg_file} ]; then
  ${ECHO} "file not found : ${pkg_file}"
  ${ECHO} "----- Error exit. -----"
  exit 1
fi

# -- Create Update Failed File : Delete on Exit --
${ECHO} "----- START : Create Update Failed File : Delete on Exit. -----"
${TOUCH} ${UPDATE_FAILED_FILE} > /dev/null
${ECHO} "----- END : Create Update Failed File : Delete on Exit. -----"

### comment out : start ---
## -- Create Recovery Process Script at Unexpected Shutdown --
#${ECHO} "----- START : Creating a recovery script. -----"
#date_str=`${DATE} '+%Y%m%d_%H%M%S'`
#${CAT} << EOF > ${RECOVER_FILE_NAME}${date_str}
##/bin/bash
#${SLEEP} ${RECOVER_BOOT_WAIT}
#$0 ${pkg_file} ${RECOVER_FILE_NAME}${date_str} > ${RECOVER_LOG_NAME}${date_str}.log
##${RM} ${RECOVER_FILE_NAME}${date_str}
##${REBOOT}
#EOF
#${CHMOD} +x ${RECOVER_FILE_NAME}${date_str}
#${ECHO} "----- END : Creating a recovery script. -----"
#${ECHO} ""
### comment out : end ---

${ECHO} " -- Delete file : ${call_file} --"
${RM} ${call_file}

${ECHO} "----- START : Update Package list. -----"

${APT_GET_UPDATE}

${ECHO} "----- END : Update Package list. -----"
${ECHO} ""

# -- Create file for Watchdog : Stop watchdog process monitoring --
${ECHO} "----- START : Create file for Watchdog : Stop watchdog process monitoring. -----"
${TOUCH} ${WDT_SUSPEND_CHECK_ALIVE} > /dev/null
${ECHO} "----- END : Create file for Watchdog : Stop watchdog process monitoring. -----"
${ECHO} ""

${ECHO} "----- START : Update Packages. -----"

cd ${WORK_DIR}

cnt_failed=0

while read line
do
  #${ECHO} "line=$line"
  if [ ${line:0:1} == '#' ]; then
    continue
  fi
  arr=( `${ECHO} ${line}` )

  # pattern 0  
  if [ "x${arr[0]}" = "x0" ]; then
    if [ ${#arr[@]} -ne 3 ]; then
      continue
    fi
    #install_apt ${arr[2]}
    install_wget ${arr[1]} ${arr[2]}
    ret=`${ECHO} $?`
    if [ "x${ret}" != "x0" ]; then
      cnt_failed=`${EXPR} ${cnt_failed} + 1`
    fi
    ${ECHO} "---------- end : ${ret} --"
    ${ECHO} ""
  fi
done < ${pkg_file}
${ECHO} "----- END : Update Packages. -----"


# -- Delete file for Watchdog : Stop watchdog process monitoring --
${ECHO} "----- START : Delete file for Watchdog : Stop watchdog process monitoring. -----"
${RM} ${WDT_SUSPEND_CHECK_ALIVE} > /dev/null
${ECHO} "----- END : Delete file for Watchdog : Stop watchdog process monitoring. -----"
${ECHO} ""

if [ "x${cnt_failed}" != "x0" ]; then
  ${ECHO} "   *****************************"
  ${ECHO} "   ***** Failed to Update. *****"
  ${ECHO} "   *****************************"
  ${ECHO} ""
  #exit 2
else

  ${ECHO} "----- START : Create Update end file. -----"
  # remove old file, if exists
  wirte_file_value=""
  if [ -f "${FINISHED_FILE_DIR}/${FINISHED_FILE_NAME}" ]; then
    # file_value : do not use
    file_value="`${HEAD} -1 ${FINISHED_FILE_DIR}/${FINISHED_FILE_NAME} | ${TR} -d '\n'`"
    ${RM} -f ${FINISHED_FILE_DIR}/${FINISHED_FILE_NAME} 2> /dev/null
  fi

  # create update finished file
  ${ECHO} -n "${FINISHED_FILE_VALUE}" > ${FINISHED_FILE_DIR}/${FINISHED_FILE_NAME}
  ${ECHO} "----- END : Create Update end file. -----"

  ### comment out : start ---
  ## -- Delete Recovery Process Script at Unexpected Shutdown --
  #${ECHO} "----- START : Creating a recovery script. -----"
  #${RM} ${RECOVER_FILE_NAME}${date_str}
  #${ECHO} "----- END   : Creating a recovery script. -----"
  #${ECHO} ""
  ### comment out : end ---

  # -- Delete Update Failed File : Update Process is Successfull. --
  ${ECHO} "----- SRART : Delete Update Failed File : Update Process is Successfull. -----"
  ${RM} -f ${UPDATE_FAILED_FILE} > /dev/null
  ${ECHO} "----- END   : Delete Update Failed File : Update Process is Successfull. -----"

fi

${ECHO} " -- Display package list file : ${pkg_file} --"
${CAT} ${pkg_file}

if [ "x${cnt_failed}" = "x0" ]; then
  ${ECHO} " -- Delete package list file : ${pkg_file} --"
  ${RM} ${pkg_file}
  ${ECHO} ""
fi

${ECHO} "----- FINISH DATE : `date` -----"


${ECHO} "_________ reboot system _________"
${SYNC}
${REBOOT}
