• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.0.25b/examples/scripts/shares/python/
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.
12##
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.
17##
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.
21##
22######################################################################
23
24import re, string, sys, commands
25
26HEADER = """######################################################################
27##
28## autogenerated file of smb.conf parameters
29## generate_parm_table <..../param/loadparm.c>
30##
31##  Copyright (C) Gerald Carter		       2004.
32##
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.
37##
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.
42##
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.
46##
47######################################################################
48
49from SambaParm import SambaParmString, SambaParmBool, SambaParmBoolRev
50
51## boolean defines for parm_table
52P_LOCAL    = 0
53P_GLOBAL   = 1
54
55"""
56
57FOOTER = """##### end of smbparm.y ##########################################
58#################################################################"""
59
60TESTPARM = "/usr/bin/testparm"
61
62## fields in Samba's parameter table
63displayName = 0
64type        = 1
65scope       = 2
66variable    = 3
67flags       = 6
68
69parm_table  = {}
70var_table   = {}
71def_values  = {}
72obj_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',
83}
84
85######################################################################
86##                        BEGIN MAIN CODE                           ##
87######################################################################
88
89## First thing is to build the dictionary of parmeter names  ##
90## based on the output from testparm                         ##
91
92cmd = "/usr/bin/testparm -s -v /dev/null"
93( status, testparm_output ) = commands.getstatusoutput( cmd )
94if status:
95	sys.stderr.write( "Failed to execute testparm!\n%s\n" % testparm_output )
96
97
98## break the output into a list ##
99
100lines = string.split( testparm_output, "\n" )
101
102## loop through list -- parameters in testparm output have ##
103## whitespace at the beginning of the line                 ##
104
105pattern = re.compile( "^\s+" )
106for 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	new = parts[1].replace('\\', '\\\\')
115	def_values[key] = new
116
117## open loadparm.c and get the entire list of parameters ##
118## including synonums                                    ##
119
120if len(sys.argv) != 2:
121	print "Usage: %s <.../param/loadparm.c>" % ( sys.argv[0] )
122	sys.exit( 1 )
123
124try:
125	fconfig = open( sys.argv[1], "r" )
126except IOError:
127	print "%s does not exist!" % sys.argv[1]
128	sys.exit (1)
129
130## Loop through loadparm.c --  all parameters are either ##
131## P_LOCAL or P_GLOBAL                                   ##
132
133synonyms = []
134pattern = re.compile( '{".*P_[GL]' )
135while True:
136	input_str= fconfig.readline()
137	if  len(input_str) == 0 :
138		break
139	input_str= string.strip(input_str)
140
141	## see if we have a patch for a parameter definition ##
142
143	parm = []
144	if pattern.search( input_str) :
145
146		## strip the surrounding '{.*},' ##
147
148		input_str= input_str[1:-2]
149		parm = string.split(input_str, ",")
150
151		## strip the ""'s and upper case ##
152
153		name = (string.strip(parm[displayName])[1:-1])
154		key = string.upper( string.join(string.split(name), "") )
155		var_name = string.strip( parm[variable] )
156
157
158		## try to catch synonyms -- if the parameter was not reported ##
159		## by testparm, then save it and come back after we will out  ##
160		## the variable list                                          ##
161
162		if not def_values.has_key( key ):
163			synonyms.append( input_str)
164			continue
165
166
167		var_table[var_name] = key
168
169		parmType = string.strip(parm[type])
170
171		parm_table[key] = [ name , string.strip(parm[type]), string.strip(parm[scope]), def_values[key] ]
172
173## Deal with any synonyms ##
174
175for input_str in synonyms:
176		parm = string.split(input_str, ",")
177		name = (string.strip(parm[displayName])[1:-1])
178		key = string.upper( string.join(string.split(name), "") )
179		var_name = string.strip( parm[variable] )
180
181		## if there's no pre-existing key, then testparm doesn't know about it
182		if not var_table.has_key( var_name ):
183			continue
184
185		## just make a copy
186		parm_table[key] = parm_table[var_table[var_name]][:]
187		# parm_table[key][1] = parm[1]
188		parm_table[key][1] = string.strip(parm[1])
189
190##                      ##
191## print out smbparm.py ##
192##                      ##
193
194try:
195	smbparm = open ( "smbparm.py", "w" )
196except IOError:
197	print "Cannot write to smbparm.py"
198	sys.exit( 1 )
199
200smbparm.write( HEADER )
201smbparm.write( "parm_table = {\n" )
202
203for x in parm_table.keys():
204	key = "\"%s\"" % x
205	smbparm.write("\t%-25s: (\"%s\", %s, %s, \"%s\"),\n" % ( key, parm_table[x][0],
206		obj_table[parm_table[x][1]], parm_table[x][2], parm_table[x][3] ))
207
208smbparm.write( "}\n" )
209
210smbparm.write( FOOTER )
211smbparm.write( "\n" )
212
213sys.exit(0)
214
215
216##                  ##
217## cut-n-paste area ##
218##                  ##
219
220for x in parm_table.keys():
221	if def_values.has_key( x ):
222		parm_table[x].append( def_values[x] )
223	else:
224		parm_table[x].append( "" )
225