ogrepository/bin/getRepoIface.py

99 lines
3.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Este script obtiene y devuelve la interfaz de red asociada a la IP especificada en el archivo "/opt/opengnsys/ogrepository/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/ogrepository/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()
# --------------------------------------------------------------------------------------------