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

Last change on this file since 1154 was 1154, checked in by joergs, on Jun 14, 2013 at 12:35:27 PM

added new types for bareos

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
325class store_name( Item_Storage_String ):
326
327 def setValue(self,value):
328 logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ unicode(value) + '\'')
329 if value != None and value != 0:
330 if type(value) == str:
331 value = value.strip('"')
332 else:
333 value = str(value)
334 self.value = '"' + value.strip('"') + '"'
335 else:
336 self.value = value
337 logger.debug("self.value is now " + unicode(self) )
338
339
340class store_str( store_name ):
341 pass
342
343class store_clearpassword( store_name ):
344 pass
345
346class store_authtype( store_name ):
347 pass
348
349class store_time( Item_Storage ):
350 def __init__(self,val):
351 self.value = val
352 self.comment = ''
353 self.possiblevalues = [] # what values are possible here ?
354 self.parentitem = None
355
356 def __str__(self):
357 #TODO do this in a nicer way without a catch-all try-except
358 if self.value is None:
359 return str(self.value)
360 outstring = ''
361 for mult in ["years", "quarters" ,"months" ,"weeks", "days","hours","minutes","seconds"]:
362 if self.value % timemultiplicators[mult] == 0:
363 outstring = "%d %s " % (self.value/timemultiplicators[mult], mult)
364 return outstring
365 return outstring
366
367 def setParentItem(self,parentItem):
368 self.parentitem = parentItem
369
370 def setValue(self,value):
371 logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\'')
372 self.value = self.__parse_timeinput__(value)
373 logger.debug("self.value is now" + str(self) )
374
375 def __partNumberKeywords__(self,string):
376 '''
377 inserts a space between numbers and keywords if there is none
378 '''
379 return re.sub(r'([0-9](?=[A-Za-z])|[A-Za-z](?=[0-9]))', "\\1 ", string)
380 #s = ''
381 #for match in RXP_NRTEXT.finditer(string):
382 # #print string,match.groups()
383 # s += ' '.join(match.groups()) + ' '
384 #return s
385
386 def __parse_timeinput__(self,timestring):
387 '''
388 parses the input string and sets the value to the resulting seconds
389 '''
390 timeval = 0
391 if timestring is None or timestring == 'None':
392 return None
393 multiplicator = 1
394 # search for x*x*X*X...
395 index = timestring.find('*')
396 if index != -1:
397 timeval = eval(timestring)
398 #print timeval
399 return timeval
400 #timestring = str(timeval)
401
402
403 if timestring.isdigit():
404 return int(timestring)
405
406
407 # search for multiple pairs like "3 seconds 4 days"
408 timestring = self.__partNumberKeywords__(timestring)
409 valueUnitPairs = timestring.split()
410 valueUnitPairs.reverse()
411 #print valueUnitPairs
412 #print timestring+'<'
413 if len(valueUnitPairs)%2:
414 logger.error(valueUnitPairs)
415 logger.error("There should always be a pair of value-unit\n maybe you forgot a space between value and unit?")
416 while len(valueUnitPairs) > 1:
417 vustr = str(valueUnitPairs.pop()) + ' ' + str(valueUnitPairs.pop())
418 for cut in (range(8)):
419 if cut == 0: # extra, as range -0 leads to nothing instead of giving the whole string
420 cut = -8
421 for mult in ('months','seconds',
422 'mins','minutes','hours',
423 'days','weeks','quarters',
424 'years'): #,'n'
425 index = vustr.lower().find(mult[:-cut])
426 #print mult[:-cut],vustr
427 if index != -1 and len(mult[:-cut])>0:
428 multiplicator = timemultiplicators[mult]
429 tmpstring = vustr.replace(mult[:-cut],'')
430 #print mult[:-cut],vustr
431 vustr = tmpstring
432
433 timeval += float(vustr) * multiplicator
434 #print "%s -> %d " % (vustr,timeval)
435
436
437 return int(timeval)
438
439
440
441
442class store_bool( Item_Storage ):
443 #pass
444 '''
445 also base class for store_bit
446 '''
447
448 def __init__(self,val):
449 Item_Storage.__init__(self, val)
450 self.setValue(val)
451
452 def setValue(self,value):
453 logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\' type: ' + str(type(value)))
454 if type(value) is str:
455 logger.debug('value was string')
456 if value.lower() == 'yes' or value.lower() == '1':
457 self.value = True
458 else:
459 self.value = False
460
461 elif type(value) is int: # type int
462 logger.debug('value was int')
463 if value == 1:
464 self.value = True
465 else:
466 self.value = False
467
468 elif type(value) is bool: # type int
469 logger.debug('value was bool')
470 self.value = value
471 else:
472 logger.error( "value must be <int> or <str>, but is " + str(type(value)) )
473
474 logger.debug('value is now ' + str(self.value))
475
476 def __str__(self):
477 if self.comment != '':
478 comment = "\t# " + self.comment
479 else:
480 comment = ''
481 if self.value == True:
482 #return 'Yes'#+ '\t# '+self.__class__.__name__ + 'id: '+ str(id(self))
483 return 'Yes' + comment #+self.__class__.__name__ + 'id: '+ str(id(self))
484
485 else:
486 #return 'No' #+ '\t# '+self.__class__.__name__ + 'id: '+ str(id(self))
487 return 'No' + comment #+self.__class__.__name__ + 'id: '+ str(id(self))
488
489class store_bit( store_bool ):
490 pass
491
492
493class store_dir( store_name ):
494 pass
495
496
497class store_alist_str( Item_Storage_String ):
498 pass
499
500class store_password( store_name ):
501 pass
502
503class store_res( Item_Storage_String ):
504 pass
505
506
507
508class store_acl( Item_Storage_String ):
509
510 def __init__(self,val):
511 self.value = val
512 self.comment = ''
513 self.possiblevalues = [] # what values are possible here ?
514 self.parentitem = None
515 self.ACLDict = {}
516
517 def __str__(self):
518 return str(self.value)
519
520
521 def setParentItem(self,parentItem):
522 self.parentitem = parentItem
523
524 def setValue(self,value):
525 logger.debug( self.__class__.__name__ +':' + 'called self.setvalue with \''+ str(value) + '\'')
526 self.value = value
527 self.__Value2ACLDict__()
528 self.__ACLDict2value__()
529 #self.__parse_ACLinput__(value)
530 #self.ACLDict2value()
531 logger.debug("self.value is now >%s<" %( self.value ))
532
533 def __Value2ACLDict__(self):
534 '''
535 parses the input string and sets the ACL Dictionary
536 '''
537 #print "parsing the following value: %s " % (self.value)
538
539 if self.value is None or self.value == 'None' or self.value == u'' or self.value == '':
540 for k in self.ACLDict.keys():
541 self.ACLDict[k]= False
542 self.value = None
543 else:
544 for acl in self.value.replace(' ','').split(','):
545 self.ACLDict[acl]=True
546 self.__ACLDict2value__()
547 #print self.ACLDict
548
549
550 def __ACLDict2value__(self):
551 '''
552 reads the acl Dictionary and produces the correct output in the value field
553 '''
554 s = ''
555
556 for msg,val in self.ACLDict.iteritems():
557 if val == True:
558 s += '%s,' % (msg)
559 #self.setValue(s[:-1])
560 #self.value = s[:-1]
561 if (len(s[:-1])) == 0:
562 self.value = None
563 else:
564 self.value = s[:-1]# cut last comma
565
566
567class store_int32( Item_Storage ):
568 pass
569
570class store_addresses_port( Item_Storage ):
571 pass
572
573class store_addresses( Item_Storage ):
574 pass
575
576class store_addresses_address( Item_Storage ):
577 pass
578
579class store_inc( Item_Storage ):
580 pass
581
582class store_migtype( Item_Storage ):
583
584 def __init__(self,val):
585 Item_Storage.__init__(self, val)
586 self.possiblevalues = migtypes
587 if val == 0:
588 Item_Storage.setValue(self, 'smallestvolume')
589
590class store_short_runscript( Item_Storage ):
591 pass
592
593class store_runscript( Item_Storage ):
594 pass
595
596class store_alist_res( Item_Storage_String ):
597 pass
598
599class store_jobtype( Item_Storage ):
600
601 def __init__(self,val):
602 Item_Storage.__init__(self, val)
603 self.possiblevalues = jobtypes
604 if val == 0:
605 Item_Storage.setValue(self, 'backup')
606
607class store_replace( Item_Storage ):
608
609 def __init__(self,val):
610 Item_Storage.__init__(self, val)
611 self.possiblevalues = ReplaceOptions
612 if val == 0:
613 Item_Storage.setValue(self, 'always')
614
615class store_level( Item_Storage ):
616
617 def __init__(self,val):
618 Item_Storage.__init__(self, val)
619 self.possiblevalues = joblevels
620 if val == 0:
621 Item_Storage.setValue(self, 'full')
622
623
624class store_size64( Item_Storage ):
625 def __init__(self,val):
626 self.value = val
627 self.comment = ''
628 self.possiblevalues = [] # what values are possible here ?
629 self.parentitem = None
630
631 def __str__(self):
632 #TODO do this in a nicer way without a catch-all try-except
633 if self.value is None:
634 return str(self.value)
635 outstring = ''
636 for mult in ["gb","mb","kb","g","m","k"]:
637 if self.value % datamultiplicators[mult] == 0:
638 outstring = "%d %s " % (self.value/datamultiplicators[mult], mult)
639 return outstring
640 return str(self.value)
641
642 #outstring = ''
643 #for mult in ["years", "quarters" ,"months" ,"weeks", "days","hours","minutes","seconds"]:
644 # if self.value % timemultiplicators[mult] == 0:
645 # outstring = "%d %s " % (self.value/timemultiplicators[mult], mult)
646 # return outstring
647 #return outstring
648
649 def setParentItem(self,parentItem):
650 self.parentitem = parentItem
651
652 def setValue(self,value):
653 logger.debug( self.__class__.__name__ +':' + 'called self.value with \''+ str(value) + '\'')
654 self.value = self.__parse_datainput__(value)
655 logger.debug("self.value is now" + str(self) )
656
657 def __parse_datainput__(self,datastring):
658 '''
659 parses the input string and sets the value to the resulting seconds
660 '''
661 if datastring is None or datastring == 'None':
662 return None
663
664 datastring = str(datastring).lower()
665
666 multiplicator = 1
667 dstring = datastring
668 for mult in ["gb","mb","kb","g","m","k"]:
669 index = dstring.lower().find(mult)
670 if index != -1:
671 multiplicator = datamultiplicators[mult]
672 tmpstring = datastring.replace(mult,'')
673 #print datastring
674 dstring = tmpstring
675 dataval = float(dstring) * multiplicator
676 return dataval
677
678
679 # search for x*x*X*X...
680 #index = timestring.find('*')
681 #if index != -1:
682 # timeval = eval(timestring)
683 # print timeval
684 # timestring = str(timeval)#####
685
686 #print timestring+'<'
687 #for mult in timemultiplicators:
688 # for cut in (range(8)):
689 # if cut == 0: # extra, as range -0 leads to nothing instead of giving the whole string
690 # cut = -8
691 # index = timestring.find(mult[:-cut])
692 # if index != -1 and len(mult[:-cut])>0:
693 # multiplicator = timemultiplicators[mult]
694 # tmpstring = timestring.replace(mult[:-cut],'')
695 # #print timestring
696 # timestring = tmpstring
697 #timeval = float(timestring) * multiplicator
698 #return timeval
699
700
701class store_strname( Item_Storage_String ):
702 pass
703
704class store_label( Item_Storage_String ):
705 pass
706
707class store_actiononpurge( Item_Storage ):
708 pass
709
710class store_runscript_bool( Item_Storage ):
711 pass
712
713class store_runscript_cmd( Item_Storage ):
714 pass
715
716class store_runscript_target( Item_Storage ):
717 pass
718
719class store_runscript_when( Item_Storage ):
720 pass
721
722class store_run( Item_Storage_String ):
723 def __init__(self,val):
724 self.value = val
725 logger.debug('store_run: called with ' + str(val))
726 self.runentry = scheduleparser.RunEntry(val)
727 self.possiblevalues = []
728
729 def setValue(self,value):
730 self.runentry.setValue(value)
731 # set value to None if resutling string contains only whitespace,
732 # in order to have the default value and not print it
733 if len(str(self.runentry).strip()) == 0:
734 self.value = None
735 else:
736 self.value = str(self.runentry)
737
738
739 def __str__(self):
740 self.value = str(self.runentry) # update value string
741 return str(self.runentry)
742
743class store_device( Item_Storage_String ):
744 pass
745
746class store_maxblocksize( Item_Storage ):
747 pass
748
749class store_devtype( Item_Storage ):
750 pass
751
752
753
754class store_msgs( Item_Storage ):
755
756 def __init__(self,val):
757 self.value = val
758 self.comment = ''
759 self.possiblevalues = [] # what values are possible here ?
760 self.parentitem = None
761 self.messageDict = {}
762 self.parameter = None
763 self.setValue(val)
764
765 def __str__(self):
766 s = ''
767
768 if self.parameter is not None:
769 s += self.parameter + ' = '
770
771 for msg,val in self.messageDict.iteritems():
772 if msg == 'all':
773 if self.messageDict['all']:
774 s += 'all,'
775 continue
776
777 if self.messageDict['all']:
778 if val == False:
779 s += '!%s,' % (msg)
780 else:# not all, so write all that are true
781 if val == True:
782 s += '%s,' % (msg)
783 return s[:-1] # cut last comma
784
785 def getParameter(self):
786 '''
787 this returns the target of the messages entry
788 '''
789 return self.parameter
790
791 def setParameter(self, parameter):
792 self.parameter = parameter
793
794 def setParentItem(self,parentItem):
795 self.parentitem = parentItem
796
797 def setValue(self,value):
798 logger.debug( self.__class__.__name__ +':' + 'called self.setvalue with \''+ str(value) + '\'')
799 self.value = self.__parse_messageinput__(value)
800 logger.debug("self.value is now" + str(self) )
801
802 def __parse_messageinput__(self,msgsstring):
803 '''
804 parses the input string and sets the value
805 '''
806 if msgsstring is None or msgsstring == 'None':
807 self.parameter = None
808 return None
809
810 splitted = msgsstring.split('=') # do we have a message string with parameter
811 if len(splitted) > 1: # (like root@localhost = all, !skipped)
812 self.parameter = splitted[0].rstrip(' ')
813 msgsstring = splitted[1]
814
815
816 messagestring = msgsstring.lower()
817 for message in msg_types:
818 self.messageDict[message] = None
819 index = messagestring.find('!'+message)
820 if index != -1:
821 logger.debug( "found NOT %s" % (message) )
822 self.messageDict[message] = False
823 else:
824 index = messagestring.find(message)
825 if index != -1:
826 logger.debug("found %s" % (message))
827 self.messageDict[message] = True
828 return self.__str__()
829
830
831
832
833
834class store_opts( Item_Storage ):
835 def __init__(self,val):
836 Item_Storage.__init__(self, val)
837 #if val == 0:
838 # Item_Storage.setValue(self, 'full')
839 def setParentItem(self,parentItem):
840 self.parentitem = parentItem
841 try:
842 self.possiblevalues = FS_option_kw[self.parentitem.name]
843 logger.debug(self.possiblevalues)
844 except:
845 logger.error('keyerror in FS_option_kw for ' + self.parentitem.name)
846
847
848class store_drivetype( Item_Storage ):
849 pass
850
851class store_regex( Item_Storage ):
852 pass
853
854class store_wild( Item_Storage ):
855 pass
856
857class store_fstype( Item_Storage ):
858 pass
859
860class store_base( Item_Storage ):
861 pass
862
863class store_plugin( Item_Storage ):
864 pass
865
866class store_excludedir( Item_Storage ):
867 pass
868
869class store_fname( store_name ):
870 pass
871
872
873class options_res( Item_Storage ):
874 pass
875
876
877class store_plugin_name( Item_Storage ):
878 pass
879
880
881
882if __name__ == "__main__":
883 #msgsstore = store_msgs("root@localhost = mount")
884 tmp = store_time("1 hour")
885
886 #for mult in ('months','seconds','n',
887 # 'mins','minutes','hours',
888 # 'days','weeks','quarters',
889 # 'years'):
890 # for val in range(9):
891 # value = str(val) + ' ' + mult
892 # tmp.setValue(value)
893 # print str(value) + '->' + str(tmp)
894 #
895 tmp.setValue("1month30minutes12seconds")
896 print tmp
Note: See TracBrowser for help on using the repository browser.