|
-
- from nilmdb.utils.printf import *
- import nilmdb.client
- import sys
-
- def setup(self, sub):
- cmd = sub.add_parser("extract", help="Extract data",
- description="""
- Extract data from a stream.
- """)
- cmd.set_defaults(verify = cmd_extract_verify,
- handler = cmd_extract)
-
- group = cmd.add_argument_group("Data selection")
- group.add_argument("path",
- help="Path of stream, e.g. /foo/bar",
- ).completer = self.complete.path
- group.add_argument("-s", "--start", required=True,
- metavar="TIME", type=self.arg_time,
- help="Starting timestamp (free-form, inclusive)",
- ).completer = self.complete.time
- group.add_argument("-e", "--end", required=True,
- metavar="TIME", type=self.arg_time,
- help="Ending timestamp (free-form, noninclusive)",
- ).completer = self.complete.time
-
- group = cmd.add_argument_group("Output format")
- group.add_argument("-B", "--binary", action="store_true",
- help="Raw binary output")
- group.add_argument("-b", "--bare", action="store_true",
- help="Exclude timestamps from output lines")
- group.add_argument("-a", "--annotate", action="store_true",
- help="Include comments with some information "
- "about the stream")
- group.add_argument("-m", "--markup", action="store_true",
- help="Include comments with interval starts and ends")
- group.add_argument("-T", "--timestamp-raw", action="store_true",
- help="Show raw timestamps in annotated information")
- group.add_argument("-c", "--count", action="store_true",
- help="Just output a count of matched data points")
- return cmd
-
- def cmd_extract_verify(self):
- if self.args.start > self.args.end:
- self.parser.error("start is after end")
-
- if self.args.binary:
- if (self.args.bare or self.args.annotate or self.args.markup or
- self.args.timestamp_raw or self.args.count):
- self.parser.error("--binary cannot be combined with other options")
-
- def cmd_extract(self):
- streams = self.client.stream_list(self.args.path)
- if len(streams) != 1:
- self.die("error getting stream info for path %s", self.args.path)
- layout = streams[0][1]
-
- if self.args.timestamp_raw:
- time_string = nilmdb.utils.time.timestamp_to_string
- else:
- time_string = nilmdb.utils.time.timestamp_to_human
-
- if self.args.annotate:
- printf("# path: %s\n", self.args.path)
- printf("# layout: %s\n", layout)
- printf("# start: %s\n", time_string(self.args.start))
- printf("# end: %s\n", time_string(self.args.end))
-
- printed = False
- if self.args.binary:
- printer = sys.stdout.buffer.write
- else:
- printer = lambda x: print(x.decode('utf-8'))
- bare = self.args.bare
- count = self.args.count
- for dataline in self.client.stream_extract(self.args.path,
- self.args.start,
- self.args.end,
- self.args.count,
- self.args.markup,
- self.args.binary):
- if bare and not count:
- # Strip timestamp (first element). Doesn't make sense
- # if we are only returning a count.
- dataline = b' '.join(dataline.split(b' ')[1:])
- printer(dataline)
- printed = True
- if not printed:
- if self.args.annotate:
- printf("# no data\n")
- return 2
-
- return 0
|