#!/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|] [-i|--inventory inventory_name] [-d|--datetime ]${NC}" echo -e "\nКоманды:" echo -e " ${CY}list${NC} - показать список известных частей playbook'а с возможностью восстановления из резервной копии." echo -e " ${CY}${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 " * - Полное восстановление." }