import re
import readline
import traceback
+import distutils.file_util
from optparse import OptionParser
from geni.util.config import Config
+from geni.util.hierarchy import *
+from geni.util.misc import *
-usual_variables = ["GENI_REGISTRY_ROOT_AUTH",
+
+all_variables = ["GENI_REGISTRY_ROOT_AUTH",
"GENI_REGISTRY_LEVEL1_AUTH",
"GENI_REGISTRY_ENABLED",
"GENI_REGISTRY_HOST",
"GENI_PLC_PORT",
"GENI_PLC_API_PATH"
]
+usual_variables = ["GENI_REGISTRY_ROOT_AUTH",
+ "GENI_REGISTRY_LEVEL1_AUTH",
+ "GENI_PLC_USER",
+ "GENI_PLC_PASSWORD",
+ ]
mainloop_usage= """Available commands:
- Uppercase versions give variables comments, when available
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 [<var>]\tShow Locally modified variables/values
- s/S [<var>]\tShow variables/values (all, in category, single)
+ s/S [<var>]\tShow all current variables/values
e/E [<var>]\tEdit variables (all, in category, single)
---
"""
command_usage="%prog [options]"
command_usage += """
Unless you specify the -d option, meaning you want to configure
- myplc-devel instead of regular myplc, in which case"""
+ using defaults without interactive prompts"""
variable_usage= """Edit Commands :
.\tStops prompting, return to mainloop
?\tThis help
"""
-def save(changes, config_file):
+def save_config(changes, config_file):
+ # always validate before saving
+ changes = validate(changes)
+
cfile = open(config_file, 'r')
+ lines = cfile.readlines()
+ cfile.close()
newlines = []
- for line in cfile:
- newlines.append(line)
+ for line in lines:
+ added = False
for variable in changes:
- if line.startswith(variable):
- print variable
+ if line.startswith(variable+'='):
try:
value = int(changes[variable])
- newlines.append('%s=%s' % (variable, value))
+ newline = '%s=%s\n' % (variable, value)
+ newlines.append(newline)
except:
value = changes[variable]
- newlines.append('%s="%s"' % (variable, value))
- from pprint import pprint
- pprint(newlines)
- cfile.close()
+ 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()
+ print 'updated config file',config_file
+
+def validate(changes):
+
+ if not changes:
+ return {}
+
+ defaults = get_defaults()
+
+ # GENI_INTERFACE_HRN is GENI_REGISTRY_LEVEL1_AUTH, if thats blank it
+ # then defaults to GENI_REGISTRY_ROOT_AUTH
+ # 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 = defaults['GENI_REGISTRY_LEVEL1_AUTH']
+
+ if level1_auth:
+ interface_hrn = level1_auth
+ else:
+ interface_hrn = root_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'
+ 'PLC_API_MAINTENANCE_USER': 'GENI_PLC_USER'
}
try:
from geni.util.config import plcConfig
raise Exception ('BailOut')
except KeyboardInterrupt:
print "\n"
- raise Excception ('BailOut')
+ raise Exception ('BailOut')
if (answer == "") or (answer == default_value):
return default_value
+ elif answer in ['""', "''"]:
+ return ""
elif (answer == "."):
raise Exception ('BailOut')
elif (answer == "?"):
elif (answer == "="):
print ("%s defaults to %s" %(variable,default_value))
else:
- return answer
+ return answer
+
+def show_variable(variable, value_dict):
+ print "%s=%s" % (variable, value_dict[variable])
def mainloop (default_config, config_file):
changes = {}
print "help"
if (answer in ["q","Q"]):
- # todo check confirmation
- return
+ break
elif (answer == "w"):
- save(changes, config_file)
+ save_config(changes, config_file)
elif (answer == "u"):
try:
for varname in usual_variables:
except Exception, inst:
if (str(inst) != 'BailOut'):
raise
- elif (answer in "vVsSlL"):
- pass
- #show_variable (c1,c2,c3,category,variable,show_value,show_comments)
+ 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)
+ result = {}
+ result.update(default_config)
+ result.update(changes)
+ return result
+
+def setup_server_key(config_dict):
+ hrn = config_dict.get('GENI_INTERFACE_HRN')
+ if not hrn: return
+
+ # Get the path to the authorities directory hierarchy
+ hierarchy = Hierarchy()
+ path = hierarchy.basedir
+ auth_path = hrn.replace(".", os.sep)
+
+ # define some useful variables
+ key = 'server.key'
+ cert = 'server.cert'
+ hrn_leaf = get_leaf(hrn)
+ if not hrn_leaf:
+ hrn_leaf = hrn
+ new_server_key = os.sep.join([path, auth_path, hrn_leaf]) + ".pkey"
+ old_server_key = os.sep.join([path, key])
+ old_server_cert = os.sep.join([path, cert])
+
+ # remove old key/cert
+ for fd in [old_server_key, old_server_cert]:
+ if os.path.isfile(fd):
+ os.remove(fd)
+
+ # create new server.key
+ try:
+ distutils.file_util.copy_file(src=new_server_key, dst=old_server_key, verbose=1)
+ print "\t\t%(old_server_key)s\ncopied from\t%(new_server_key)s" % locals()
+ # this is expected when running geni-config-tty for the first time (before gimport.py)
+ except:
+ print "Could not create %(old_server_key)s - ignore if you haven't run gimport yet"%locals()
+
+
+
####################
def main ():
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",help="specify configuration directory")
+ 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()
- mainloop (defaults, config_file)
+ # if -d is specified dont prompt, just configure with defaults
+ if '-d' in argv:
+ save_config(defaults, config_file)
+ results = defaults
+ else:
+ results = mainloop (defaults, config_file)
+ setup_server_key(results)
return 0
if __name__ == '__main__':