Configurar placa de red en Python (muy fácil)

Imagen de gpiermattei
0 puntos

Si alguna ves trabajaron con una PC que tiene muchas placas de red, seguro se dieron cuenta que puede ser un poco complicado saber que placa es (por ejemplo) la "eth0" y cual es la "eth2".

Entonces, el siguiente programa tiene como principal objetivo simplificar esa tarea brindando información sobre que placas están conectadas y la configuración básica que tienen.

Está principalmente pensado para estudiantes de Ing. en Telecomunicaciones pero se ajusta muy bien a cualquier otra persona que trabaje mucho en redes.

Para ejecutar el programa solo tienen que copiar el código de fuente en un archivo (por ejemplo net_conf.py) y dar permisos de ejecución a ese archivo:

chmod +x net_conf.py

Luego lo corren como root:

sudo ./net_conf.py

Si saben algo de Python van a ver que el código es bastante rustico eso es porque recién comienzo a programar en Python y no soy programador, por eso comparto este programa con ustedes para que si alguien le interesa lo continué y lo mejore.

La configuración que realiza el programa es solo temporal porque utiliza el comando "ifconfig", si lo que buscas es una forma de realizar una configuración que no se borre al reiniciar la PC busca en el foro como se usa el archivo "/etc/network/interfaces" y este programa no es para vos.

OJO: Necesita el comando "lshw" para funcionar, en los Ubuntu que toque ya lo tienian instalado, pero en algunos Debian no, si no lo tienen lo pueden instalar haciendo:

apt-get install lshw

Con ustedes, mi primer programa en Python:

 
#!/usr/bin/python

###########################################################
#                                                                                                                                     #
#   ES UN PROGRAMA RUSTICO, PERO FUNCIONA.                                    #
#   SI LO QUIEREN MEJORAR ESTA A SU PLENA DISPOSICION              #
#   SIEMPRE Y CUANDO LO MANTENGAN COMO SOFT LIBRE!!              #
#                                                                                                                                     #
#                        Gerardo Piermattei, gpiermattei@gmail.com                         #
#                                                                                                                                     #
###########################################################

import sys
import re
import os

# ----------> FUNCION:estado => muestra el estado de una nic
def estado(nic): # declaro la funcion estado recibe como entrada un string
    # busco "logical name: "
    logical_name = re.search('logical name: (\w+)', nic)
    logical_name = logical_name.group(1)

    # busco "DISABLED"
    disabled = re.search('DISABLED', nic) # puede no existir
    if disabled: habilitada = 'no' # si existe es porque la placa es Deshabilitada
    else: habilitada = 'si' # si no existe, esta habilitada

    # busco "description: "
    description = re.search('description: (\w+ \w+)', nic)
    description = description.group(1)

    # busco "serial: "
    serial = re.search('serial: (\w+:\w+:\w+:\w+:\w+:\w+)', nic)
    serial = serial.group(1)

    # busco "link= "
    link = re.search('link=(\w+)', nic)
    if link: # link puede no existir. Primero verifico si existe
        link = link.group(1)
        if link == 'yes': link = 'si'
        else: link = 'no'
    else:
        link = 'no'

    # busco "ip= "
    ip = re.search('ip=(\d+\.\d+.\d+.\d+)', nic)
    if ip: #ip puede no existir. Primero verifico si existe
        ip = ip.group(1)
    else: ip='Sin direccion IP'
        
    print('=======================================')
    print logical_name,':',ip
    print '  - Habilitada:',habilitada
    print '  - Descripcion:',description
    print '  - Mac:',serial
    print '  - Conectada:',link


# ----------> FUNCION:muestra
def muestra():
    if nic1: estado(nic1)
    if nic2: estado(nic2)
    if nic3: estado(nic3)
    if nic4: estado(nic4)
    if nic5: estado(nic5)
    if nic6: estado(nic6)
    if nic7: estado(nic7)
    if nic8: estado(nic8)
    print('=======================================')


# ----------> FUNCION:detecta => lee y detecta los nics del sistema
def detecta():
    os.system('clear') # uso la libreria "os" para correr comandos de linux
    os.system('lshw -c network > /tmp/nics')

    dispositivos = open('/tmp/nics','r') # abro el archivo de texto que genere con el comando anterior
    leo_dispositivos = dispositivos.read() # leo el archivo y lo guardo en un string
    dispositivos.close() # lo cierro
    os.system('rm /tmp/nics') # borro el archivo temporal

    lista1=[]   #
    lista2=[]   #
    lista3=[]   #
    lista4=[]   #
    lista5=[]   #
    lista6=[]   #  ESTA PARTE ESTA MUY FEA
    lista7=[]   #  SE PUEDE HACER MAS LINDA
    lista8=[]   #  PERO TODAVIA NO MANEJO LOS DICCIONARIOS
                #  
    nic1=[]     #
    nic2=[]     #  EL PROGRAMA SOPORTA SOLO 8 NICs (por ahora)
    nic3=[]     #
    nic4=[]     #
    nic5=[]     #
    nic6=[]     #
    nic7=[]     #
    nic8=[]     #

    # como lo de arriba es feo, lo que sigue tambien lo es:
    i=3
    if i<(len(leo_dispositivos)-1):
        while leo_dispositivos[i] != '*':
            lista1.append(leo_dispositivos[i])
            i=i+1
        nic1 = ''.join(lista1)

    i=i+1
    if i FUNCION:len2mask => convierte una mascara en notacion bitcount a decimal
def len2mask(len):
    #Convert a bit length to a dotted netmask (aka. CIDR to netmask)
    # CIDR to Netmask conversion
    # (c) 2010 Peter Bittner, http://linux.bittner.it/blog
    # 
    # Tip for an excellent background read: "IP subnetting made easy"
    # http://articles.techrepublic.com.com/5100-10878_11-6089187.html

    mask = ''
    if not isinstance(len, int) or len < 0 or len > 32:
        print "Illegal subnet length: %s (which is a %s)" % (str(len), type(len).__name__)
        return None
    
    for t in range(4):
        if len > 7:
            mask += '255.'
        else:
            dec = 255 - (2**(8 - len) - 1)
            mask += str(dec) + '.'
        len -= 8
        if len < 0:
            len = 0
    
    return mask[:-1]


# ----------> FUNCION:configura
def configura():
    confirma = ''

    while confirma != 'a':
        nombre = raw_input('Ingrese el nombre logico de la NIC a configurar, ejemplo eth0: ')
        print'Opciones posibles:'
        print '  - Ingrese Direccion IP y mascara en formato "bit count", ejemplo 10.0.0.3/8'
        print "  - Ingrese '0' (cero) para no asignar ninguna Direccion IP"
        print "  - Ingrese 'd' para deshabilitar la interfaz"
        direccion = raw_input(' >> ')
        
        if direccion == '0':
            comando = 'ifconfig',nombre,'0.0.0.0'
            comando_terminado = ' '.join(comando)
        elif direccion == 'd':
            comando = 'ifconfig',nombre,'down'
            comando_terminado = ' '.join(comando)
        else:
            direccion_ip = re.search('(\d+\.\d+.\d+.\d+)', direccion)
            direccion_ip = direccion_ip.group(1)

            bitcount = re.search('\d+.\d+.\d+.\d+/(\d+)', direccion)
            bitcount = bitcount.group(1)
            bitcount = int(bitcount)
            mascara = len2mask(bitcount)

            comando = 'ifconfig',nombre,direccion_ip,'netmask',mascara,'up'
            comando_terminado = ' '.join(comando)

        print 'Se realizara la siguiente configuracion:"',comando_terminado,'", Es correcto?'
        confirma = raw_input('a: Aceptar, r: Reintentar  >> ')
    
    os.system(comando_terminado)
    return tecla

# ----------> EL PROGRAMA:
tecla = ''
while tecla != 's':
    nic1, nic2, nic3, nic4, nic5, nic6, nic7, nic8 = detecta() # llamo a la funcion detecta
    muestra() # llamo a la funcion muestra
    tecla = raw_input('c: Configurar, r: Re-leer, s: Salir  >> ')
    if tecla == 'r':
        nic1, nic2, nic3, nic4, nic5, nic6, nic7, nic8 = detecta() # llamo a la funcion detecta
        muestra() # llamo a la funcion muestra
    elif tecla == 'c': configura() # llamo a la funcion configura
    else: break
 

Espero que les sea útil.