Files
rdiff-backup-dockerized/start.sh
T

286 lines
7.0 KiB
Bash
Raw Normal View History

2017-12-26 12:46:05 +01:00
#!/bin/bash
# set -e
# source job.conf
BACKUP_DIR=/backups
FILES=ROOT
VOLS=VOL
CONTAINERS=CON
BACKUP_DIR_FILES=$BACKUP_DIR/$FILES
BACKUP_DIR_VOLS=$BACKUP_DIR/$VOLS
BACKUP_DIR_CONTAINERS=$BACKUP_DIR/$CONTAINERS
CONFIG_DIR=/config
SSH_CF_DIR=/root/.ssh
2018-07-14 11:26:01 +02:00
read_config(){
#Konfiguration resetten
source "/reset-conf.sh"
if [ ! -f "$CONFIG_DIR/$1" ]; then
2018-11-11 13:01:16 +01:00
echo config nicht vorhanden!
2018-07-14 11:26:01 +02:00
exit 1
fi
2018-11-11 17:29:09 +01:00
source "$CONFIG_DIR/$1"
2018-07-14 11:26:01 +02:00
}
gen_config(){
[ ! -f "$SSH_CF_DIR/id_rsa" ] && ssh-keygen -t rsa -b 4096 -f "$SSH_CF_DIR/id_rsa" -q -C "rdiff-backup-dockerized @ ${SSH_KEY_MARKER}" && chmod go-rwx $SSH_CF_DIR/id_rsa
if [ ! -f "$SSH_CF_DIR/config" ]; then
echo 'Host *' > "$SSH_CF_DIR/config"
echo ' StrictHostKeyChecking no' >> "$SSH_CF_DIR/config"
# echo ' UserKnownHostsFile=/dev/null' >> "$SSH_CF_DIR/config"
chmod go-rwx $SSH_CF_DIR/config
fi
[ ! -f "$CONFIG_DIR/example_conf.sh" ] && cp /example_conf.sh "$CONFIG_DIR/example_conf.sh"
}
2017-12-26 12:46:05 +01:00
2018-11-11 17:29:09 +01:00
move_to_ROOT(){
# prüfen ob Ordner ROOT, VOL, CONT existieren
# wenn nicht ROOT anlegen und alle bisher vorhandene Ordner dorthin verschieben
[ ! -d "$BACKUP_DIR_FILES" ] && mkdir -p "$BACKUP_DIR_FILES" || return
2018-11-11 17:29:09 +01:00
### find /home/vitali/find_tests/ -maxdepth 1 -mindepth 1 -type d -name "CONT" -prune -or -name "VOL" -prune -or -name ROOT -prune -or -name "*" -exec mv -t /home/vitali/find_tests/ROOT/ {} +
find "$BACKUP_DIR" -maxdepth 1 -mindepth 1 -type d -name "$CONTAINERS" -prune -or -name "$VOLS" -prune -or -name "$FILES" -prune -or -name "*" -exec mv -t "$BACKUP_DIR_FILES/" {} +
2018-11-11 17:29:09 +01:00
# anschliessend VOL und CONT anlegen
[ ! -d "$BACKUP_DIR_VOLS" ] && mkdir -p "$BACKUP_DIR_VOLS"
[ ! -d "$BACKUP_DIR_CONTAINERS" ] && mkdir -p "$BACKUP_DIR_CONTAINERS"
}
## Einzelne Backup-Jobs
b_files(){
## einzelne Dateien und Ordner mit rdiff-backup sichern
# prüfen ob das backup-ordner existiert ...
if [ ! -d "$2" ]
then
# ... und gegebenfals anlegen
mkdir -p "$2"
fi
# die eigentliche Sicherung ...
echo backup file[s]: "$1"
rdiff-backup $RDIFF_BACKUP_OPTS "$1" "$2"
# alle Sicherungen die älter als $DELETE_OLD_FILES löschen
rdiff-backup --remove-older-than $DELETE_OLD_FILES --force "$2"
}
2018-11-25 16:59:05 +01:00
export_sql(){
## Export einer MySQL-DB als SQL-Script in ein später (!) zu sicherndes Ordner
2018-11-25 12:06:10 +01:00
echo dumb database: "$1"
2018-11-25 16:59:05 +01:00
2018-11-25 12:06:10 +01:00
if [ "$MYSQL_CONTAINER" != '' ]
then
echo from container: "$MYSQL_CONTAINER"
ssh ${REMOTE_USER}@${REMOTE_HOST} "docker exec -i \"$MYSQL_CONTAINER\" mysqldump -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" --events --routines --triggers --single-transaction --add-drop-database -B \"$1\" > \"$MYSQL_DUMP_DIR/$1.sql\""
else
ssh ${REMOTE_USER}@${REMOTE_HOST} "mysqldump -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" --events --routines --triggers --single-transaction --add-drop-database -B \"$1\" > \"$MYSQL_DUMP_DIR/$1.sql\""
fi
}
b_vol(){
## Docker volume mit rdiff-backup sichern
sleep 1
}
2017-12-26 12:46:05 +01:00
backup(){
2018-07-14 11:26:01 +02:00
read_config "$1"
echo Start backup $1
echo ==================================================
2018-11-26 14:24:48 +01:00
# Backupverzeichnisse einrichten
2018-11-26 15:01:00 +01:00
move_to_ROOT
2018-11-26 14:24:48 +01:00
2017-12-26 12:46:05 +01:00
# SCHRITT 1:
# sichern der MySQL-Datenbanken auf dem remote host
# es muss auf dem remote host genug Platz auf der Festplatte geben damit Dump erfolgen kann!
2017-12-26 12:46:05 +01:00
if [ ${#MYSQL_DB[@]} -gt 0 ]
then
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "[ ! -d \"$MYSQL_DUMP_DIR\" ] && mkdir -p \"$MYSQL_DUMP_DIR\""
for db in "${MYSQL_DB[@]}"
do
# lokaler Export der DB als SQL
2018-11-25 16:59:05 +01:00
export_sql "$db"
2017-12-26 12:46:05 +01:00
done
# Ordner mit SQL-Dateien sofort (!) sichern
2018-11-11 17:29:09 +01:00
if [ "$MYSQL_CONTAINER" != '' ]
then
b_files "${REMOTE_USER}@${REMOTE_HOST}::${MYSQL_DUMP_DIR}" "$BACKUP_DIR_CONTAINERS/${MYSQL_CONTAINER}"
2018-11-11 17:29:09 +01:00
else
2018-11-26 14:24:48 +01:00
b_files "${REMOTE_USER}@${REMOTE_HOST}::${MYSQL_DUMP_DIR}" "${BACKUP_DIR_FILES}/${MYSQL_DUMP_DIR}"
2018-11-11 17:29:09 +01:00
fi
# die SQL-Dateien vom remote host wieder löschen
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/\"*.sql"
2017-12-26 12:46:05 +01:00
fi
# SCHRITT 2:
# die Sicherung der Ordner (inklusive der SQL-Dump)
for dir in "${FOLDERS[@]}"
do
# die eigentliche Sicherung ...
2018-11-26 14:24:48 +01:00
b_files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "${BACKUP_DIR_FILES}/${dir}"
2018-07-14 11:26:01 +02:00
# Liste der Sicherungen anzeigen
if [ "$2" == "--list" ]; then
2018-11-26 14:24:48 +01:00
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
2018-07-14 11:26:01 +02:00
fi
2018-08-17 19:59:14 +02:00
echo
2017-12-26 12:46:05 +01:00
done
2018-01-12 19:34:50 +01:00
echo Done backup $1
2018-08-17 19:59:14 +02:00
echo
2017-12-26 12:46:05 +01:00
}
## Einzelne Restore-Jobs
r_files(){
2018-11-25 16:59:05 +01:00
## einzelne Dateien und Ordner mit rdiff-backup wiederherstellen
2018-11-25 12:06:10 +01:00
if [ "$3" != "" ]; then
rdiff-backup --force -r "$3" "$1" "$2"
else
rdiff-backup --force -r now "$1" "$2"
fi
}
2018-11-26 17:22:36 +01:00
import_sql(){
2018-11-25 16:59:05 +01:00
## Import einer MySQL-DB von einem SQL-Script aus einem vorher (!) wiederherstellen Ordner
2018-11-26 17:22:36 +01:00
if [ "$MYSQL_CONTAINER" != '' ]
then
FROM_FILE=${BACKUP_DIR_CONTAINERS}/${MYSQL_CONTAINER}/${1}.sql
else
FROM_FILE=${BACKUP_DIR_FILES}/${MYSQL_DUMP_DIR}/${1}.sql
fi
r_files "$FROM_FILE" "${REMOTE_USER}@${REMOTE_HOST}::${MYSQL_DUMP_DIR}/${1}.sql" "$2"
if [ "$MYSQL_CONTAINER" != '' ]
then
ssh ${REMOTE_USER}@${REMOTE_HOST} "docker exec -i \"$MYSQL_CONTAINER\" mysql -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" < \"$MYSQL_DUMP_DIR/${1}.sql\""
else
ssh ${REMOTE_USER}@${REMOTE_HOST} "mysql -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" < \"$MYSQL_DUMP_DIR/${1}.sql\""
fi
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/${1}.sql\""
}
2018-11-25 13:02:04 +01:00
r_vol(){
2018-11-25 16:59:05 +01:00
## Docker volume mit rdiff-backup wiederherstellen
sleep 1
}
2018-11-25 13:02:04 +01:00
r_mysql_cont(){
2018-11-25 16:59:05 +01:00
## Import einer MySQL-DB von einem SQL-Script aus einem vorher (!) wiederherstellen Ordner in ein Container
sleep 1
}
2017-12-26 12:46:05 +01:00
restore(){
2018-07-14 11:26:01 +02:00
read_config "$1"
2018-11-26 17:22:36 +01:00
echo Start restore $1 to $2
2018-07-14 11:26:01 +02:00
echo ==================================================
# SCHRITT 1:
# Alle Dateien und Ordner aus dem letzten Backup wiederherstellen
if [ ${#MYSQL_DB[@]} -gt 0 ]
then
2018-11-26 17:22:36 +01:00
#FOLDERS+=("$MYSQL_DUMP_DIR")
## jede SQL-Datei einzeln hochladen
for db in "${MYSQL_DB[@]}"
do
2018-12-02 14:26:53 +01:00
echo restore database: "$db" "$2"
2018-11-26 17:22:36 +01:00
import_sql "$db" "$2"
done
2018-07-14 11:26:01 +02:00
fi
for dir in "${FOLDERS[@]}"
do
# die eigentliche Wiederherstellung ...
2018-12-02 14:26:53 +01:00
echo restore file[s]: "${dir}" "$2"
2018-11-26 14:24:48 +01:00
r_files "${BACKUP_DIR_FILES}/${dir}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "$2"
2018-07-14 11:26:01 +02:00
done
echo Done restore $1
2018-08-17 19:59:14 +02:00
echo
2018-07-14 11:26:01 +02:00
}
2018-11-11 17:29:09 +01:00
test_function(){
read_config "$1"
echo $REMOTE_HOST
}
2018-07-14 11:26:01 +02:00
list(){
read_config "$1"
echo Show backups of $1
echo ==================================================
# neue Konfiguration lesen
2018-11-11 17:29:09 +01:00
#source "$CONFIG_DIR/$1"
2018-07-14 11:26:01 +02:00
if [ ${#MYSQL_DB[@]} -gt 0 ]
then
FOLDERS+=("$MYSQL_DUMP_DIR")
fi
2017-12-26 12:46:05 +01:00
for dir in "${FOLDERS[@]}"
do
2018-07-14 11:26:01 +02:00
echo show backups for file[s]: "$dir"
2018-11-26 14:24:48 +01:00
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
2018-08-17 19:59:14 +02:00
echo
2017-12-26 12:46:05 +01:00
done
2018-07-14 11:26:01 +02:00
echo Done show $1
2018-08-17 19:59:14 +02:00
echo
2017-12-26 12:46:05 +01:00
}
if [ "$1" == "--gen-config" ]; then
gen_config
2018-07-14 11:26:01 +02:00
elif [ "$1" == "--backup" ]; then
2018-07-14 11:26:01 +02:00
shift
backup "$@"
elif [ "$1" == "--restore" ]; then
shift
restore "$@"
elif [ "$1" == "--list" ]; then
shift
list "$@"
elif [ "$1" == "--bash" ]; then
shift
/bin/bash "$@"
2018-11-11 17:29:09 +01:00
elif [ "$1" == "--testit" ]; then
shift
test_function "$@"
else
2018-07-14 11:26:01 +02:00
echo "usage ?"
fi
2017-12-26 12:46:05 +01:00