204 lines
7.0 KiB
Bash
204 lines
7.0 KiB
Bash
#!/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 " * - Полное восстановление."
|
||
}
|