diff --git a/README.md b/README.md index 639ee04..367fd0d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,6 @@ OpenGnsys Repository Manager README Este repositorio GIT contiene la estructura de datos del repositorio de datos de OpenGnsys. -- bin: Binarios y scripts de gestión del repositorio. -- etc: Ficheros o plantillas de configuración del repositorio. -- py_scripts: Scripts en Python 3, algunos de los cuales son traducciones de los scripts bash situados en "bin". \ No newline at end of file +- bin -------- Binarios y scripts de gestión del repositorio. +- etc -------- Ficheros o plantillas de configuración del repositorio. +- py_scripts - Scripts en Python 3, algunos de los cuales son traducciones de los scripts bash situados en "bin". \ No newline at end of file diff --git a/py_scripts/getRepoIface.py b/py_scripts/getRepoIface.py new file mode 100644 index 0000000..18d9385 --- /dev/null +++ b/py_scripts/getRepoIface.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 + +""" +Este script obtiene y devuelve la interfaz de red asociada a la IP especificada en el archivo "/opt/opengnsys/etc/ogAdmRepo.cfg" (en la clave "IPlocal"). +En principio, debería hacer lo mismo que el script bash original (cuyo nombre es "getRepoIface", a secas). + +No recibe ningún parámetro, y siempre es llamado por otros scripts, que necesitan dicha interfaz (por ejemplo, "sendFileMcast"). +""" + +# -------------------------------------------------------------------------------------------- +# IMPORTS +# -------------------------------------------------------------------------------------------- + +import socket +import fcntl +import struct + + +# -------------------------------------------------------------------------------------------- +# VARIABLES +# -------------------------------------------------------------------------------------------- + +config_file = '/opt/opengnsys/etc/ogAdmRepo.cfg' + + +# -------------------------------------------------------------------------------------------- +# FUNCTIONS +# -------------------------------------------------------------------------------------------- + + +def get_IPlocal(): + """ Obtiene el valor asociado a la variable "IPlocal", desde el archivo '/opt/opengnsys/etc/ogAdmRepo.cfg'. + Retorna la IP encontrada, o un error (si no la encuentra). + """ + IPlocal = None + with open(config_file, 'r') as file: + for line in file: + if line.startswith('IPlocal'): + IPlocal = line.split('=')[1].strip() + return IPlocal + if IPlocal is None: + return "IP no encontrada en el archivo de configuración" + + +def get_ip_address(ifname): + """ Obtiene y retorna la IP asociada a la interfaz especificada como parámetro. + """ + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15].encode('utf-8')))[20:24]) + + +# -------------------------------------------------------------------------------------------- +# MAIN +# -------------------------------------------------------------------------------------------- + + +def main(): + """ + """ + # Obtenemos la IP especificada en el archivo '/opt/opengnsys/etc/ogAdmRepo.cfg' (como valor de "IPlocal"): + IPlocal = get_IPlocal() + + # Si no se ha encontrado, imprimimos un error y salimos del script: + if "IP no encontrada" in IPlocal: + print("IP no encontrada en el archivo de configuración") + sys.exit(0) + + # Obtenemos una lista de tuplas, que contiene los índices y los nombres de las interfaces + # (en formato "[(1, 'lo'), (2, 'enp0s3'), (3, 'enp0s8')]"): + interfaces = socket.if_nameindex() + + # Iteramos los índices y nombres contenidos en "interfaces", obtenemos la IP asociada a cada interfaz, + # y las comparamos a la variable "IPlocal", para obtener el nombre de la interfaz asociada a dicha IP: + for ifindex, ifname in interfaces: + try: + ip_address = get_ip_address(ifname) + if ip_address == IPlocal: + interface_name = ifname + break + except IOError: + continue + + # Si hemos obtenido la interfaz la imprimimos, y si no imprimimos un error y salimos del script: + if interface_name: + print(interface_name) + else: + print("No se encontró la interfaz asociada a IPlocal") + sys.exit(1) + + + +# -------------------------------------------------------------------------------------------- + +if __name__ == "__main__": + main() + +# -------------------------------------------------------------------------------------------- diff --git a/py_scripts/sendFileMcast.py b/py_scripts/sendFileMcast.py index 72b267c..ba7e06c 100644 --- a/py_scripts/sendFileMcast.py +++ b/py_scripts/sendFileMcast.py @@ -40,7 +40,7 @@ import subprocess script_name = os.path.basename(__file__) repo_path = '/opt/opengnsys/images/' bin_path = '/opt/opengnsys/bin/' -repo_iface = subprocess.getoutput('/opt/opengnsys/bin/getRepoIface') +repo_iface_script = '/opt/opengnsys/py_scripts/getRepoIface.py' # -------------------------------------------------------------------------------------------- @@ -91,6 +91,22 @@ def build_file_path(): return file_path +def get_repo_iface(): + """ Obtiene y retorna la interfaz del repositorio, ejecutando el script "getRepoIface.py". + Como se ve, es necesario que el script se ejecute como sudo, o dará error. + """ + try: + result = subprocess.run(['sudo', 'python3', repo_iface_script], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + repo_iface = result.stdout.decode().strip() # Es necesario poner "strip", o dará error. + return repo_iface + 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 # -------------------------------------------------------------------------------------------- @@ -121,6 +137,9 @@ def main(): # Creamos la variable "cerror" (no sé que hace, pero estaba en el script original): cerror = "8x8/128" + # Obtenemos y almacenamos la interfaz del repositorio, mediante el script "getRepoIface.py": + repo_iface = get_repo_iface() + # Creamos una lista con el comando a enviar (esto es requerido por la función "subprocess.run"). # NOTA: Se desabilita el uso de mbuffer, ya que esta versión del upd-sender no la admite (ya estaba así en el script original). mbuffer = "" # which mbuffer &> /dev/null && MBUFFER="--pipe 'mbuffer -m 20M'"