#!/usr/bin/python

# generate ethercat sysconfig file from a configuration file
# date: 2012-07-19
# author: sebastien blanchet

import fcntl, re, socket, struct, sys

configFilename='/etc/sysconfig/ethercat.conf.py'

HwAddrDict = {}

def defineEcMaster( mac, index, driver):
    """Load configution in the HwAddrDict dictionnary"""
    HwAddrDict[mac.lower()] = [index, driver.lower()]


# load configuration file
execfile( configFilename, globals() )


def getHwAddr(ifname):
    """return mac address of an ethernet interface"""
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]


def listHwAddress():
    """return list of all mac addresses """

    result = []

    # parse /proc/net/dev to get ethernet interface names
    f = open( "/proc/net/dev" , "r")
    lines = f.readlines()
    f.close()

    p = re.compile('^\s*(\w*\d):')
    for line in lines:
        m = p.match(line)
        if m:
            mac = ""
            ifname = m.group(1)
            try:
                mac = getHwAddr(ifname)
                result.append ( mac )
            except:
                pass
            #print ifname, mac
    return result



if __name__ == "__main__":

    f = open( '/dev/shm/ethercat_sysconfig', 'w');

    f.write( "# EtherCAT master sysconfig file\n" )
    f.write( "# Automatically generated by %s\n" % sys.argv[0] )
    f.write( "# DO NOT EDIT\n\n" )

    driverSet = {}
    for hwaddr in listHwAddress():
        if hwaddr in HwAddrDict:
            index, driver = HwAddrDict[hwaddr]
            f.write( "MASTER%d_DEVICE=\"%s\"\n" % (index, hwaddr) )
            if driver != 'generic':
                driverSet[driver] = '';

    f.write( "DEVICE_MODULES=\"%s generic\"\n" % (" ".join(driverSet.keys())) )
    f.close()


