-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
98 lines (80 loc) · 2.61 KB
/
main.py
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
46
47
48
49
50
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
import boto3
import lzma
import re
import subprocess
import sched, time
import base64
from logging import log
import os
# configurar
BUCKET = 'tada-backup-falcao'
DATABASE_URI = base64.b64decode(b'bla').decode()
FILENAME = 'bla.backup' # Mudar
AGENDAR = True
MINUTES = 6
ACCESS_KEY_ID = base64.b64decode(b'bla').decode()
ACCESS_KEY = base64.b64decode(b'bla').decode()
def runprocess(command):
"Executa subprocess multiplataforma sem exibir janela. Retorna o returncode."
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
retcode = subprocess.check_call(command, timeout=30, startupinfo=startupinfo)
return retcode
def dump_db():
"""
Realiza o backup do sistema utilizando a ferramenta pg_dump do postgreSQL.
No windows, o pg_dump precisa estar no PATH do sistema.
"""
try:
s = DATABASE_URI
user, password = re.search('//(.*)@', s).group(1).split(':')
host, db = re.search('@(.*)', s).group(1).split('/')
try:
host, porta = host.split(':')
except:
porta = '5432'
arq_backup = FILENAME
r = runprocess(['pg_dump',
f'--dbname=postgresql://{user}:{password}@{host}:{porta}/{db}',
'-f', arq_backup, '-F', 't', '-w'])
except Exception as e:
log.exception('admin, _backup. Erro pg_dump: {}.'.format(e))
return r == 0
def compress_file(input_name, output_name):
with open(input_name, "rb") as r:
data = r.read()
with lzma.open(output_name, "w") as f:
f.write(data)
def upload_file(filename):
s3 = boto3.client('s3',
aws_access_key_id=ACCESS_KEY_ID,
aws_secret_access_key=ACCESS_KEY)
bucket_name = BUCKET
s3.upload_file(filename, bucket_name, filename)
def backup_on_s3():
"Processo completo"
upload_filename = FILENAME+'.7z'
t1 = time.time()
print('1. Realizando dump do banco de dados...')
dump_db()
print('2. Comprimindo arquivo...')
compress_file(FILENAME, upload_filename)
print('3. Carregando arquivo para nuvem...')
upload_file(upload_filename)
print('Backup realizado com sucesso!')
print('Tempo: {0:.2f} segundos'.format(time.time() - t1))
def schedule_backup(minutes):
"Agenda rotina"
print('Agendando tarefa...')
s = sched.scheduler()
s.enter(minutes*60, 1, backup_on_s3)
s.run()
def main():
if AGENDAR:
schedule_backup(MINUTES)
else:
backup_on_s3()
if __name__ == '__main__':
main()