#!/usr/bin/python # Interactively prompts for variable values # expected arguments are # command -d [default-xml [custom-xml [ consolidated-xml ]]] # # -d is for the myplc-devel package # we use 3 instances of PLCConfiguration throughout: # cdef : models the defaults, from plc_default.xml # cread : merged from plc_default & configs/site.xml # cwrite : site.xml + pending changes import sys import os import re import readline import traceback from optparse import OptionParser from geni.util.config import Config usual_variables = ["GENI_REGISTRY_ROOT_AUTH", "GENI_REGISTRY_LEVEL1_AUTH", "GENI_REGISTRY_ENABLED", "GENI_REGISTRY_HOST", "GENI_REGISTRY_PORT", "GENI_AGGREGATE_ENABLED", "GENI_AGGREGATE_HOST", "GENI_AGGREGATE_PORT", "GENI_SM_ENABLED", "GENI_SM_HOST", "GENI_SM_PORT", "GENI_PLC_USER", "GENI_PLC_PASSWORD", "GENI_PLC_HOST", "GENI_PLC_PORT", "GENI_PLC_API_PATH" ] mainloop_usage= """Available commands: u/U\t\t\tEdit usual variables w/W\t\t\tWrite / Write & reload q\t\t\tQuit (without saving) h/?\t\t\tThis help --- l/L []\tShow Locally modified variables/values s/S []\tShow all current variables/values e/E []\tEdit variables (all, in category, single) --- """ command_usage="%prog [options]" command_usage += """ Unless you specify the -d option, meaning you want to configure using defaults without interactive prompts""" variable_usage= """Edit Commands : .\tStops prompting, return to mainloop =\tShows default value ?\tThis help """ def save_config(changes, config_file): # always validate before saving changes = validate(changes) cfile = open(config_file, 'r') lines = cfile.readlines() newlines = [] cfile.close() for line in lines: added = False for variable in changes: if line.startswith(variable): try: value = int(changes[variable]) newline = '%s=%s\n' % (variable, value) newlines.append(newline) except: value = changes[variable] newline = '%s="%s"\n' % (variable, value) newlines.append(newline) added = True break if not added: newlines.append(line) cfile = open(config_file, 'w') cfile.writelines(newlines) cfile.close() def validate(changes): defaults = get_defaults() if not changes: return # GENI_INTERFACE_HRN is generated by combining GENI_REGISTRY_ROOT_AUTH and # GENI_REGISTRY_LEVEL1_AUTH, so if either of these are present we must # update GENI_INTERFACE_HRN if 'GENI_REGISTRY_ROOT_AUTH' in changes: root_auth = changes['GENI_REGISTRY_ROOT_AUTH'] else: root_auth = defaults['GENI_REGISTRY_ROOT_AUTH'] if 'GENI_REGISTRY_LEVEL1_AUTH' in changes: level1_auth = changes['GENI_REGISTRY_LEVEL1_AUTH'] else: level1_auth = default['GENI_REGISTRY_LEVEL1_AUTH'] interface_hrn = ".".join([root_auth, level1_auth]) changes['GENI_INTERFACE_HRN'] = interface_hrn return changes def get_defaults(): geni_config = Config() plc_vars = {'PLC_API_MAINTENANCE_PASSWORD': 'GENI_PLC_PASSWORD', 'PLC_API_MAINTENCE_USER': 'GENI_PLC_PASSWORD' } try: from geni.util.config import plcConfig plc_config = plcConfig except: plc_config = None defaults = {} for var in dir(geni_config): if var.startswith('GENI'): value = eval("geni_config.%s" % var) defaults[var] = value # some defaults come from plc_config for var in dir(plc_config): if var in plc_vars: value = eval("plc_config.%s" % var) defaults[plc_vars[var]] = value return defaults def prompt_variable(variable, default_config): if variable in default_config: default_value = default_config[variable] else: default_value = "" while True: prompt = "%(variable)s : [%(default_value)s] " % locals() try: answer = raw_input(prompt).strip() except EOFError: raise Exception ('BailOut') except KeyboardInterrupt: print "\n" raise Excception ('BailOut') if (answer == "") or (answer == default_value): return default_value elif answer in ['""', "''"]: return "" elif (answer == "."): raise Exception ('BailOut') elif (answer == "?"): print variable_usage.strip() elif (answer == "="): print ("%s defaults to %s" %(variable,default_value)) else: return answer def show_variable(variable, value_dict): print "%s=%s" % (variable, value_dict[variable]) def mainloop (default_config, config_file): changes = {} while True: try: answer = raw_input("Enter command (u for usual changes, w to save, ? for help) ").strip() except EOFError: answer ="" except KeyboardInterrupt: print "\nBye" sys.exit() if (answer == "") or (answer in "?hH"): print mainloop_usage continue if answer in ['?']: print "help" if (answer in ["q","Q"]): return elif (answer == "w"): save_config(changes, config_file) elif (answer == "u"): try: for varname in usual_variables: changes[varname] = prompt_variable(varname, default_config) except Exception, inst: if (str(inst) != 'BailOut'): raise elif (answer in ["e","E"]): try: prompt_variable (cdef,cread,cwrite,category,variable, show_comments,False) except Exception, inst: if (str(inst) != 'BailOut'): raise elif (answer in "sS"): for varname in usual_variables: show_variable (varname, default_config) elif (answer in "lL"): if not changes: print "No changes to display" else: for varname in changes: show_variable(varname, changes) else: print ("Unknown command >%s< -- use h for help" % answer) #################### def main (): command=sys.argv[0] argv = sys.argv[1:] save = True parser = OptionParser(usage=command_usage, version="%prog 1.0") parser.set_defaults(config_dir="/etc/geni", usual_variables=[]) parser.add_option("","--configdir",dest="config_dir",action="append", help="specify configuration directory") parser.add_option("","--usual_variable",dest="usual_variables",action="append", help="add a usual variable") parser.add_option("-d", "--default", action="count", help="dont prompt for values, just use defaults") (config,args) = parser.parse_args() if len(args)>3: parser.error("too many arguments") config_dir = parser.values.config_dir config_file = os.sep.join([config_dir, 'geni_config']) defaults = get_defaults() # if -d is specified dont prompt, just configure with defaults if '-d' in argv: save_config(defaults, config_file) else: mainloop (defaults, config_file) return 0 if __name__ == '__main__': main()