source: people/peter.buschman/backup_monitoring/parsing/parsers/nbdevquery/_nbdevquery.py

Last change on this file was 976, checked in by peter, on Dec 6, 2011 at 10:19:33 AM

Raw checkin of current NetBackup / TSM parsing code.

File size: 3.2 KB
Line 
1import re
2
3import time
4import datetime
5import pytz
6
7from ....builtins import *
8
9from ...exceptions import *
10from ...expressions import *
11from ...autotype import *
12from ...streams import *
13
14##
15## nbdevquery has records separated by blank lines
16##
17def stream(stream, format='nbdevquery -listdv -U -stype BasicDisk'):
18
19 if format in ['nbdevquery -listdv -U -stype BasicDisk', 'nbdevquery -listdv -U -stype AdvancedDisk', 'nbdevquery -listdv -U -stype PureDisk']:
20 return BlankLineStream(stream, header=0)
21 else:
22 raise ParseError, 'Unknown format %s' % (format)
23
24
25##
26## Parse a nbdevquery record
27##
28## nbdevquery -listdv -U -stype BasicDisk
29##
30def parse(record, format='nbdevquery -listdv -U -stype BasicDisk', version=None, tz=None):
31
32 re_pair = re.compile('^\s*([^:]+):\s*(.*)\s*$')
33 re_type_id = re.compile('^([0-9a-zA-Z\-_ ]+)\s+\((\d+)\)$')
34 re_id_type = re.compile('^(\d+)\s+\(([0-9a-zA-Z\-_ ]+)\)$')
35 re_in_parens = re.compile('^\((.*)\)$')
36 re_starts_with_time = re.compile('^time_.*$')
37 re_ends_with_time = re.compile('^.*_time$')
38 re_time_plus_epoch_seconds_in_parens = re.compile('^.*\d:\d\d:\d\d.*\((\d+)\)$')
39 re_epoch_seconds_plus_time_in_parens = re.compile('^(\d+)\s+\(.*\d:\d\d:\d\d.*\)$')
40
41 re_trailing_whitespace = re.compile('\s+$')
42 re_strip_trailing_whitespace = re.compile('^(.*\S)\s*$')
43
44 pool = ExtendedDict()
45 pool['flags'] = ExtendedDict()
46
47 if format in ['nbdevquery -listdv -U -stype BasicDisk', 'nbdevquery -listdv -U -stype AdvancedDisk', 'nbdevquery -listdv -U -stype PureDisk']:
48
49 try:
50
51 for line in record:
52
53 match = re_pair.match(line)
54
55 key = match.group(1)
56 value = match.group(2)
57
58 key = key.rstrip()
59 value = value.rstrip()
60
61 key = re.sub('\s+', ' ', key)
62 key = key.lower()
63 key = key.replace(' ', '_')
64 key = key.replace('/', '_')
65 key = key.replace('(', '')
66 key = key.replace(')', '')
67 key = key.replace('%', '_pct')
68
69 #
70 # convert to python datatypes
71 #
72 while True:
73
74 #
75 # convert to integer value
76 #
77 if re_integer.match(value):
78 value = int(value)
79 break
80
81 #
82 # convert to floating point value
83 #
84 if re_float.match(value):
85 value = float(value)
86 break
87
88 #
89 # break if nothing matched
90 #
91 break
92
93 #
94 # if flag, add value to flags
95 #
96 if key == 'flag':
97 pool.flags[value] = True
98 else:
99 pool[key] = value
100
101 return pool
102
103 except Exception, e:
104
105 raise ParseError, e
106
107 else:
108
109 raise ParseError, 'Unknown format %s' % (format)
Note: See TracBrowser for help on using the repository browser.