def METHOD_NAME():
    argparser = argparse.ArgumentParser()
    argparser.add_argument("hub_url", help="Base URL of the JupyterHub to talk to")
    argparser.add_argument(
        "hours_ago",
        help="How recently should the user have been active to be rsynced",
        type=int,
    )
    argparser.add_argument(
        "src_basedir", help="Base directory containing home directories to be rsynced"
    )
    argparser.add_argument(
        "dest_basedir",
        help="Base directory where home directories should be rsynced to",
    )
    argparser.add_argument(
        "--actually-run-rsync",
        action="store_true",
        help="Actually run rsync, otherwise we just dry-run",
    )
    argparser.add_argument(
        "--concurrency", type=int, help="How many parallel rsyncs to run", default=16
    )
    args = argparser.parse_args()
    if "JUPYTERHUB_TOKEN" not in os.environ:
        print("Could not find JUPYTERHUB_TOKEN in environment.")
        print("Please get an admin user's token from {args.hub_url}/hub/token")
        sys.exit(1)
    time_since = datetime.now(timezone.utc) - timedelta(hours=args.hours_ago)
    users_since = []
    for user in get_all_users(args.hub_url, os.environ["JUPYTERHUB_TOKEN"]):
        if user["last_activity"]:
            if user["last_activity"] >= time_since:
                users_since.append(user["name"])
    pool = ThreadPoolExecutor(max_workers=args.concurrency)
    futures = []
    completed_futures = 0
    for user in users_since:
        # Escaping logic from https://github.com/jupyterhub/kubespawner/blob/0eecad35d8829d8d599be876ee26c192d622e442/kubespawner/spawner.py#L1340
        # tarring is CPU bound, so we can parallelize trivially.
        # FIXME: This should be tuneable, or at least default to some multiple of number of cores on the system
        future = pool.submit(
            rsync,
            user,
            args.src_basedir,
            args.dest_basedir,
            not args.actually_run_rsync,
        )
        futures.append(future)
    for future in as_completed(futures):
        completed_user, duration = future.result()
        completed_futures += 1
        print(
            f"Finished {completed_futures} of {len(users_since)} in {duration:0.3f} - user {completed_user}"
        )
    if not args.actually_run_rsync:
        print("No rsync commands were actually performed")
        print(
            "Check the rsync commands output, and then run this command with `--actually-run-rsync`"
        )