#!/usr/bin/env python

luci_module_path='/usr/local/lib/luci'

# import Python modules
import sys, getopt, errno, re, string

sys.path.append(luci_module_path)

# import luci module
import file


debug=0

def usage():
    print
    print "Usage:"
    print "create_desc_file [options] config_file config_file_type"
    print
    print "config_file: name of configuration file to read."
    print "config_file_type: can be shell, shell_env or keywords."
    print "Options:"
    print "-h|--help                        this help message"
    print "-d|--description                 "+\
          "add a empty description for each entry"
    print "-t|--type value_type             "+\
          "add a default value_type for each entry"
    print "-l|--length max_length           "+\
          "add a default max_length for each entry"
    print "-s|--size s                      add a default size for each entry"
    print "-p|--presence none|all|comment   "+\
          "set the 'presence' parameter (default to none):"
    print "   none:    all entries are mandatory (don't care of comment lines)"
    print "   all:     all entries are optionals (use comment entries)"
    print "   comment: only comment entries in the config file are optional"
    
    raise SystemExit, 1

def init(argv):
    """
    Init the global params
    
    params:
      argv: command line
    return:
      dict of param/value

    """
    params={}
    params['desc_dir']='/etc/luci'
    params['presence']='none'
    try:
        optlist, args = getopt.getopt(argv[1:], 'hdp:t:l:s:',
                                      ['help', 'description', \
                                       'type=', 'length=', 'presence=', \
                                       'size='])
    except getopt.error:
        usage()
    for i in optlist: 
        if i == ('--description','') or i == ('-d',''):
            params['description']=''
        elif i == ('--help','') or i == ('-h',''):
            usage()
        elif i[0] == '--presence' or i[0] == '-p':
            params['presence']=i[1]
        elif i[0] == '--type' or i[0] == '-t':
            params['value_type']=i[1]
        elif i[0] == '--length' or i[0] == '-l':
            params['max_length']=i[1]
        elif i[0] == '--size' or i[0] == '-s':
            params['size']=i[1]
            
    try:
        params['config_file_name']=args[0]
        params['config_file_type']=args[1]
        return params
    
    except IndexError:
        usage()


def add_entry(config, entries, name):
    config_name=name
    name=string.lower(name)
    config['entries'].append(name)
    entries[name]={}
    entries[name]['name']=string.capitalize(name)
    entries[name]['config_name']=config_name
    return name

def match_read(s, parameters, entries):
    m=parameters['pattern'].match(s)
    if m:
        name=m.group('variable')
        if m.groupdict().has_key('comment') and m.group('comment'):
            if parameters['presence']=='all':
                name=add_entry(parameters, entries, name)
                entries[name]['presence']='optional'
            elif parameters['presence']!='none':
                name=add_entry(parameters, entries, name)
                entries[name]['presence']='optional'    # entry commented
        else :
            name=add_entry(parameters, entries, name)
            if parameters['presence']=='all':
                entries[name]['presence']='optional'

def read_file(config, entries):
    try:
	file=config['config_file_name']
        if string.strip(file)[0:2]=='~/':
            file=string.replace(file,'~',os.environ['HOME'],1)
            config['config_file_name']=file
	f=open(file, 'r')
	line=f.readline()
	while line != '':
	    match_read(line, config, entries)
	    line=f.readline()
	f.close()
    except IOError, m:
        if errno.errorcode[m.errno] == 'ENOENT' :
            return "NoConfigFile"
	raise IOError, m

def write_file(config, entries):
    print "# LUCI description file for config file '"+config['config_file_name']+"'."
    print "# Automatically generated by create_desc_file."
    print
    for i in ['config_file_name', 'config_file_type']:
        print i+" "*3+"= '"+config[i]+"'"
    print "entries =",config['entries']
    print
    print
    for k in config['entries']:
        entry=entries[k]
        print k+"={"
        print "'name'"+" "*12+": '"+entry['name']+"',"
        for i in ['description', 'value_type', 'max_length', 'size']:
            if config.has_key(i):
                print "'"+i+"'"+" "*(16-len(i))+": '"+config[i]+"',"            
        if entry.has_key('presence'):
            print "'presence'"+" "*8+": 'optional',"            
        print "'config_name'"+" "*5+": '"+entry['config_name']+"'"
        print "}"
        print

config={}
config['entries']=[]
entries={}
config.update(init(sys.argv))

file.init_params(config)
if read_file(config, entries)=="NoConfigFile":
    print "Error: cannot read config file '"+config['config_file_name']+"'."
    raise SystemExit, 1
write_file(config, entries)
