source: dassmodus/trunk/dassmodus/nosferatu/nosferatu/config_classes.py @ 994

Last change on this file since 994 was 994, checked in by pstorz, 10 years ago

web2py

File size: 27.1 KB
Line 
1# -*- coding: utf-8 -*-
2# $Id: config_classes.py 12290 2011-02-10 14:02:38Z pstorz $
3import re
4import logging
5import copy
6logger = logging.getLogger("directive")
7import scheduleparser # schedule class
8from auto_types import *
9
10from  prettynames import *
11
12RXP_SIMPLE_ITEM = re.compile(r'''
13(^|;)(\s*(?P<itemname>[\w ]+?)?\s*=\s*(?P<value>"?[^;^\n]+"?)(?P<comment>\s+\#.*)?) # xxx = yyy # comment
14''',re.M| re.X)
15#(^|;)(\s*(?P<itemname>[\w ]+?)?\s*=\s*(?P<value>"?[^{^}^;^\n]+"?)(?P<comment>\s+\#.*)?) # xxx = yyy # comment
16   
17#(^|;)(\s*(?P<itemname>[\w ]+?)?\s*=\s*(?P<value>"?[^{^}^;^\n^\s]+"?)\s*(?P<comment>\s+\#.*)?) # xxx = yyy # comment
18
19RXP_RESTYPE = re.compile(r'''
20  ^\s*(?P<resourcetype>\w[\w ]+?\s*(=\s+)?\s?)$
21''', re.M|re.X|re.S)
22
23# TODO: allow spaces in resourcetypes like sd addresses!
24# this does not work now
25#  SD Addresses = <
26 
27RXP_NRTEXT = re.compile(r'''
28(?P<number>\d+)\s?(?P<text>[A-Za-z]+)
29''', re.M|re.X|re.S)
30
31#RXP_TEXTNR = re.compile(r'''
32#(?P<text>\w+)\s?(?P<number>\d+)
33#''', re.M|re.X|re.S)
34
35# what resources can appear multiple times in director configs?
36MULTIPLE_RESOURCES_IN_DIRD = set([
37                                  'client',
38                                  'console',
39                                  'fileset',
40                                  'job',
41                                  'jobdefs',
42                                  'messages',
43                                  'pool',
44                                  'schedule',
45                                  'storage',
46                                  ])
47
48INTERNALLY_REFERENCED_ITEMS = set(['fileset',
49                                  'client' ,
50                                  'catalog',
51                                  'messages',
52                                  'schedule',
53                                  'storage',
54                                  'jobdefs',
55                                  'pool',
56                                  'incrementalbackuppool',
57                                  'fullbackuppool',
58                                  'differentialbackuppool',
59                                  'nextpool',
60                                  'job',
61                                  'basejob',
62                                  'device',
63                                                                   
64                                  ])
65
66# translate full name to short name
67res2shrtn = {          'catalog'      :'cat',
68                       'client'       :'cli',
69                       'console'      :'con',
70                       'counter'      :'counter',
71                       'director'     :'dir',
72                       'fileset'      :'fs',
73                       'filedaemon'   :'cli',  # filedaemon is the same as cli
74                       'job'          :'job',
75                       'jobdefs'      :'job',  # jobdefs are the same as jobs
76                       'messages'     :'msgs',
77                       'pool'         :'pool',
78                       'runscript'    :'runscript',
79                       'schedule'     :'sch',
80                       'storage'      :'store',
81                       #'console'      :'con',
82                       'autochanger'  :'changer',
83                       'device'       :'dev',     
84                      'options'       :'options',
85                       #manually added
86                      'diraddresses'  :'addresses',
87                      'fdaddresses'  :'addresses',
88                      'sdaddresses'  :'addresses',
89                      'ip'           :'ip',
90                      'ipv4'         :'ip',
91                      'ipv6'         :'ip',
92                      'include'      : 'include',
93                      'exclude'      : 'include',
94                       }
95
96
97# which itemsnames can appear multiple times?
98MULTIPLE_ALLOWED_ITEMS_SET  = set([
99                             'file',
100                             'run',
101                             'plugin',
102                             ])
103
104#MULTIPLE_ALLOWED_RESOURCES_SET = set([
105#                                      'include',
106#                                      'exclude',
107#                                      'ip',
108#                                      ])
109
110
111timemultiplicators = {
112               "seconds"  : 1,
113               "minutes"  : 60,
114               "mins"     : 60,
115               "hours"    : 3600,
116               "days"     : 3600*24,
117               "weeks"    : 3600*24*7,   
118               "quarters" : 3600*24*91,   
119               "years"    : 3600*24*365,
120               "months"   : 60*60*24*30,
121               "n"        : 60,
122               }
123
124datamultiplicators  = {
125                "k" : 1024,          #/* kilobyte */
126                "kb": 1000,          #/* kb kilobyte */
127                "m" : 1048576,       #/* megabyte */
128                "mb": 1000000,       #/* mb megabyte */
129                "g" : 1073741824,    #/* gigabyte */
130                "gb": 1000000000};   #/* gb gigabyte */
131               
132
133RESSOURCES_WITH_EQUALSIGN = set(['diraddresses',
134                                'fdaddresses',
135                                'sdaddresses',
136                                'ip',
137                                'ipv4',
138                                'ipv6',
139                                ])
140
141#INDENTSTRING = '|--|'
142INDENTSTRING = '  '
143
144
145
146
147class Item(object):
148    def __init__(self, name, value, defaultvalue, default, type, required, parentresource = None, indentlevel = 0):
149        self.indentlevel = indentlevel
150        self.parentresource = parentresource
151        self.name = name.lower().replace(' ','')
152        self.defaultvalue = defaultvalue
153        self.default = default
154        self.value = value # real value lies in storage       
155        self.type = type
156        self.required = required
157        self.printall = False
158        #TODO: try/except this eval
159        #print type, defaultvalue
160       
161        #storage1 = eval(type + '(' + str(defaultvalue) +')' )
162        #self.storage = copy.deepcopy(storage1)
163        #logger.debug('storage: ' +str(id(self.storage)) + ' storage1: ' + str(id(storage1)))
164       
165        self.storage  =  eval(type + '(' + str(defaultvalue) +')' )
166        self.storage.setValue(value)
167       
168       
169        self.storage.indentlevel = self.indentlevel + 1
170        self.storage.setParentItem(self)
171 
172
173    def __lt__(self,other):
174      #print "comparing", self.name, other.name
175      if self.name == 'name': # name comes first
176        #print self.name,"<",other.name
177        return True
178      if self.name < other.name :
179        #print self.name,"<",other.name
180        return True
181      else:
182        #print self.name,">",other.name
183        return False
184
185
186    def __repr__(self):
187      string_types = set(['store_time'])
188      if self.type in string_types: # explicitly store this in a string
189          return "Item(\'%s\', \'%s\', \'%s\', %s, \'%s\', %s)" % (str(self.name),
190                                                         self.value,
191                                                         self.defaultvalue,
192                                                         self.default,
193                                                         str(self.type),
194                                                         self.required)
195      else:
196          return "Item(\'%s\', %s, %s, %s, \'%s\', %s)" % (str(self.name),
197                                                         self.value,
198                                                         self.defaultvalue,
199                                                         self.default,
200                                                         str(self.type),
201                                                         self.required)
202
203
204    ''' find out if this item is to be printed or not '''
205    def print_item(self):
206        printout = self.printall # override to print all out       
207        if self.default:
208          if str(self.storage.value) != str(self.defaultvalue):
209            logger.debug( "printing " + self.name + " as self.storage.value != self.defaultvalue:"
210                         + str(self.storage.value) + ' != ' + str(self.defaultvalue) + '<' )
211            printout = True
212          else:
213            #pass
214            logger.debug( "NOT printing " + self.name + " as self.storage.value == self.defaultvalue:"
215                         + str(self.storage.value) + ' == ' + str(self.defaultvalue) + '<' )
216
217        elif self.required:
218          # jobs can inherit their items from jobdefs, jobdefs do not need a client
219          # but a name is needed anyway
220          # TODO: merge jobs and jobdefs in order to check if they are complete after merge
221
222          # jobs and jobdefs
223          if self.parentresource.resourcetype.startswith('job') and self.value == self.defaultvalue and str(self.storage.value) == str(self.defaultvalue):
224            printout = False
225          else:
226            logger.debug( "printing " + self.name + " as self.required is set")
227            printout = True
228
229        elif self.storage.value is not None:
230
231          if self.storage.value != self.defaultvalue:
232            logger.debug( "printing " + self.name + " as self.storage.value is set to :>"
233                         + str( self.storage.value )+'<')
234            printout = True
235
236        return printout
237
238
239    def __str__(self):
240        '''
241        standard behaviour:
242        only print items that are configured and have not a different value than the default value
243        '''
244
245        if self.print_item():
246          return '%s%s = %s\n' % ( self.indentlevel * INDENTSTRING,  prettyName(self.name), self.storage)
247          #return '    %s = %s\n' % (prettyName(self.name), self.storage)
248        else:
249          return ''
250
251    def setValue(self, value):
252      '''set value item'''
253      self.storage.setValue(value)
254
255
256
257
258
259#class command(object):
260#  '''
261#  this class contains the information to a console command, also dot commands
262#  '''
263#  def __init__(self, commandtext, commandname, usage, help, inrunscript):
264#    self.commandtext = commandtext
265#    self.commandname = commandname
266#    self.usage = usage
267#    self.help = help
268#    self.inrunscript = inrunscript
269#
270#  def __repr__(self):
271#    return "command('%s','%s','%s','%s','%s')" % (self.commandtext, self.commandname, self.usage, self.help, self.inrunscript)
272
273
274
275
276# the bacula internal storage representations
277#
278# base classes for all storages
279class Item_Storage(object):
280  """
281  base class for the representation of any item object
282  """
283 
284  def __init__(self,val):
285    self.value = val
286    self.comment = ''
287    self.possiblevalues = []  # what values are possible here ?
288    self.parentitem = None
289   
290  def __str__(self):
291    #TODO do this in a nicer way without a catch-all try-except
292    if self.comment != '':
293      comment = "\t# " + self.comment
294    else:
295      comment = ''
296    try:
297      #return self.value
298      return self.value + comment #+self.__class__.__name__ + ' id: '+ str(id(self))
299    except:
300      #return str(self.value)
301      return unicode(self.value) + comment  #+self.__class__.__name__ + ' id: '+ str(id(self))
302   
303  def setParentItem(self,parentItem):
304    self.parentitem = parentItem
305   
306  def setValue(self,value):
307    logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\'')   
308    self.value = value
309    logger.debug("self.value is now" + str(self) )
310
311class Item_Storage_String (Item_Storage):
312  pass
313    #def __str__(self):
314    #  return str(self.value)
315      #return '"' + str(self.value) + '"'# + '\t# '+ self.__class__.__name__
316
317
318# generated
319class store_pint32( Item_Storage ):
320  def __str__(self):
321    return str(self.value) #+ '\t# '+self.__class__.__name__ + 'id: '+ str(id(self))
322    #return str(self.value) + '\t# '+self.__class__.__name__ + 'id: '+ str(id(self))
323                   
324
325                   
326
327class store_name( Item_Storage_String ):
328 
329  def setValue(self,value):
330    logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ unicode(value) + '\'')   
331    if value != None  and value != 0:
332      if type(value) == str:
333        value = value.strip('"')
334      else:
335        value = str(value)
336      self.value = '"' + value.strip('"') + '"'
337    else:
338      self.value = value
339    logger.debug("self.value is now " + unicode(self) )
340                           
341
342class store_str( store_name ):
343  pass                         
344
345class store_time( Item_Storage ):                         
346  def __init__(self,val):
347    self.value = val
348    self.comment = ''
349    self.possiblevalues = []  # what values are possible here ?
350    self.parentitem = None
351   
352  def __str__(self):
353    #TODO do this in a nicer way without a catch-all try-except
354    if self.value is None:
355      return str(self.value)
356    outstring = ''
357    for mult in ["years", "quarters" ,"months" ,"weeks", "days","hours","minutes","seconds"]:
358      if self.value % timemultiplicators[mult] == 0:
359        outstring = "%d %s " % (self.value/timemultiplicators[mult], mult)
360        return outstring   
361    return outstring 
362   
363  def setParentItem(self,parentItem):
364    self.parentitem = parentItem
365   
366  def setValue(self,value):
367    logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\'')   
368    self.value = self.__parse_timeinput__(value)
369    logger.debug("self.value is now" + str(self) )
370 
371  def __partNumberKeywords__(self,string):
372    '''
373    inserts a space between numbers and keywords if there is none
374    '''
375    return re.sub(r'([0-9](?=[A-Za-z])|[A-Za-z](?=[0-9]))', "\\1 ", string)
376    #s = ''
377    #for match in RXP_NRTEXT.finditer(string):
378    #  #print string,match.groups()
379    #  s += ' '.join(match.groups()) + ' '
380    #return s
381 
382  def __parse_timeinput__(self,timestring):
383    '''
384    parses the input string and sets the value to the resulting seconds
385    '''
386    timeval = 0
387    if timestring is None or timestring == 'None':
388      return None
389    multiplicator = 1
390    # search for x*x*X*X...
391    index = timestring.find('*')
392    if index != -1:
393      timeval = eval(timestring)
394      #print timeval
395      return timeval
396      #timestring = str(timeval)
397     
398   
399    if  timestring.isdigit():
400      return int(timestring)
401   
402   
403    # search for multiple pairs like "3 seconds 4 days"
404    timestring = self.__partNumberKeywords__(timestring)
405    valueUnitPairs = timestring.split()
406    valueUnitPairs.reverse()
407    #print valueUnitPairs
408    #print timestring+'<'
409    if len(valueUnitPairs)%2:
410      logger.error(valueUnitPairs)
411      logger.error("There should always be a pair of value-unit\n maybe you forgot a space between value and unit?")
412    while len(valueUnitPairs) > 1:
413      vustr = str(valueUnitPairs.pop()) + ' ' + str(valueUnitPairs.pop())
414      for cut in (range(8)):
415        if cut == 0: # extra, as range -0 leads to nothing instead of giving the whole string
416          cut = -8
417        for mult in ('months','seconds',
418                 'mins','minutes','hours',
419                 'days','weeks','quarters',
420                 'years'):        #,'n'     
421          index = vustr.lower().find(mult[:-cut])
422          #print mult[:-cut],vustr
423          if  index != -1 and len(mult[:-cut])>0:
424            multiplicator = timemultiplicators[mult]
425            tmpstring = vustr.replace(mult[:-cut],'')
426            #print mult[:-cut],vustr
427            vustr = tmpstring
428         
429      timeval += float(vustr) * multiplicator   
430      #print "%s -> %d " % (vustr,timeval)
431   
432   
433    return int(timeval)
434
435
436
437
438class store_bool( Item_Storage ):     
439  #pass
440  '''
441  also base class for store_bit
442  '''
443 
444  def __init__(self,val):
445    Item_Storage.__init__(self, val)
446    self.setValue(val)
447   
448  def setValue(self,value):
449    logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\' type: ' + str(type(value)))   
450    if type(value) is str:
451      logger.debug('value was string')
452      if value.lower() == 'yes' or value.lower() == '1':
453        self.value = True
454      else:
455        self.value = False   
456       
457    elif type(value) is int: # type int
458      logger.debug('value was int')
459      if value == 1:
460        self.value = True
461      else:
462        self.value = False
463       
464    elif type(value) is bool: # type int
465      logger.debug('value was bool')
466      self.value = value   
467    else:
468      logger.error( "value must be <int> or <str>, but is " + str(type(value)) )
469
470    logger.debug('value is now ' + str(self.value))
471 
472  def __str__(self):
473    if self.comment != '':
474      comment = "\t# " + self.comment
475    else:
476      comment = ''
477    if self.value == True:
478      #return 'Yes'#+ '\t# '+self.__class__.__name__ + 'id: '+ str(id(self))
479      return 'Yes'  + comment  #+self.__class__.__name__ + 'id: '+ str(id(self))
480   
481    else:
482      #return 'No' #+ '\t# '+self.__class__.__name__  + 'id: '+ str(id(self))
483      return 'No'  + comment  #+self.__class__.__name__  + 'id: '+ str(id(self))   
484
485class store_bit( store_bool ):
486  pass       
487
488
489class store_dir( store_name ):     
490  pass
491
492
493class store_alist_str( Item_Storage_String ):
494  pass     
495
496class store_password( store_name ):
497  pass                               
498
499class store_res( Item_Storage_String ):
500  pass                         
501
502
503
504class store_acl( Item_Storage_String ):
505   
506  def __init__(self,val):
507    self.value = val
508    self.comment = ''
509    self.possiblevalues = []  # what values are possible here ?
510    self.parentitem = None
511    self.ACLDict = {}
512   
513  def __str__(self):
514    return str(self.value)
515 
516   
517  def setParentItem(self,parentItem):
518    self.parentitem = parentItem
519   
520  def setValue(self,value):
521    logger.debug( self.__class__.__name__ +':' + 'called self.setvalue with \''+ str(value) + '\'')
522    self.value = value
523    self.__Value2ACLDict__()
524    self.__ACLDict2value__()
525    #self.__parse_ACLinput__(value)
526    #self.ACLDict2value()
527    logger.debug("self.value is now >%s<" %( self.value ))
528 
529  def __Value2ACLDict__(self):
530    '''
531    parses the input string and sets the ACL Dictionary
532    '''
533    #print "parsing the following value: %s  " % (self.value)
534 
535    if self.value is None or self.value == 'None' or self.value == u'' or self.value == '':
536      for k in self.ACLDict.keys():
537        self.ACLDict[k]= False
538      self.value = None
539    else:
540      for acl in self.value.replace(' ','').split(','):
541        self.ACLDict[acl]=True
542    self.__ACLDict2value__()
543    #print self.ACLDict
544   
545 
546  def __ACLDict2value__(self):
547    '''
548    reads the acl Dictionary and produces the correct output in the value field
549    '''
550    s = ''
551
552    for msg,val in self.ACLDict.iteritems():   
553      if val == True:
554        s += '%s,' % (msg)
555    #self.setValue(s[:-1])
556    #self.value = s[:-1]
557    if (len(s[:-1])) == 0:
558      self.value = None
559    else:
560      self.value = s[:-1]# cut last comma
561   
562
563 
564
565
566
567
568
569class store_int32( Item_Storage ):
570  pass                           
571
572class store_addresses_port( Item_Storage ):
573  pass                                     
574
575class store_addresses( Item_Storage ):
576  pass                                     
577
578class store_addresses_address( Item_Storage ):
579  pass
580 
581class store_inc( Item_Storage ):
582  pass                         
583
584class store_migtype( Item_Storage ):
585 
586  def __init__(self,val):
587    Item_Storage.__init__(self, val)
588    self.possiblevalues = migtypes             
589    if val == 0:
590      Item_Storage.setValue(self,  'smallestvolume')   
591   
592class store_short_runscript( Item_Storage ):
593  pass                                     
594
595class store_runscript( Item_Storage ):
596  pass                               
597
598class store_alist_res( Item_Storage_String ):
599  pass                               
600
601class store_jobtype( Item_Storage ):
602 
603  def __init__(self,val):
604    Item_Storage.__init__(self, val)
605    self.possiblevalues = jobtypes
606    if val == 0:
607      Item_Storage.setValue(self,  'backup')
608
609class store_replace( Item_Storage ):
610 
611  def __init__(self,val):
612    Item_Storage.__init__(self, val)
613    self.possiblevalues = ReplaceOptions
614    if val == 0:
615      Item_Storage.setValue(self,  'always')
616
617class store_level( Item_Storage ):
618 
619  def __init__(self,val):
620    Item_Storage.__init__(self, val)
621    self.possiblevalues = joblevels
622    if val == 0:
623      Item_Storage.setValue(self,  'full')   
624
625
626class store_size64( Item_Storage ):
627  def __init__(self,val):
628    self.value = val
629    self.comment = ''
630    self.possiblevalues = []  # what values are possible here ?
631    self.parentitem = None
632   
633  def __str__(self):
634    #TODO do this in a nicer way without a catch-all try-except
635    if self.value is None:
636      return str(self.value)
637    outstring = ''
638    for mult in ["gb","mb","kb","g","m","k"]:
639      if self.value % datamultiplicators[mult] == 0:
640        outstring = "%d %s " % (self.value/datamultiplicators[mult], mult)
641        return outstring   
642    return str(self.value)
643   
644    #outstring = ''
645    #for mult in ["years", "quarters" ,"months" ,"weeks", "days","hours","minutes","seconds"]:
646    #  if self.value % timemultiplicators[mult] == 0:
647    #    outstring = "%d %s " % (self.value/timemultiplicators[mult], mult)
648    #    return outstring   
649    #return outstring 
650   
651  def setParentItem(self,parentItem):
652    self.parentitem = parentItem
653   
654  def setValue(self,value):
655    logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\'')   
656    self.value = self.__parse_datainput__(value)
657    logger.debug("self.value is now" + str(self) )
658 
659  def __parse_datainput__(self,datastring):
660    '''
661    parses the input string and sets the value to the resulting seconds
662    '''
663    if datastring is None or datastring == 'None':
664      return None
665   
666    datastring = str(datastring).lower()
667   
668    multiplicator = 1
669    dstring = datastring
670    for mult in ["gb","mb","kb","g","m","k"]:
671        index = dstring.lower().find(mult)
672        if  index != -1:
673          multiplicator = datamultiplicators[mult]
674          tmpstring = datastring.replace(mult,'')
675          #print datastring
676          dstring = tmpstring
677    dataval = float(dstring) * multiplicator   
678    return dataval
679   
680       
681    # search for x*x*X*X...
682    #index = timestring.find('*')
683    #if index != -1:
684    #  timeval = eval(timestring)
685    #  print timeval
686    #  timestring = str(timeval)#####
687
688    #print timestring+'<'
689    #for mult in timemultiplicators:
690    #  for cut in (range(8)):
691    #    if cut == 0: # extra, as range -0 leads to nothing instead of giving the whole string
692    #      cut = -8
693    #    index = timestring.find(mult[:-cut])
694    #    if  index != -1 and len(mult[:-cut])>0:
695    #      multiplicator = timemultiplicators[mult]
696    #      tmpstring = timestring.replace(mult[:-cut],'')
697    #      #print timestring
698    #      timestring = tmpstring
699    #timeval = float(timestring) * multiplicator   
700    #return timeval
701
702
703class store_strname( Item_Storage_String ):
704  pass
705
706class store_label( Item_Storage_String ):
707  pass
708
709class store_actiononpurge( Item_Storage ):
710  pass
711
712class store_runscript_bool( Item_Storage ):
713  pass
714
715class store_runscript_cmd( Item_Storage ):
716  pass
717
718class store_runscript_target( Item_Storage ):
719  pass
720
721class store_runscript_when( Item_Storage ):
722  pass
723
724class store_run( Item_Storage_String ):
725  def __init__(self,val):
726    self.value = val
727    logger.debug('store_run: called with ' + str(val))
728    self.runentry = scheduleparser.RunEntry(val)
729    self.possiblevalues = []
730   
731  def setValue(self,value):
732    self.runentry.setValue(value)
733    # set value to None if resutling string contains only whitespace,
734    # in order to have the default value and not print it
735    if len(str(self.runentry).strip()) == 0:
736      self.value = None
737    else:
738      self.value = str(self.runentry)
739   
740     
741  def __str__(self):
742    self.value = str(self.runentry) # update value string
743    return str(self.runentry)
744
745class store_device( Item_Storage_String ):
746  pass
747
748class store_maxblocksize( Item_Storage ):
749  pass
750
751class store_devtype( Item_Storage ):
752  pass
753
754
755
756class store_msgs( Item_Storage ):
757 
758  def __init__(self,val):
759    self.value = val
760    self.comment = ''
761    self.possiblevalues = []  # what values are possible here ?
762    self.parentitem = None
763    self.messageDict = {}
764    self.parameter = None
765    self.setValue(val)
766   
767  def __str__(self):
768    s = ''
769     
770    if self.parameter is not None:
771      s += self.parameter + ' = '
772     
773    for msg,val in self.messageDict.iteritems():
774      if msg == 'all':
775        if self.messageDict['all']:
776          s += 'all,'
777        continue
778   
779      if self.messageDict['all']:
780        if val == False:
781          s += '!%s,' % (msg)
782      else:# not all, so write all that are true
783        if val == True:
784          s += '%s,' % (msg)
785    return s[:-1] # cut last comma
786 
787  def getParameter(self):
788    '''
789    this returns the target of the messages entry
790    '''
791    return self.parameter
792 
793  def setParameter(self, parameter):
794    self.parameter = parameter
795   
796  def setParentItem(self,parentItem):
797    self.parentitem = parentItem
798   
799  def setValue(self,value):
800    logger.debug( self.__class__.__name__ +':' + 'called self.setvalue with \''+ str(value) + '\'')   
801    self.value = self.__parse_messageinput__(value)
802    logger.debug("self.value is now" + str(self) )
803 
804  def __parse_messageinput__(self,msgsstring):
805    '''
806    parses the input string and sets the value
807    '''
808    if msgsstring is None or msgsstring == 'None':
809      self.parameter = None
810      return None
811   
812    splitted = msgsstring.split('=')   # do we have a message string with parameter
813    if len(splitted) > 1:                 # (like root@localhost = all, !skipped)
814      self.parameter = splitted[0].rstrip(' ')
815      msgsstring = splitted[1]
816       
817         
818    messagestring = msgsstring.lower()
819    for message in msg_types:
820      self.messageDict[message] = None
821      index = messagestring.find('!'+message)
822      if  index != -1:
823        logger.debug( "found NOT %s" % (message) )
824        self.messageDict[message] = False 
825      else:
826        index = messagestring.find(message)
827        if  index != -1:
828          logger.debug("found %s" % (message))
829          self.messageDict[message] = True 
830    return self.__str__()
831
832 
833 
834 
835 
836class store_opts( Item_Storage ):
837  def __init__(self,val):
838    Item_Storage.__init__(self, val)
839    #if val == 0:
840    #  Item_Storage.setValue(self,  'full')
841  def setParentItem(self,parentItem):
842    self.parentitem = parentItem
843    try:
844      self.possiblevalues =   FS_option_kw[self.parentitem.name]
845      logger.debug(self.possiblevalues)
846    except:
847      logger.error('keyerror in FS_option_kw for ' + self.parentitem.name)
848     
849
850class store_drivetype( Item_Storage ):
851  pass
852
853class store_regex( Item_Storage ):
854  pass
855
856class store_wild( Item_Storage ):
857  pass
858
859class store_fstype( Item_Storage ):
860  pass
861
862class store_base( Item_Storage ):
863  pass
864
865class store_plugin( Item_Storage ):
866  pass
867
868class store_excludedir( Item_Storage ):
869  pass
870
871class store_fname( store_name ):
872  pass
873
874
875class options_res( Item_Storage ):
876  pass
877
878
879class store_plugin_name( Item_Storage ):
880  pass
881
882
883
884if __name__ == "__main__":
885  #msgsstore = store_msgs("root@localhost = mount")
886  tmp = store_time("1 hour")
887 
888  #for mult in ('months','seconds','n',
889  #               'mins','minutes','hours',
890  #               'days','weeks','quarters',
891  #               'years'):   
892  #  for val in range(9):   
893  #    value = str(val) + ' ' + mult
894  #    tmp.setValue(value)
895  #    print str(value) + '->'  +  str(tmp)
896  # 
897  tmp.setValue("1month30minutes12seconds")
898  print tmp
Note: See TracBrowser for help on using the repository browser.