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