X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plc_config.py;h=420386245318dcd07d7c6c21d1c4ca845bdde6a9;hb=039b8b04f1e3e9f584abf83797ae3f1a8c421e23;hp=cedd66c126e1fb1d02453600e17fd8cd6ab85aa0;hpb=8749484b9bdde8930ad5b64f60d53ddae9ff35de;p=myplc.git diff --git a/plc_config.py b/plc_config.py index cedd66c..4203862 100644 --- a/plc_config.py +++ b/plc_config.py @@ -7,13 +7,10 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id$ -# import codecs import os import re -import readline import sys import textwrap import time @@ -829,6 +826,35 @@ DO NOT EDIT. This file was automatically generated at return buf.getvalue() + def validate_type(self, variable_type, value): + + # ideally we should use the "validate_*" methods in PLCAPI or + # even declare some checks along with the default + # configuration (using RELAX NG?) but this shall work for now. + def ip_validator(val): + import socket + try: + socket.inet_aton(val) + return True + except: return False + + def email_validator(val): + return re.match('\A[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9._\-]+\.[a-zA-Z]+\Z', val) + + def boolean_validator (val): + return val in ['true', 'false'] + + validators = { + 'email' : email_validator, + 'ip': ip_validator, + 'boolean': boolean_validator, + } + + # validate it if not a know type. + validator = validators.get(variable_type, lambda x: True) + return validator(value) + + # xml.dom.minidom.Text.writexml adds surrounding whitespace to textual # data when pretty-printing. Override this behavior. @@ -847,10 +873,6 @@ class TrimTextElement(xml.dom.minidom.Element): #################### # GLOBAL VARIABLES # -release_id = "$Id:$" -release_rev = "$Revision:$" -release_url = "$URL:$" - g_configuration=None usual_variables=None config_dir=None @@ -878,8 +900,9 @@ def init_configuration (): 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 - r\t\t\tRestart %s service + w\t\t\tWrite + r\t\t\tRestart %(service)s service + R\t\t\tReload %(service)s service (rebuild config files for sh, python....) q\t\t\tQuit (without saving) h/?\t\t\tThis help --- @@ -888,10 +911,10 @@ def init_configuration (): e/E [|]\tEdit variables (all, in category, single) --- c\t\t\tList categories - v/V [|]List Variables (all, in category, single) + v/V [|]\tList Variables (all, in category, single) --- Typical usage involves: u, [l,] w, r, q -""" % service +""" % globals() def usage (): command_usage="%prog [options] [default-xml [site-xml [consolidated-xml]]]" @@ -917,6 +940,10 @@ def get_value (config, category_id, variable_id): (category, variable) = config.get (category_id, variable_id) return variable['value'] +def get_type (config, category_id, variable_id): + (category, variable) = config.get (category_id, variable_id) + return variable['type'] + def get_current_value (cread, cwrite, category_id, variable_id): # the value stored in cwrite, if present, is the one we want try: @@ -1018,6 +1045,7 @@ def prompt_variable (cdef, cread, cwrite, category, variable, while True: default_value = get_value(cdef,category_id,variable_id) + variable_type = get_type(cdef,category_id,variable_id) current_value = get_current_value(cread,cwrite,category_id, variable_id) varname = get_varname (cread,category_id, variable_id) @@ -1054,9 +1082,12 @@ def prompt_variable (cdef, cread, cwrite, category, variable, else: print "No support for next category" else: - variable['value'] = answer - cwrite.set(category,variable) - return + if cdef.validate_type(variable_type, answer): + variable['value'] = answer + cwrite.set(category,variable) + return + else: + print "Not a valid value" def prompt_variables_all (cdef, cread, cwrite, show_comments): try: @@ -1157,7 +1188,6 @@ def mainloop (cdef, cread, cwrite, default_config, site_config, consolidated_con continue show_comments=command.isupper() - command=command.lower() mode='ALL' if arg: @@ -1178,10 +1208,10 @@ def mainloop (cdef, cread, cwrite, default_config, site_config, consolidated_con print "%s: no such category or variable" % arg continue - if (command in "qQ"): + if command in "qQ": # todo check confirmation return - elif (command == "w"): + elif command == "w": try: # Confirm that various constraints are met before saving file. validate_variables = g_configuration.get('validate_variables',{}) @@ -1200,7 +1230,7 @@ def mainloop (cdef, cread, cwrite, default_config, site_config, consolidated_con consolidate(default_config, site_config, consolidated_config) print ("You might want to type 'r' (restart %s), 'R' (reload %s) or 'q' (quit)" % \ (service,service)) - elif (command == "u"): + elif command in "uU": global usual_variables try: for varname in usual_variables: @@ -1210,13 +1240,13 @@ def mainloop (cdef, cread, cwrite, default_config, site_config, consolidated_con except Exception, inst: if (str(inst) != 'BailOut'): raise - elif (command == "r"): + elif command == "r": restart_service() - elif (command == "R"): + elif command == "R": reload_service() - elif (command == "c"): + elif command == "c": print_categories(cread) - elif (command in "eE"): + elif command in "eE": if mode == 'ALL': prompt_variables_all(cdef, cread, cwrite,show_comments) elif mode == 'CATEGORY': @@ -1226,12 +1256,12 @@ def mainloop (cdef, cread, cwrite, default_config, site_config, consolidated_con prompt_variable (cdef,cread,cwrite,category,variable, show_comments,False) except Exception, inst: - if (str(inst) != 'BailOut'): + if str(inst) != 'BailOut': raise - elif (command in "vVsSlL"): + elif command in "vVsSlL": show_value=(command in "sSlL") (c1,c2,c3) = (cdef, cread, cwrite) - if (command in "lL"): + if command in "lL": (c1,c2,c3) = (cwrite,cwrite,cwrite) if mode == 'ALL': show_variables_all(c1,c2,c3,show_value,show_comments) @@ -1261,7 +1291,7 @@ def check_dir (config_file): #################### def optParserSetup(configuration): - parser = OptionParser(usage=usage(), version="%prog 1.0" + release_rev + release_url ) + parser = OptionParser(usage=usage()) parser.set_defaults(config_dir=configuration['config_dir'], service=configuration['service'], usual_variables=configuration['usual_variables'])