import sys, string, SambaParm
from smbparm import parm_table
class SambaComment:
def __init__( self, comment ):
self.comment = comment
def Dump( self, stream, whitespace=None ):
if not self.comment:
return
for line in self.comment:
if whitespace:
stream.write( whitespace )
stream.write( line )
stream.write( "\n" )
class SambaParameter :
DisplayName = 0
ObjectType = 1
DefaultValue = 2
Scope = 3
def __init__( self, name, value, comment=None ):
self.key = string.upper(string.strip(name))
self.comment = None
assert parm_table.has_key( self.key ), "Bad parameter name! [%s]" % name
self.parm = parm_table[self.key][self.ObjectType]( value )
if comment :
self.comment = SambaComment( comment )
def isGlobalParm( self ) :
return parm_table[self.key][Scope]
def Dump( self, stream ):
if self.comment:
self.comment.Dump( stream, "\t" )
stream.write( "\t%s = %s\n" % ( parm_table[self.key][self.DisplayName], self.parm.StringValue() ))
class SambaConf:
def __init__( self ):
self.services = {}
self.valid = True
self.services["GLOBAL"] = {}
self.services_order = []
def ReadLine( self, stream ):
result = None
input_str = None
while True:
input_str = stream.readline()
if len(input_str) == 0:
return result
input_str = string.strip( input_str )
if len(input_str) == 0:
if not result:
continue
else:
return result
if not result:
result = ""
if input_str[0] == '#' or input_str[0] == ';' :
result = input_str
break
if input_str[-1] == "\\" :
result += input_str[0:-1]
contine
result += input_str
break
return result
def NormalizeParamName( self, param ):
return string.upper( string.join(string.split(param), "") )
def ReadConfig( self, filename ):
self.filename = filename
try:
fconfig = open( filename, "r" )
except IOError:
self.valid = False
return
section_name = None
current_comment = []
while True:
str = self.ReadLine( fconfig )
if not str:
break
if str[0] == '#' or str[0] == ';' :
current_comment.append( str )
continue
if str[0]=='[' and str[-1]==']' :
section_name = str[1:-1]
self.AddService( section_name, current_comment )
current_comment = []
continue
str_list = string.split( str, "=" )
if len(str_list) != 2 :
continue
if not section_name :
print "parameter given without section name!"
break
param = self.NormalizeParamName( str_list[0] )
value = string.strip(str_list[1])
self.SetServiceOption( section_name, param, value, current_comment )
self.dirty = False
current_comment = []
fconfig.close()
def SetGlobalOption( self, param, value, comment=None ) :
self.SetServiceOption( "GLOBAL", param, value, comment )
def SetServiceOption( self, servicename, param, value, comment=None ) :
service = string.upper(servicename)
parm = self.NormalizeParamName(param)
self.services[service]['_order_'].append( parm )
self.services[service][parm] = SambaParameter( parm, value, comment )
self.dirty = True
def DelService( self, servicename ) :
service = string.upper(servicename)
self.services[service] = None
self.dirty = True
def AddService( self, servicename, comment=None ) :
service = string.upper(servicename)
self.services[service] = {}
self.services[service]['_order_'] = []
if ( comment ):
self.services[service]['_comment_'] = SambaComment( comment )
self.services_order.append( service )
self.dirty = True
def isService( self, servicename ):
service = string.upper(servicename)
return self.services.has_key( service )
def DumpService( self, stream, servicename ):
if self.services[servicename].has_key( '_comment_' ):
self.services[servicename]['_comment_'].Dump( stream )
stream.write( "[%s]\n" % (servicename) )
for parm in self.services[servicename]['_order_']:
self.services[servicename][parm].Dump(stream)
def Dump( self, stream ):
self.DumpService( stream, "GLOBAL" )
stream.write("\n")
for section in self.services_order:
if section == "GLOBAL":
continue
if not self.services[section]:
continue
self.DumpService( stream, section )
stream.write( "\n" )
def Flush( self ):
if not self.dirty:
return
try:
fconfig = open( self.filename, "w" )
except IOError:
sys.stderr.write( "ERROR!\n" )
return 1
self.Dump( fconfig )
fconfig.close()
return 0
def Services( self ):
service_list = []
for section in self.services.keys():
service_list.append( section )
return service_list
def NumServices( self ):
return len(self.Services())
def Write( self, filename ):
self.filename = filename
self.valid = True
if not self.dirty:
return
self.Flush()
if __name__ == "__main__" :
x = SambaConf( )
x.ReadConfig( sys.argv[1] )
if not x.valid :
print "Bad file!"
sys.exit(1)
x.Dump( sys.stdout )