refs #631 - Add 'exportImage.py' and modify API proposal
parent
5bab335733
commit
de649f84dc
84
README.md
84
README.md
|
@ -25,18 +25,19 @@ El presente documento detalla los endpoints de la API, con sus respectivos pará
|
|||
3. [Obtener Información de una Imagen concreta](#obtener-información-de-una-imagen-concreta) - `GET /ogrepository/v1/images/{ID_img}`
|
||||
4. [Actualizar Información del Repositorio](#actualizar-información-del-repositorio) - `PUT /ogrepository/v1/images`
|
||||
5. [Chequear integridad de Imagen](#chequear-integridad-de-imagen) - `GET /ogrepository/v1/status/images/{ID_img}`
|
||||
6. [Eliminar una Imagen](#eliminar-una-imagen) - `DELETE /ogrepository/v1/images/{ID_img}`
|
||||
7. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/trash/images/{ID_img}`
|
||||
6. [Eliminar una Imagen](#eliminar-una-imagen) - `DELETE /ogrepository/v1/images/{ID_img}?method={method}`
|
||||
7. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/trash/images`
|
||||
8. [Eliminar una Imagen de la Papelera](#eliminar-una-imagen-de-la-papelera) - `DELETE /ogrepository/v1/trash/images/{ID_img}`
|
||||
9. [Importar una Imagen](#importar-una-imagen) - `POST /ogrepository/v1/repo/{ID_repo}/images/{ID_img}`
|
||||
10. [Crear archivos auxiliares](#crear-archivos-auxiliares) - `POST /ogrepository/v1/images/torrentsum`
|
||||
11. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/wol`
|
||||
12. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/udpcast/images/{ID_img}`
|
||||
13. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/uftp/images/{ID_img}`
|
||||
14. [Enviar una Imagen mediante P2P](#enviar-una-imagen-mediante-p2p) - `POST /ogrepository/v1/p2p/images/{ID_img}`
|
||||
15. [Ver Estado de Transmisiones UDPcast](#ver-estado-de-transmisiones-udpcast) - `GET /ogrepository/v1/udpcast`
|
||||
16. [Cancelar Transmisión UDPcast](#cancelar-transmisión-udpcast) - `DELETE /ogrepository/v1/udpcast/images/{ID_img}`
|
||||
17. [Cancelar Transmisiones P2P](#cancelar-transmisiones-p2p) - `DELETE /ogrepository/v1/p2p`
|
||||
9. [Importar una Imagen](#importar-una-imagen) - `POST /ogrepository/v1/repo/images`
|
||||
10. [Exportar una Imagen](#exportar-una-imagen) - `PUT /ogrepository/v1/repo/images`
|
||||
11. [Crear archivos auxiliares](#crear-archivos-auxiliares) - `POST /ogrepository/v1/images/torrentsum`
|
||||
12. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/wol`
|
||||
13. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/udpcast/images/{ID_img}`
|
||||
14. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/uftp/images/{ID_img}`
|
||||
15. [Enviar una Imagen mediante P2P](#enviar-una-imagen-mediante-p2p) - `POST /ogrepository/v1/p2p/images/{ID_img}`
|
||||
16. [Ver Estado de Transmisiones UDPcast](#ver-estado-de-transmisiones-udpcast) - `GET /ogrepository/v1/udpcast`
|
||||
17. [Cancelar Transmisión UDPcast](#cancelar-transmisión-udpcast) - `DELETE /ogrepository/v1/udpcast/images/{ID_img}`
|
||||
18. [Cancelar Transmisiones P2P](#cancelar-transmisiones-p2p) - `DELETE /ogrepository/v1/p2p`
|
||||
|
||||
---
|
||||
### Obtener Información de Estado de ogRepository
|
||||
|
@ -93,7 +94,7 @@ curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/stat
|
|||
|
||||
Se devolverá la informacion contenida en el archivo "**/opt/opengnsys/etc/repoinfo.json**" (que corresponde a todas las imágenes almacenadas en el repositorio), y en el archivo "**/opt/opengnsys/etc/trashinfo.json**" (que corresponde a las imágenes que fueron eliminadas, que estarán en la papelera).
|
||||
Se puede utilizar el script "**getRepoInfo.py**, que debe ser llamado por el endpoint.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase "all" como primer parámetro (que correspondería al nombre de la imagen) y "none" como segundo parámetro (que corresponderia al nombre del subdirectorio correspondiente a la OU). Esta transformación de parámetros se puede realizar en el controlador PHP.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase "all" como primer parámetro (que correspondería al nombre de la imagen) y "none" como segundo parámetro (que corresponderia al nombre del subdirectorio correspondiente a la OU). Esta transformación de parámetros se realiza en la API.
|
||||
|
||||
**URL:** `/ogrepository/v1/images`
|
||||
**Método HTTP:** GET
|
||||
|
@ -199,7 +200,7 @@ curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/imag
|
|||
|
||||
Se devolverá la informacion de la imagen especificada, que puede estar en el archivo "**/opt/opengnsys/etc/repoinfo.json**" o en el archivo "**/opt/opengnsys/etc/trashinfo.json**" (en este último caso, si la imagen está en la papelera).
|
||||
Se puede utilizar el script "**getRepoInfo.py**, que debe ser llamado por el endpoint.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión) como primer parámetro, y el subdirectorio correspondiente a la OU (o "none" si no es el caso) como segundo parámetro. En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión) como primer parámetro, y el subdirectorio correspondiente a la OU (o "none" si no es el caso) como segundo parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
|
||||
|
||||
**URL:** `/ogrepository/v1/images/{ID_img}`
|
||||
**Método HTTP:** GET
|
||||
|
@ -269,7 +270,7 @@ curl -X PUT -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/imag
|
|||
|
||||
Se comprobará la integridad del fichero de imagen especificado como parámetro.
|
||||
Se puede hacer con el script "**checkImage.py**", que compara el tamaño actual del archivo con el almacenado en el archivo "**.size**", y el hash MD5 del último MB del archivo con el almacenado en el archivo "**.sum**".
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
|
||||
|
||||
**URL:** `/ogrepository/v1/status/images/{ID_img}`
|
||||
**Método HTTP:** GET
|
||||
|
@ -290,18 +291,18 @@ curl -X POST -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/sta
|
|||
|
||||
Se eliminará la imagen especificada como parámetro, pudiendo eliminarla permanentemente o enviarla a la papelera.
|
||||
Se puede hacer con el script "**deleteimage.py**", que debe ser llamado por el endpoint (y que incluye la funcionalidad "papelera"), y que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y el parámetro opcional "-p" (para que la eliminación sea permanente). En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP, pero en principio habrá que especificar el método de eliminación en un json (en la URL).
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y el parámetro opcional "-p" (para que la eliminación sea permanente). Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros, pero también hay que especificar el método de eliminación en la URL, como parámetro adicional.
|
||||
|
||||
**URL:** `/ogrepository/v1/images/{ID_img}`
|
||||
**URL:** `/ogrepository/v1/images/{ID_img}?method={method}`
|
||||
**Método HTTP:** DELETE
|
||||
|
||||
**Cuerpo de la Solicitud (JSON):**
|
||||
**Parámetro adicional (en URL):**
|
||||
- **method**: Método de eliminación (puede ser "trash" o "permanent").
|
||||
|
||||
**Ejemplo de Solicitud:**
|
||||
|
||||
```bash
|
||||
curl -X DELETE -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"method":"trash"}' http://example.com/ogrepository/v1/images/{ID_img}
|
||||
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images/{ID_img}?method=trash
|
||||
```
|
||||
**Respuestas:**
|
||||
- **Código 500 Internal Server Error:** Ocurrió un error al eliminar la imagen.
|
||||
|
@ -313,15 +314,18 @@ curl -X DELETE -H "Authorization: $API_KEY" -H "Content-Type: application/json"
|
|||
|
||||
Se recuperará la imagen especificada como parámetro, desde la papelera.
|
||||
Se puede hacer con el script "**recoverImage.py**", que debe ser llamado por el endpoint, y que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
|
||||
|
||||
**URL:** `/ogrepository/v1/trash/images/{ID_img}`
|
||||
**URL:** `/ogrepository/v1/trash/images`
|
||||
**Método HTTP:** POST
|
||||
|
||||
**Cuerpo de la Solicitud (JSON):**
|
||||
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
|
||||
|
||||
**Ejemplo de Solicitud:**
|
||||
|
||||
```bash
|
||||
curl -X POST -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/trash/images/{ID_img}
|
||||
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id"}' http://example.com/ogrepository/v1/trash/images
|
||||
```
|
||||
**Respuestas:**
|
||||
- **Código 500 Internal Server Error:** Ocurrió un error al recuperar la imagen.
|
||||
|
@ -333,7 +337,7 @@ curl -X POST -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/tra
|
|||
|
||||
Se eliminará permanentemente la imagen especificada como parámetro, desde la papelera.
|
||||
Se puede hacer con el script "**deleteTrashImage.py**", que debe ser llamado por el endpoint, y que a su vez llama al script "**updateTrashInfo.py**", para actualizar la información de la papelera.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
|
||||
|
||||
**URL:** `/ogrepository/v1/trash/images/{ID_img}`
|
||||
**Método HTTP:** DELETE
|
||||
|
@ -353,24 +357,52 @@ curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/t
|
|||
|
||||
Se importará una imagen de un repositorio remoto al repositorio local.
|
||||
Se puede hacer con el script "**importImage.py**", que debe ser llamado por el endpoint.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, la IP o hostname del repositorio remoto como segundo parámetro, y el usuario remoto como tercer parámetro. En principio, ogCore puede acceder a estos datos a partir del ID del repositorio y del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP, pero en principio habrá que especificar el usuario remoto en un json (en la URL).
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, la IP o hostname del repositorio remoto como segundo parámetro, y el usuario remoto como tercer parámetro. Estos parámetros deben enviarse desde ogCore (en el JSON), porque el repositorio local no puede extraer la información de la imagen de un ID almacenado en un repositorio remoto.
|
||||
|
||||
**URL:** `/ogrepository/v1/repo/{ID_repo}/images/{ID_img}`
|
||||
**URL:** `/ogrepository/v1/repo/images`
|
||||
**Método HTTP:** POST
|
||||
|
||||
**Cuerpo de la Solicitud (JSON):**
|
||||
- **user**: Usuario con el que acceder al repositorio remoto.
|
||||
- **image**: Nombre de la imagen (con extensión).
|
||||
- **ou_subdir**: Subdirectorio correspondiente a la OU (o "none" si no es el caso).
|
||||
- **repo_ip**: Dirección IP del repositorio remoto (desde el que se importará la imagen).
|
||||
- **user**: Usuario con el que acceder al repositorio remoto.
|
||||
|
||||
**Ejemplo de Solicitud:**
|
||||
|
||||
```bash
|
||||
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"user":"user_name"}' http://example.com/ogrepository/v1/repo/{ID_repo}/images/{ID_img}
|
||||
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img","ou_subdir":"none","repo_ip":"192.168.56.100","user":"user_name"}' http://example.com/ogrepository/v1/repo/images
|
||||
```
|
||||
**Respuestas:**
|
||||
- **Código 500 Internal Server Error:** Ocurrió un error al importar la imagen.
|
||||
- **Código 400 Bad Request:** No se ha encontrado la imagen y/o el equipo remoto especificados.
|
||||
- **Código 200 OK:** La imagen se ha importado exitosamente.
|
||||
|
||||
---
|
||||
### Exportar una Imagen
|
||||
|
||||
Se exportará una imagen del repositorio local a un repositorio remoto.
|
||||
Se puede hacer con el script "**exportImage.py**", que debe ser llamado por el endpoint.
|
||||
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, la IP o hostname del repositorio remoto como segundo parámetro, y el usuario remoto como tercer parámetro. El primer parámetro se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), pero la IP del repositorio remoto y el usuario remoto deben enviarse desde ogCore (en el JSON).
|
||||
|
||||
**URL:** `/ogrepository/v1/repo/images`
|
||||
**Método HTTP:** PUT
|
||||
|
||||
**Cuerpo de la Solicitud (JSON):**
|
||||
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
|
||||
- **repo_ip**: Dirección IP del repositorio remoto (al que se exportrará la imagen).
|
||||
- **user**: Usuario con el que acceder al repositorio remoto.
|
||||
|
||||
**Ejemplo de Solicitud:**
|
||||
|
||||
```bash
|
||||
curl -X PUT -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id","repo_ip":"192.168.56.100","user":"user_name"}' http://example.com/ogrepository/v1/repo/images
|
||||
```
|
||||
**Respuestas:**
|
||||
- **Código 500 Internal Server Error:** Ocurrió un error al exportar la imagen.
|
||||
- **Código 400 Bad Request:** No se ha encontrado la imagen y/o el equipo remoto especificados.
|
||||
- **Código 200 OK:** La imagen se ha exportado exitosamente.
|
||||
|
||||
---
|
||||
### Crear archivos auxiliares
|
||||
|
||||
|
|
|
@ -0,0 +1,215 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Este script exporta la imagen especificada como primer parámetro (y sus archivos asociados), al repositorio remoto especificado como segundo parámetro,
|
||||
con las credenciales del usuario especificado como tercer parámetro (en principio, mediante claves).
|
||||
Realiza la acción contraria que el script "importImage.py", pero es preferible usar "exportImage.py" (porque permite buscar la imagen por ID).
|
||||
Al acabar, ogCore debe llamar al script "updateRepoInfo.py" en el repositorio remoto, para actualizar la información de dicho repositorio.
|
||||
|
||||
Librerías Python requeridas: "paramiko" (se puede instalar con "sudo apt install python3-paramiko")
|
||||
|
||||
Parámetros
|
||||
------------
|
||||
sys.argv[1] - Nombre completo de la imagen a exportar (con o sin ruta), pero incluyendo el subdirectorio correspondiente a la OU, si es el caso.
|
||||
- Ejemplo1: image1.img
|
||||
- Ejemplo2: /opt/opengnsys/images/image1.img
|
||||
- Ejemplo3: ou_subdir/image1.img
|
||||
- Ejemplo4: /ou_subdir/image1.img
|
||||
- Ejemplo5: /opt/opengnsys/images/ou_subdir/image1.img
|
||||
|
||||
sys.argv[2] - IP o hostname del repositorio remoto.
|
||||
- Ejemplo1: 192.168.56.100
|
||||
- Ejemplo2: remote_repo
|
||||
|
||||
sys.argv[3] - Usuario con el que conectar al repositorio remoto.
|
||||
- Ejemplo1: remote_user
|
||||
- Ejemplo2: root
|
||||
|
||||
Sintaxis
|
||||
----------
|
||||
./exportImage.py [ou_subdir/]image_name|/image_path/image_name remote_host remote_user
|
||||
|
||||
Ejemplos
|
||||
---------
|
||||
./exportImage.py image1.img 192.168.56.100 user
|
||||
./exportImage.py /opt/opengnsys/images/image1.img 192.168.56.100 user
|
||||
./exportImage.py ou_subdir/image1.img remote_hostname user
|
||||
./exportImage.py /ou_subdir/image1.img remote_hostname root
|
||||
./exportImage.py /opt/opengnsys/images/ou_subdir/image1.img remote_hostname root
|
||||
"""
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# IMPORTS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import paramiko
|
||||
import warnings
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# VARIABLES
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
script_name = os.path.basename(__file__)
|
||||
repo_path = '/opt/opengnsys/images/'
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# FUNCTIONS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def show_help():
|
||||
""" Imprime la ayuda, cuando se ejecuta el script con el parámetro "help".
|
||||
"""
|
||||
help_text = f"""
|
||||
Sintaxis: {script_name} [ou_subdir/]image_name|/image_path/image_name remote_host remote_user
|
||||
Ejemplo1: {script_name} image1.img 192.168.56.100 user
|
||||
Ejemplo2: {script_name} /opt/opengnsys/images/image1.img 192.168.56.100 user
|
||||
Ejemplo3: {script_name} ou_subdir/image1.img remote_hostname user
|
||||
Ejemplo4: {script_name} /ou_subdir/image1.img remote_hostname root
|
||||
Ejemplo5: {script_name} /opt/opengnsys/images/ou_subdir/image1.img remote_hostname root
|
||||
"""
|
||||
print(help_text)
|
||||
|
||||
|
||||
|
||||
def check_params():
|
||||
""" Comprueba que se haya enviado la cantidad correcta de parámetros, y en el formato correcto.
|
||||
Si no es así, muestra un mensaje de error, y sale del script.
|
||||
LLama a la función "show_help" cuando se ejecuta el script con el parámetro "help".
|
||||
"""
|
||||
# Si se ejecuta el script con el parámetro "help", se muestra la ayuda, y se sale del script:
|
||||
if len(sys.argv) == 2 and sys.argv[1] == "help":
|
||||
show_help()
|
||||
sys.exit(0)
|
||||
# Si se ejecuta el script con más o menos de 3 parámetros, se muestra un error y la ayuda, y se sale del script:
|
||||
elif len(sys.argv) != 4:
|
||||
print(f"{script_name} Error: Formato incorrecto: Se debe especificar 3 parámetros")
|
||||
show_help()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
|
||||
def build_file_path():
|
||||
""" Construye la ruta completa al archivo a exportar
|
||||
(agregando "/opt/opengnsys/images/" si no se ha especificado en el parámetro).
|
||||
"""
|
||||
param_path = sys.argv[1]
|
||||
# Si la ruta comienza con una barra, pero que no corresponde a "repo_path"
|
||||
# (porque corresponderá al subdirectorio de una OU), eliminamos la barra:
|
||||
if param_path.startswith('/') and not param_path.startswith(repo_path):
|
||||
param_path = param_path.lstrip('/')
|
||||
# Construimos la ruta completa:
|
||||
if not param_path.startswith(repo_path):
|
||||
file_path = os.path.join(repo_path, param_path)
|
||||
else:
|
||||
file_path = param_path
|
||||
return file_path
|
||||
|
||||
|
||||
|
||||
def export_image(file_path, remote_host, remote_user):
|
||||
""" Conecta al repositorio remoto por SSH e inicia un cliente SFTP.
|
||||
Luego exporta la imagen al repositorio remoto (junto con sus archivos asociados).
|
||||
"""
|
||||
# Creamos una lista con las extensiones de los archivos asociados a la imagen
|
||||
# (incluyendo ninguna extensión, que corresponde a la propia imagen):
|
||||
extensions = ['', '.size', '.sum', '.full.sum', '.torrent', '.info.checked']
|
||||
|
||||
# Iniciamos un cliente SSH:
|
||||
ssh_client = paramiko.SSHClient()
|
||||
# Establecemos la política por defecto para localizar la llave del host localmente:
|
||||
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
|
||||
# Intentamos conectar con el equipo remoto por SSH, e iniciar un cliente SFTP,
|
||||
try: # y en caso de fallar devolvemos un error y salimos del script:
|
||||
ssh_client.connect(remote_host, 22, remote_user) # Así se hace con claves
|
||||
#ssh_client.connect(remote_host, 22, remote_user, 'opengnsys') # Así se haría con password
|
||||
sftp_client = ssh_client.open_sftp()
|
||||
except Exception as error_description:
|
||||
print(f"Connection has returned an exception: {error_description}")
|
||||
sys.exit(4)
|
||||
|
||||
# Comprobamos si la imagen ya existe en el equipo remoto, en cuyo caso devolvemos un error y salimos del script:
|
||||
try:
|
||||
sftp_client.stat(file_path)
|
||||
print("Image already exists on remote repository.")
|
||||
sys.exit(5)
|
||||
except IOError:
|
||||
print("As expected, image doesn't exist on remote repository.")
|
||||
|
||||
# Evaluamos si la ruta de la imagen tiene 5 barras, en cuyo caso corresponderá a una imagen basada en OU,
|
||||
# y almacenamos el nombre del directorio correspondiente a la OU:
|
||||
if file_path.count('/') == 5:
|
||||
ou_subdir = file_path.split('/')[4]
|
||||
# Comprobamos si el directorio de OU existe en el equipo remoto, y en caso contrario lo creamos:
|
||||
try:
|
||||
sftp_client.stat(f"{repo_path}{ou_subdir}")
|
||||
except IOError:
|
||||
sftp_client.mkdir(f"{repo_path}{ou_subdir}", mode=755)
|
||||
|
||||
# Creamos un archivo de bloqueo en el servidor remoto:
|
||||
sftp_client.open(f"{file_path}.lock", 'w')
|
||||
|
||||
# Exportamos la imagen al servidor remoto, junto con sus archivos asociados:
|
||||
for ext in extensions:
|
||||
sftp_client.put(f"{file_path}{ext}", f"{file_path}{ext}")
|
||||
|
||||
# Renombramos el archivo remoto ".info.checked" a ".info", para que lo pille el script "updateRepoInfo.py":
|
||||
sftp_client.rename(f"{file_path}.info.checked", f"{file_path}.info")
|
||||
|
||||
# Eliminamos el archivo de bloqueo del servidor remoto:
|
||||
sftp_client.remove(f"{file_path}.lock")
|
||||
|
||||
# Cerramos el cliente SSH y el cliente SFTP:
|
||||
ssh_client.close()
|
||||
sftp_client.close()
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# MAIN
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
"""
|
||||
# Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto:
|
||||
check_params()
|
||||
|
||||
# Obtenemos la ruta completa al archivo a exportar:
|
||||
file_path = build_file_path()
|
||||
|
||||
# Si no existe el archivo de imagen, imprimimos un mensaje de error y salimos del script:
|
||||
if not os.path.exists(file_path):
|
||||
print("Image file doesn't exist")
|
||||
sys.exit(2)
|
||||
|
||||
# Si la imagen está bloqueada, imprimimos un mensaje de error y salimos del script:
|
||||
if os.path.exists(f"{file_path}.lock"):
|
||||
print("Image is locked.")
|
||||
sys.exit(3)
|
||||
|
||||
# Almacenamos la IP/hostname del repositorio remoto, y el usuario remoto (desde los parámetros):
|
||||
remote_host = sys.argv[2]
|
||||
remote_user = sys.argv[3]
|
||||
|
||||
# Exportamos la imagen al repositorio remoto:
|
||||
export_image(file_path, remote_host, remote_user)
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
|
@ -206,6 +206,9 @@ def main():
|
|||
# Importamos la imagen del repositorio remoto:
|
||||
import_image(file_path, remote_host, remote_user)
|
||||
|
||||
# Renombramos el archivo ".info.checked" a ".info", para que lo pille el script "updateRepoInfo.py":
|
||||
os.rename(f"{file_path}.info.checked", f"{file_path}.info")
|
||||
|
||||
# Eliminamos el archivo de bloqueo:
|
||||
os.remove(f"{file_path}.lock")
|
||||
|
||||
|
|
Loading…
Reference in New Issue