├── .idea ├── .name ├── PythonBackupSystem.iml ├── encodings.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── workspace.xml ├── README.md ├── backup-diferencial.py └── backup-full.py /.idea/.name: -------------------------------------------------------------------------------- 1 | PythonBackupSystem -------------------------------------------------------------------------------- /.idea/PythonBackupSystem.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 44 | 45 | 51 | 52 | 53 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 89 | 90 | 91 | 92 | 95 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 127 | 128 | 146 | 147 | 165 | 166 | 186 | 187 | 208 | 209 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 1454281734150 241 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 273 | 276 | 277 | 278 | 280 | 281 | 282 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PythonBackupSystem 2 | Rotinas de Backup Full e Diferencial feitas em Python #IndustriaFox 3 | 4 | Manual: http://www.nanoshots.com.br/2016/02/criando-um-sistema-de-backup-full-e.html 5 | -------------------------------------------------------------------------------- /backup-diferencial.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | ''' 5 | AUTORES: Matheus Fidelis 6 | Script de Automação do Backup Full semanal e criação de Logs do Fileserver 7 | para melhorar o script antigo escrito em Shellscript utilizando compactação via Rsync 8 | 9 | 10 | ================================================================================== 11 | || CONSIDERAÇÕES IMPORTANTES SOBRE O RSYNC 12 | || O Script pode ser modificado a vontade. Porém, ele foi criado de antemão 13 | || para os seguintes parâmetros que podem ser modificados na variável 'opts' 14 | || Dentro da função gerabackup(). Aqui vai uma explicação bem rápida sobre 15 | || cada um deles: 16 | || 17 | || -v: Ativa a “verbosidade”. Simplesmente faz o rsync relatar todo o 18 | || processo na tela. 19 | || 20 | || -q: Faz rsync trabalhar quietinho. Ele só printa alguns logs no final do 21 | || script. Ativem a opção e removam o -v caso queiram evitar logs muito grandes 22 | || no servidor :) 23 | || 24 | || -r: Esse parâmetro é muito importante. Pois ele garante a recursividade do 25 | || Rsync. Ou seja, faz ele procurar arquivos e pastas dentro dos subdiretórios 26 | || Caso essa opção não seja ativada o Rsync vai sincronizar somente o primeiro 27 | || nível dos diretórios, ignorando as subpastas. 28 | || 29 | || -n: rodada de testes. Serve para você testar o rsync sem correr o risco dele 30 | || modificar seus arquivos. 31 | || 32 | || –delete: apaga arquivos do destino que não existam na origem. Este comando 33 | || garante que a origem e destino sejam exatamente iguais depois da sincronização. 34 | || Sem isso, o destino acumularia com arquivos que não existem mais na origem. 35 | || Desativá-lo pode ser útil para backups diários para manter um histórico. 36 | || 37 | || -z: ativa a compressão, torna a transferência mais rápida. 38 | || 39 | || -l, --links - cópia symlinks como symlinks 40 | || 41 | || -L, --copy-links - transforma symlink em sua referência, arquivo ou diretório 42 | || 43 | || -t, --times - preserva a data de modificação; 44 | || 45 | || --exclude - exclui do backup alguns tipos de arquivos identificados pelo nome 46 | || pode ser utilizado para ignorar arquivos temporários e logs, como por exemplo 47 | || --exclude={'*.tmp,*.log'} 48 | || 49 | ================================================================================== 50 | ''' 51 | 52 | import subprocess 53 | import time 54 | import sys 55 | 56 | #Essa função gera um banner com a hora inicial do Backup 57 | def inicio(horaInicio): 58 | 59 | inicio = ''' 60 | =========================================================================== 61 | || ____ _____ _ ___ _ _____ _____ _____ || 62 | || | _ \ /\ / ____| |/ / | | | __ \ | __ \ / ____| || 63 | || | |_) | / \ | | | ' /| | | | |__) | | |__) | (___ _ _ _ __ ___ || 64 | || | _ < / /\ \| | | < | | | | ___/ | _ / \___ \| | | | '_ \ / __| || 65 | || | |_) / ____ \ |____| . \| |__| | | | | \ \ ____) | |_| | | | | (__ || 66 | || |____/_/ \_\_____|_|\_ \____/|_| |_| \_\_____/ \__, |_| |_|\___| || 67 | || __/ | || 68 | || |___/ || 69 | || BACKUP DIFERENCIAL DO FILESERVER || 70 | =========================================================================== 71 | 72 | =========================================================================== 73 | BACKUP DIFERENCIAL DO FILESERVER INICIADO ÀS %s 74 | =========================================================================== 75 | ''' % horaInicio 76 | return inicio 77 | 78 | #Termino e calculos 79 | def termino(diaInicio, horaInicio, backup, pathlog): 80 | hoje = (time.strftime("%d-%m-%Y")) 81 | horaFinal = time.strftime('%H:%M:%S') 82 | backup = backup.replace('tar cvf', '') 83 | final = ''' 84 | =========================================================================== 85 | BACKUP DIFERENCIAL FINALIZADO 86 | 87 | HORA INICIAL: %s - %s 88 | HORA FINAL : %s - %s 89 | LOG FILE : %s 90 | BAK FILE : %s 91 | =========================================================================== 92 | 93 | ''' % (diaInicio, horaInicio, hoje, horaFinal, pathlog, backup) 94 | return final 95 | 96 | 97 | #ESSA FUNÇÃO DESMONTA O HD DE BACKUP POR SEGURANÇA. 98 | #DESCOMENTE A LINHA desmonta_hd() DENTRO DE backupclone() PARA UTILIZÁ-LA 99 | def desmonta_hd(disk): 100 | try: 101 | umount = 'umount %s' % disk 102 | subprocess.call(umount, shell=True) 103 | except: 104 | return False 105 | 106 | 107 | 108 | #CONSTROI OS LOGS DO SISTEMA - Aqui selecionamos o nome do backup e o arquivo de logs que iremos criar. 109 | def geralog(): 110 | date = (time.strftime("%Y-%m-%d")) # 111 | logfile = '%s-backup-rsync.txt' % date # Cria o arquivo de Log 112 | pathlog = '/var/log/backup/backup-rsync/%s' % logfile # Arquivo de log 113 | 114 | return pathlog 115 | 116 | 117 | #CONSTROI O ARQUIVO E PATH DE BACKUP E RETORNA 118 | def gerabackup(): 119 | date = (time.strftime("%Y-%m-%d")) 120 | opts = 'Cravzp' 121 | #opts = 'rvtl' # Opções que serão passadas com Rsync. Comentários no inicio do Script :) 122 | exclude = '*.log, *.tmp, .recycle' # Define os diretórios e tipos de arquivos que não vão ter backup 123 | pathdestino = '/mnt/backupclone/' # Destino onde será gravado espelhado o backup 124 | pathorigem = '/mnt/storage/' # pasta que será 'backupeada' 125 | backup = 'rsync -%s --exclude={%s} %s %s' % (opts, exclude, pathorigem, pathdestino) # Comando de execução 126 | 127 | #print backup 128 | #sys.exit() 129 | return backup 130 | 131 | 132 | #CRIA OS BACKUPs 133 | def backupclone(): 134 | disk = '/dev/sdc' # Aqui defina a partição que contém o disco que será realizado para guardar o backup 135 | horaInicio = time.strftime('%H:%M:%S') 136 | pathlog = geralog() 137 | backup = gerabackup() 138 | log = ' >> %s' % pathlog 139 | start = inicio(horaInicio) 140 | 141 | #Printa o Banner 142 | l = open(pathlog, 'w') 143 | l.write(start) 144 | l.close() 145 | 146 | #Monta todos os discos presentes no fstab 147 | mount = 'mount -a' 148 | subprocess.call(mount, shell=True) 149 | 150 | #RODA O BACKUP 151 | subprocess.call(backup + log, shell=True) 152 | 153 | #Printa o final e relatório 154 | diaInicio = (time.strftime("%d-%m-%Y")) 155 | final = termino(diaInicio, horaInicio, backup, pathlog) 156 | r = open(pathlog, 'w') 157 | r.write(final) 158 | r.close() 159 | 160 | #Caso seja necessário que o HD que guarda o Backup seja desmontado por segurança, descomente essa linha 161 | #desmonta_hd(disk) 162 | 163 | 164 | #Chama a função Main 165 | backupclone() 166 | -------------------------------------------------------------------------------- /backup-full.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | 5 | import subprocess 6 | import time 7 | 8 | #Essa função gera um banner com a hora inicial do Backup 9 | def inicio(horaInicio): 10 | 11 | inicio = ''' 12 | =========================================================================== 13 | || ____ _____ _ ___ _ _____ ______ _ _ _ _ || 14 | || | _ \ /\ / ____| |/ / | | | __ \ | ____| | | | | | | || 15 | || | |_) | / \ | | | ' /| | | | |__) | | |__ | | | | | | | || 16 | || | _ < / /\ \| | | < | | | | ___/ | __| | | | | | | | || 17 | || | |_) / ____ \ |____| . \| |__| | | | | | |__| | |____| |____ || 18 | || |____/_/ \_\_____|_|\_ \____/|_| |_| \____/|______|______| || 19 | || || 20 | || BACKUP FULL DO FILESERVER || 21 | || || 22 | =========================================================================== 23 | 24 | =========================================================================== 25 | BACKUP FULL DO FILESERVER INICIADO ÀS %s 26 | =========================================================================== 27 | ''' % horaInicio 28 | return inicio 29 | 30 | #Termino e calculos 31 | def termino(diaInicio, horaInicio, backup, pathlog): 32 | hoje = (time.strftime("%d-%m-%Y")) 33 | horaFinal = time.strftime('%H:%M:%S') 34 | backup = backup.replace('tar cvf', '') 35 | final = ''' 36 | =========================================================================== 37 | BACKUP FULL FINALIZADO 38 | 39 | HORA INICIAL: %s - %s 40 | HORA FINAL : %s - %s 41 | LOG FILE : %s 42 | BAK FILE : %s 43 | =========================================================================== 44 | 45 | ''' % (diaInicio, horaInicio, hoje, horaFinal, pathlog, backup) 46 | return final 47 | 48 | 49 | #ESSA FUNÇÃO DESMONTA O HD DE BACKUP POR SEGURANÇA. 50 | #DESCOMENTE A LINHA desmonta_hd() DENTRO DE backupfull() PARA UTILIZÁ-LA 51 | def desmonta_hd(disk): 52 | try: 53 | umount = 'umount %s' % disk 54 | subprocess.call(umount, shell=True) 55 | return True 56 | except: 57 | return False 58 | 59 | 60 | #CONSTROI OS LOGS DO SISTEMA - Aqui selecionamos o nome do backup e o arquivo de logs que iremos criar. 61 | def geralog(): 62 | date = (time.strftime("%Y-%m-%d")) # 63 | logfile = '%s-backup-full.txt' % date # Cria o arquivo de Log 64 | pathlog = '/var/log/backup/backup-full/%s' % logfile # Arquivo de log 65 | 66 | return pathlog 67 | 68 | 69 | #CONSTROI O ARQUIVO E PATH DE BACKUP E RETORNA 70 | def gerabackup(): 71 | date = (time.strftime("%Y-%m-%d")) 72 | backupfile = '%s-backup-full.tar.gz' % date # Cria o nome do arquivo de Backup 73 | pathdestino = '/mnt/hdbackup/%s' % backupfile # Destino onde será gravado o Backup 74 | pathorigem = '/mnt/storage/' # pasta que será 'backupeada' 75 | backup = 'tar cvf %s %s' % (pathdestino, pathorigem) # Comando de execução 76 | 77 | return backup 78 | 79 | 80 | #CRIA OS BACKUPs 81 | def backupfull(): 82 | disk = '/dev/sdb' #Define onde está a partição que será usada para guardar o backup 83 | horaInicio = time.strftime('%H:%M:%S') 84 | pathlog = geralog() 85 | backup = gerabackup() 86 | log = ' >> %s' % pathlog 87 | start = inicio(horaInicio) 88 | 89 | #Printa o Banner 90 | l = open(pathlog, 'w') 91 | l.write(start) 92 | l.close() 93 | 94 | #Monta todos os discos que estão no FSTAB 95 | mount = 'mount -a' 96 | subprocess.call(mount, shell=True) 97 | 98 | #RODA O BACKUP 99 | subprocess.call(backup + log, shell=True) 100 | 101 | #Printa o final e relatório 102 | diaInicio = (time.strftime("%d-%m-%Y")) 103 | final = termino(diaInicio, horaInicio, backup, pathlog) 104 | r = open(pathlog, 'w') 105 | r.write(final) 106 | r.close() 107 | 108 | #Descomente essa função para desmontar a partição que será utilizada para armazenar o backup 109 | #desmonta_hd(disk) 110 | 111 | backupfull() --------------------------------------------------------------------------------