@@ -48,17 +48,19 @@ def main(argv = None): | |||
# Copy them all by running the "copy" tool as if it were | |||
# invoked from the command line. | |||
for stream in matched: | |||
copy_argv = ["--url", client_src.geturl(), | |||
new_argv = ["--url", client_src.geturl(), | |||
"--dest-url", client_dest.geturl() ] | |||
if args.start: | |||
copy_argv.extend(["--start", "@" + repr(args.start)]) | |||
new_argv.extend(["--start", "@" + repr(args.start)]) | |||
if args.end: | |||
copy_argv.extend(["--end", "@" + repr(args.end)]) | |||
new_argv.extend(["--end", "@" + repr(args.end)]) | |||
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: | |||
nilmtools.copy_one.main(copy_argv) | |||
nilmtools.copy_one.main(new_argv) | |||
except SystemExit as e: | |||
# Ignore SystemExit which could be raised on --dry-run | |||
if e.code != 0: | |||
@@ -19,6 +19,10 @@ def main(argv = None): | |||
help="NilmDB server URL (default: %(default)s)") | |||
parser.add_argument('-f', '--factor', action='store', default=4, type=int, | |||
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", | |||
help='Path of base stream') | |||
args = parser.parse_args(argv) | |||
@@ -58,10 +62,12 @@ def main(argv = None): | |||
client.stream_create(new_path, decimated_type) | |||
# 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 | |||
info = nilmtools.filter.get_stream_info(client, new_path) | |||
@@ -76,6 +76,7 @@ class Filter(object): | |||
self.start = None | |||
self.end = None | |||
self.interhost = False | |||
self.force_metadata = False | |||
@property | |||
def client_src(self): | |||
@@ -105,6 +106,10 @@ class Filter(object): | |||
default = False, | |||
help="Just print intervals that would be " | |||
"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", | |||
metavar="TIME", type=self.arg_time, | |||
help="Starting timestamp for intervals " | |||
@@ -162,6 +167,8 @@ class Filter(object): | |||
print self.interval_string(interval) | |||
raise SystemExit(0) | |||
self.force_metadata = args.force_metadata | |||
self.start = args.start | |||
self.end = args.end | |||
@@ -223,18 +230,20 @@ class Filter(object): | |||
"""See if the metadata jives, and complain if it doesn't. If | |||
there's no conflict, update the metadata to match 'data'.""" | |||
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 | |||
self._client_dest.stream_update_metadata(self.dest.path, data) | |||