ogrepository/bin/runTorrentTracker.py

145 lines
5.5 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
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"), que se ejecutaba por cron cada hora.
Creemos que debe ser llamado únicamente cuando se quiera hacer una descarga mediante P2P (junto al script "runTorrentSeeder.py").
NOTA: El paquete no hace una búsqueda recursiva, por lo que se debe especificar el subdirectorio correspondiente a la OU, si es el caso.
Parámetros
------------
sys.argv[1] - Subdirectorio correspondiente a la OU (o "none" si no es el caso).
- Ejemplo1: none
- Ejemplo2: ou_subdir
Sintaxis
----------
./runTorrentTracker.py none|ou_subdir
Ejemplos
---------
./runTorrentTracker.py none
./runTorrentTracker.py ou_subdir
"""
# --------------------------------------------------------------------------------------------
# IMPORTS
# --------------------------------------------------------------------------------------------
import os
import sys
import subprocess
import time
# --------------------------------------------------------------------------------------------
# VARIABLES
# --------------------------------------------------------------------------------------------
script_name = os.path.basename(__file__)
repo_path = '/opt/opengnsys/ogrepository/images' # En este caso, no lleva barra final
bttrack_port = 6969
bttrack_dfile = '/tmp/dstate'
bttrack_log = '/opt/opengnsys/ogrepository/log/bttrack.log'
bttrack_interval = 10
bttrack_allow_get = 0 # Este valor impide la descarga desde clientes no autorizados
# --------------------------------------------------------------------------------------------
# FUNCTIONS
# --------------------------------------------------------------------------------------------
def show_help():
""" Imprime la ayuda, cuando se ejecuta el script con el parámetro "help".
"""
help_text = f"""
Sintaxis: {script_name} none|ou_subdir
Ejemplo1: {script_name} none
Ejemplo2: {script_name} ou_subdir
"""
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 1 parámetro, se muestra un error y la ayuda, y se sale del script:
elif len(sys.argv) != 2:
print(f"{script_name} Error: Formato incorrecto: Se debe especificar 1 parámetro")
show_help()
sys.exit(1)
def run_bttrack(torrent_path):
""" Ejecuta el comando "bttrack", con sus parámetros correspondientes.
Además, captura el resultado y los posibles errores, y los imprime.
"""
# Creamos una lista con el comando "bttrack" y sus parámetros, y lo imprimimos con espacios:
splitted_cmd = f"bttrack --port {bttrack_port} --dfile {bttrack_dfile} --save_dfile_interval {bttrack_interval} --reannounce_interval {bttrack_interval} --logfile {bttrack_log} --allowed_dir {torrent_path} --allow_get {bttrack_allow_get}".split()
print(f"Sending command: {' '.join(splitted_cmd)}")
# Ejecutamos el comando "bttrack" en el sistema, e imprimimos el resultado:
try:
result = subprocess.run(splitted_cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"Bttrack ReturnCode: {result.returncode}")
except subprocess.CalledProcessError as error:
print(f"Bttrack ReturnCode: {error.returncode}")
print(f"Bttrack Error Output: {error.stderr.decode()}")
except Exception as error:
print(f"Unexpected bttrack error: {error}")
# --------------------------------------------------------------------------------------------
# MAIN
# --------------------------------------------------------------------------------------------
def main():
"""
"""
# Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto:
check_params()
# Finalizamos el proceso "bttrack" (en caso de que estuviera corriendo):
try:
subprocess.run(f"pkill bttrack".split(), check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as error_description:
print(f"No bttrack process running? Returned error: {error_description}")
# Si existe el archivo "/tmp/dstate", lo eliminamos:
if os.path.exists(bttrack_dfile):
os.remove(bttrack_dfile)
# Esperamos 2 segundos:
time.sleep(2)
# Construimos la ruta en la que buscar los torrents, en base al parámetro especificado:
if sys.argv[1] == 'none':
torrent_path = repo_path
else:
torrent_path = f"{repo_path}/{sys.argv[1]}"
# Ejecutamos el comando "bttrack" (para hacer tracking de los torrents):
run_bttrack(torrent_path)
# --------------------------------------------------------------------------------------------
if __name__ == "__main__":
main()
# --------------------------------------------------------------------------------------------