#!/bin/sh
#
# VMTux.net
#
# /usr/bin/vmt-install
# Date: 2024-10-26
#
#
. /etc/vmt/vmt-colors
. /etc/vmt/vmt-conf

PATH=/bin:/sbin

umask 022

if [ "$(id -u)" -eq 0 ]; then
  echo "${BRed}Please run as user.${Reset}"
  exit 1;
fi

if [ -z "$1" ]; then echo "Usage: $(basename $0) [--release ${VMT_RELEASE}] [--archive] package-name(s)|--boot|--list"; exit 1; fi

if [ -d ${VMT_PKG_DIR} ]; then
  cd ${VMT_PKG_DIR}
else
  echo "${BRed}No packages directory found.${Reset}"
  exit 1;
fi

# -------

level=0

InstallPackage() 
{
  if [ -z "$1" ]; then echo "${BRed}InstallPackage <packagename>${Reset}" ; return ; fi

  local package="${1%.squ}"
  local mountpoint=${VMT_LOOP}/${package}
  local squ=${package}.squ
  local dep=${package}.dep
  local md5=${package}.md5
  local shortcomplete=true

  local indent=""
  
  for iii in $(seq ${level}); do indent="${indent}\t" ; done
    
  echo -n "${indent}${BBlue}Install ${BYellow}${package}${Reset} ..."

  if [ -d ${mountpoint} ]; then
    if [ ! -z "$(mount | grep ${mountpoint})" ]; then
      echo "${BGreen} existing${Reset}"
      return
    fi
  fi

  if [ $offline ]; then

    if [ ! -f ${md5} ]; then
      echo
      echo "${indent}${BRed}Package ${BYellow}${package}${BRed} does not exist${Reset}"
      return
    fi
  
    if [ ! -f ${squ} ]; then
      echo
      echo "${indent}${BRed}Package ${BYellow}${package}${BRed} not downloaded${Reset}"
      return
    fi
    
    md5sum -c ${md5} >/dev/null 2>&1

    if [ "$?" != 0 ]; then
      echo
      echo "${indent}${BRed} Checksum ${BYellow}${package}${BRed} incorrect${Reset}"
      return
    fi

  else #online

    if [ ! -f ${md5} ]; then
      wget -q "${mirror}/${md5}" 2>/dev/null
    fi
  
    if [ ! -f ${md5} ]; then
      echo
      echo "${indent}${BRed}Package ${BYellow}${package}${BRed} does not exist${Reset}"
      return
    fi

    for trying in 1 2 3 4; do
      if [ "$trying" == "4" ]; then
        echo
        echo "${indent}${BRed}Giving up on ${BYellow}${package}${Reset}"
        return
      fi

      if [ ! -f ${squ} ]; then
        echo
        echo -n "${Cyan}"
        wget "${mirror}/${squ}"
        echo -n "${Reset}"
        shortcomplete=false
      fi

      if [ ! -f ${squ} ]; then
        echo
        echo "${indent}${BRed}Error downloading ${BYellow}${package}${Reset}"
        continue
      fi

      md5sum -c ${md5} >/dev/null 2>&1

      if [ "$?" != 0 ]; then
        echo
        echo "${indent}${BRed} Checksum ${BYellow}${package}${BRed} incorrect${Reset}"
        rm -f ${squ}
        continue
      fi
      # all ok
      break
    done

    if [ ! -f ${dep} ]; then
      wget -q "${mirror}/${dep}" 2>/dev/null
    fi
  fi # online
  
  if [ -s ${dep} ]; then
    if [ $shortcomplete == "true" ]; then echo ; fi
    let level++
    for dependency in $(cat ${dep}); do InstallPackage ${dependency} ; done
    let level--
    shortcomplete=false
  fi

  # use locals package, mountpoint, squ, dep and SHORT
  sudo mkdir -p "${mountpoint}"
  sudo mount ${squ} "${mountpoint}" -t squashfs -o loop,ro
  sudo cp -asf "${mountpoint}"/* /

  if [[ -d "${mountpoint}/usr/local/lib" || -d "${mountpoint}/usr/lib" ]]; then sudo ldconfig ; fi

  if [[ -d "${mountpoint}/usr/local/lib/modules" || -d "${mountpoint}/usr/lib/modules" ]]; then sudo depmod ; fi

  afterburner="${mountpoint}/usr/local/vmt-afterburner/${package}"

  if [ -x "${afterburner}" ]; then
    export i="${indent}"
    colorlog sudo "${afterburner}" --install
  fi

  if [ $shortcomplete == "true" ]; then
    echo " ${BGreen}done.${Reset}"
  else
    echo "${indent}${BBlue}Install ${BYellow}${package}${Reset} ${BGreen}done.${Reset}"
  fi
}

# -------

archive=""

release="${VMT_RELEASE}"

if [ "$1" == "--release" ]; then
  release="$2"
  shift 2
fi

if [ "$1" == "--archive" ]; then
  archive="/archive"
  shift 1
fi

mirror="${VMT_MIRROR_URL}/${release}/packages${archive}"      

wget --spider $mirror 2>/dev/null

if [ $? -ne 0 ]; then offline=true ; fi


if [ "$1" == "--boot" ]; then
  if [ -f ${VMT_BOOTLIST} ]; then
    while read -r package
    do
      InstallPackage ${package}
    done < ${VMT_BOOTLIST}
  fi
  exit 0
fi

if [ "$1" == "--list" ]; then
  if [ -f ${VMT_BOOTLIST} ]; then
    cat ${VMT_BOOTLIST}
  fi
  exit 0
fi

for packagename in "$@"; do
  if [ $offline ]; then
    package=$(find . -name "${packagename}*.squ" -exec basename {} .squ \;)
  else
    package=$(wget -qO- ${VMT_SEARCH_URL}/${packagename}/${release}${archive})
  fi
  if [ -z "${package}" ]; then
    echo "${BRed}Package ${BYellow}${packagename}${BRed} not found.${Reset}"
  else
    if [ "$(echo ${package} | wc -w)" -gt "1" ]; then
      echo "${BGreen}available (${release}${archive}): ${BYellow}${package}${Reset}"
    else
      InstallPackage ${package}
      grep -qxF "${package}" ${VMT_BOOTLIST} || echo "${package}" >> ${VMT_BOOTLIST}
    fi
  fi
done

exit 0
