|
@@ -14,7 +14,7 @@ from google_auth_oauthlib.flow import InstalledAppFlow
|
|
|
from google.auth.transport.requests import Request
|
|
|
from docker.errors import NotFound, APIError
|
|
|
from datetime import datetime, timedelta
|
|
|
-from io import BytesIO
|
|
|
+from io import FileIO, BytesIO
|
|
|
|
|
|
BACKUP_AGE = 30
|
|
|
DOCKER_SOCK = 'unix://var/run/docker.sock'
|
|
@@ -192,6 +192,45 @@ def create_postgres_backup(database, docker_client):
|
|
|
|
|
|
return (True, tmp_file)
|
|
|
|
|
|
+'''
|
|
|
+'''
|
|
|
+def create_postgres_backup_v2(database, docker_client):
|
|
|
+ pg_container = get_pg_container(docker_client)
|
|
|
+
|
|
|
+ if pg_container is None or pg_container.status == 'exited':
|
|
|
+ return None
|
|
|
+
|
|
|
+ log('Creando copia de seguridad de la base de datos: %s' % database)
|
|
|
+
|
|
|
+ backup_file_name = '%s_database_%s.tar' % (database, datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
|
|
|
+ command = 'pg_dump -U %s -d %s -F tar -C -b -c -f %s' % (POSTGRES_USER, database, backup_file_name)
|
|
|
+
|
|
|
+ result = pg_container.exec_run(command)
|
|
|
+
|
|
|
+ if result.exit_code == -1:
|
|
|
+ log('Error al crear la copia de seguridad de la base de datos: %s' % database)
|
|
|
+ return None
|
|
|
+
|
|
|
+ (backup_file, _) = pg_container.get_archive('/%s' % backup_file_name)
|
|
|
+
|
|
|
+ tmp_file_path = os.path.abspath(os.path.join('./tmp', backup_file_name))
|
|
|
+ tmp_file_stream = FileIO(tmp_file_path, mode='w')
|
|
|
+
|
|
|
+ for chunk in backup_file:
|
|
|
+ tmp_file_stream.write(chunk)
|
|
|
+
|
|
|
+ tmp_file_stream.seek(0)
|
|
|
+ tmp_file_stream.close()
|
|
|
+
|
|
|
+ tmp_tar = tmp_file_path.replace(os.path.basename(tmp_file_path), 'tmp.tar')
|
|
|
+ os.rename(tmp_file_path, tmp_tar)
|
|
|
+
|
|
|
+ tar = tarfile.open(tmp_tar, mode='r')
|
|
|
+ tar.extractall('./tmp')
|
|
|
+
|
|
|
+ os.remove(tmp_tar)
|
|
|
+ return tmp_file_path
|
|
|
+
|
|
|
'''
|
|
|
'''
|
|
|
def create_odoo_filestore_backup(folder_name):
|
|
@@ -244,12 +283,12 @@ def upload_postgres_to_drive(backup_file_name, backup_folder_id, docket_client,
|
|
|
|
|
|
'''
|
|
|
'''
|
|
|
-def upload_filestore_to_drive(backup_path, backup_folder_id, service):
|
|
|
+def upload_backup_to_drive(backup_path, backup_folder_id, service):
|
|
|
if service == None:
|
|
|
return None
|
|
|
|
|
|
backup_name = os.path.basename(backup_path)
|
|
|
- log('Subiendo copia de seguridad de los archivos adjuntos: %s' % backup_name)
|
|
|
+ log('Subiendo copia de seguridad: %s' % backup_name)
|
|
|
|
|
|
backup_metadata = {
|
|
|
'name': backup_name,
|
|
@@ -261,7 +300,7 @@ def upload_filestore_to_drive(backup_path, backup_folder_id, service):
|
|
|
result = service.files().create(body=backup_metadata, media_body=backup_media).execute()
|
|
|
return result.get('id')
|
|
|
except Exception:
|
|
|
- log('Error al subir copia de seguridad de los archivos adjuntos: %s' % backup_name)
|
|
|
+ log('Error al subir copia de seguridad: %s' % backup_name)
|
|
|
return None
|
|
|
|
|
|
'''
|
|
@@ -285,7 +324,7 @@ def delete_postgres_backup(backup_name, docker_client):
|
|
|
|
|
|
'''
|
|
|
'''
|
|
|
-def delete_filestore_backup(backup_path):
|
|
|
+def delete_backup_path(backup_path):
|
|
|
log('Eliminando copia temporal de los archivos adjuntos: %s' % os.path.basename(backup_path))
|
|
|
os.remove(backup_path)
|
|
|
|
|
@@ -322,22 +361,19 @@ def run_backup():
|
|
|
create_tmp_path()
|
|
|
|
|
|
for index, db in enumerate(databases):
|
|
|
- log('Procesando %d de %d' % (index, len(databases)))
|
|
|
+ log('Creado copias: %d de %d' % (index, len(databases)))
|
|
|
|
|
|
- (backup_ok, backup_name) = create_postgres_backup(db, docker_client)
|
|
|
-
|
|
|
- if not backup_ok:
|
|
|
- if backup_name:
|
|
|
- delete_postgres_backup(backup_name, docker_client)
|
|
|
+ pg_bkp_path = create_postgres_backup_v2(db, docker_client)
|
|
|
|
|
|
+ if not pg_bkp_path:
|
|
|
continue
|
|
|
|
|
|
- upload_postgres_to_drive(backup_name, folder_id, docker_client, service)
|
|
|
- delete_postgres_backup(backup_name, docker_client)
|
|
|
+ upload_backup_to_drive(pg_bkp_path, folder_id, docker_client, service)
|
|
|
+ delete_backup_path(pg_bkp_path, docker_client)
|
|
|
|
|
|
filestore_path = create_odoo_filestore_backup(db)
|
|
|
- upload_filestore_to_drive(filestore_path, folder_id, service)
|
|
|
- delete_filestore_backup(filestore_path)
|
|
|
+ upload_backup_to_drive(filestore_path, folder_id, service)
|
|
|
+ delete_backup_path(filestore_path)
|
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
@@ -346,4 +382,4 @@ def run_backup():
|
|
|
end_time = datetime.now() - start_time
|
|
|
log('Backup finalizado en %s' % str(end_time))
|
|
|
|
|
|
-run_backup()
|
|
|
+run_backup()
|