refs #631 - getRepoIface.py added

pull/1/head
Gerardo GIl Elizeire 2024-08-08 13:28:40 +02:00
parent 66f51cc1e2
commit 28ef5b9b3b
3 changed files with 120 additions and 4 deletions

View File

@ -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".
- 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".

View File

@ -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()
# --------------------------------------------------------------------------------------------

View File

@ -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'"