refs #631 - Add size, sum and fullsum Info (6 scripts modified)
parent
97f1f9c62e
commit
709c2d7f27
31
README.md
31
README.md
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue