2 ######################################################################
4 ## Generate parameter dictionary from param/loadparm.c
6 ## Copyright (C) Gerald Carter 2004.
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
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
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 ######################################################################
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
)
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
):
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] )
124 fconfig
= open( sys
.argv
[1], "r" )
126 print "%s does not exist!" % sys
.argv
[1]
129 ## Loop through loadparm.c -- all parameters are either ##
130 ## P_LOCAL or P_GLOBAL ##
133 pattern
= re
.compile( '{".*P_[GL]' )
135 input_str
= fconfig
.readline()
136 if len(input_str
) == 0 :
138 input_str
= string
.strip(input_str
)
140 ## see if we have a patch for a parameter definition ##
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
)
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
):
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])
189 ## print out smbparm.py ##
193 smbparm
= open ( "smbparm.py", "w" )
195 print "Cannot write to smbparm.py"
198 smbparm
.write( HEADER
)
199 smbparm
.write( "parm_table = {\n" )
201 for x
in parm_table
.keys():
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" )
215 ## cut-n-paste area ##
218 for x
in parm_table
.keys():
219 if def_values
.has_key( x
):
220 parm_table
[x
].append( def_values
[x
] )
222 parm_table
[x
].append( "" )