--- /dev/null
+#!/usr/bin/python
+
+import sys
+import os
+
+def recent(q, val, length):
+ return [val] + q[:length-1]
+
+def add(d, path, v):
+ if path not in d:
+ d[path] = []
+ d[path] = recent(d[path], v, 6)
+ #d[path].append(v)
+
+def stateof(l):
+ if len(set(l)) == 1:
+ return l[0]
+ else:
+ return "BOOT"
+
+def in_hard_state(l):
+ if len(set(l)) == 1:
+ return True
+ else:
+ return False
+
+recent_node_ts = {}
+recent_node_states = {}
+last_node_state = {}
+last_node_ts = {}
+print "ts,host,status,pcustatus,model,length"
+
+while True:
+ line = sys.stdin.readline()
+ if not line:
+ break
+ line = line.strip()
+ # NOTE assumes ts are ordered.
+ try:
+ (ts, host, state, pcu, pcumodel) = line.split(',')
+ except:
+ print >>sys.stderr, "EXCEPTION:", line
+ while True:
+ line = sys.stdin.readline()
+ if not line:
+ break
+ line = line.strip()
+ if line[0] == ',':
+ pcumodel = line[1:]
+ break
+ #sys.exit(1)
+
+ ts = int(float(ts))
+ add(recent_node_states, host, state)
+ add(recent_node_ts, host, ts)
+
+ if host not in last_node_state:
+ last_node_state[host] = "UNKNOWN"
+ last_node_ts[host] = ts
+
+ if ( (in_hard_state(recent_node_states[host]) and stateof(recent_node_states[host]) == "DOWN") or \
+ not in_hard_state(recent_node_states[host]) ) and \
+ last_node_state[host] != stateof(recent_node_states[host]):
+
+ if stateof(recent_node_states[host]) == "DOWN":
+ ts = recent_node_ts[host][-1] # get earliest time down
+ print "%s,%s,%s,%s,%s,%s" % (ts, host, stateof(recent_node_states[host]), pcu, pcumodel, ts-last_node_ts[host] )
+ last_node_state[host] = stateof(recent_node_states[host])
+ last_node_ts[host] = ts
+
+