-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathencriptar.py
158 lines (134 loc) · 5.7 KB
/
encriptar.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
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
import os
import sys
import uuid
import gzip
from cryptography.fernet import Fernet
from google.cloud import storage
from google.cloud import logging
from google.cloud import secretmanager
from datetime import datetime
# Variables de entorno
PROJECT_ID = os.environ.get("PROJECT_ID")
BUCKET_ENCRIPTADOS = os.environ.get("BUCKET_ENCRIPTADOS")
SECRET_KEY = os.environ.get("SECRET_KEY")
# Constantes
START_DATETIME = datetime.now()
START_DATE = START_DATETIME.strftime("%Y%m%d") # -%H%M%S
PROCESO_ID = uuid.uuid4().hex
# Clientes de GCP
logging_client = logging.Client()
storage_client = storage.Client()
secret_client = secretmanager.SecretManagerServiceClient()
# Crea el directorio temp si no existe
def create_temp_folder() -> str:
temp_folder = os.path.join(os.getcwd(), "temp")
if not os.path.exists(temp_folder):
os.makedirs(temp_folder, exist_ok=True)
return temp_folder
# Comprime un archivo usando gzip
def compress_data(input_file: str) -> str:
# Chequea si existe o crea el directorio temp
temp_folder = create_temp_folder()
# Construimos el path del archivo comprimido
gzip_name = os.path.basename(input_file).split(".")[0] + ".gz"
gzip_path = os.path.join(temp_folder, gzip_name)
# Comprimimos el archivo
with open(input_file, "rb") as finput, gzip.open(gzip_path, "wb") as foutput:
foutput.writelines(finput)
return gzip_path
# Encripta un archivo usando fernet
def encrypt_data(input_file: str, blob: storage.Blob, key: str) -> storage.Blob:
f = Fernet(key)
with open(input_file, "rb") as finput:
with blob.open(mode="wb") as foutput:
block = finput.read()
encrypted_block = f.encrypt(block)
foutput.write(encrypted_block)
blob.reload()
return blob
def main() -> int:
# 1 = Success | -1 = Failure
# Terminar el programa si las variables de entorno no estan definidas.
if not (PROJECT_ID and BUCKET_ENCRIPTADOS and SECRET_KEY):
print("Se deben setear las variables de entorno.")
return -1
# Se debe pasar como argumento el path del archivo a encriptar.
if len(sys.argv) != 3:
print("Se debe pasar como argumento el path del archivo a encriptar.")
return -1
input_file = sys.argv[1]
job_name = sys.argv[2]
# El archivo a encriptar debe existir.
if not os.path.exists(input_file):
print("El archivo debe existir", input_file)
return -1
try:
logger_name = os.path.basename(input_file).split(".")[0].lower()
# Metadata de los logs.
labels = {
"proceso_id": PROCESO_ID,
"name": "encriptar",
"work_file": logger_name,
"enroute": "yes",
}
logger = logging_client.logger(name=logger_name, labels=labels)
except Exception as error:
print("Error al crear el logger", error)
return -1
# print("Se inicia el proceso de encriptacion.")
logger.log_text("Se inicia el proceso de encriptacion.", severity="INFO")
# print("Se procede a comprimir el archivo.")
# # logger.log_text("Se procede a comprimir el archivo.", severity="INFO")
# try:
# gzip_path = compress_data(input_file=input_file)
# except Exception as error:
# error = f"Fallo (comprension del archivo): {str(error)}"
# print(error)
# # logger.log_text(error, severity="ERROR")
# return -1
# print("Se procede a crear un blob object para almacenar el contenido encriptado.")
logger.log_text("Se procede a crear un blob object para almacenar el contenido encriptado.", severity="INFO")
try:
blob_name = "data/" + START_DATE + "/" + os.path.basename(input_file).split(".")[0] + ".encrypted"
bucket = storage_client.get_bucket(BUCKET_ENCRIPTADOS)
blob = bucket.blob(blob_name)
except Exception as error:
error = f"Fallo (creacion del blob object): {str(error)}"
# print(error)
logger.log_text(error, severity="ERROR")
return -1
# print("Se procede a obtener la key para encriptar el archivo")
logger.log_text("Se procede a obtener la key para encriptar el archivo", severity="INFO")
try:
name = f"projects/{PROJECT_ID}/secrets/{SECRET_KEY}/versions/latest"
response_secret = secret_client.access_secret_version(name=name)
secret_value = response_secret.payload.data.decode("UTF-8")
key = secret_value # base64.b64decode(secret_value)
except Exception as error:
error = f"Fallo (obtencion del secret key): {str(error)}"
# print(error)
logger.log_text(error, severity="ERROR")
return -1
# print("Se procede a encriptar el archivo comprimido")
logger.log_text("Se procede a encriptar el archivo comprimido", severity="INFO")
try:
blob = encrypt_data(input_file=input_file, blob=blob, key=key)
metageneration_match_precondition = None
metageneration_match_precondition = blob.metageneration
blob.metadata = {"proceso_id": PROCESO_ID, "job_name": job_name}
blob.patch(if_metageneration_match=metageneration_match_precondition)
except Exception as error:
error = f"Fallo (encriptacion del archivo): {str(error)}"
# print(error)
logger.log_text(error, severity="ERROR")
return -1
duration = round((datetime.now() - START_DATETIME).total_seconds())
# print(f"Proceso terminado con exito ({duration}s)")
logger.log_text(f"Proceso terminado con exito ({duration}s)", severity="INFO")
return 1
if __name__ == "__main__":
result = main()
if (result == -1):
print("Fallo el proceso")
else:
print("Proceso terminado con exito")