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

Last change on this file since 994 was 994, checked in by pstorz, on Apr 9, 2012 at 10:02:11 AM

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.