Initial import
[samba] / examples / scripts / shares / python / generate_parm_table.py
diff --git a/examples/scripts/shares/python/generate_parm_table.py b/examples/scripts/shares/python/generate_parm_table.py
new file mode 100644 (file)
index 0000000..1dbc071
--- /dev/null
@@ -0,0 +1,224 @@
+#!/usr/bin/env python
+######################################################################
+##
+##  Generate parameter dictionary from param/loadparm.c
+##
+##  Copyright (C) Gerald Carter                       2004.
+##
+##  This program is free software; you can redistribute it and/or modify
+##  it under the terms of the GNU General Public License as published by
+##  the Free Software Foundation; either version 2 of the License, or
+##  (at your option) any later version.
+##
+##  This program is distributed in the hope that it will be useful,
+##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##  GNU General Public License for more details.
+##
+##  You should have received a copy of the GNU General Public License
+##  along with this program; if not, write to the Free Software
+##  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+######################################################################
+
+import re, string, sys, commands
+
+HEADER = """######################################################################
+##
+## autogenerated file of smb.conf parameters
+## generate_parm_table <..../param/loadparm.c>
+##
+##  Copyright (C) Gerald Carter                       2004.
+##
+##  This program is free software; you can redistribute it and/or modify
+##  it under the terms of the GNU General Public License as published by
+##  the Free Software Foundation; either version 2 of the License, or
+##  (at your option) any later version.
+##
+##  This program is distributed in the hope that it will be useful,
+##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##  GNU General Public License for more details.
+##
+##  You should have received a copy of the GNU General Public License
+##  along with this program; if not, write to the Free Software
+##  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+######################################################################
+
+from SambaParm import SambaParmString, SambaParmBool, SambaParmBoolRev
+
+## boolean defines for parm_table
+P_LOCAL    = 0
+P_GLOBAL   = 1
+
+"""
+
+FOOTER = """##### end of smbparm.y ##########################################
+#################################################################"""
+
+TESTPARM = "/usr/bin/testparm"
+
+## fields in Samba's parameter table
+displayName = 0
+type        = 1
+scope       = 2
+variable    = 3
+flags       = 6
+
+parm_table  = {}
+var_table   = {}
+def_values  = {}
+obj_table = {
+       'P_BOOL'    : 'SambaParmBool',
+       'P_BOOLREV' : 'SambaParmBoolRev',
+       'P_STRING'  : 'SambaParmString',
+       'P_USTRING' : 'SambaParmString',
+       'P_GSTRING' : 'SambaParmString',
+       'P_LIST'    : 'SambaParmString',
+       'P_ENUM'    : 'SambaParmString',
+       'P_CHAR'    : 'SambaParmString',
+       'P_OCTAL'   : 'SambaParmString',
+       'P_INTEGER' : 'SambaParmString',
+}
+
+######################################################################
+##                        BEGIN MAIN CODE                           ##
+######################################################################
+
+## First thing is to build the dictionary of parmeter names  ##
+## based on the output from testparm                         ##
+
+cmd = "/usr/bin/testparm -s -v /dev/null"
+( status, testparm_output ) = commands.getstatusoutput( cmd )
+if status:
+       sys.stderr.write( "Failed to execute testparm!\n%s\n" % testparm_output )
+
+
+## break the output into a list ##
+
+lines = string.split( testparm_output, "\n" )
+
+## loop through list -- parameters in testparm output have ##
+## whitespace at the beginning of the line                 ##
+
+pattern = re.compile( "^\s+" )
+for input_str in lines:
+       if not pattern.search( input_str ):
+               continue
+       input_str = string.strip( input_str )
+       parts = string.split( input_str, "=" )
+       parts[0] = string.strip( parts[0] )
+       parts[1] = string.strip( parts[1] )
+       key = string.upper( string.join(string.split(parts[0]), "") )
+       new = parts[1].replace('\\', '\\\\')
+       def_values[key] = new
+
+## open loadparm.c and get the entire list of parameters ##
+## including synonums                                    ##
+               
+if len(sys.argv) != 2:
+       print "Usage: %s <.../param/loadparm.c>" % ( sys.argv[0] )
+       sys.exit( 1 )
+       
+try:
+       fconfig = open( sys.argv[1], "r" )
+except IOError:
+       print "%s does not exist!" % sys.argv[1]
+       sys.exit (1)
+
+## Loop through loadparm.c --  all parameters are either ##
+## P_LOCAL or P_GLOBAL                                   ##
+
+synonyms = []
+pattern = re.compile( '{".*P_[GL]' )
+while True:
+       input_str= fconfig.readline()
+       if  len(input_str) == 0 :
+               break
+       input_str= string.strip(input_str)
+       
+       ## see if we have a patch for a parameter definition ##
+       
+       parm = []
+       if pattern.search( input_str) :
+       
+               ## strip the surrounding '{.*},' ##
+               
+               input_str= input_str[1:-2]
+               parm = string.split(input_str, ",")
+               
+               ## strip the ""'s and upper case ##
+               
+               name = (string.strip(parm[displayName])[1:-1])
+               key = string.upper( string.join(string.split(name), "") )
+               var_name = string.strip( parm[variable] )
+               
+
+               ## try to catch synonyms -- if the parameter was not reported ##
+               ## by testparm, then save it and come back after we will out  ##
+               ## the variable list                                          ##
+               
+               if not def_values.has_key( key ):
+                       synonyms.append( input_str)
+                       continue
+               
+                       
+               var_table[var_name] = key 
+               
+               parmType = string.strip(parm[type])
+               
+               parm_table[key] = [ name , string.strip(parm[type]), string.strip(parm[scope]), def_values[key] ]
+
+## Deal with any synonyms ##
+
+for input_str in synonyms:
+               parm = string.split(input_str, ",")
+               name = (string.strip(parm[displayName])[1:-1])
+               key = string.upper( string.join(string.split(name), "") )
+               var_name = string.strip( parm[variable] )
+               
+               ## if there's no pre-existing key, then testparm doesn't know about it
+               if not var_table.has_key( var_name ):
+                       continue
+                       
+               ## just make a copy
+               parm_table[key] = parm_table[var_table[var_name]][:]
+               # parm_table[key][1] = parm[1]
+               parm_table[key][1] = string.strip(parm[1])
+
+##                      ##     
+## print out smbparm.py ##
+##                      ##     
+
+try:
+       smbparm = open ( "smbparm.py", "w" )
+except IOError:
+       print "Cannot write to smbparm.py"
+       sys.exit( 1 )
+       
+smbparm.write( HEADER )
+smbparm.write( "parm_table = {\n" )
+
+for x in parm_table.keys():
+       key = "\"%s\"" % x
+       smbparm.write("\t%-25s: (\"%s\", %s, %s, \"%s\"),\n" % ( key, parm_table[x][0], 
+               obj_table[parm_table[x][1]], parm_table[x][2], parm_table[x][3] ))
+
+smbparm.write( "}\n" )
+
+smbparm.write( FOOTER )
+smbparm.write( "\n" )
+
+sys.exit(0)
+
+
+##                  ##
+## cut-n-paste area ##
+##                  ##
+
+for x in parm_table.keys():
+       if def_values.has_key( x ):
+               parm_table[x].append( def_values[x] )
+       else:
+               parm_table[x].append( "" )