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

export TEXTDOMAINDIR='/usr/share/locale'
export TEXTDOMAIN='podsec'
export cmd=$1

if [ $# -lt 1 ]
then
  echo "$(gettext 'Image archiving directory not specified')\n" >&2
  echo -ne "$(gettext 'Format'):\n\t$cmd $(gettext 'archive_deployment_directory [architecture ...] [transport] [image] ...')\n" >&2
  exit 1
fi

if [ $# -eq 1 ]
then
  echo "$(gettext 'No list of images specified')" >&2
  echo -ne "$(gettext 'Format'):\n\t$cmd $(gettext 'archive_deployment_directory [architecture ...] [transport] [image] ...')\n" >&2
  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 $(gettext 'OCI catalog already exists') >&2
  exit 1
fi


if [ ! -d /root/.config/containers ]
then
  mkdir -p /root/.config/containers
fi

if [ -f /root/.config/containers/policy.json ]
then
  mv /root/.config/containers/policy.json /root/.config/containers/policy_prev.json
fi

echo '{"default":[{"type":"insecureAcceptAnything"}]}' |
jq . > /root/.config/containers/policy.json


regName=$U7S_ALTREGISTRY

case $archs in
  'all') archs='amd64 arm64 arm ppc64le 386';;
  *)
    ifs=$IFS IFS=,
    set -- $archs
    IFS=$ifs
    archs=$*
    IFS=$ifs
    export arch
    for arch in $archs
    do
      case $1 in
        amd64 | arm64 | arm | ppc64le | 386) :;;
        *)
          echo "$(gettext 'Unknown architecture') $arch" >&2
          echo "$(gettext 'Allowed: amd64, arm64, arm, ppc64le, 386')" >&2
          echo -ne "$(gettext 'Format'):\n\t$cmd $(gettext 'archive_deployment_directory [architecture ...] [transport] [image] ...')\n" >&2
          exit 2
      esac
    done
esac

mkdir $ociDir
#if [ -n "$PODSECSAVE_USEEXISTINGIMAGES" ]
#then
#  export storage="/var/lib/u7s-admin/.local/share/usernetes/containers/storage/"
#  if [ ! -d $storage ]
#  then
#    echo "$(gettext 'Directory') $storage $(gettext 'is missing. Copying existing images of user u7s-admin is not possible.')" >&2
#  fi
#fi

for arch in $archs
do
  echo $arch
  ociArchDir="$ociDir/$arch"
  if [ -d $ociArchDir ]
  then
    mkdir $ociArchDir
  fi
  export image
  for image in $images
  do
    echo -ne "\n------------------------\n$(gettext 'Archiving the image') $image\n" >&2
    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}\
#        oci:$ociArchDir:$image  2>/dev/null
      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$(gettext 'Archiving and compressing images\n')" >&2
  tar cvCf $ociDir -  $arch | xz -9v > $ociArchDir.tar.xz
  rm -rf $ociArchDir
done

if [ -f /root/.config/containers/policy_prev.json ]
then
  mv /root/.config/containers/policy_prev.json /root/.config/containers/policy.json
fi
