#!/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"

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/"

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

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


# ----- 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
}


# ----- 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 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} ""

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

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

${APT_GET_UPDATE}

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

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

cd ${WORK_DIR}

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]}
    ${ECHO} "---------- end : ${ret} --"
    ${ECHO} ""
  fi
done < ${pkg_file}
${ECHO} "----- END : Update Packages. -----"

${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. -----"

# -- 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} ""

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

${ECHO} " -- Delete package list file : ${pkg_file} --"
${RM} ${pkg_file}
${ECHO} ""

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

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