99 lines
3.8 KiB
Python
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()
|
|
|
|
# --------------------------------------------------------------------------------------------
|