#!/bin/bash
#Script switches and check OS mode (CE/SE)
usage() {
  echo "${0##*/} <REPOSITORY_URL>|on|off|status|modechk [debug]" && exit 1
}

ADDCOMP=astra-ce
#add to the following list your restrictive scripts which accept enable/disable argument
SE_SCRIPTS='/usr/sbin/astra-mode-apps'
MY_ARCH=$(dpkg --print-architecture)
CODENAME=$(lsb_release -cs)
CN_ESC=${CODENAME//./\\.}
SEDRELRE="release v=(${CN_ESC%%_*}\.[0-9]+([0-9.]*-base)?|[^,]+12\.40\.iso),.+n=${CN_ESC},"
SEDMATCHREP='{x;p;d};{s/^[0-9 ]+((file|ftp|https?|cdrom):.+)\s[^ ]+\s+\w+\s+Packages$/\1/;x}'
SUCMD=
((${EUID:-0} || "$(id -u)")) && SUCMD=sudo
$SUCMD apt update > /dev/null 2>&1


SE=$(apt policy 2>/dev/null|sed -En "/${SEDRELRE}c=main,b=${MY_ARCH}/$SEDMATCHREP")
if [ -z "$SE" ]; then
  echo "SE main repository is not found" && exit 1
else
  [ "${SE:0:6}" = "file:/" ] && SE="file:///${SE:6}"
fi
REP=$(apt policy 2>/dev/null|sed -En "/release v=.+n=${CN_ESC},c=${ADDCOMP},b=${MY_ARCH}/$SEDMATCHREP"|sort -u|head -n1)
[ -n "$REP" -a "${REP:0:6}" = "file:/" ] && REP="file:///${REP:6}"
COMPS="main contrib non-free $ADDCOMP"

PREF_STR="Pin: release c=$ADDCOMP"


if [ "$2" = "debug" ] ; then
  DBGLOG="/tmp/${0##*/}_${2}.$(date --iso-8601=minutes|tr ':' '_').log"
  echo "Debug log of ${0##*/}, args are '${@}'" > ${DBGLOG}

  DBGVARs=( SE_SCRIPTS MY_ARCH CODENAME CN_ESC SEDRELRE SEDMATCHREP SE REP COMPS PREF_STR SUCMD )
  for v in "${DBGVARs[@]}"
  do
    echo "$v='${!v}'" >> ${DBGLOG}
  done
fi

case $1 in
off)
  COMPLIST=$(compgen -G "/var/lib/apt/lists/*_dists_${CODENAME//_/%5f}_astra-ce_binary-${MY_ARCH}_Packages"|sort -u|head -n1)
  [ ! -f ${COMPLIST} ] && echo "$COMPLIST doesn't exist" && exit 1
  INSTALLED=$(comm -12 <(dpkg --get-selections|sed -En 's/(:\w+)?\s+install$//p'|sort -u) <(sed -n 's/^Package:\s//p' $COMPLIST|sort -u))
  [ "$2" = "debug" ] && echo -e "INSTALLED are:\n${INSTALLED}" >> ${DBGLOG}
  if [ -n "$INSTALLED" ]; then
    echo "В системе установлены следующие пакеты компоненты $ADDCOMP:" 
    echo "${INSTALLED}"
    THE_MSG="Они будут заменены на пакеты ограниченной функциональности базового репозитория"
  else
    THE_MSG="Отключить CE репозиторий"
  fi
  read -p  "$THE_MSG (y/N): " confirm && \
    [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1

  
  if [ "$2" = "debug" ]; then
	  echo -e "\ninitial sources.list and /etc/apt/preferences state:\n" >> ${DBGLOG}
	  cat /etc/apt/sources.list  >> ${DBGLOG}
	  echo -e "--------end-of-sources.list---------------------------------------\n" >> ${DBGLOG}
	  cat /etc/apt/preferences >> ${DBGLOG}
	  echo -e "--------end-of-preferences----------------------------------------\n" >> ${DBGLOG}
	  echo -e "\nPkgs removed:\n" >> ${DBGLOG}
	  $SUCMD apt-get remove -y ${INSTALLED} | tee -a ${DBGLOG}
  else
	  $SUCMD apt-get remove -y ${INSTALLED}
  fi
  
  
  [ -n "$REP" ] && $SUCMD sed -i -E '/^deb\s+(\[\w+=\w+\]\s+)?'${REP//\//\\/}'/d' /etc/apt/sources.list
  [ -f /etc/apt/preferences ] && grep "$PREF_STR" /etc/apt/preferences 2>/dev/null && \
    $SUCMD sed -i -e '/Package:\ \*/,/Pin-Priority:\ 1001/{H;$!d;};x;/c='$ADDCOMP'/d' /etc/apt/preferences
  
  $SUCMD apt update
  
  [ -n "$INSTALLED" ] && {
	  INST2=$(for p in ${INSTALLED};do apt-cache madison $p|sed -E 's/\|.+$//';done)
	  if [ "$2" = "debug" ]; then
	    echo -e "\nPkgs installed:\n" >> ${DBGLOG}
		$SUCMD apt-get install -y ${INST2} | tee -a ${DBGLOG}
		echo -e "--------end-of-apt-get-output----------------------------------------\n" >> ${DBGLOG}
	  else
		$SUCMD apt-get install -y ${INST2}
	  fi
  }
  while read SCRIPTPATH
  do
    [ -e "${SCRIPTPATH}" ] && $SUCMD ${SCRIPTPATH} enable
  done < <(echo "${SE_SCRIPTS}")  
  ;;
  
status|modechk)
  if [ "$1" = "modechk" ]; then
    CE_MSG="Common"
    SE_MSG="Special"
    SE_EXIT=1
  else
    SE_MSG="CE репозиторий не подключен"
    CE_MSG="CE репозиторий подключен"
    SE_EXIT=0
  fi
  [ -z "$REP" ] && echo ${SE_MSG} && exit ${SE_EXIT}
  [ -f /etc/apt/preferences ] && grep "$PREF_STR" /etc/apt/preferences > /dev/null || {
	  echo "CE репозиторий не настроен на использование" && exit ${SE_EXIT}
  }
  echo ${CE_MSG} && exit 0
  ;;
  
*)
  RE='^on|((https?|ftp|file)://|/).+$'
  [[ $1 =~ $RE ]] || usage
  
  [ -n "${BASH_REMATCH[1]}" ] && REP=${BASH_REMATCH[0]}
  [ "${BASH_REMATCH[1]}" = '/' ] &&  REP="file://${REP}"
  
  [ -z "$REP" ] && echo "CE репозиторий не известен, укажите URL репозитория вместо аргумента on" && exit 0
  echo "Установлен CE репозиторий '$REP'"
  read -p "Доработанные в части МКЦ/МРД программы могут быть заменены на обычные, продолжить (y/N): " confirm && \
    [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
    
  REP_STR="deb $REP $CODENAME $COMPS"
  egrep '^deb\s+(\[\w+=\w+\]\s+)?'${REP} /etc/apt/sources.list > /dev/null || echo "$REP_STR" | $SUCMD tee -a /etc/apt/sources.list
  [ ! -f /etc/apt/preferences ] && $SUCMD touch /etc/apt/preferences
  grep "$PREF_STR" /etc/apt/preferences || cat <<THECONTENT | $SUCMD tee -a /etc/apt/preferences > /dev/null

Package: *
$PREF_STR
Pin-Priority: 1001

THECONTENT

  while read SCRIPTPATH
  do
    [ -e "${SCRIPTPATH}" ] && $SUCMD ${SCRIPTPATH} disable
  done < <(echo "${SE_SCRIPTS}")
  $SUCMD apt update
  $SUCMD apt dist-upgrade
  ;;
  
esac


