diff --git a/backup b/backup index 264dc3e..3c347bd 100644 --- a/backup +++ b/backup @@ -2,165 +2,168 @@ # ┌──────────────────────────────────────────────────────────┐ # │ Author: Bruno.Tosta │ # │ Desc: Realiza o backup do banco de dados │ -# └──────────────────────────────────────────{ CONFIGURACAO }┘ -VERSAO="2.1" +# ├──────────────────────────────────────────────────────────┤ + option='N' # │ +# ├ "D" = Desligar | +# ├ "R" = Reiniciar | +# ├ "N" = Nada | + config='/etc/openerp-server.conf' # | + origem='/backup/postgres' # | + raiz='/backup' # | + destino='backup:' # | +# └─────────────────────────────────────────{ CONFIGURACOES }┘ +VERSAO="4.0" -FINALIZAR='0' -# "0" = Finalizar | "1" = Reiniciar | "2" = Desligar -# ┌──────────────────────────────────────────────────────────┐ -# └─────────────────────────────────────────────{ VARIAVEIS }┘ -REPOSITORIO='download.sigsolucoes.net.br/public/Tosta/ERP' -DIR_ORIGEM='/backup/diario/Dropbox' -DIR_DESTINO='backup:' -DIRETORIO=$(date '+%A') -VERDE='\033[32;1m' -AMARELO='\033[33;1m' -VERMELHO='\033[31;1m' -RESET=$(tput 'sgr0') -LOG="$(date '+%m%Y')" -ARQUIVO_LOG="/tmp/rclone-$LOG.log" -MENSAGEM_LOG="#$(date '+%A, %d %B %Y')#" -MENU=" [ -OPÇÃO ] - -a Armazenamento - -c Checar - -C Configurar - -i Informacao - -l Listar - -s Sincronizar - -u Atualizar rclone - -U Atualizar script - -v Verificar - -V Versão do script - -h Ajuda deste menu" -# ┌──────────────────────────────────────────────────────────┐ -# └─────────────────────────────────────────────────{ TESTE }┘ -Testar(){ - rclone --version 2>'/dev/null' | head -1 | grep -q 'rclone v1.67.0' && echo -e "${VERDE}Está atualizado! \n" $RESET || { - wget -q --show-progress -O '/tmp/rinstall' "$REPOSITORIO/instaladores/rclone"; chmod 755 '/tmp/rinstall'; /tmp/./rinstall - } -} +data=$(date '+%A') +log="/tmp/rclone-${data}.log" +total=$(echo "$(rclone about "${destino}" 2>'/dev/null' | awk '/Total:/ {print $2}' | sed 's/[a-zA-Z]*//g') * 1028" | bc 2>'/dev/null') +if tty -s; then + NORMAL=$(tput sgr0) + VERMELHO=$(tput setaf 1) + VERDE=$(tput setaf 2) + AMARELO=$(tput setaf 3) +fi +MENU=' + -a ou --storage | Armazenamento + -c ou --check | Checar + -C ou --config | Configurar + -i ou --info | Informacao + -l ou --list | Listar + -s ou --sync | Sincronizar + -t ou --trash | Limpar lixeira + -u ou --update | Atualizar script + -v ou --version | Versão do script + -h ou --help | Ajuda deste menu +' # ┌──────────────────────────────────────────────────────────┐ # └───────────────────────────────────────────────{ FUNCOES }┘ -Configurar(){ - rclone config; +configurar(){ + clear && rclone config } -Informacao(){ - rclone about "$DIR_DESTINO"; +informacao(){ + rclone about "${destino}" } -Listar(){ - rclone tree "$DIR_DESTINO"; +listar(){ + rclone tree "${destino}" } -Verificar(){ -[ -e "$DIR_ORIGEM/" ] && echo "$DIR_ORIGEM/ existe" || { - mkdir -p "$DIR_ORIGEM/" - [ -e '/home/caixa/' ] && chown -R caixa:caixa '/backup' - [ -e '/home/sig' ] && chown -R sig:sig '/backup' - [ ! -e '/home/caixa/' ] && [ ! -e '/home/sig' ] && echo "${VERMELHO}Não existe usuário 'caixa' ou 'sig' neste computador${RESET}" - chmod -R 777 '/backup' - } +realizar(){ + _fazerBackup(){ + local __base=$(PGPASSWORD="${_password}" psql -U 'openerp' -l | awk '{ if ($3 == "openerp") print $1 }' | head -${i} | tail -1) + + printf "\n${VERDE}Quantidade: ${i}/${_amount} \nBase: ${__base} \n${NORMAL}" + PGPASSWORD="${_password}" pg_dump -h 'localhost' -p '5432' --role 'openerp' -U 'openerp' -F 'custom' -b -v -T 'logs_logs' -T 'ir_attachment' -T 'logs_detalhe' -T 'ecf_exportar_osv_id_seq' -f "${_file}/${__base}-${data}.dump" "${__base}" + } + + local _password=$(grep db_password "$config" | awk '{print $3}') + local _amount=$(PGPASSWORD="${_password}" psql -U 'openerp' -l | awk '{ if ($3 == "openerp") print $1 }' | wc -l) + local _file=$(mktemp -d '/tmp/XXXXXXXXXX') + local _user=$(id -u '1000') + + rm -f "${origem}/${data}.tar.gz" + + for ((i=1; i < $(($_amount+1)); i++)) do + _fazerBackup + done + + (cd "${_file}" && tar cfvz "${origem}/${data}.tar.gz" ./*.dump \ + && chown -R "${_user}":"${_user}" "${raiz}" \ + && chmod -R 755 "${raiz}") } -Realizar(){ - SENHA=$(grep db_password '/etc/openerp-server.conf' | awk '{print $3}') - QUANTIDADE=$(PGPASSWORD="$SENHA" psql -U 'openerp' -l | awk '{ if ($3 == "openerp") print $1 }' | wc -l) - cd "$DIR_ORIGEM" && rm -rf "$DIRETORIO.tar.gz" - mkdir $DIRETORIO - for ((N=1; N < $(($QUANTIDADE+1)); N++)) do - BASE=$(PGPASSWORD="$SENHA" psql -U 'openerp' -l | awk '{ if ($3 == "openerp") print $1 }' | head -$N | tail -1) - printf "\n${VERDE}Quantidade: $N \nBase: $BASE \n${RESET}" - PGPASSWORD="$SENHA" pg_dump -h 'localhost' -p '5432' --role 'openerp' -U 'openerp' -F 'custom' -b -v -T 'logs_logs' -T 'ir_attachment' -T 'logs_detalhe' -T 'ecf_exportar_osv_id_seq' -f "$DIR_ORIGEM/$DIRETORIO/$BASE.dump" "$BASE" - done - tar cfvz "$DIRETORIO.tar.gz" "$DIRETORIO" && chmod 777 "$DIRETORIO.tar.gz"; rm -rf "$DIRETORIO" +healthCheck(){ + local _verify=$(du -sm "${origem}/${data}.tar.gz" | awk '{print $1}') + + [ "${_verify}" -gt 1 ] && echo -e "\n${VERDE}O backup foi concluído com sucesso. \n${NORMAL}" \ + || { printf "\n${VERMELHO}O backup do banco de dados não foi realizado, verifique os parametros. \n${NORMAL}"; exit 1; } } -HealthCheck(){ - ESPACO=$(du -sm "$DIR_ORIGEM/$DIRETORIO.tar.gz" | awk '{print $1}') -[[ "$ESPACO" -gt 3 ]] && echo -e "\n${VERDE}O backup foi concluído com sucesso. \n${RESET}" || { - printf "\n${VERMELHO}O backup do banco de dados não foi realizado, verifique os parametros. \n${RESET}"; exit 1 -} -} -Gerenciar(){ - TOTAL=$(echo "$(rclone about "$DIR_DESTINO" | awk '{print $2}'| head -1) * 1028" | bc) +gerenciar(){ + _removerExcesso(){ + local __antigo=$(ls -rt "${origem}/" | head -1) + + echo -e "${AMARELO}Removendo o arquivo ${__antigo} devido ao excesso de uso do espaço em disco.${NORMAL}" + rm "${origem}/${__antigo}" && echo -e "${VERDE}Arquivo ${__antigo} removido com sucesso. \n${NORMAL}" + } + while true; do - USADO=$(du -sm "$DIR_ORIGEM/" | awk '{print $1}') - [ "$USADO" -gt "$TOTAL" ] && { - ANTIGO=$(ls -rt "$DIR_ORIGEM/" | head -1) - echo -e "${AMARELO}Removendo o arquivo $ANTIGO devido ao excesso de uso do espaço em disco.${RESET}" - rm "$DIR_ORIGEM/$ANTIGO" && echo -e "${VERDE}Arquivo $ANTIGO removido com sucesso. \n${RESET}" -} || { - echo "Arquivos cabem no diretório."; break -} + local __usado=$(du -sm "${origem}" | awk '{print $1}') + [ "${__usado}" -gt "${total}" ] && _removerExcesso \ + || { echo -e "${VERDE}Espaço suficiente no diretório.\n${NORMAL}"; break; } done } -Sincronizar(){ - rclone -vP delete --delete-excluded "$DIR_ORIGEM/" "$DIR_DESTINO" --log-file="$ARQUIVO_LOG" - rclone -vP cleanup --progress "$DIR_DESTINO" --log-file="$ARQUIVO_LOG" - rclone -vP sync --progress "$DIR_ORIGEM/" "$DIR_DESTINO" --log-file="$ARQUIVO_LOG" +sincronizar(){ + local _lixeira=$(echo "$(rclone about "backup:" 2>'/dev/null' | awk '/Trashed:/ {print $2}' | sed 's/[a-zA-Z]*//g') * 1028" | bc | sed 's/\..*//') + [ "${_lixeira}" -gt '0' ] && limparLixeira + + rclone -vP sync --delete-excluded --delete-before --drive-use-trash=false --progress "${origem}/" "${destino}" --log-file="${log}" } -Validar(){ - tail "$ARQUIVO_LOG" | grep "ERROR"; [ ! $? -eq 0 ] && echo -e "\n${VERDE}Sincronismo concluído com sucesso. \n${RESET}" || { - echo -e "\n${VERMELHO}Erros encontrados. Verifique o arquivo $ARQUIVO_LOG. \n${RESET}" +limparLixeira(){ + rclone cleanup "${destino}" && sleep 5 } +validar(){ + tail "${log}" | grep "ERROR"; [ ! $? -eq 0 ] && \ + echo -e "\n${VERDE}Sincronismo concluído com sucesso. \n${NORMAL}" \ + || echo -e "\n${VERMELHO}Erros encontrados. Verifique o arquivo ${log}. \n${NORMAL}" } -Checar(){ - DATA_ORIGEM=$(ls $DIR_ORIGEM/*.tar.gz -tl --time-style="+%Y-%m-%d" | awk '{print $6}') - DATA_DESTINO=$(rclone lsl "$DIR_DESTINO" | awk '{print $2}') -[ "$DATA_ORIGEM" = "$DATA_DESTINO" ] && echo -e "${VERDE}O backup está sendo feito normalmente \n${RESET}" || { - echo -e "${VERMELHO}O backup está defasado \n${RESET}" +checar(){ + local _data_origem=$(ls ${origem}/*.tar.gz -tl --time-style="+%Y-%m-%d" | awk '{print $6}') + local _data_destino=$(rclone lsl "${destino}" | awk '{print $2}') + + [ "${_data_origem}" = "${_data_destino}" ] && \ + echo -e "${VERDE}O backup está sendo feito normalmente \n${NORMAL}" \ + || echo -e "${VERMELHO}O backup está defasado \n${NORMAL}" } +armazenamento(){ + local _usado=$(du -sm "${origem}/" | awk '{print $1}') + + [ "${total}" -lt "${_usado}" ] && gerenciar \ + || echo -e "${VERDE}O drive tem espaço suficiente para a realização do backup \n${NORMAL}" } -Armazenamento(){ - T=$(echo "$(rclone about $DIR_DESTINO | awk '{print $2}'| head -1) * 1028" | bc) - U=$(du -sm "$DIR_ORIGEM/" | awk '{print $1}') -[ "$T" -lt "$U" ] && Gerenciar || { - echo -e "${VERDE}Espaço disponível no drive é suficiente para a realização do backup \n${RESET}" -} -} -Backup(){ - Verificar && Realizar && HealthCheck - rclone config show 2>'/dev/null' | grep -q '^\[.*\]' && { - Gerenciar && Sincronizar && Validar && Checar -} || { - echo -e "${AMARELO}Backup feito apenas localmente \n${RESET}"; exit 0 -} +backup(){ + [ -e "${origem}" ] && echo "${origem}/ existe" \ + || { mkdir -p "${origem}" && echo "${origem}/ criada"; } + + realizar && healthCheck \ + && rclone config show 2>'/dev/null' | grep -q '^\[.*\]' && (gerenciar && sincronizar && validar && checar) \ + || (echo -e "${AMARELO}Backup feito apenas localmente \n${NORMAL}") + +case ${option} in + D) poweroff + ;; + R) reboot + ;; + N) echo -e "${VERDE}Finalizado \n${NORMAL}" + ;; + *) exit + ;; +esac } # ┌──────────────────────────────────────────────────────────┐ # └─────────────────────────────────────────────{ PRINCIPAL }┘ -Finaliza(){ -case "$FINALIZAR" in - 2) sudo shutdown -h now ;; - 1) sudo reboot ;; - 0) exit 0 ;; -esac -} -[ -z "$1" ] && { - Backup; Finaliza -} || { -while [ -n "$1" ]; do -case "$1" in - -a) clear; echo -e "${AMARELO}Armazenamento da aplicação \n${RESET}"; Armazenamento; exit - ;; - -c) clear; echo -e "${AMARELO}Checando o rclone \n${RESET}"; Checar; exit - ;; - -C) clear; echo -e "${AMARELO}Configuração do rclone \n${RESET}"; Configurar; clear; exit - ;; - -i) clear; echo -e "${AMARELO}Informações de armazenamento \n${RESET}"; Informacao; exit - ;; - -l) clear; echo -e "${AMARELO}Listar arquivos e diretórios \n${RESET}"; Listar; exit - ;; - -s) clear; echo -e "${AMARELO}Sincronizar backups \n${RESET}"; Sincronizar; exit - ;; - -u) clear; echo -e "${AMARELO}Atualização do rclone \n${RESET}"; Testar; exit - ;; - -U) clear; sudo su -s '/bin/bash' -c 'hub -B'; exit - ;; - -v) clear; echo -e "${AMARELO}Verificação de arquivos \n${RESET}"; Verificar; exit - ;; - -V) clear; echo -e "\n ${VERDE}A versão do script é $VERSAO${RESET}"; exit - ;; - -h|--help) echo -e "\n $MENU \n${RESET}"; exit - ;; - *) echo -e "${VERMELHO}Opção inválida. $MENU \n${RESET}"; exit 1 - ;; -esac -done -} +[ ! "$(id -u)" = '0' ] && echo -e "${VERMELHO}É necessário executar como root para continuar \n${NORMAL}" && exit \ + || [ -z "${1:-}" ] && backup \ + || while [ -n "${1:-}" ]; do + case "${1}" in + -a|--storage) echo -e "${AMARELO}Armazenamento da aplicação \n${NORMAL}" && armazenamento \ + && exit;; + -c|--check) echo -e "${AMARELO}Checando o rclone \n${NORMAL}" && checar \ + && exit;; + -C|--config) echo -e "${AMARELO}Configuração do rclone \n${NORMAL}" && configurar \ + && exit;; + -i|--info) echo -e "${AMARELO}Informações de armazenamento \n${NORMAL}" && informacao \ + && exit;; + -l|--list) echo -e "${AMARELO}Listar arquivos e diretórios \n${NORMAL}" && listar \ + && exit;; + -s|--sync) echo -e "${AMARELO}Sincronizar backups \n${NORMAL}" && sincronizar \ + && exit;; + -t|--trash) echo -e "${AMARELO}Limpando lixeira \n${NORMAL}" && limparLixeira \ + && exit;; + -u|--update) sudo su -s '/bin/bash' -c 'hub -B' \ + && exit;; + -v|--version) echo -e "${VERDE}A versão do script é ${VERSAO}${NORMAL}" \ + && exit;; + -h|--help) echo -e "${VERMELHO}\n [ OPÇÃO ]\n ${MENU}${NORMAL}" \ + && exit;; + *) echo -e "${VERMELHO}\n [ OPÇÃO INVÁLIDA ]\n ${MENU}${NORMAL}" \ + && exit 1;; + esac + done # └──────────────────────────────────────────────────────────┘