-
Notifications
You must be signed in to change notification settings - Fork 327
/
whisper-fetch.py
executable file
·97 lines (82 loc) · 2.6 KB
/
whisper-fetch.py
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
#!/usr/bin/env python
import sys
import time
import signal
import optparse
try:
import whisper
except ImportError:
raise SystemExit('[ERROR] Please make sure whisper is installed properly')
_DROP_FUNCTIONS = {
'zeroes': lambda x: x != 0,
'nulls': lambda x: x is not None,
'empty': lambda x: x != 0 and x is not None
}
# Ignore SIGPIPE
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
now = int(time.time())
yesterday = now - (60 * 60 * 24)
option_parser = optparse.OptionParser(usage='''%prog [options] path''')
option_parser.add_option(
'--from', default=yesterday, type='int', dest='_from',
help=("Unix epoch time of the beginning of "
"your requested interval (default: 24 hours ago)"))
option_parser.add_option(
'--until', default=now, type='int',
help="Unix epoch time of the end of your requested interval (default: now)")
option_parser.add_option(
'--json', default=False, action='store_true',
help="Output results in JSON form")
option_parser.add_option(
'--pretty', default=False, action='store_true',
help="Show human-readable timestamps instead of unix times")
option_parser.add_option(
'-t', '--time-format', action='store', type='string', dest='time_format',
help='Time format to use with --pretty; see time.strftime()')
option_parser.add_option(
'--drop', choices=list(_DROP_FUNCTIONS.keys()), action='store',
help="Specify 'nulls' to drop all null values. "
"Specify 'zeroes' to drop all zero values. "
"Specify 'empty' to drop both null and zero values")
(options, args) = option_parser.parse_args()
if len(args) != 1:
option_parser.print_help()
sys.exit(1)
path = args[0]
from_time = int(options._from)
until_time = int(options.until)
try:
data = whisper.fetch(path, from_time, until_time)
if not data:
raise SystemExit('No data in selected timerange')
(timeInfo, values) = data
except (whisper.WhisperException, IOError) as exc:
raise SystemExit('[ERROR] %s' % str(exc))
if options.drop:
fcn = _DROP_FUNCTIONS.get(options.drop)
values = [x for x in values if fcn(x)]
(start, end, step) = timeInfo
if options.json:
values_json = str(values).replace('None', 'null')
print('''{
"start" : %d,
"end" : %d,
"step" : %d,
"values" : %s
}''' % (start, end, step, values_json))
sys.exit(0)
t = start
for value in values:
if options.pretty:
if options.time_format:
timestr = time.strftime(options.time_format, time.localtime(t))
else:
timestr = time.ctime(t)
else:
timestr = str(t)
if value is None:
valuestr = "None"
else:
valuestr = "%f" % value
print("%s\t%s" % (timestr, valuestr))
t += step