|
|
@ -215,21 +215,22 @@ class Process(object):
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _start_slave(mitogen_, src_id, args):
|
|
|
|
@mitogen.core.takes_router
|
|
|
|
|
|
|
|
def _start_slave(src_id, args, router):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
This runs in the target context, it is invoked by _fakessh_main running in
|
|
|
|
This runs in the target context, it is invoked by _fakessh_main running in
|
|
|
|
the fakessh context immediately after startup. It starts the slave process
|
|
|
|
the fakessh context immediately after startup. It starts the slave process
|
|
|
|
(the the point where it has a stdin_handle to target but not stdout_chan to
|
|
|
|
(the the point where it has a stdin_handle to target but not stdout_chan to
|
|
|
|
write to), and waits for main to.
|
|
|
|
write to), and waits for main to.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
LOG.debug('_start_slave(%r, %r)', mitogen_, args)
|
|
|
|
LOG.debug('_start_slave(%r, %r)', router, args)
|
|
|
|
|
|
|
|
|
|
|
|
proc = subprocess.Popen(args,
|
|
|
|
proc = subprocess.Popen(args,
|
|
|
|
stdin=subprocess.PIPE,
|
|
|
|
stdin=subprocess.PIPE,
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
process = Process(mitogen_.router,
|
|
|
|
process = Process(router,
|
|
|
|
proc.stdin.fileno(),
|
|
|
|
proc.stdin.fileno(),
|
|
|
|
proc.stdout.fileno(),
|
|
|
|
proc.stdout.fileno(),
|
|
|
|
proc,
|
|
|
|
proc,
|
|
|
@ -276,7 +277,8 @@ def parse_args():
|
|
|
|
return hostname, allopts, args
|
|
|
|
return hostname, allopts, args
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _fakessh_main(mitogen_, dest_context_id):
|
|
|
|
@mitogen.core.takes_econtext
|
|
|
|
|
|
|
|
def _fakessh_main(dest_context_id, econtext):
|
|
|
|
hostname, opts, args = parse_args()
|
|
|
|
hostname, opts, args = parse_args()
|
|
|
|
if not hostname:
|
|
|
|
if not hostname:
|
|
|
|
die('Missing hostname')
|
|
|
|
die('Missing hostname')
|
|
|
@ -295,14 +297,15 @@ def _fakessh_main(mitogen_, dest_context_id):
|
|
|
|
if subsystem:
|
|
|
|
if subsystem:
|
|
|
|
die('-s <subsystem> is not yet supported')
|
|
|
|
die('-s <subsystem> is not yet supported')
|
|
|
|
|
|
|
|
|
|
|
|
dest = mitogen.master.Context(mitogen_.router, dest_context_id)
|
|
|
|
dest = mitogen.master.Context(econtext.router, dest_context_id)
|
|
|
|
control_handle, stdin_handle = dest.call_with_deadline(None, True,
|
|
|
|
|
|
|
|
_start_slave, mitogen.context_id, args)
|
|
|
|
control_handle, stdin_handle = dest.call(_start_slave,
|
|
|
|
|
|
|
|
mitogen.context_id, args)
|
|
|
|
|
|
|
|
|
|
|
|
LOG.debug('_fakessh_main: received control_handle=%r, stdin_handle=%r',
|
|
|
|
LOG.debug('_fakessh_main: received control_handle=%r, stdin_handle=%r',
|
|
|
|
control_handle, stdin_handle)
|
|
|
|
control_handle, stdin_handle)
|
|
|
|
|
|
|
|
|
|
|
|
process = Process(mitogen_.router, 1, 0)
|
|
|
|
process = Process(econtext.router, 1, 0)
|
|
|
|
process.start_master(
|
|
|
|
process.start_master(
|
|
|
|
stdin=mitogen.core.Sender(dest, stdin_handle),
|
|
|
|
stdin=mitogen.core.Sender(dest, stdin_handle),
|
|
|
|
control=mitogen.core.Sender(dest, control_handle),
|
|
|
|
control=mitogen.core.Sender(dest, control_handle),
|
|
|
@ -352,7 +355,7 @@ def run(dest, router, args, deadline=None, econtext=None):
|
|
|
|
router.register(fakessh, stream)
|
|
|
|
router.register(fakessh, stream)
|
|
|
|
|
|
|
|
|
|
|
|
# Held in socket buffer until process is booted.
|
|
|
|
# Held in socket buffer until process is booted.
|
|
|
|
fakessh.call_async(True, _fakessh_main, dest.context_id)
|
|
|
|
fakessh.call_async(_fakessh_main, dest.context_id)
|
|
|
|
|
|
|
|
|
|
|
|
tmp_path = tempfile.mkdtemp(prefix='mitogen_fakessh')
|
|
|
|
tmp_path = tempfile.mkdtemp(prefix='mitogen_fakessh')
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|