Скрипт удаления старых томов для bacula

Я уже писал о том как вручную удалять старые тома из базы и с диска. Казалось что это однократная операция. Однако пришлось делать это во второй раз. Попутно выявилась проблема с приоритетом команды restore. Диск с бэкапами заполнился, задания застряли в очереди и команда restore создала задание которое послушно встало в хвост очереди. Приоритеты очереди работают только в том случае если очередь движется. Bacula не приостанавливает ткущее задание чтобы выполнить задание с более высоким приоритетом. А оно стоит в очереди и не может выполниться изза нехватки места на диске. Гугл не смог найти ответ как же запустить рестор вне очереди. Пришлось очистить очередь, при помощи команды cancel в bconsole после чего отработал рестор.

Это всё отступления, вернёмся-же к автоматизации:

Скрипт удаляет бэкапы которые последний раз записывались более чем 190 дней от текущей даты. Список томов получает из bconsole. Прочитав список томов из базы данных скрипт подсчитывает размер файлов для удаления и выводит на экран их имена. Непосредственно перед удалением записей из каталогаи файлов скрипт делает “последнее китайское предупреждение”. В качестве параметра можно передать начало VolumeName тогда скрипт выберет только указанные записи.

cat purge-bareos-db-and-files.sh 
#!/bin/bash

  # several days ago
  DATEFROM=`date --date='190 days ago' '+%Y-%m-%d'`
  BACKUPFOLDER="/mnt/bpool"

  if [ $# -eq 1 ] ; then
    FILTER="$1%"
    echo -e "Useing filter : \"${FILTER}\""
  else
    FILTER=""
    echo -e "Filter is not using..."
  fi

  echo -e "Check all backups before ${DATEFROM}"

  # get list of files to prune
  #
  echo "Reading VolumeName list from catalog"
  if [ -z "${FILTER}" ] ; then
    DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g' | sed -e '/^[ \t]*$/d'`
  else
    DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where VolumeName LIKE '${FILTER}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g' | sed -e '/^[ \t]*$/d'`
  fi
  if [[ -z "${DELETELIST}" ]] ; then
    echo "No records found earlier than ${DATEFROM}"
    exit 1
  else
    DELETELISTRECORDCOUNT=`echo -e "${DELETELIST}" | wc -l`
    echo " ${DELETELISTRECORDCOUNT} records found earlier than ${DATEFROM}"
    read -p 'Type Y if you want to display it: ' input
    echo
    if [[ ${input,,} =~ ^y$  ]]; then
      echo -e "${DELETELIST}" | sed -e 's/^./  -x- &/;'
      read -p 'Press ENTER to continue: ' input
    fi
  fi

  LONGESTLINE=`echo -e "${DELETELIST}" | sed -e 's|^.|'${BACKUPFOLDER}'/&|' | wc -L`
  # подсчитать суммарный размер файлов в мегабайтах
  echo -e "${DELETELIST}" | xargs -I{} stat --format="%n:%s" "${BACKUPFOLDER}/{}" | awk -v format="%${LONGESTLINE}s  %15d\n" -F: 'BEGIN{size=0}{size=size+$2; printf(format, $1, $2);} END {print "\nCommon file size: "size/1024/1024" M"}'

  echo
  echo "WARNING: IT WILL DESTROY THAT FILES ON THE DISK"
  echo "Are you sure you want to proceed?"
  read -p 'Type YES if you really want to proceed: ' input
  echo
  if [[ ${input} != "YES"  ]]; then
    echo "Ok. Aborting."
    exit 1
  fi

  # delete records from catalog database
  echo -e "${DELETELIST}" | xargs -I '{}' echo delete yes volume='{}' | bconsole

  # show command and execute
  echo -e "${DELETELIST}" | xargs -I '{}' echo -e rm ${BACKUPFOLDER}/'{}' | while read LINE ; do echo -e "${LINE}"; ${LINE}; done