bump major to 5.2
[myplc.git] / plc_config.py
index 98f95d1..4203862 100644 (file)
@@ -7,8 +7,6 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id$
-#
 
 import codecs
 import os
@@ -828,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.
@@ -846,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
@@ -877,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
 ---
@@ -887,10 +911,10 @@ def init_configuration ():
  e/E [<cat>|<var>]\tEdit variables (all, in category, single)
 ---
  c\t\t\tList categories
- v/V [<cat>|<var>]List Variables (all, in category, single)
+ v/V [<cat>|<var>]\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]]]"
@@ -916,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:
@@ -1017,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)
         
@@ -1053,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:
@@ -1156,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:
@@ -1177,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',{})
@@ -1199,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:
@@ -1209,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':
@@ -1225,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)
@@ -1260,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'])