r4904: sync up with 3.0 for 3.0.11pre2
[Samba.git] / examples / scripts / python / generate_parm_table.py
blobd25ff6616e13241b41fa48b43239a97eeb031d2c
1 #!/usr/bin/env python
2 ######################################################################
3 ##
4 ## Generate parameter dictionary from param/loadparm.c
5 ##
6 ## Copyright (C) Gerald Carter 2004.
7 ##
8 ## This program is free software; you can redistribute it and/or modify
9 ## it under the terms of the GNU General Public License as published by
10 ## the Free Software Foundation; either version 2 of the License, or
11 ## (at your option) any later version.
13 ## This program is distributed in the hope that it will be useful,
14 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ## GNU General Public License for more details.
18 ## You should have received a copy of the GNU General Public License
19 ## along with this program; if not, write to the Free Software
20 ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 ######################################################################
24 import re, string, sys, commands
26 HEADER = """######################################################################
28 ## autogenerated file of smb.conf parameters
29 ## generate_parm_table <..../param/loadparm.c>
31 ## Copyright (C) Gerald Carter 2004.
33 ## This program is free software; you can redistribute it and/or modify
34 ## it under the terms of the GNU General Public License as published by
35 ## the Free Software Foundation; either version 2 of the License, or
36 ## (at your option) any later version.
38 ## This program is distributed in the hope that it will be useful,
39 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
40 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41 ## GNU General Public License for more details.
43 ## You should have received a copy of the GNU General Public License
44 ## along with this program; if not, write to the Free Software
45 ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
47 ######################################################################
49 from SambaParm import SambaParmString, SambaParmBool, SambaParmBoolRev
51 ## boolean defines for parm_table
52 P_LOCAL = 0
53 P_GLOBAL = 1
55 """
57 FOOTER = """##### end of smbparm.y ##########################################
58 #################################################################"""
60 TESTPARM = "/opt/src/samba-cvs/samba-3.0/source/bin/testparm"
62 ## fields in Samba's parameter table
63 displayName = 0
64 type = 1
65 scope = 2
66 variable = 3
67 flags = 6
69 parm_table = {}
70 var_table = {}
71 def_values = {}
72 obj_table = {
73 'P_BOOL' : 'SambaParmBool',
74 'P_BOOLREV' : 'SambaParmBoolRev',
75 'P_STRING' : 'SambaParmString',
76 'P_USTRING' : 'SambaParmString',
77 'P_GSTRING' : 'SambaParmString',
78 'P_LIST' : 'SambaParmString',
79 'P_ENUM' : 'SambaParmString',
80 'P_CHAR' : 'SambaParmString',
81 'P_OCTAL' : 'SambaParmString',
82 'P_INTEGER' : 'SambaParmString',
85 ######################################################################
86 ## BEGIN MAIN CODE ##
87 ######################################################################
89 ## First thing is to build the dictionary of parmeter names ##
90 ## based on the output from testparm ##
92 cmd = "/opt/samba/bin/testparm -s -v /dev/null"
93 ( status, testparm_output ) = commands.getstatusoutput( cmd )
94 if status:
95 sys.stderr.write( "Failed to execute testparm!\n%s\n" % testparm_output )
98 ## break the output into a list ##
100 lines = string.split( testparm_output, "\n" )
102 ## loop through list -- parameters in testparm output have ##
103 ## whitespace at the beginning of the line ##
105 pattern = re.compile( "^\s+" )
106 for input_str in lines:
107 if not pattern.search( input_str ):
108 continue
109 input_str = string.strip( input_str )
110 parts = string.split( input_str, "=" )
111 parts[0] = string.strip( parts[0] )
112 parts[1] = string.strip( parts[1] )
113 key = string.upper( string.join(string.split(parts[0]), "") )
114 def_values[key] = parts[1]
116 ## open loadparm.c and get the entire list of parameters ##
117 ## including synonums ##
119 if len(sys.argv) != 2:
120 print "Usage: %s <.../param/loadparm.c>" % ( sys.argv[0] )
121 sys.exit( 1 )
123 try:
124 fconfig = open( sys.argv[1], "r" )
125 except IOError:
126 print "%s does not exist!" % sys.argv[1]
127 sys.exit (1)
129 ## Loop through loadparm.c -- all parameters are either ##
130 ## P_LOCAL or P_GLOBAL ##
132 synonyms = []
133 pattern = re.compile( '{".*P_[GL]' )
134 while True:
135 input_str= fconfig.readline()
136 if len(input_str) == 0 :
137 break
138 input_str= string.strip(input_str)
140 ## see if we have a patch for a parameter definition ##
142 parm = []
143 if pattern.search( input_str) :
145 ## strip the surrounding '{.*},' ##
147 input_str= input_str[1:-2]
148 parm = string.split(input_str, ",")
150 ## strip the ""'s and upper case ##
152 name = (string.strip(parm[displayName])[1:-1])
153 key = string.upper( string.join(string.split(name), "") )
154 var_name = string.strip( parm[variable] )
156 ## try to catch synonyms -- if the parameter was not reported ##
157 ## by testparm, then save it and come back after we will out ##
158 ## the variable list ##
160 if not def_values.has_key( key ):
161 synonyms.append( input_str)
162 continue
165 var_table[var_name] = key
167 parmType = string.strip(parm[type])
169 parm_table[key] = [ name , string.strip(parm[type]), string.strip(parm[scope]), def_values[key] ]
171 ## Deal with any synonyms ##
173 for input_str in synonyms:
174 parm = string.split(input_str, ",")
175 name = (string.strip(parm[displayName])[1:-1])
176 key = string.upper( string.join(string.split(name), "") )
177 var_name = string.strip( parm[variable] )
179 ## if there's no pre-existing key, then testparm doesn't know about it
180 if not var_table.has_key( var_name ):
181 continue
183 ## just make a copy
184 parm_table[key] = parm_table[var_table[var_name]][:]
185 # parm_table[key][1] = parm[1]
186 parm_table[key][1] = string.strip(parm[1])
188 ## ##
189 ## print out smbparm.py ##
190 ## ##
192 try:
193 smbparm = open ( "smbparm.py", "w" )
194 except IOError:
195 print "Cannot write to smbparm.py"
196 sys.exit( 1 )
198 smbparm.write( HEADER )
199 smbparm.write( "parm_table = {\n" )
201 for x in parm_table.keys():
202 key = "\"%s\"" % x
203 smbparm.write("\t%-25s: (\"%s\", %s, %s, \"%s\"),\n" % ( key, parm_table[x][0],
204 obj_table[parm_table[x][1]], parm_table[x][2], parm_table[x][3] ))
206 smbparm.write( "}\n" )
208 smbparm.write( FOOTER )
209 smbparm.write( "\n" )
211 sys.exit(0)
214 ## ##
215 ## cut-n-paste area ##
216 ## ##
218 for x in parm_table.keys():
219 if def_values.has_key( x ):
220 parm_table[x].append( def_values[x] )
221 else:
222 parm_table[x].append( "" )