0

I am use fabric to write my rsync wrapper, the variable env.host_string will be set by execute() to run task. To get env.host_string, I run('pwd') first, and run rsync.

Is It possible to make sure user set env.hosts before some checkpoint arrived, such as the condition src == env.host_string ?

from fabric.api import run, env, task, abort
from string import Template

@task
def sync_to_same_dir(src, path):
    env.host_string
    cmd_template = Template("""rsync --dry-run -e ssh -avr $user@$src_host:$path/ $path/""")
    if path.endswith("/"):
        path = path[:-1]

    run("pwd") # it's a work around
    if src == env.host_string:
        abort("cannot rysnc to the same host")
    cmd = cmd_template.substitute(path=path, user=env.user, src_host=src)
    run(cmd)

I find the answer from fabric's source code. There is a simple idea: how run check host as needed ?

@needs_host
def put(local_path=None, remote_path=None, use_sudo=False,
    mirror_local_mode=False, mode=None):
    """
    Upload one or more files to a remote host.
    """

I trace the needs_host it will prompt to ask hosts, when the user don't assign any hosts:

No hosts found. Please specify (single) host string for connection: 

We can rewrite the task as:

from fabric.network import needs_host

@task
@needs_host
def the_task_needs_host(): pass
qrtt1
  • 7,746
  • 8
  • 42
  • 62

1 Answers1

1

What are you trying to do? A task knows what host it's using w/o having any other fabric calls:

fab -f host-test.py foo
[98.98.98.98] Executing task 'foo'
98.98.98.98
98.98.98.98

Done.

And here is the script eg:

#!/user/bin/env python

from fabric.api import *

env.user = 'mgoose'

@task
@hosts("98.98.98.98")
def foo():
    print(env.host)
    print(env.host_string)

So you don't have to do anything special to know what host your task is on.

Morgan
  • 4,143
  • 27
  • 35
  • thanks for reply, but I want to make sure the user has been set host before some method call or check point. I will refine my question. – qrtt1 Jul 15 '12 at 07:06
  • it's just python. So a check of: if env.hosts is not None: ... ; will be sufficient. – Morgan Jul 15 '12 at 18:44