refs #631 - Add size, sum and fullsum Info (6 scripts modified)

pull/1/head
Gerardo GIl Elizeire 2024-09-02 17:14:33 +02:00
parent 97f1f9c62e
commit 709c2d7f27
8 changed files with 131 additions and 41 deletions

View File

@ -70,7 +70,10 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 9859634200
"datasize": 9859634200000,
"size": 4505673214,
"sum": "065a933c780ab1aaa044435ad5d4bf87",
"fullsum": "33575b9070e4a8043371b8c6ae52b80e"
},
{
"name": "Windows10",
@ -79,7 +82,10 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "NTFS",
"datasize": 23654400000
"datasize": 24222105600000,
"size": 13198910185,
"sum": "8874d5ab84314f44841c36c69bb5aa82",
"fullsum": "9e7cd32c606ebe5bd39ba212ce7aeb02"
}
],
"ous": [
@ -93,7 +99,10 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 8704000000
"datasize": 8912896000000,
"size": 3803794535,
"sum": "081a933c780ab1aaa044435ad5d4bf56",
"fullsum": "22735b9070e4a8043371b8c6ae52b90d"
}
]
}
@ -114,7 +123,10 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 8704000000
"datasize": 8912896000000,
"size": 3803794535,
"sum": "081a933c780ab1aaa044435ad5d4bf56",
"fullsum": "22735b9070e4a8043371b8c6ae52b90d"
}
]
}
@ -128,6 +140,9 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
- **compressor**: Programa utilizado para la compresión.
- **filesystem**: Sistema de archivos utilizado en la partición clonada.
- **datasize**: Tamaño de la imagen una vez restaurada, en bytes (tamaño de los datos).
- **size**: Tamaño del archivo de imagen, en bytes.
- **sum**: Hash MD5 del último MB del archivo de imagen.
- **fullsum**: Hash MD5 de todo el archivo de imagen.
---
### Obtener Información de una Imagen concreta
@ -164,7 +179,10 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "NTFS",
"datasize": 23654400000
"datasize": 9859634200000,
"size": 4505673214,
"sum": "065a933c780ab1aaa044435ad5d4bf87",
"fullsum": "33575b9070e4a8043371b8c6ae52b80e"
}
]
}
@ -176,6 +194,9 @@ curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
- **compressor**: Programa utilizado para la compresión.
- **filesystem**: Sistema de archivos utilizado en la partición clonada.
- **datasize**: Tamaño de la imagen una vez restaurada, en bytes (tamaño de los datos).
- **size**: Tamaño del archivo de imagen, en bytes.
- **sum**: Hash MD5 del último MB del archivo de imagen.
- **fullsum**: Hash MD5 de todo el archivo de imagen.
---
### Actualizar Información del Repositorio

View File

@ -2,14 +2,15 @@
# -*- coding: utf-8 -*-
"""
Este script crea los archivos ".sum", ".full.sum" y ".torrent" para la imagen que recibe como parámetro.
En principio, debería hacer lo mismo que el script bash original (cuyo nombre es "torrent-creator").
Este script crea los archivos ".size", ".sum", ".full.sum" y ".torrent" para la imagen que recibe como parámetro.
Hace casi lo mismo que el script bash original (cuyo nombre es "torrent-creator"), pero añade el archivo ".size".
Al acabar, llama al script "updateRepoInfo.py", para actualizar la información del repositorio.
Debería ser llamado por ogCore u ogLive cada vez que se cree una imagen.
Parámetros
------------
sys.argv[1] - Nombre completo de la imagen a eliminar (con o sin ruta), pero incluyendo el subdirectorio correspondiente a la OU, si es el caso.
sys.argv[1] - Nombre completo de la imagen (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
@ -46,6 +47,8 @@ import hashlib
script_name = os.path.basename(__file__)
repo_path = '/opt/opengnsys/images/'
config_file = '/opt/opengnsys/etc/ogAdmRepo.cfg'
update_repo_script = '/opt/opengnsys/py_scripts/updateRepoInfo.py'
# --------------------------------------------------------------------------------------------
@ -84,7 +87,7 @@ def check_params():
def build_file_path():
""" Construye la ruta completa al archivo a eliminar
""" Construye la ruta completa al archivo de imagen
(agregando "/opt/opengnsys/images/" si no se ha especificado en el parámetro).
"""
param_path = sys.argv[1]
@ -158,6 +161,20 @@ def create_torrent(file_path, torrent_file, datafullsum):
print(f"Se ha producido un error inesperado: {error}")
def update_repo_info():
""" Actualiza la información del repositorio, ejecutando el script "updateRepoInfo.py".
Como se ve, es necesario que el script se ejecute como sudo, o dará error.
"""
try:
result = subprocess.run(['sudo', 'python3', update_repo_script], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as error:
print(f"Error Output: {error.stderr.decode()}")
sys.exit(3)
except Exception as error:
print(f"Se ha producido un error inesperado: {error}")
sys.exit(4)
# --------------------------------------------------------------------------------------------
# MAIN
@ -186,22 +203,38 @@ def main():
# Creamos un archivo de bloqueo:
open(f"{file_path}.lock", "w").close()
# Construimos las rutas completas de los archivos ".sum", ".full.sum" y ".torrent":
# Construimos las rutas completas de los archivos ".size", ".sum", ".full.sum" y ".torrent":
size_file = f"{file_path}.size"
sum_file = f"{file_path}.sum"
fullsum_file = f"{file_path}.full.sum"
torrent_file = f"{file_path}.torrent"
# Creamos el archivo ".sum" (para transferencias Unicast y Multicast):
print("Creating '.sum' file...")
with open(sum_file, 'w') as file:
datasum = get_md5_sum(file_path)
file.write(datasum)
# Creamos el archivo ".size" (pque almacenará el tamaño del archivo), siempre que no exista:
if not os.path.exists(size_file):
print("Creating '.size' file...")
with open(size_file, 'w') as file:
datasize = os.path.getsize(file_path)
file.write(str(datasize))
else:
print("Size file exists")
# Creamos el archivo ".full.sum" (para transferencias P2P):
print("Creating '.ful.sum' file...")
with open(fullsum_file, 'w') as file:
datafullsum = get_md5_fullsum(file_path)
file.write(datafullsum)
# Creamos el archivo ".sum" (para transferencias Unicast y Multicast), siempre que no exista:
if not os.path.exists(sum_file):
print("Creating '.sum' file...")
with open(sum_file, 'w') as file:
datasum = get_md5_sum(file_path)
file.write(datasum)
else:
print("Sum file exists")
# Creamos el archivo ".full.sum" (para transferencias P2P), siempre que no exista:
if not os.path.exists(fullsum_file):
print("Creating '.ful.sum' file...")
with open(fullsum_file, 'w') as file:
datafullsum = get_md5_fullsum(file_path)
file.write(datafullsum)
else:
print("Fullsum file exists")
# Creamos el archivo ".torrent" (siempre que no exista):
if not os.path.exists(torrent_file):
@ -212,6 +245,10 @@ def main():
# Eliminamos el archivo de bloqueo:
os.remove(f"{file_path}.lock")
# Actualizamos la información del repositorio, ejecutando el script "updateRepoInfo.py":
print("Updating Repository Info...")
update_repo_info()
# --------------------------------------------------------------------------------------------

View File

@ -220,7 +220,7 @@ def main():
# Creamos una lista con las extensiones de los archivos asociados a la imagen
# (incluyendo ninguna extensión, que corresponde a la propia imagen):
extensions = ['', '.sum', '.full.sum', '.torrent', '.info', '.info.checked']
extensions = ['', '.size', '.sum', '.full.sum', '.torrent', '.info', '.info.checked']
# Evaluamos la cantidad de barras que hay en la ruta de la imagen, para diferenciar entre imágenes "normales" y basadas en OU
# (y llamamos a la función correspondiente para eliminarla):

View File

@ -122,7 +122,7 @@ def import_image(file_path, remote_host, remote_user):
"""
# Creamos una lista con las extensiones de los archivos asociados a la imagen
# (incluyendo ninguna extensión, que corresponde a la propia imagen):
extensions = ['', '.sum', '.full.sum', '.torrent', '.info.checked']
extensions = ['', '.size', '.sum', '.full.sum', '.torrent', '.info.checked']
# Iniciamos un cliente SSH:
ssh_client = paramiko.SSHClient()

View File

@ -172,7 +172,7 @@ def main():
# Creamos una lista con las extensiones de los archivos asociados a la imagen
# (incluyendo ninguna extensión, que corresponde a la propia imagen):
extensions = ['', '.sum', '.full.sum', '.torrent', '.info', '.info.checked']
extensions = ['', '.size', '.sum', '.full.sum', '.torrent', '.info', '.info.checked']
# Evaluamos la cantidad de barras que hay en la ruta de la imagen, para diferenciar entre imágenes "normales" y basadas en OU
# (y llamamos a la función correspondiente para recuperarla):
@ -195,5 +195,3 @@ if __name__ == "__main__":
main()
# --------------------------------------------------------------------------------------------

View File

@ -3,7 +3,7 @@
"""
Este script inicia el tracker "bttrack" (o lo reinicia, si ya estuviera iniciado), finalizando previamente cualquier proceso activo, y borrando el archivo "/tmp/dstate".
En principio, debería hacer lo mismo que el script bash original (cuyo nombre es "torrent-tracker").
En principio, debería hacer lo mismo que el script bash original (cuyo nombre es "torrent-tracker"), que se ejecutaba por cron cada hora.
No recibe ningún parámetro, y creemos que debe ser llamado únicamente cuando se quiera hacer una descarga mediante P2P (junto al script "runTorrentSeeder.py").
"""
@ -27,7 +27,7 @@ bttrack_port = 6969
bttrack_dfile = '/tmp/dstate'
bttrack_log = '/opt/opengnsys/log/bttrack.log'
bttrack_interval = 10
bttrack_allow_get = 1 # Este es el valor que estaba en "etc/init.d/opengnsys" (en "torrent-tracker", que no se ejecutaba, el valor era "0")
bttrack_allow_get = 0 # Este valor impide la descarga desde clientes no autorizados
# --------------------------------------------------------------------------------------------

View File

@ -8,8 +8,7 @@ La información es obtenida desde archivos "<imagen_name>.info", que originalmen
pero que en esta versión son renombrados a "<imagen_name>.info.checked", obteniendo la misma funcionalidad.
Al acabar, llama al script "updateTrashInfo.py", para actualizar también la información de la papelera del repositorio.
No recibe ningún parámetro, y debería ser llamado por el propio ogRepoitory cada vez que se elimine una imagen (desde el script "deleteImage.py"),
y por ogCore u ogLive cada vez que se cree una imagen.
No recibe ningún parámetro, y es llamado por el propio ogRepoitory cada vez que se elimina una imagen (desde el script "deleteImage.py").
"""
@ -18,6 +17,7 @@ No recibe ningún parámetro, y debería ser llamado por el propio ogRepoitory c
# --------------------------------------------------------------------------------------------
import os
import sys
import json
import subprocess
import shutil
@ -77,11 +77,18 @@ def check_files():
# En caso contrario, almacenamos el contenido del archivo ".info" (del tipo "PARTCLONE:LZOP:EXTFS:8500000:Ubuntu_20") en la variable "data":
else:
with open(info_file, 'r') as file:
data = file.read()
info_data = file.read()
# Almacenamos el contenido de los archivos ".size", ".sum" y ".full.sum":
with open(f"{img_path}.size", 'r') as file:
size = file.read().strip('\n')
with open(f"{img_path}.sum", 'r') as file:
_sum = file.read().strip('\n')
with open(f"{img_path}.full.sum", 'r') as file:
fullsum = file.read().strip('\n')
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
# (pasándole el nombre de la imagen, la extensión, y los datos extraídos del archivo ".info"):
img_name = os.path.relpath(img_path, repo_path)
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], data)
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], info_data, size, _sum, fullsum)
# Renombramos el archivo ".info" a ".info.checked", para que ya no se añada la información que contiene
# (originalmente se eliminaba el archivo, pero creo que es mejor mantenerlo):
@ -115,15 +122,22 @@ def check_dirs():
fstype = line.split("=")[1].strip()
elif line.startswith("# sizedata"):
sizedata = line.split("=")[1].strip()
data = f"rsync::{fstype}:{sizedata}:"
info_data = f"rsync::{fstype}:{sizedata}:"
# Almacenamos el contenido de los archivos ".size", ".sum" y ".full.sum":
with open(f"{img_path}.size", 'r') as file:
size = file.read().strip('\n')
with open(f"{img_path}.sum", 'r') as file:
_sum = file.read().strip('\n')
with open(f"{img_path}.full.sum", 'r') as file:
fullsum = file.read().strip('\n')
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
# (pasándole el nombre de la imagen, el tipo "dir"", y los datos extraídos del archivo "ogimg.info"):
img_name = os.path.relpath(img_path, repo_path)
add_to_json(img_name, "dir", data)
add_to_json(img_name, "dir", info_data, size, _sum, fullsum)
def add_to_json(image_name, image_type, data):
def add_to_json(image_name, image_type, data, size, _sum, fullsum):
""" Esta función añade al archivo "repoinfo.json" la información de las imágenes que aun no ha sido introducida en él (imágenes nuevas, básicamente).
El procedimiento es diferente para las imágenes "normales" y para las imágenes basadas en OU.
"""
@ -144,7 +158,10 @@ def add_to_json(image_name, image_type, data):
"clonator": clonator.lower(),
"compressor": compressor.lower(),
"filesystem": fstype.upper(),
"datasize": int(datasize) * 1024 # Convertimos el valor a bytes (desde KB)
"datasize": int(datasize) * 1024, # Convertimos el valor a bytes (desde KB)
"size": int(size),
"sum": _sum,
"fullsum": fullsum
}
# Almacenamos el contenido del archivo "repoinfo.json" en la variable "info_data":
with open(info_file, 'r') as file:

View File

@ -92,11 +92,18 @@ def check_files():
# En caso contrario, almacenamos el contenido del archivo ".info.checked" (del tipo "PARTCLONE:LZOP:EXTFS:8500000:Ubuntu_20") en la variable "data":
else:
with open(info_file, 'r') as file:
data = file.read()
info_data = file.read()
# Almacenamos el contenido de los archivos ".size", ".sum" y ".full.sum":
with open(f"{img_path}.size", 'r') as file:
size = file.read().strip('\n')
with open(f"{img_path}.sum", 'r') as file:
_sum = file.read().strip('\n')
with open(f"{img_path}.full.sum", 'r') as file:
fullsum = file.read().strip('\n')
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
# (pasándole el nombre de la imagen, la extensión, y los datos extraídos del archivo ".info.checked"):
img_name = os.path.relpath(img_path, trash_path)
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], data)
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], info_data, size, _sum, fullsum)
@ -126,15 +133,22 @@ def check_dirs():
fstype = line.split("=")[1].strip()
elif line.startswith("# sizedata"):
sizedata = line.split("=")[1].strip()
data = f"rsync::{fstype}:{sizedata}:"
info_data = f"rsync::{fstype}:{sizedata}:"
# Almacenamos el contenido de los archivos ".size", ".sum" y ".full.sum":
with open(f"{img_path}.size", 'r') as file:
size = file.read().strip('\n')
with open(f"{img_path}.sum", 'r') as file:
_sum = file.read().strip('\n')
with open(f"{img_path}.full.sum", 'r') as file:
fullsum = file.read().strip('\n')
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
# (pasándole el nombre de la imagen, el tipo "dir"", y los datos extraídos del archivo "ogimg.info"):
img_name = os.path.relpath(img_path, trash_path)
add_to_json(img_name, "dir", data)
add_to_json(img_name, "dir", info_data, size, _sum, fullsum)
def add_to_json(image_name, image_type, data):
def add_to_json(image_name, image_type, data, size, _sum, fullsum):
""" Esta función añade al archivo "trashinfo.json" la información de las imágenes que aun no ha sido introducida en él (imágenes eliminadas recientemente, básicamente).
El procedimiento es diferente para las imágenes "normales" y para las imágenes basadas en OU.
"""
@ -155,7 +169,10 @@ def add_to_json(image_name, image_type, data):
"clonator": clonator.lower(),
"compressor": compressor.lower(),
"filesystem": fstype.upper(),
"datasize": int(datasize) * 1024 # Convertimos el valor a bytes (desde KB)
"datasize": int(datasize) * 1024, # Convertimos el valor a bytes (desde KB)
"size": int(size),
"sum": _sum,
"fullsum": fullsum
}
# Almacenamos el contenido del archivo "trashinfo.json" en la variable "info_data":
with open(info_file, 'r') as file: