Fabric: Странная обработка ввода в Windows в Fab2

Созданный на 14 сент. 2018  ·  11Комментарии  ·  Источник: fabric/fabric

Fabric 1 правильно обрабатывает ручной ввод, но Fabric 2 ведет себя странно, с pty или без него.

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

# contents of test_input.sh
# #!/bin/bash
# read -p "enter value: " var
# echo "you entered $var"

# Fabric 1 handled input correctly
>>> run("~/test_input.sh")
[riskapp.comm.equabank.loc] run: ~/test_input.sh
[riskapp.comm.equabank.loc] Login password for 'user':
[riskapp.comm.equabank.loc] out: enter value: foo # typed "foo" ENTER
[riskapp.comm.equabank.loc] out: you entered foo
[riskapp.comm.equabank.loc] out:

'enter value: foo\r\nyou entered foo'

# Fabric 2 without pty doesn't show prompt and behaves strange, must hit enter twice to finish command
>>> c = Connection(SERVER, connect_kwargs={"password": PASSWORD})
>>> c.run("~/test_input.sh")
bar # typed "bar" ENTER
bar # only "b" appeared, the rest after another ENTER


you entered bar
<Result cmd='~/test_input.sh' exited=0>

# Fabric 2 with pty shows prompt but input behavior is still strange, still must hit enter twice
>>> c.run("~/test_input.sh", pty=True)
enter value: baz  # typed "baz" ENTER
b  # another ENTER
az

you entered baz
<Result cmd='~/test_input.sh' exited=0>

# Fabric 2 automatic response works ok with pty
>>> c.run("~/test_input.sh", pty=True, watchers=[Responder(pattern="enter value", response="foo\n")])
enter value: foo
you entered foo
<Result cmd='~/test_input.sh' exited=0>

Протестировано на Windows 7 64b в cmd, Python 3.7 64b, с версиями Fabric:
Fabric3 1.14.post1, Fabric 2.3.1, Paramiko 2.4.1, Invoke 1.1.1

Bug Needs investigation Nonstandard platforms

Самый полезный комментарий

Вот критическое изменение invoke с версии 1.2 на версию 1.3.
https://github.com/pyinvoke/invoke/issues/654

Все 11 Комментарий

Спасибо за отчет. Я не могу самостоятельно проводить диагностику систем Windows, но, надеюсь, кто-то другой сможет воспроизвести их. Я могу сказать, что в прошлом мы определенно устранили ряд проблем, связанных с терминалом и кодированием, связанных с Windows, поэтому там _должно_ быть довольно стабильно, но вы, возможно, нашли еще один.

Еще один вопрос, вызванный другим тикетом - это всегда происходило или началось только недавно? Другой пользователь сообщил о странном поведении (но отличном от указанного симптома) после недавнего обновления Windows.

Не могу сказать, началось это недавно или нет, потому что раньше я не тестировал.
Теперь я попробовал его в Windows 10 на Python 3.5.3 и без изменений.
Я пробовал несколько раз, и однажды он закончил с этой ошибкой:

>>> c.run("~/test_input.sh")
asv  # i typed "asv" ENTER
asv  # another ENTER
you entered asv

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<decorator-gen-3>", line 2, in run
  File "C:\Python35\lib\site-packages\fabric2\connection.py", line 30, in opens
    return method(self, *args, **kwargs)
  File "C:\Python35\lib\site-packages\fabric2\connection.py", line 702, in run
    return self._run(self._remote_runner(), command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\context.py", line 101, in _run
    return runner.run(command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 271, in run
    return self._run_body(command, **kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 365, in _run_body
    raise ThreadException(thread_exceptions)
invoke.exceptions.ThreadException:
Saw 1 exceptions within threads (OSError):

Thread args: {'kwargs': {'echo': None,
            'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='cp852'>,
            'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp852'>},
 'target': <bound method Runner.handle_stdin of <fabric2.runners.Remote object at 0x000001BF0189C908>>}

Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\invoke\util.py", line 233, in run
    super(ExceptionHandlingThread, self).run()
  File "C:\Python35\lib\threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 648, in handle_stdin
    self.write_proc_stdin(data)
  File "C:\Python35\lib\site-packages\invoke\runners.py", line 784, in write_proc_stdin
    self._write_proc_stdin(data.encode(self.encoding))
  File "C:\Python35\lib\site-packages\fabric2\runners.py", line 69, in _write_proc_stdin
    return self.channel.sendall(data)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 846, in sendall
    sent = self.send(s)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 801, in send
    return self._send(s, m)
  File "C:\Python35\lib\site-packages\paramiko\channel.py", line 1180, in _send
    raise socket.error("Socket is closed")

OSError: Socket is closed

Привет,

Любое исправление на этом. У нас такая же проблема, как показано выше.

2019-08-07 11: 31: 30,590 - vm-1.0-GA-x86_64-minimal-template-1.0-Update-917-1565202528 - ИНФОРМАЦИЯ - exec [cd / root || выход $ ?; mkdir -m 777 -p / mnt / shared-1565202528]
testlist: {'tests': [{'test_catagory': 'upgrade', 'test_json': 'runlists / upgrade.json', 'priority': 'P0'}]}
Отслеживание (последний вызов последний):
Файл "harness.py", строка 395, в
основной()
Файл "harness.py", строка 392, в основном
sys.exit (жгут.start_run ())
Файл "harness.py", строка 59, в start_run
result_map = self.run ()
Файл "harness.py", строка 84, выполняется
result_map [тест ['test_catagory']] = self.run_tests (тест)
Файл "harness.py", строка 127, в run_tests
self.mount_storage_on_vm (vm_object)
Файл harness.py, строка 241, в mount_storage_on_vm
"mkdir -m 777 -p% s"% (self.log_location)). return_code == 0:
Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/guest.py", строка 36, в run_with_cd
return conn.run ("cd {} || exit $ ?; {}". format (quote (dir), command), * args)Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/vm.py", строка 242, в _pre_runreturn _orig_run (команда, * kwargs)
Файл "", строка 2, выполняется
Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", строка 30, открывается.
метод возврата (self, args, * kwargs)
Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", строка 702, выполняется.
return self._run (self._remote_runner (), команда, * kwargs)Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/context.py", строка 101, в _runreturn runner.run (команда, * kwargs)
Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", строка 291, в процессе
return self._run_body (команда, ** kwargs)
Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", строка 399, в _run_body
поднять ThreadException (thread_exceptions)
invoke.exceptions.ThreadException:
Видел 1 исключение в потоках (NotImplementedError):

Аргументы темы: {'kwargs': {'echo': Нет,
'input_': <_io.textiowrapper i = "44">,
'output': <_io.textiowrapper i = "46">},
'цель':>}

Отслеживание (последний вызов последний):

Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py", строка 233, выполняется.
super (ExceptionHandlingThread, сам) .run ()

Файл "/usr/lib/python3.6/threading.py", строка 864, выполняется
self._target ( self._args, * self._kwargs)

Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", строка 706, в handle_stdin
self.close_proc_stdin ()

Файл "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", строка 939, в close_proc_stdin
поднять NotImplementedError

NotImplementedError

Та же проблема возникла в 2019/08/07

def ssh_login_target_nas():
    """ Use ssh to login the target NAS 

        return 
            type: <class 'fabric.connection.Connection'>
    """
    # Set up fabric's login information
    host = SSH_ACCOUNT + "@" + SELF_NAS_IP_ADDRESS              
    # Connect to your nas
    c = Connection(host = host, connect_kwargs={"password": SSH_ACCOUNT_PASSWORD})
    try:
        hostname = c.run('hostname').stdout.strip()
        logger.debug("Connect to NAS: " + hostname)
    except Exception, error:
        logger.error(error)
        raise SystemExit
    return c

Я мог получить имя хоста из стандартного вывода. Но у меня все еще есть исключение, как показано ниже.

05:57:13 [ERROR] - 2019-08-08 05:58:17,108 - auto_update: ssh_login_target_nas 54   - 
05:57:13 Saw 1 exceptions within threads (NotImplementedError):
05:57:13 
05:57:13 
05:57:13 Thread args: {'kwargs': {'echo': None,
05:57:13             'input_': <open file '<stdin>', mode 'r' at 0x7fbf8f39b0c0>,
05:57:13             'output': <open file '<stdout>', mode 'w' at 0x7fbf8f39b150>},
05:57:13  'target': <bound method Remote.handle_stdin of <fabric.runners.Remote object at 0x7fbf8c6d3e10>>}
05:57:13 
05:57:13 Traceback (most recent call last):
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/util.py", line 233, in run
05:57:13     super(ExceptionHandlingThread, self).run()
05:57:13 
05:57:13   File "/usr/lib/python2.7/threading.py", line 754, in run
05:57:13     self.__target(*self.__args, **self.__kwargs)
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 706, in handle_stdin
05:57:13     self.close_proc_stdin()
05:57:13 
05:57:13   File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 939, in close_proc_stdin
05:57:13     raise NotImplementedError
05:57:13 
05:57:13 NotImplementedError

Мое содержимое файла requirements.txt, как показано ниже:

requests==2.11.1
fabric==2.4.0
xmltodict

Я обнаружил, что после выполнения pip install -r requirements.txt с 2019/08/07 буду устанавливать другую версию пакетов.

2019/08/06.

Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.2.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0

2019/08/07.

Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.3.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0

Версия пакета invoke отличается.

Вот критическое изменение invoke с версии 1.2 на версию 1.3.
https://github.com/pyinvoke/invoke/issues/654

отличная находка @baconYao , это

То же самое и здесь, при нажатии любой клавиши в непрерывно выполняющейся многопоточной задаче я получаю ошибку сокета.

Saw 1 exceptions within threads (OSError):

Thread args: {'kwargs': {'echo': None,
            'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>,
            'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>},
 'target': <bound method Runner.handle_stdin of <fabric.runners.Remote object at 0x7fcad97aeed0>>}

Traceback (most recent call last):

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/util.py", line 233, in run
    super(ExceptionHandlingThread, self).run()

  File "/usr/lib64/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 694, in handle_stdin
    self.write_proc_stdin(data)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 832, in write_proc_stdin
    self._write_proc_stdin(data.encode(self.encoding))

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/fabric/runners.py", line 67, in _write_proc_stdin
    return self.channel.sendall(data)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 846, in sendall
    sent = self.send(s)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 801, in send
    return self._send(s, m)

  File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 1198, in _send
    raise socket.error("Socket is closed")

OSError: Socket is closed

У меня была такая же проблема с 2.4.0. Я использовал fab в задаче с сельдереем. По какой-то причине обновление до 2.5.0 решило эту проблему.

Эта проблема также может быть связана со средами Windows или WSL. У нас была такая же трассировка стека с использованием последней версии Ubuntu WSL в последней версии Windows 10, и мы решили ее, запустив наши задачи в macOS.
Обновление или понижение версии Fabric и / или вызов, как упомянуто выше, не помогли нам.

Странно то, что большинство задач также работали на WSL, только очень длинная задача (многие команды run ()) завершилась ошибкой с этим исключением недетерминированно, то есть после выполнения некоторого неопределенного числа команд.

Я так рад, что смог это найти.

При дальнейшем исследовании он также может быть связан с классом Responder. Мы использовали ответчик, чтобы ответить «да» на пару быстрых последовательных команд .run (), и это не помогло бы на WSL. Удаление объектов Responder и вызов «yes | the-command» вместо этого работали и на WSL.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

supriyopaul picture supriyopaul  ·  4Комментарии

SamuelMarks picture SamuelMarks  ·  3Комментарии

Grazfather picture Grazfather  ·  4Комментарии

shadyabhi picture shadyabhi  ·  5Комментарии

jamesob picture jamesob  ·  3Комментарии