#!/bin/bash

#Licence GPLv3 and later
#Author: AlexL

TARGET0="$1"
DISTR_ARCH="$2"
ADD_AUM="$3"
DISTR=mageia
DEV_DISTR=cauldron
USER0="mass_rebuild"
HOME0="/home"
TARGET="$DISTR$TARGET0"
DISTRIB="http://mirror.yandex.ru/$DISTR/distrib/$TARGET0/$DISTR_ARCH"
MEDIA1="$DISTRIB/media/core/release"
PWD=`pwd`
LANG0=`echo $LANG|grep ru`
if [ ! "$LANG0" = "" ]
then
  SCRIPT_LANG=Russian
else
  SCRIPT_LANG=English
fi
if [ $# -eq 0 ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]
  then
    echo "Использование:"
    echo "первый параметр - номер дистрибутива, например, 4 или $DEV_DISTR"
    echo "второй параметр - архитектура собираемых пакетов, например, i586 или x86_64"
    echo "третий параметр - дополнительные параметры для aum++ (опционально)"
  else
    echo "Usage:"
    echo "the first parameter is distro number, for example, 4 or $DEV_DISTR"
    echo "the second parameter is architecture of builing packages, for example, i586 or x86_64"
    echo "the third parameter - additional options for aum++ (optional)"
  fi
  exit 1
fi
if [ "$(id -u)" != "0" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Требуется запуск под root"; else echo "You must be root"; fi
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Выход"; else echo "Exit"; fi
  exit 1
fi
MASS_REBUILD="$HOME0/$USER0"
LOG="$MASS_REBUILD/mass_rebuild.log"
mkdir -p "$MASS_REBUILD"
if [ ! "$1" = "$DEV_DISTR" ]
then
  N=$(expr $1 + 0 2>/dev/null) || if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Первый параметр - не номер дистрибутива и не $DEV_DISTR"|tee -a $LOG; exit 1; else echo "The first parameter is not number of distro and not $DEV_DISTR"|tee -a $LOG; exit 1; fi
else
  TARGET="$DEV_DISTR"
fi
if [ "$2" = "" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Не указана архитектура вторым параметром"|tee -a $LOG; else echo "No architecture by the second parameter"|tee -a $LOG; fi
  exit 1
fi
if [ ! "$2" = "i586" ]
then
  if [ ! "$2" = "x86_64" ]
  then
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Неизвестная архитектура $2"|tee -a $LOG; else echo "Unknown architecture $2"|tee -a $LOG; fi
    exit 1
  fi
fi
AUM="$PWD/aum++"
if [ ! -f "$AUM" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Не найден $AUM"|tee -a $LOG; else echo "There is no $AUM"|tee -a $LOG; fi
  AUM="/usr/bin/aum++"
  if [ ! -f "$AUM" ]
  then
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Не найден $AUM"|tee -a $LOG; else echo "There is no $AUM"|tee -a $LOG; fi
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Выход"|tee -a $LOG; else echo "Exit"|tee -a $LOG; fi
    exit 1
  fi
fi
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Используется $AUM"|tee -a $LOG; else echo "Using $AUM"|tee -a $LOG; fi
SKEL_REPO="/usr/share/aum++/skel/repo"
if [ ! -d "$SKEL_REPO" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Не найден репозиторий $SKEL_REPO, установите пакет aum++"|tee -a $LOG; else echo "There is no repo $SKEL_REPO, please install package aum++"|tee -a $LOG; fi
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Выход"|tee -a $LOG; else echo "Exit"|tee -a $LOG; fi
  exit 1
fi
SUDO="/usr/bin/sudo"
if [ ! -f "$SUDO" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Не найден $SUDO"|tee -a $LOG; else echo "There is no $SUDO"|tee -a $LOG; fi
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Выход"|tee -a $LOG; else echo "Exit"|tee -a $LOG; fi
  exit 1
fi
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Используется рабочая директория $MASS_REBUILD"|tee -a $LOG; else echo "Using work directory $MASS_REBUILD"|tee -a $LOG; fi
CHROOT="$MASS_REBUILD/"$DISTR"_"$TARGET0"_"$DISTR_ARCH".tar.xz"
if [ ! -f "$CHROOT" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Образ chroot $CHROOT не найден, начинается его создание"|tee -a $LOG; else echo "Archive chroot $CHROOT did not find, creating is starting"|tee -a $LOG; fi
  echo "%distro_section mrc" > /tmp/rpmmacros
  #workaround for genchroot-tarball without --upload-dir=
  cd "$MASS_REBUILD"
  #workaround for bug https://bugs.launchpad.net/aum/+bug/1185578 and for genchroot-tarball without --log-file=
  sudo echo n|genchroot-tarball -v --name=""$DISTR"_"$TARGET0"_"$DISTR_ARCH"" --format=xz --add-rpmmacros="/tmp/rpmmacros" --urpmi-options="--download-all,--quiet" --distrib="$DISTRIB" basesystem-minimal rpm-build sudo urpmi curl |tee -a $LOG
  sudo echo n|genchroot-tarball -v --name=""$DISTR"_"$TARGET0"_"$DISTR_ARCH"" --format=xz --add-rpmmacros="/tmp/rpmmacros" --urpmi-options="--download-all,--quiet" --distrib="$DISTRIB" basesystem-minimal rpm-build sudo urpmi curl |tee -a $LOG
  cd "$PWD"
  rm -f /tmp/rpmmacros
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Готово"|tee -a $LOG; else echo "Finished"|tee -a $LOG; fi
fi
if [ ! -f "$CHROOT" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Нет образа chroot"|tee -a $LOG; else echo "There is no archive chroot"|tee -a $LOG; fi
  exit 1
fi
REPO="$MASS_REBUILD/repo/$TARGET"
if [ ! -d "$REPO" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Копирование $SKEL_REPO/* в $REPO"|tee -a $LOG; else echo "Copying $SKEL_REPO/* into $REPO"|tee -a $LOG; fi
  mkdir -p $REPO
  cp -af $SKEL_REPO/* $REPO/
fi
if [ ! -f "/usr/bin/repo-hdlistgen" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Отсутствует /usr/bin/repo-hdlistgen, установите пакет aum++"|tee -a $LOG; else echo "There is no /usr/bin/repo-hdlistgen, please install package aum++"|tee -a $LOG; fi
  exit 1
fi
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Запуск скрипта repo-hdlistgen"|tee -a $LOG; else echo "Starting script repo-hdlistgen"|tee -a $LOG; fi
repo-hdlistgen $USER0 $TARGET > /dev/null 2>&1
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Скрипт repo-hdlistgen завершён"|tee -a $LOG; else echo "Script repo-hdlistgen was finished"|tee -a $LOG; fi
SRPMS="$MASS_REBUILD/SRPMS"
mkdir -p "$SRPMS"
PACKAGES=`dir $SRPMS`
if [ "$PACKAGES" = "" ]
then
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Положите src.rpm, которые надо пересобрать в $SRPMS"|tee -a $LOG; else echo "Please put src.rpm for rebuilding into $SRPMS"|tee -a $LOG; fi
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Выход"|tee -a $LOG; else echo "Exit"|tee -a $LOG; fi
  exit 1
fi
if [ ! -f "$MASS_REBUILD/list.txt" ]
then
  dir -1 $SRPMS > "$MASS_REBUILD/list.txt"
  if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Автоматически был создан список пакетов на пересборку $MASS_REBUILD/list.txt"|tee -a $LOG; else echo "The packages's list for rebuilding $MASS_REBUILD/list.txt was auto created"|tee -a $LOG; fi
fi
#add Enter if somebody forgot (добавить Enter если кто-нибудь забыл)
printf "\n" >> "$MASS_REBUILD/list.txt"
#delete all spaces and tabs (удалить все пробелы и символы табуляции)
sed -i 's/^[ \t]*//;s/[ \t]*$//' "$MASS_REBUILD/list.txt"
#delete all empty lines (удалить все пустые строки)
sed -i '/^$/d' "$MASS_REBUILD/list.txt"
cp -f "$MASS_REBUILD/list.txt" "$MASS_REBUILD/list_old.txt"
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Начинается массовая пересборка"|tee -a $LOG; else echo "Starting mass rebuilding"|tee -a $LOG; fi
rm -f "$MASS_REBUILD/list_new.txt"
if [ ! -f "$MASS_REBUILD/list_new.txt" ]
then
  cp -f "$MASS_REBUILD/list_old.txt" "$MASS_REBUILD/list_new.txt"
fi
if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Лог-файл: $LOG"|tee -a $LOG; else echo "Log file: $LOG"|tee -a $LOG; fi
FLAG=0
while [ "$FLAG" = "0" ]
do
  cat "$MASS_REBUILD/list_old.txt"|while read LINE
  do
    $AUM -v --chroot=$CHROOT --log-file="$LOG" --arch="$DISTR_ARCH" --upload-rpm-dir="$MASS_REBUILD/repo/$TARGET/RPMS" --upload-srpm-dir="$MASS_REBUILD/repo/$TARGET/SRPMS" --add-media="$MEDIA1" --distrib-own="file://$MASS_REBUILD/repo/$TARGET/$DISTR_ARCH" "$ADD_AUM" "$SRPMS/$LINE"
    if [ "$?" = "0" ]
    then
      if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Запуск скрипта repo-hdlistgen"|tee -a $LOG; else echo "Starting script repo-hdlistgen"|tee -a $LOG; fi
      repo-hdlistgen $USER0 $TARGET > /dev/null 2>&1
      if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Скрипт repo-hdlistgen завершён"|tee -a $LOG; else echo "Script repo-hdlistgen was finished"|tee -a $LOG; fi
      sed -i "/$LINE/d" "$MASS_REBUILD/list_new.txt"
      if [ "$SCRIPT_LANG" = "Russian" ]; then echo "MASS_REBUILD: Сборка пакета $LINE успешна"|tee -a $LOG; else echo "MASS_REBUILD: Package $LINE was built successfully"|tee -a $LOG; fi
    else
      if [ "$SCRIPT_LANG" = "Russian" ]; then echo "MASS_REBUILD: Сборка пакета $LINE неудачна"|tee -a $LOG; else echo "MASS_REBUILD: Package $LINE was not built"|tee -a $LOG; fi
    fi
  done
  A=`cat "$MASS_REBUILD/list_old.txt"`
  B=`cat "$MASS_REBUILD/list_new.txt"`
  cp -f "$MASS_REBUILD/list_new.txt" "$MASS_REBUILD/list_old.txt"
  if [ "$A" = "$B" ]
  then
    FLAG=1
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Массовая пересборка завершена"|tee -a $LOG; else echo "Mass rebuilding was finished"|tee -a $LOG; fi
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Несобранные пакеты смотрите в $MASS_REBUILD/list_old.txt"|tee -a $LOG; else echo "Please see $MASS_REBUILD/list_old.txt for unbuilding packages"|tee -a $LOG; fi
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Собранные пакеты смотрите в $MASS_REBUILD/repo"|tee -a $LOG; else echo "Please see $MASS_REBUILD/repo for built packages"|tee -a $LOG; fi
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Логи смотрите в $LOG"|tee -a $LOG; else echo "Please see logs in $LOG"|tee -a $LOG; fi
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Если Вы полностью закончили сборку, то запустите mass_rebuild_test для проверки корректности установки всех пакетов в репозитории $MASS_REBUILD/repo. Внимание: Вы должны иметь достаточно свободного места в /home"|tee -a $LOG; else echo "If you finished building packages fully, then run mass_rebuild_test for testing of installation for all packages from repo $MASS_REBUILD/repo. Attention: You must have enough free space in /home"|tee -a $LOG; fi
  else
    if [ "$SCRIPT_LANG" = "Russian" ]; then echo "Начинается новый проход пересборки"|tee -a $LOG; else echo "Starting new rebuild cycle"|tee -a $LOG; fi
  fi
done
