Convert to blueprint
parent
f6a5699c58
commit
e518a509cd
|
@ -2,23 +2,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
API de ogRepository, programada en Flask.
|
||||
API de ogRepository, programada en Flask.
|
||||
|
||||
Responde a peticiones HTTP (en principio, enviadas desde ogCore) mediante endpoints, que a su vez ejecutan los scripts Python almacenados en ogRepository.
|
||||
En ciertos casos, transforma los parámetros recibidos desde el portal, para adaptarlos a los que es necesario enviar a los scripts
|
||||
(por ejemplo, a partir del ID de una imagen obtiene su nombre y su extensión).
|
||||
(por ejemplo, a partir del ID de una imagen obtiene su nombre y su extensión).
|
||||
|
||||
Librerías Python requeridas: - flask (se puede instalar con "sudo apt install python3-flask")
|
||||
- paramiko (se puede instalar con "sudo apt install python3-paramiko")
|
||||
Librerías Python requeridas: - flask (se puede instalar con "sudo apt install python3-flask")
|
||||
- paramiko (se puede instalar con "sudo apt install python3-paramiko")
|
||||
- requests (se puede instalar con "sudo apt install python3-requests") - No es necesario instalarlo en Ubuntu 24
|
||||
- flasgger (se puede instalar con "sudo apt install python3-flasgger")
|
||||
- flasgger (se puede instalar con "sudo apt install python3-flasgger")
|
||||
"""
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# IMPORTS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
from flask import Flask, jsonify, request
|
||||
from flask import Flask, jsonify, request, Blueprint
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
|
@ -52,30 +52,15 @@ config_file = '/opt/opengnsys/ogrepository/etc/ogAdmRepo.cfg'
|
|||
# FUNCTIONS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# Creamos una instancia de la aplicación Flask:
|
||||
app = Flask(__name__)
|
||||
|
||||
# Cargamos el contenido del archivo "swagger.yaml":
|
||||
with open("swagger.yaml", "r") as file:
|
||||
swagger_template = yaml.safe_load(file)
|
||||
|
||||
# Así cambiamos el nombre de la página (por defecto, es 'Flasgger'):
|
||||
swagger_config = Swagger.DEFAULT_CONFIG
|
||||
swagger_config['title'] = 'ogRepository API'
|
||||
|
||||
swagger = Swagger(app, template=swagger_template)
|
||||
|
||||
|
||||
# ---------------------------------------------------------
|
||||
|
||||
blueprint = Blueprint('repo_api', __name__, template_folder='templates')
|
||||
app = blueprint
|
||||
|
||||
def get_IPcore():
|
||||
""" Obtiene el valor asociado a la variable "IPcore", desde el archivo '/opt/opengnsys/ogrepository/etc/ogAdmRepo.cfg'.
|
||||
Retorna la IP encontrada (que corresponde a la IP de ogCore), o un error (si no la encuentra).
|
||||
"""
|
||||
"""
|
||||
journal.send("Running function 'get_IPcore'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
||||
|
||||
IPcore = None
|
||||
with open(config_file, 'r') as file:
|
||||
for line in file:
|
||||
|
@ -327,7 +312,7 @@ def check_remote_backup(image_name, remote_ip, remote_user, remote_path, job_id)
|
|||
# Creamos un bucle infinito:
|
||||
while True:
|
||||
# Comprobamos si ya se ha copiado la imagen y cada uno de sus archivos asociados (y almacenamos el resultado):
|
||||
try:
|
||||
try:
|
||||
for ext in extensions:
|
||||
sftp_client.stat(f"{remote_path}{image_name}{ext}")
|
||||
all_files_copied = True
|
||||
|
@ -601,7 +586,7 @@ def recall_ogcore(data):
|
|||
|
||||
def check_file_exists(file_path):
|
||||
""" Comprueba la existencia del archivo cuya ruta recibe como parámetro.
|
||||
Si el archivo existe devuelve "True", y si no devuelve "False".
|
||||
Si el archivo existe devuelve "True", y si no devuelve "False".
|
||||
"""
|
||||
journal.send("Running function 'check_file_exists'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
||||
|
@ -671,7 +656,7 @@ def get_repo_status():
|
|||
journal.send("Running script 'getRepoStatus.py'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
# Ejecutamos el script "getRepoStatus.py", y almacenamos el resultado:
|
||||
result = subprocess.run(['python3', f"{script_path}/getRepoStatus.py"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8')
|
||||
|
||||
|
||||
# Evaluamos el resultado de la ejecución, y devolvemos la respuesta:
|
||||
if result.returncode == 0:
|
||||
journal.send("Script 'getRepoStatus.py' result OK (ReturnCode: 0)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
@ -973,7 +958,7 @@ def recover_image():
|
|||
|
||||
# Almacenamos el parámetro "ID_img" (enviado por JSON):
|
||||
json_data = json.loads(request.data)
|
||||
image_id = json_data.get("ID_img")
|
||||
image_id = json_data.get("ID_img")
|
||||
|
||||
# Obtenemos el nombre y la extensión de la imagen:
|
||||
param_dict = get_image_params(image_id, "trash")
|
||||
|
@ -1136,7 +1121,7 @@ def import_image():
|
|||
if result.returncode is None:
|
||||
journal.send("Script 'importImage.py' result OK (ReturnCode: None)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
journal.send("{'component':'ogRepo', 'severity':'INFO', 'http_code':'200', 'operation':'Run script importImage.py', 'desc':'Result OK (ReturnCode: None)'}", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api")
|
||||
|
||||
|
||||
# Si el resultado es correcto, llamamos a la función "check_lock_local" en un hilo paralelo
|
||||
# (para que compruebe si la imagen se ha acabado de importar exitosamente):
|
||||
journal.send("Calling function 'check_lock_local'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
@ -1179,7 +1164,7 @@ def import_image():
|
|||
def backup_image():
|
||||
""" Este endpoint exporta la imagen especificada como primer parámetro (y todos sus archivos asociados), desde el servidor local a un equipo remoto (que no tiene por qué ser un repositorio).
|
||||
Para ello, ejecuta el script "backupImage.py", con el nombre de la imagen como primer parámetro, la IP o hostname del equipo remoto como segundo parámetro,
|
||||
el usuario con el que conectar al equipo remoto como tercer parámetro, y la ruta remota en la que copiar la imagen como cuarto parámetro.
|
||||
el usuario con el que conectar al equipo remoto como tercer parámetro, y la ruta remota en la que copiar la imagen como cuarto parámetro.
|
||||
"""
|
||||
journal.send("Running endpoint 'Hacer backup de una Imagen'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
||||
|
@ -1260,7 +1245,7 @@ def backup_image():
|
|||
}), 200
|
||||
else:
|
||||
journal.send("Script 'backupImage.py' result KO (Backup image failed)", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
journal.send("{'component':'ogRepo', 'severity':'ERROR', 'http_code':'500', 'operation':'Run script backupImage.py', 'desc':'Result KO (Backup image failed)'}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api")
|
||||
journal.send("{'component':'ogRepo', 'severity':'ERROR', 'http_code':'500', 'operation':'Run script backupImage.py', 'desc':'Result KO (Backup image failed)'}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api")
|
||||
return jsonify({
|
||||
"success": False,
|
||||
"error": "Backup image failed"
|
||||
|
@ -1608,7 +1593,7 @@ def send_p2p():
|
|||
"success": False,
|
||||
"error": "Tracker or Seeder (or both) not running"
|
||||
}), 500
|
||||
|
||||
|
||||
|
||||
# ---------------------------------------------------------
|
||||
|
||||
|
@ -1875,7 +1860,7 @@ def stop_p2p():
|
|||
journal.send("Running script 'stopP2P.py'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
# Ejecutamos el script "stopP2P.py", y almacenamos el resultado (este script si que requiere ser ejecutado con "sudo"):
|
||||
result = subprocess.run(['sudo', 'python3', f"{script_path}/stopP2P.py"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8')
|
||||
|
||||
|
||||
# Evaluamos el resultado de la ejecución, y devolvemos la respuesta:
|
||||
if result.returncode == 0:
|
||||
journal.send("Script 'stopP2P.py' result OK (ReturnCode: 0)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
@ -1909,7 +1894,7 @@ def convert_virtual_image():
|
|||
""" Este endpoint convierte la imagen virtual especificada como parámetro en una imagen "img" como las que se generan desde OpenGnsys
|
||||
(con "partclone" y "lzop"), por lo que luego puede ser restaurada como cualquier otra imagen del repositorio.
|
||||
Para ello, ejecuta el script "convertVMtoIMG.py", con el nombre de la imagen virtual como primer parámetro,
|
||||
y el sistema de archivos de la partición a clonar (en formato "blkid") como segundo parámetro.
|
||||
y el sistema de archivos de la partición a clonar (en formato "blkid") como segundo parámetro.
|
||||
"""
|
||||
journal.send("Running endpoint 'Convertir imagen virtual a imagen OpenGnsys'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
||||
|
@ -1972,7 +1957,7 @@ def convert_virtual_image():
|
|||
if result.returncode is None:
|
||||
journal.send("Script 'convertVMtoIMG.py' result OK (ReturnCode: None)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
journal.send("{'component':'ogRepo', 'severity':'INFO', 'http_code':'200', 'operation':'Run script convertVMtoIMG.py', 'desc':'Result OK (ReturnCode: None)'}", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api")
|
||||
|
||||
|
||||
# Si el resultado es correcto, llamamos a la función "check_virtual_image_conversion" en un hilo paralelo
|
||||
# (para que compruebe si la imagen se ha acabado de convertir exitosamente):
|
||||
journal.send("Calling function 'check_virtual_image_conversion'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
@ -2015,7 +2000,7 @@ def convert_virtual_image():
|
|||
def convert_image_to_virtual():
|
||||
""" Este endpoint convierte la imagen de OpenGnsys especificada como parámetro en una imagen virtual con la extensión especificada (".vdi", ".vmdk", etc).
|
||||
Para ello, ejecuta el script "convertIMGtoVM.py", con el nombre de la imagen "img" como primer parámetro,
|
||||
y la extensión del disco virtual destino (sin punto) como segundo parámetro.
|
||||
y la extensión del disco virtual destino (sin punto) como segundo parámetro.
|
||||
"""
|
||||
journal.send("Running endpoint 'Convertir imagen OpenGnsys a imagen virtual'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
||||
|
@ -2077,7 +2062,7 @@ def convert_image_to_virtual():
|
|||
if result.returncode is None:
|
||||
journal.send("Script 'convertIMGtoVM.py' result OK (ReturnCode: None)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
journal.send("{'component':'ogRepo', 'severity':'INFO', 'http_code':'200', 'operation':'Run script convertIMGtoVM.py', 'desc':'Result OK (ReturnCode: None)'}", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api")
|
||||
|
||||
|
||||
# Si el resultado es correcto, llamamos a la función "check_virtual_image_reconversion" en un hilo paralelo
|
||||
# (para que compruebe si la imagen se ha acabado de convertir exitosamente):
|
||||
journal.send("Calling function 'check_virtual_image_reconversion'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||
|
@ -2112,13 +2097,3 @@ def convert_image_to_virtual():
|
|||
}), 500
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# Ejecutamos la aplicación, en el puerto "8006":
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True, host='0.0.0.0', port=8006)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue