#!/usr/bin/python # Copy streams between NilmDB servers with wildcards import nilmtools.filter import nilmtools.copy_one import nilmdb.client import argparse import fnmatch def main(argv = None): f = nilmtools.filter.Filter() # Reuse filter's parser, since it handles most options we need. parser = f.setup_parser(description = """\ Copy all streams matching the given wildcard from one host to another. Example: %(prog)s -u http://host1/nilmdb -U http://host2/nilmdb /sharon/* """, skip_paths = True) parser.add_argument("path", action="store", nargs="+", help='Wildcard paths to copy') args = parser.parse_args(argv) # Verify arguments if args.dest_url is None: parser.error("must provide both source and destination URL") client_src = nilmdb.client.Client(args.url) client_dest = nilmdb.client.Client(args.dest_url) if client_src.geturl() == client_dest.geturl(): parser.error("source and destination URL must be different") print "Source URL:", client_src.geturl() print " Dest URL:", client_dest.geturl() # Find matching streams matched = [] for path in args.path: matched.extend([s for s in client_src.stream_list(extended = True) if fnmatch.fnmatch(s[0], path) and s not in matched]) # Create destination streams if they don't exist for stream in matched: src = nilmtools.filter.StreamInfo(client_src.geturl(), stream) dest = nilmtools.filter.get_stream_info(client_dest, src.path) if not dest: print "Creating destination stream", src.path client_dest.stream_create(src.path, src.layout) # Copy them all by running the "copy" tool as if it were # invoked from the command line. for stream in matched: new_argv = ["--url", client_src.geturl(), "--dest-url", client_dest.geturl() ] if args.start: new_argv.extend(["--start", "@" + repr(args.start)]) if args.end: new_argv.extend(["--end", "@" + repr(args.end)]) if args.dry_run: 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(new_argv) except SystemExit as e: # Ignore SystemExit which could be raised on --dry-run if e.code != 0: raise if __name__ == "__main__": main()