Последняя активность 6 months ago

backuppc-achive-rclone.sh Исходник
1#!/bin/bash
2
3if [ -r /opt/etc/default/backuppc-achive-rclone ]; then
4 source /opt/etc/default/backuppc-achive-rclone
5else
6 source /etc/default/backuppc-achive-rclone
7fi
8
9if [ -r /opt/etc/backuppc-achive-rclone.conf ]; then
10 source /opt/etc/backuppc-achive-rclone.conf
11else
12 source /etc/backuppc-achive-rclone.conf
13fi
14
15BACKUPPC_HOSTS="${BACKUPPC_HOSTS:=/etc/backuppc/hosts}"
16BACKUPPC_ARCHIVESTART="${BACKUPPC_ARCHIVESTART:=/usr/share/backuppc/bin/BackupPC_archiveStart}"
17BACKUPPC_ARCHIVE_RENTENTION="${BACKUPPC_ARCHIVE_RENTENTION:=2}"
18RCLONE_BIN="${RCLONE_BIN:=rclone}"
19RCLONE_BUCKET="${RCLONE_BUCKET:=backuppc-archive}"
20RCLONE_BWLIMIT="${RCLONE_BWLIMIT:="06:00,512 22:00,1M"}"
21HEAD="$(which /opt/bin/head || which head)"
22
23[ -z ${RCLONE_REMOTE} ] && { echo "E: please set RCLONE_REMOTE in /opt/etc/backuppc-achive-rclone.conf or /etc/backuppc-achive-rclone.conf!"; exit 1; }
24[ -z ${RCLONE_BUCKET} ] && { echo "E: please set RCLONE_BUCKET in /opt/etc/backuppc-achive-rclone.conf or /etc/backuppc-achive-rclone.conf!"; exit 1; }
25[ -z ${BACKUPPC_ARCHIVE_PATH} ] && { echo "E: please set BACKUPPC_ARCHIVE_PATH in /opt/etc/backuppc-achive-rclone.conf or /etc/backuppc-achive-rclone.conf!"; exit 1; }
26[ -z ${BACKUPPC_PC_PATH} ] && { echo "E: please set BACKUPPC_PC_PATH in /opt/etc/backuppc-achive-rclone.conf or /etc/backuppc-achive-rclone.conf!"; exit 1; }
27
28get_backup_hosts() {
29 # Taken from https://brb.epr.ch/blog/_export/code/blog:backuppc_script_archive_all_hosts?codeblock=0
30 HOSTS=""
31 while read -r LINE; do
32 # Skip comments
33 [[ "${LINE}" =~ ^#.*$ ]] && continue
34
35 HOST=`echo ${LINE} | cut -f 1 -d " "`
36 ! [ "${HOST}" != "" -a "${HOST}" != "archive" -a "${HOST}" != "host" ] && continue
37
38 HOSTS="${HOSTS} ${HOST}"
39 done < "${BACKUPPC_HOSTS}"
40}
41
42get_archived_hosts() {
43 for FILE in ${BACKUPPC_ARCHIVE_PATH}/*; do
44 basename $FILE .tar.bz2 | sed 's/\.[[:digit:]]\+.*//g';
45 done | uniq
46}
47
48get_archived_host_files() {
49 ${HEAD} -n -1 /proc/cpuinfo > /dev/null 2>&1 || { echo "E: head command does not support '-n' option."; exit 1; }
50 ARCHIVED_HOSTS="$(get_archived_hosts)"
51 for FILEHOSTNAME in $(get_archived_hosts); do
52 ls -atl ${BACKUPPC_ARCHIVE_PATH}/${FILEHOSTNAME}* | tr -s ' ' | cut -d ' ' -f 9 | sed "1,${BACKUPPC_ARCHIVE_RENTENTION} d"
53 done
54}
55
56archive_hosts() {
57 BACKUPPC_ARCHIVE_HOSTS=""
58 for CHECK_HOST in ${HOSTS}; do
59 BACKUPPC_LATEST_BACKUP="$(tail -1 ${BACKUPPC_PC_PATH}/${CHECK_HOST}/backups | cut -d$'\t' -f1)"
60 [ -f ${BACKUPPC_ARCHIVE_PATH}/${CHECK_HOST}.${BACKUPPC_LATEST_BACKUP}.tar.* ] || BACKUPPC_ARCHIVE_HOSTS="${BACKUPPC_ARCHIVE_HOSTS} ${CHECK_HOST}"
61 done
62 echo "Trigger archive export of the following hosts: ${BACKUPPC_ARCHIVE_HOSTS}"
63 if [ "$(whoami)" != "backuppc" ]; then
64 BACKUPPC_ARCHIVESTART="sudo -u backuppc ${BACKUPPC_ARCHIVESTART}"
65 fi
66 ${BACKUPPC_ARCHIVESTART} archive backuppc ${BACKUPPC_ARCHIVE_HOSTS}
67}
68
69case ${1} in
70 export)
71 get_backup_hosts
72 archive_hosts
73 ;;
74 sync)
75 if [ -z "${RCLONE_BWLIMIT}" ]; then
76 ${RCLONE_BIN} sync ${BACKUPPC_ARCHIVE_PATH} ${RCLONE_REMOTE}:${RCLONE_BUCKET}
77 else
78 ${RCLONE_BIN} sync ${BACKUPPC_ARCHIVE_PATH} ${RCLONE_REMOTE}:${RCLONE_BUCKET} --bwlimit "${RCLONE_BWLIMIT}"
79 fi
80 ;;
81 cleanup)
82 [ -z "$(get_archived_host_files)" ] && { echo "W: Nothing to clean up at the moment"; exit 0; }
83 rm $(get_archived_host_files)
84 ;;
85 *)
86 echo "ERROR: Use the following keywords:"
87 echo "'export' for queuing BackupPC archive export"
88 echo "'sync' to start rcloud sync"
89 echo "'cleanup' for removing unneeded archives"
90 exit 1
91esac
92