summaryrefslogtreecommitdiffstats
path: root/catalog/read.py
blob: 50e2141138275a97e2526f0880deafafb89a53dd (plain)
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
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'))
OpenPOWER on IntegriCloud