Archived
1
This repository has been archived on 2025-08-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
playbookctl/scripts/scripts.d/30-restore.sh
Voomra c584648913 import code
сохранён для истории
2024-04-23 07:41:00 +03:00

204 lines
7.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# vi: set tabstop=2 shiftwidth=2 noexpandtab :
MAP_COMMAND["restore"]=fn_command_restore
MAP_COMMAND_DESC["restore"]="восстановление резервной копии."
MAP_COMMAND_HELP["restore"]=fn_command_restore_help
ARRAY_RESTORE_PARTS=()
declare -A MAP_RESTORE_FLAGS
PRERESTORE_FILE=""
function fn_command_restore_break() {
echo "-- BREAK --"
exit 1
}
function fn_command_restore() {
local __parts=($@)
# Default values
MAP_RESTORE_FLAGS["remote_only"]=0
MAP_RESTORE_FLAGS["datetime"]="latest"
MAP_RESTORE_FLAGS["inventory"]="$ANSIBLE_TARGET_HOST"
# Trapping Ctrl-C
trap fn_command_restore_break INT
if [[ "list" == "${__parts[0]}" ]]; then
echo "Части playbook'а:"
for __ansible_part in "${ANSIBLE_PARTS_RESTORE[@]}"; do
echo -e " - ${CY}${__ansible_part}${NC}"
done
exit 0
fi
local __flag_arg=""
if [[ ${#__parts[@]} -gt 0 ]]; then
# Разеляем флаги и ansible части
for __part in "${__parts[@]}"; do
if [[ "$__part" = '-'* ]]; then
if [[ -n $__flag_arg ]]; then
LogError "Missing flag argument for '${__flag_arg}'"
exit 1
fi
if [[ "-i" = "$__part" ]] || [[ "--inventory" = "$__part" ]]; then
__flag_arg="inventory"
elif [[ "-d" = "$__part" ]] || [[ "--datetime" = "$__part" ]]; then
__flag_arg="datetime"
elif [[ "-r" = "$__part" ]] || [[ "--remote-only" = "$__part" ]]; then
MAP_RESTORE_FLAGS["remote_only"]=1
fi
else
if [[ -n $__flag_arg ]]; then
MAP_RESTORE_FLAGS["$__flag_arg"]="$__part"
__flag_arg=""
else
ARRAY_RESTORE_PARTS+=($__part)
fi
fi
done
fi
if [[ -n $__flag_arg ]]; then
LogError "Missing flag argument for '${__flag_arg}'"
exit 1
fi
LogDebug "ARRAY_RESTORE_PARTS: ${ARRAY_RESTORE_PARTS[*]}"
LogDebug "MAP_RESTORE_FLAGS.keys: ${!MAP_RESTORE_FLAGS[@]}"
LogDebug "MAP_RESTORE_FLAGS.value: ${MAP_RESTORE_FLAGS[@]}"
if [[ ${#ARRAY_RESTORE_PARTS[@]} -gt 0 ]]; then
# Проверяем указанные части
local __check=0
for __part in "${ARRAY_RESTORE_PARTS[@]}"; do
__check=0
for __ansible_part in "${ANSIBLE_PARTS_RESTORE[@]}"; do
if [[ $__part = $__ansible_part ]]; then
__check=1
break
fi
done
if [[ $__check -eq 0 ]]; then
LogError "Unknown part for restore: ${CY}${__part}${NC}"
exit 1
fi
done
unset __check
fi
fn_command_restore_pre_run
fn_command_restore_run
fn_command_restore_post_run
}
function fn_command_restore_pre_run() {
if [[ MAP_RESTORE_FLAGS["remote_only"] -eq 1 ]]; then
return
fi
local __extra_vars
__ansible_extra_vars="--extra-vars \"dd_vars=$TARGET_HOST\""
if [[ ${#ARRAY_RESTORE_PARTS} -eq 0 ]]; then
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_prerestore=true\""
else
for __part in "${ARRAY_RESTORE_PARTS[@]}"; do
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_prerestore_${__part}=true\""
done
fi
PRERESTORE_FILE="/tmp/$(date +%s)"
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore_datetime=${MAP_RESTORE_FLAGS["datetime"]}\""
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore_inventory=${MAP_RESTORE_FLAGS["inventory"]}\""
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_prerestore_file=${PRERESTORE_FILE}\""
local __ansible_vvv=""
if [[ $DD_DEBUG -gt 1 ]]; then
__ansible_vvv="-vvv"
fi
local __ansible_eval="ansible-playbook \
$__ansible_vvv \
-i "$BASE_DIR"/hosts.yml \
-l "$ANSIBLE_TARGET_HOST" \
"$BASE_DIR"/"$ANSIBLE_PLAYBOOK" \
$__ansible_extra_vars"
Title "Pre restore Ansible"
LogDebug $__ansible_eval
eval $__ansible_eval
Title "Send files"
chmod +x "$PRERESTORE_FILE"
bash -c "$PRERESTORE_FILE"
rm -f "$PRERESTORE_FILE"
}
function fn_command_restore_run() {
local __ansible_extra_vars
__ansible_extra_vars="--extra-vars \"dd_vars=$ANSIBLE_TARGET_HOST\""
if [[ ${#ARRAY_RESTORE_PARTS[@]} -eq 0 ]]; then
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore=true\""
else
for __part in "${ARRAY_RESTORE_PARTS[@]}"; do
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore_${__part}=true\""
done
fi
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore_datetime=${MAP_RESTORE_FLAGS["datetime"]}\""
__ansible_extra_vars="$__ansible_extra_vars --extra-vars \"dd_restore_inventory=${MAP_RESTORE_FLAGS["inventory"]}\""
local __ansible_become=""
if [[ $ANSIBLE_BECOME == 1 ]]; then
__ansible_become="--become --become-user=$ANSIBLE_BECOME_USER"
fi
local __ansible_vvv=""
if [[ $DD_DEBUG -gt 1 ]]; then
__ansible_vvv="-vvv"
fi
local __ansible_eval="ansible-playbook \
$__ansible_vvv \
$__ansible_become \
-i "$BASE_DIR"/hosts.yml \
-l "$ANSIBLE_TARGET_HOST" \
"$BASE_DIR"/"$ANSIBLE_PLAYBOOK" \
$__ansible_extra_vars"
Title "Start Annsible Playbook"
LogDebug $__ansible_eval
eval $__ansible_eval
}
function fn_command_restore_post_run() {
if [[ MAP_RESTORE_FLAGS["remote_only"] -eq 1 ]]; then
return
fi
Title "Remove files"
chmod +x "${PRERESTORE_FILE}_clean"
bash -c "${PRERESTORE_FILE}_clean"
rm -f "${PRERESTORE_FILE}_clean"
}
function fn_command_restore_help() {
echo "Использование:"
echo -e " ${CW}$(basename $0) ${CY}restore ${CC}[list|<PARTS>] [-i|--inventory inventory_name] [-d|--datetime <latest|20230102_030405>]${NC}"
echo -e "\nКоманды:"
echo -e " ${CY}list${NC} - показать список известных частей playbook'а с возможностью восстановления из резервной копии."
echo -e " ${CY}<PARTS>${NC} - (опционально) восстановить только часть playbook'а. Можно указать несколько частей."
echo -e " ${CY}-i|--inventory${NC} - (опционально) восстановить из указанного ansible inventory."
echo -e " ${CY}-d|--datetime${NC} - (опционально) восстановить из указанной копии."
echo -e " ${CY}-r|--remote-only${NC} - (опционально) использовать резервную копию ранее загруженную на удалённый хост."
echo -e " * - Полное восстановление."
}