Я использую ткань для написания своей оболочки rsync, переменная env.host_string будет установлена с помощью execute() для запуска задачи. Чтобы получить env.host_string, я сначала запускаю ('pwd') и запускаю rsync.
Можно ли убедиться, что пользователь установил env.hosts до того, как появится какая-либо контрольная точка, например условие 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)
Я нахожу ответ в исходном коде ткани. Есть простая идея: как запустить проверку хоста по мере необходимости?
@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.
"""
Я отслеживаю need_host, он предложит запрашивать хосты, когда пользователь не назначает никаких хостов:
No hosts found. Please specify (single) host string for connection:
Мы можем переписать задачу так:
from fabric.network import needs_host
@task
@needs_host
def the_task_needs_host(): pass