refs #631 - getRepoIface.py added
parent
66f51cc1e2
commit
28ef5b9b3b
|
@ -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".
|
|
@ -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()
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
|
@ -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'"
|
||||
|
|
Loading…
Reference in New Issue