152 lines
6.6 KiB
Python
152 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Este script inicia el seeder "bittornado" (o lo reinicia, si ya estuviera iniciado), finalizando previamente cualquier proceso activo.
|
|
En principio, debería hacer lo mismo que la sección correspondiente del script "/etc/init.d/opengnsys", que se ejecuta al inicio (pero que debería dejar de hacerlo).
|
|
Creemos que debe ser llamado únicamente cuando se quiera hacer una descarga mediante P2P (junto al script "runTorrentTracker.py").
|
|
|
|
No recibe ningún parámetro.
|
|
"""
|
|
|
|
# --------------------------------------------------------------------------------------------
|
|
# IMPORTS
|
|
# --------------------------------------------------------------------------------------------
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
import psutil
|
|
import re
|
|
from systemd import journal
|
|
|
|
|
|
# --------------------------------------------------------------------------------------------
|
|
# VARIABLES
|
|
# --------------------------------------------------------------------------------------------
|
|
|
|
repo_path = '/opt/opengnsys/ogrepository/images' # En este caso, no lleva barra final
|
|
|
|
|
|
# --------------------------------------------------------------------------------------------
|
|
# FUNCTIONS
|
|
# --------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
def run_bittornado(repo_path):
|
|
""" Ejecuta el comando "btlaunchmany.bittornado", con sus parámetros correspondientes.
|
|
Además, captura el resultado y los posibles errores, y los imprime.
|
|
"""
|
|
# Creamos una lista con el comando "btlaunchmany.bittornado" y sus parámetros, y lo imprimimos con espacios:
|
|
splitted_cmd = f"btlaunchmany.bittornado {repo_path}".split()
|
|
print(f"Sending command: {' '.join(splitted_cmd)}")
|
|
journal.send(f"runTorrentSeeder.py: Running command: {' '.join(splitted_cmd)}", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
|
|
# Ejecutamos el comando "btlaunchmany.bittornado" en el sistema, e imprimimos el resultado:
|
|
try:
|
|
result = subprocess.run(splitted_cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
journal.send(f"runTorrentSeeder.py: Command ReturnCode: {result.returncode}", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
print(f"Bittornado ReturnCode: {result.returncode}")
|
|
except subprocess.CalledProcessError as error:
|
|
journal.send("runTorrentSeeder.py: Process finalized", PRIORITY=journal.LOG_WARNING, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
print(f"Bittornado ReturnCode: {error.returncode}")
|
|
print(f"Bittornado Error Output: {error.stderr.decode()}")
|
|
except Exception as error:
|
|
journal.send(f"runTorrentSeeder.py: Command exception: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
print(f"Unexpected bittornado error: {error}")
|
|
|
|
|
|
|
|
def run_aria2c_seeder(image_name):
|
|
"""Lanza aria2c como seeder puro para una imagen concreta ya existente."""
|
|
|
|
repo_path = '/opt/opengnsys/ogrepository/images'
|
|
torrent_file = os.path.join(repo_path, f"{image_name}.img.torrent")
|
|
image_file = os.path.join(repo_path, f"{image_name}.img")
|
|
|
|
# Verificación básica
|
|
if not os.path.exists(torrent_file):
|
|
print(f"Torrent file not found: {torrent_file}")
|
|
journal.send(f"Seeder error: Torrent file not found: {torrent_file}",
|
|
PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api")
|
|
return
|
|
|
|
if not os.path.exists(image_file):
|
|
print(f"Image file not found: {image_file}")
|
|
journal.send(f"Seeder error: Image file not found: {image_file}",
|
|
PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api")
|
|
return
|
|
|
|
# Comando aria2c como seeder puro
|
|
cmd = [
|
|
'aria2c',
|
|
'--enable-peer-exchange=true',
|
|
'--bt-seed-unverified=true',
|
|
'--check-integrity=true',
|
|
'--seed-ratio=0.0',
|
|
'--dir=' + repo_path,
|
|
torrent_file
|
|
]
|
|
|
|
journal.send(f"Launching aria2c seeder for {image_name}",
|
|
PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api")
|
|
|
|
print("Running command:", ' '.join(cmd))
|
|
try:
|
|
subprocess.run(cmd, check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
journal.send(f"aria2c seeder failed: {e}",
|
|
PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api")
|
|
print(f"Seeder process exited with code {e.returncode}")
|
|
|
|
# --------------------------------------------------------------------------------------------
|
|
# MAIN
|
|
# --------------------------------------------------------------------------------------------
|
|
|
|
|
|
def main():
|
|
"""
|
|
"""
|
|
# Finalizamos el proceso "btlaunchmany.bittornado" (en caso de que estuviera corriendo):
|
|
if len(sys.argv) != 2:
|
|
print("Usage: runTorrentSeeder.py <image_name>")
|
|
journal.send("runTorrentSeeder.py: Invalid number of arguments. Expected 1 argument: <image_name>",
|
|
PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
sys.exit(1)
|
|
|
|
image_name = sys.argv[1]
|
|
torrent_file = os.path.join(repo_path, f"{image_name}.img.torrent")
|
|
found = False
|
|
# Matamos los procesos de aria2c que sirvan la imagen en concreto. Chequeamos todos los procesos
|
|
|
|
for proc in psutil.process_iter(['pid','name','cmdline']):
|
|
try:
|
|
if proc.info['name'] != 'aria2c':
|
|
continue
|
|
|
|
if any(arg.endswith(torrent_file) for arg in proc.info['cmdline']):
|
|
proc.kill()
|
|
found = True
|
|
print(f"Killed aria2c process with PID {proc.info['pid']} for {image_name}.torrent")
|
|
journal.send(f"runTorrentSeeder.py: Killed aria2c process with PID {proc.info['pid']} for {image_name}.torrent",
|
|
PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
continue
|
|
|
|
if not found:
|
|
print(f"No aria2c process found for {image_name}.torrent")
|
|
journal.send(f"runTorrentSeeder.py: No aria2c process found for {image_name}.torrent",
|
|
PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
|
|
# Lanzamos aria2c como seeder para la imagen proporcionada
|
|
run_aria2c_seeder(image_name)
|
|
|
|
|
|
# --------------------------------------------------------------------------------------------
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
# --------------------------------------------------------------------------------------------
|