├── .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 |
10 |
11 |
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 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
51 |
52 |
53 |
54 |
55 |
56 |
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 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 | 1454281734150
241 |
242 | 1454281734150
243 |
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 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
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()
--------------------------------------------------------------------------------