#!/bin/bash

DIRECTORY=/root/debs
PKGLIST=""
CURRENT=/var/www/html/current

show_usage() {
echo "
Usage:
fastUpdate [OPTIONS]

Possible OPTIONS:
  backend      - update only backend packages
  engines      - update only the engine packages
  all          - update system, backend, and frontend packages
"
}

generate_current () {

echo "Repositories in use during last update at $(date):
--------------------------------------------------------------------------------

$(egrep -v '^#|^$' /etc/apt/sources.list.d/open-xchange.list)
" > $CURRENT

echo "Packages installed during last update:
--------------------------------------------------------------------------------

$(ls -lrt /root/debs)
" >> $CURRENT
}

install_debs () {
  dpkg -i --force-confold *.deb
  generate_current
  rm *.deb > /dev/null 2>&1
  exit 0
}

retry_download () {
  packages=($@)
  
  rm *.FAILED > /dev/null 2>&1
  aptitude update
  for ((i=0; i < ${#packages[@]}; i++))
    do
      packages[i]=${packages[i]#./}
      packages[i]=${packages[i]%%_*.FAILED}
    done
  aptitude download ${packages[@]}

  failed=($(find . -name "*.FAILED"))
  if [ ${#failed[@]} -gt 0 ]
  then
    echo Packages failed to download again: ${failed[@]}
    echo Giving up!
    exit 1
  else
    install_debs
  fi
}

download_and_install () {
  aptitude download ${PKGLIST}
  failed=($(find . -name "*.FAILED"))
  if [ ${#failed[@]} -gt 0 ]
  then
    echo Packages failed to download: ${failed[@]}
    echo Retrying to download once
    retry_download ${failed[@]}
  else
    install_debs
  fi
}

update_package_infos () {
  aptitude clean
  aptitude update
}


update_all () {
  PKGLIST=$(aptitude -F "%p" search "?and(?installed,?name(open-xchange))")
  #PKGLIST=$(aptitude -F "%p" search "?and(?installed,?or(?name(open-xchange),?name(readerengine),?name(calcengine)),?not(?name(open-xchange-guard)))")
  update_package_infos
  # Upgrades installed packages to their most recent version, removing or installing packages as necessary. 
  aptitude -y -o Dpkg::Options::="--force-confold" full-upgrade
  download_and_install  
  generate_current
}

update_backend () {
  PKGLIST=$(aptitude -F "%p" search "?and(?installed,?name(open-xchange), ?not(?or(?name(open-xchange-appsuite), ?name(open-xchange-doc), ?name(open-xchange-l10n), ?name(open-xchange-calc), ?name(open-xchange-gui))))")
  update_package_infos
  download_and_install
  generate_current 
}

update_engines () {
  PKGLIST=$(aptitude -F "%p" search "?and(?installed,?or(?name(readerengine),?name(calcengine)))")
  update_package_infos
  download_and_install  
  generate_current
}

main () {
  if [ ! -d "${DIRECTORY}" ]; then
    mkdir ${DIRECTORY}
  fi
  
  pushd ${DIRECTORY}
  rm *.deb *.FAILED > /dev/null 2>&1
  
  if   [ $# -ne 1 ]
  then
    show_usage
    exit 1
  elif [ ${1} == backend ]
  then
    update_backend
  elif [ ${1} == engines ]
  then
    update_engines
  elif [ ${1} == all ]
  then
    update_all
  else
    show_usage
    exit 1
  fi
  
  chmod 755 /var/log/open-xchange
  popd
}

main $@
