@@ -48,17 +48,19 @@ def main(argv = None): | |||||
# Copy them all by running the "copy" tool as if it were | # Copy them all by running the "copy" tool as if it were | ||||
# invoked from the command line. | # invoked from the command line. | ||||
for stream in matched: | for stream in matched: | ||||
copy_argv = ["--url", client_src.geturl(), | |||||
new_argv = ["--url", client_src.geturl(), | |||||
"--dest-url", client_dest.geturl() ] | "--dest-url", client_dest.geturl() ] | ||||
if args.start: | if args.start: | ||||
copy_argv.extend(["--start", "@" + repr(args.start)]) | |||||
new_argv.extend(["--start", "@" + repr(args.start)]) | |||||
if args.end: | if args.end: | ||||
copy_argv.extend(["--end", "@" + repr(args.end)]) | |||||
new_argv.extend(["--end", "@" + repr(args.end)]) | |||||
if args.dry_run: | if args.dry_run: | ||||
copy_argv.extend(["--dry-run"]) | |||||
copy_argv.extend([stream[0], stream[0]]) | |||||
new_argv.extend(["--dry-run"]) | |||||
if args.force_metadata: | |||||
new_argv.extend(["--force-metadata"]) | |||||
new_argv.extend([stream[0], stream[0]]) | |||||
try: | try: | ||||
nilmtools.copy_one.main(copy_argv) | |||||
nilmtools.copy_one.main(new_argv) | |||||
except SystemExit as e: | except SystemExit as e: | ||||
# Ignore SystemExit which could be raised on --dry-run | # Ignore SystemExit which could be raised on --dry-run | ||||
if e.code != 0: | if e.code != 0: | ||||
@@ -19,6 +19,10 @@ def main(argv = None): | |||||
help="NilmDB server URL (default: %(default)s)") | help="NilmDB server URL (default: %(default)s)") | ||||
parser.add_argument('-f', '--factor', action='store', default=4, type=int, | parser.add_argument('-f', '--factor', action='store', default=4, type=int, | ||||
help='Decimation factor (default: %(default)s)') | help='Decimation factor (default: %(default)s)') | ||||
parser.add_argument("--force-metadata", action="store_true", | |||||
default = False, | |||||
help="Force metadata changes if the dest " | |||||
"doesn't match") | |||||
parser.add_argument("path", action="store", | parser.add_argument("path", action="store", | ||||
help='Path of base stream') | help='Path of base stream') | ||||
args = parser.parse_args(argv) | args = parser.parse_args(argv) | ||||
@@ -58,10 +62,12 @@ def main(argv = None): | |||||
client.stream_create(new_path, decimated_type) | client.stream_create(new_path, decimated_type) | ||||
# Run the decimation as if it were run from the commandline | # Run the decimation as if it were run from the commandline | ||||
nilmtools.decimate.main(["-u", args.url, | |||||
"-f", str(args.factor), | |||||
info.path, | |||||
new_path]) | |||||
new_argv = [ "-u", args.url, | |||||
"-f", str(args.factor) ] | |||||
if args.force_metadata: | |||||
new_argv.extend([ "--force-metadata" ]) | |||||
new_argv.extend([info.path, new_path]) | |||||
nilmtools.decimate.main(new_argv) | |||||
# Update info using the newly decimated stream | # Update info using the newly decimated stream | ||||
info = nilmtools.filter.get_stream_info(client, new_path) | info = nilmtools.filter.get_stream_info(client, new_path) | ||||
@@ -76,6 +76,7 @@ class Filter(object): | |||||
self.start = None | self.start = None | ||||
self.end = None | self.end = None | ||||
self.interhost = False | self.interhost = False | ||||
self.force_metadata = False | |||||
@property | @property | ||||
def client_src(self): | def client_src(self): | ||||
@@ -105,6 +106,10 @@ class Filter(object): | |||||
default = False, | default = False, | ||||
help="Just print intervals that would be " | help="Just print intervals that would be " | ||||
"processed") | "processed") | ||||
group.add_argument("--force-metadata", action="store_true", | |||||
default = False, | |||||
help="Force metadata changes if the dest " | |||||
"doesn't match") | |||||
group.add_argument("-s", "--start", | group.add_argument("-s", "--start", | ||||
metavar="TIME", type=self.arg_time, | metavar="TIME", type=self.arg_time, | ||||
help="Starting timestamp for intervals " | help="Starting timestamp for intervals " | ||||
@@ -162,6 +167,8 @@ class Filter(object): | |||||
print self.interval_string(interval) | print self.interval_string(interval) | ||||
raise SystemExit(0) | raise SystemExit(0) | ||||
self.force_metadata = args.force_metadata | |||||
self.start = args.start | self.start = args.start | ||||
self.end = args.end | self.end = args.end | ||||
@@ -223,18 +230,20 @@ class Filter(object): | |||||
"""See if the metadata jives, and complain if it doesn't. If | """See if the metadata jives, and complain if it doesn't. If | ||||
there's no conflict, update the metadata to match 'data'.""" | there's no conflict, update the metadata to match 'data'.""" | ||||
metadata = self._client_dest.stream_get_metadata(self.dest.path) | metadata = self._client_dest.stream_get_metadata(self.dest.path) | ||||
for key in data: | |||||
wanted = str(data[key]) | |||||
val = metadata.get(key, wanted) | |||||
if val != wanted and self.dest.rows > 0: | |||||
m = "Metadata in destination stream:\n" | |||||
m += " %s = %s\n" % (key, val) | |||||
m += "doesn't match desired data:\n" | |||||
m += " %s = %s\n" % (key, wanted) | |||||
m += "Refusing to change it. To prevent this error, " | |||||
m += "change or delete the metadata with nilmtool,\n" | |||||
m += "or remove existing data from the stream." | |||||
raise Exception(m) | |||||
if not self.force_metadata: | |||||
for key in data: | |||||
wanted = str(data[key]) | |||||
val = metadata.get(key, wanted) | |||||
if val != wanted and self.dest.rows > 0: | |||||
m = "Metadata in destination stream:\n" | |||||
m += " %s = %s\n" % (key, val) | |||||
m += "doesn't match desired data:\n" | |||||
m += " %s = %s\n" % (key, wanted) | |||||
m += "Refusing to change it. To prevent this error, " | |||||
m += "change or delete the metadata with nilmtool,\n" | |||||
m += "remove existing data from the stream, or " | |||||
m += "retry with --force-metadata." | |||||
raise Exception(m) | |||||
# All good -- write the metadata in case it's not already there | # All good -- write the metadata in case it's not already there | ||||
self._client_dest.stream_update_metadata(self.dest.path, data) | self._client_dest.stream_update_metadata(self.dest.path, data) | ||||