#!/bin/sh
# Скрипт производит архивацию образов в указанный первым параметром каталог
# Второй параметры задает через запятую архивируемые архитектуры.
# Если второй параметр имеет значение all архивируются все архитектуры: amd64 arm64 arm ppc64le 386
# Скрипт производит загрузку образов с регистратора registry.altlinux.org в containers-storage: системы
# с последующим помещением их в указанный первым параметром каталог в подкаталог с именем архитектуры ($ociDir/$arch).
# Для улучшения последующей компресии слои образа помещаются несжатыми (параметр --dest-oci-accept-uncompressed-layers)
# После окончания наполнения подкаталога архитектуры он архивируется, сжимается и помещается в файл $ociDir/$arch.tar.xz
#
# Так как скрипт производит загрузку образов различных архитектур
# последняя загруженная в containers-storage: архитектура может отличаться от текущей архитектуры процессора
# При необходимости нужно будет произвести перезагрузку образов для рабочей архитектуры процессора
#set -x

if [ $# -lt 1 ]
then
  echo "Не указан каталог архивирования образов"
  echo -ne "Формат:\n\t$0  <каталог_архивирования_образов> <архитектура>,<архитектура>,...|all <образ> ..."
  exit 1
fi

if [ $# -eq 1 ]
then
  echo "Не указан список образов"
  echo -ne "Формат:\n\t$0  <каталог_архивирования_образов> <архитектура>,<архитектура>,...|all <образ> ..."
  exit 1
fi

ociDir=$1
archs=$2
transport=$3
if [ -z "$transport" ]
then
  transport="docker://"
fi
shift
shift
shift
images=$*

if [ -d $ociDir ]
then
  echo "OCI-каталог уже существует"
  exit 1
fi

regName=$U7S_ALTREGISTRY

case $archs in
  'all') archs='amd64 arm64 arm ppc64le 386';;
  *)
    ifs=$IFS IFS=,
    set -- $archs
    IFS=$ifs
    archs=$*
    IFS=$ifs
    for arch in $archs
    do
      case $1 in
        amd64 | arm64 | arm | ppc64le | 386) :;;
        *)
          echo "Неизвестная архитектура $arch";
          echo "Допустимые: amd64, arm64, arm, ppc64le, 386"
          echo -ne "Формат:\n\t$0 каталог_разворачивания_архивов [архитектура ...] [транспорт]  [образ] ...\n"
          exit 2
      esac
    done
esac

mkdir $ociDir
if [ -n "$PODSECSAVE_USEEXISTINGIMAGES" ]
then
  storage="/var/lib/u7s-admin/.local/share/usernetes/containers/storage/"
  if [ ! -d $storage ]
  then
    echo "Каталог $storage отсутствует. Копирование существующих образов  пользователя u7s-admin невозможно."
  fi
fi

for arch in $archs
do
  echo $arch
  ociArchDir="$ociDir/$arch"
  if [ -d $ociArchDir ]
  then
    mkdir $ociArchDir
  fi
  for image in $images
  do
    echo -ne "\n------------------------\nАрхивация образа $image\n"
    Image="$regName/$image"
    podman image rm $image >/dev/null 2>&1
#     if [ -n "$PODSECSAVE_USEEXISTINGIMAGES" ]
#     then
      skopeo --override-arch $arch copy\
        --remove-signatures --dest-oci-accept-uncompressed-layers\
        ${transport}${Image}\
        containers-storage:$Image 2>/dev/null
#     else
#       skopeo --override-arch $arch copy \
#         --remove-signatures\
#         --dest-oci-accept-uncompressed-layers\
#         docker://$Image \
#         containers-storage:$Image 2>/dev/null
#     fi
    skopeo --override-arch $arch copy \
      --dest-oci-accept-uncompressed-layers \
      containers-storage:$Image\
      oci:$ociArchDir:$image  2>/dev/null
  done
  echo -ne "\n------------------------\nАрхивания и сжатие образов\n"
  tar cvCf $ociDir -  $arch | xz -9v > $ociArchDir.tar.xz
  rm -rf $ociArchDir
done
