clearer names for actions, and infer actions better
[monitor.git] / statistics / dump_db_m3_raw.py
1 #!/usr/bin/python
2
3 from monitor.database.info.model import *
4 import sys
5 from math import *
6 from monitor.generic import *
7 from datetime import datetime, timedelta
8 import time
9 import string
10
11 def list_to_str(list):
12     ret = []
13     for l in list:
14         if type(l) == type([]):
15             ret.append(" ".join([str(i) for i in l]))
16         else:
17             s = str(l)
18             s = s.translate(string.maketrans(",\n\r\"", ";||'"))
19             ret.append(s)
20     return ret
21
22 def add_if_not_present(d, add_fields=None):
23     if type(d) == type({}):
24         key_list = d.keys()
25         for k in add_fields.keys():
26             if k not in key_list:
27                 d[k] = add_fields[k]
28             else:
29                 add_if_not_present(d[k], add_fields[k])
30     return
31
32 def dict_to_list(d, add_fields=None, ignore_fields=None):
33     """ return a list of header names from a nested dict 
34         { 'a' : 1, 'b' : { 'c':2, 'd' : 3}} 
35         would return:
36         [ 'a', 'b_c', 'b_d' ]
37     """
38     k_list = []
39     d_list = []
40     if add_fields: add_if_not_present(d, add_fields)
41     for k in d.keys():
42         if type(d[k]) == type({}):
43             (z_kl, z_dl) = dict_to_list(d[k])
44             for i,zk in enumerate(map(lambda x: "%s_%s" % (k,x), z_kl)):
45                 if ignore_fields is None or zk not in ignore_fields:
46                     k_list.append(zk) 
47                     d_list.append(z_dl[i]) 
48         else:
49             if ignore_fields is None or k not in ignore_fields:
50                 k_list.append(k)
51                 d_list.append(d[k])
52     r = zip(k_list, list_to_str(d_list))
53     r.sort(lambda x,y: cmp(x[0], y[0]))
54     return ([ i[0] for i in r ], [ i[1] for i in r ])
55
56
57 if len(sys.argv) > 1 and sys.argv[1] == "--action":
58     args = sys.argv[2:]
59     find_action = True
60 else:
61     if len(sys.argv) > 1:
62         since_time = Time.str_to_dt(sys.argv[1], "%Y-%m-%d")
63         skip = int(sys.argv[2])
64         args = sys.argv[3:]
65     else:
66         args = sys.argv[1:]
67
68     find_action = False
69
70 first_time = True
71 index = 0
72 t1=t2=0
73 if find_action:
74     a = ActionRecord.query.all()
75     print >>sys.stderr, len(a)
76     for node in a:
77
78         print >>sys.stderr, index, node.hostname, t2-t1
79         index += 1
80         t1 = time.time()
81
82         d = node.__dict__
83         (k,l) = dict_to_list(d)
84         if first_time:
85             print "timestamp_unix,%s" % ",".join(k[1:])
86             first_time = False
87
88         print "%s,%s" % (Time.dt_to_ts(d['date_created']), ",".join(l[1:]))
89         t2=time.time()
90
91 else:
92     ignore_fields = ['plc_node_stats_nodenetwork_ids', 'port_status_806', 'port_status_22', 'port_status_80' ]
93     add_fields = {'plc_node_stats' : { 'last_boot' : 0, 'last_pcu_confirmation' : 0, 'last_pcu_reboot' : 0, 'last_download' : 0, 'run_level': 0, }}
94     for node in FindbadNodeRecord.query.all():
95
96         print >>sys.stderr, index, node.hostname, t2-t1
97         index += 1
98         t1 = time.time()
99         if index > skip :
100             for v in node.versions:
101
102                 d = v.__dict__
103                 (k,l) = dict_to_list(d, add_fields=add_fields, ignore_fields=ignore_fields)
104                 if not first_time:
105                     if cmp(k, k_last) != 0:
106                         print >>sys.stderr, "mismatching key lists"
107                         print >>sys.stderr, k
108                         print >>sys.stderr, k_last
109                         for i in zip(k,k_last):
110                             print >>sys.stderr, i
111                         print >>sys.stderr, set(k) - set(k_last)
112                         print >>sys.stderr, set(k_last) - set(k)
113                         #sys.exit(1)
114                         continue
115
116                 if d['timestamp'] > since_time:
117                     if first_time:
118                         print "timestamp_unix,%s" % ",".join(k[1:])
119                         first_time = False
120
121
122                     print "%s,%s" % (Time.dt_to_ts(d['timestamp']), ",".join(l[1:]))
123
124                 k_last = k
125         t2=time.time()