#!/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() # --------------------------------------------------------------------------------------------