~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to examples/scripts/shares/python/generate_parm_table.py

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 3 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, see <http://www.gnu.org/licenses/>.
 
20
##
 
21
######################################################################
 
22
 
 
23
import re, string, sys, commands
 
24
 
 
25
HEADER = """######################################################################
 
26
##
 
27
## autogenerated file of smb.conf parameters
 
28
## generate_parm_table <..../param/loadparm.c>
 
29
##
 
30
##  Copyright (C) Gerald Carter                2004.
 
31
##
 
32
##  This program is free software; you can redistribute it and/or modify
 
33
##  it under the terms of the GNU General Public License as published by
 
34
##  the Free Software Foundation; either version 3 of the License, or
 
35
##  (at your option) any later version.
 
36
##
 
37
##  This program is distributed in the hope that it will be useful,
 
38
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
39
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
40
##  GNU General Public License for more details.
 
41
##
 
42
##  You should have received a copy of the GNU General Public License
 
43
##  along with this program; if not, see <http://www.gnu.org/licenses/>.
 
44
##
 
45
######################################################################
 
46
 
 
47
from SambaParm import SambaParmString, SambaParmBool, SambaParmBoolRev
 
48
 
 
49
## boolean defines for parm_table
 
50
P_LOCAL    = 0
 
51
P_GLOBAL   = 1
 
52
 
 
53
"""
 
54
 
 
55
FOOTER = """##### end of smbparm.y ##########################################
 
56
#################################################################"""
 
57
 
 
58
TESTPARM = "/usr/bin/testparm"
 
59
 
 
60
## fields in Samba's parameter table
 
61
displayName = 0
 
62
type        = 1
 
63
scope       = 2
 
64
variable    = 3
 
65
flags       = 6
 
66
 
 
67
parm_table  = {}
 
68
var_table   = {}
 
69
def_values  = {}
 
70
obj_table = {
 
71
        'P_BOOL'    : 'SambaParmBool',
 
72
        'P_BOOLREV' : 'SambaParmBoolRev',
 
73
        'P_STRING'  : 'SambaParmString',
 
74
        'P_USTRING' : 'SambaParmString',
 
75
        'P_GSTRING' : 'SambaParmString',
 
76
        'P_LIST'    : 'SambaParmString',
 
77
        'P_ENUM'    : 'SambaParmString',
 
78
        'P_CHAR'    : 'SambaParmString',
 
79
        'P_OCTAL'   : 'SambaParmString',
 
80
        'P_INTEGER' : 'SambaParmString',
 
81
}
 
82
 
 
83
######################################################################
 
84
##                        BEGIN MAIN CODE                           ##
 
85
######################################################################
 
86
 
 
87
## First thing is to build the dictionary of parmeter names  ##
 
88
## based on the output from testparm                         ##
 
89
 
 
90
cmd = "/usr/bin/testparm -s -v /dev/null"
 
91
( status, testparm_output ) = commands.getstatusoutput( cmd )
 
92
if status:
 
93
        sys.stderr.write( "Failed to execute testparm!\n%s\n" % testparm_output )
 
94
 
 
95
 
 
96
## break the output into a list ##
 
97
 
 
98
lines = string.split( testparm_output, "\n" )
 
99
 
 
100
## loop through list -- parameters in testparm output have ##
 
101
## whitespace at the beginning of the line                 ##
 
102
 
 
103
pattern = re.compile( "^\s+" )
 
104
for input_str in lines:
 
105
        if not pattern.search( input_str ):
 
106
                continue
 
107
        input_str = string.strip( input_str )
 
108
        parts = string.split( input_str, "=" )
 
109
        parts[0] = string.strip( parts[0] )
 
110
        parts[1] = string.strip( parts[1] )
 
111
        key = string.upper( string.join(string.split(parts[0]), "") )
 
112
        new = parts[1].replace('\\', '\\\\')
 
113
        def_values[key] = new
 
114
 
 
115
## open loadparm.c and get the entire list of parameters ##
 
116
## including synonums                                    ##
 
117
                
 
118
if len(sys.argv) != 2:
 
119
        print "Usage: %s <.../param/loadparm.c>" % ( sys.argv[0] )
 
120
        sys.exit( 1 )
 
121
        
 
122
try:
 
123
        fconfig = open( sys.argv[1], "r" )
 
124
except IOError:
 
125
        print "%s does not exist!" % sys.argv[1]
 
126
        sys.exit (1)
 
127
 
 
128
## Loop through loadparm.c --  all parameters are either ##
 
129
## P_LOCAL or P_GLOBAL                                   ##
 
130
 
 
131
synonyms = []
 
132
pattern = re.compile( '{".*P_[GL]' )
 
133
while True:
 
134
        input_str= fconfig.readline()
 
135
        if  len(input_str) == 0 :
 
136
                break
 
137
        input_str= string.strip(input_str)
 
138
        
 
139
        ## see if we have a patch for a parameter definition ##
 
140
        
 
141
        parm = []
 
142
        if pattern.search( input_str) :
 
143
        
 
144
                ## strip the surrounding '{.*},' ##
 
145
                
 
146
                input_str= input_str[1:-2]
 
147
                parm = string.split(input_str, ",")
 
148
                
 
149
                ## strip the ""'s and upper case ##
 
150
                
 
151
                name = (string.strip(parm[displayName])[1:-1])
 
152
                key = string.upper( string.join(string.split(name), "") )
 
153
                var_name = string.strip( parm[variable] )
 
154
                
 
155
 
 
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                                          ##
 
159
                
 
160
                if not def_values.has_key( key ):
 
161
                        synonyms.append( input_str)
 
162
                        continue
 
163
                
 
164
                        
 
165
                var_table[var_name] = key 
 
166
                
 
167
                parmType = string.strip(parm[type])
 
168
                
 
169
                parm_table[key] = [ name , string.strip(parm[type]), string.strip(parm[scope]), def_values[key] ]
 
170
 
 
171
## Deal with any synonyms ##
 
172
 
 
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] )
 
178
                
 
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
 
182
                        
 
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])
 
187
 
 
188
##                      ##      
 
189
## print out smbparm.py ##
 
190
##                      ##      
 
191
 
 
192
try:
 
193
        smbparm = open ( "smbparm.py", "w" )
 
194
except IOError:
 
195
        print "Cannot write to smbparm.py"
 
196
        sys.exit( 1 )
 
197
        
 
198
smbparm.write( HEADER )
 
199
smbparm.write( "parm_table = {\n" )
 
200
 
 
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] ))
 
205
 
 
206
smbparm.write( "}\n" )
 
207
 
 
208
smbparm.write( FOOTER )
 
209
smbparm.write( "\n" )
 
210
 
 
211
sys.exit(0)
 
212
 
 
213
 
 
214
##                  ##
 
215
## cut-n-paste area ##
 
216
##                  ##
 
217
 
 
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( "" )