Module jumpscale.entry_points.jsync

jsync is syncing tool to sync over certain set of directories against remote machine.

list available clients

~> poetry run jsync list-ssh-clients
['xmonader']

sync with a client certain set of paths

~> poetry run jsync sync --clients "xmonader" --paths "~/wspace/tq,/tmp/proj:/tmp/proj2"
['xmonader'] {'~/wspace/tq': '~/wspace/tq', '/tmp/proj': '/tmp/proj2'}
Expand source code
"""`jsync` is syncing tool to sync over certain set of directories against remote machine.
## list available clients
```
~> poetry run jsync list-ssh-clients
['xmonader']
```

## sync with a client certain set of paths
```
~> poetry run jsync sync --clients "xmonader" --paths "~/wspace/tq,/tmp/proj:/tmp/proj2"
['xmonader'] {'~/wspace/tq': '~/wspace/tq', '/tmp/proj': '/tmp/proj2'}
```
"""

import click
from jumpscale.loader import j


@click.command()
def list_ssh_clients():
    # TODO: show terminal table with host information
    return print(j.clients.sshclient.list_all())


# jsync --clients "xmonader,client2" --paths "/home/xmonader/wspace/tq:/tmp/tq,..."
@click.command()
@click.option("--clients")
@click.option("--paths")
@click.option("--nosync", is_flag=True, default=False, type=bool)
def sync(clients, paths, nosync=False):
    clients = [cl_name.strip() for cl_name in clients.split(",")]
    paths_dict = {}
    for watched_path_info in paths.split(","):
        parts = watched_path_info.split(":")
        if len(parts) == 1:
            src, dest = parts[0], parts[0]
        else:
            src, dest = parts[0], parts[1]
        src = j.sals.fs.expanduser(src)
        paths_dict[src] = dest

    j.logger.info("clients: {}, paths {} ".format(clients, paths_dict))
    syncer = j.tools.syncer.Syncer(clients, paths_dict)
    syncer.start(sync=not nosync)


@click.group()
def cli():
    pass


cli.add_command(sync)
cli.add_command(list_ssh_clients)

if __name__ == "__main__":
    cli()