1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#!/usr/bin/python
#
# Copyright (C) 2016 Santosh Sivaraj <santosiv@in.ibm.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
from struct import *
from common import *
import sys
GNAMELEN_OFFSET = 0x30
ENAMELEN_OFFSET = 0x14
FNAMELEN_OFFSET = 0x10
def read_group(group_dump):
group = {}
glen, group['flag'], group['domain'], group['event group offset'], \
group['event group length'], group['schema index'], \
group['event count'] = unpack_from(">HxxIBxHHBB", group_dump)
group['event indexes'] = unpack_from(">16H", group_dump[0x10:])
group['name'], nlen = read_string(group_dump[GNAMELEN_OFFSET:])
group['description'], dlen = read_string(group_dump[(GNAMELEN_OFFSET + nlen):])
return glen, group
def read_formula(formula_dump):
formula = {}
tlen, formula['flag'], formula['Group'] = unpack_from(">HxxIH6x",
formula_dump)
if formula['flag'] == 0x4:
formula['Grouped'] = 'y'
else:
formula['Grouped'] = 'n'
formula['Formula Name'], nlen = read_string(formula_dump[FNAMELEN_OFFSET:])
formula['Formula Description'], dlen = read_string(formula_dump[(FNAMELEN_OFFSET + nlen):])
formula['Formula'], flen = read_string(formula_dump[(FNAMELEN_OFFSET + nlen + dlen):])
formula['Unit'], ulen = read_string(formula_dump[(FNAMELEN_OFFSET + nlen + dlen + flen):])
return tlen, formula
def read_event(event_dump):
event = {}
elen, event['formula index'], event['domain'], event['record byte offset'], event['record length'], \
event['counter offset'], event['flag'], event['primary group index'], \
event['group count'] = unpack_from(">HHBxHHHIHH", event_dump)
if event['formula index'] == 0xffff:
event['formula index'] = "-1"
event['name'], nlen = read_string(event_dump[ENAMELEN_OFFSET:])
event['description'], dlen = read_string(event_dump[(ENAMELEN_OFFSET + nlen):])
event['detailed description'], ddlen = read_string(event_dump[(ENAMELEN_OFFSET + nlen + dlen):])
return elen, event
def read_groups(dump_file, page_offset, num_pages, num_count, group_type):
f = open(dump_file, 'r')
f.seek(page_offset * PAGE_SIZE, 0)
dump = f.read(PAGE_SIZE * num_pages)
if group_type == 'groups':
read_fn = read_group
elif group_type == 'events':
read_fn = read_event
elif group_type == 'formulae':
read_fn = read_formula
else:
print "No such group"
offset = 0
groups = []
for i in range(0, num_count):
glen, group = read_fn(dump[offset:])
offset += glen
groups.append(group)
f.close()
return groups
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Require a lid file to read from"
exit(1)
lid_file = sys.argv[1]
f = open(lid_file, 'r')
dump = f.read(PAGE_SIZE)
f.close()
desc, length, version, build_date, schema_offset, schema_len, schema_len, \
event_offset, event_len, event_count, group_offset, group_len, \
group_count, formula_offset, formula_len, formula_count = unpack_from(">IIQ16s32xHHHxxHHHxxHHHxxHHHxx",
dump)
signature = struct.unpack('4s', struct.pack('>I', desc))[0]
if signature != "24x7":
print "Not a catalog file"
exit(1)
print "File Signature: %s\nLength: %d\nVersion: %lu\nBuild Date: %s" % (signature, length, version, build_date)
write_to_csv('formulae.csv', read_groups(lid_file, formula_offset, formula_len, formula_count, 'formulae'))
write_to_csv('events.csv', read_groups(lid_file, event_offset, event_len, event_count, 'events'))
write_to_csv('groups.csv', read_groups(lid_file, group_offset, group_len, group_count, 'groups'))
|