Atualizar backup

This commit is contained in:
2025-03-24 12:07:57 -03:00
parent f9532a0cb2
commit 5889537299

287
backup
View File

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