Skip to content

Commit

Permalink
code: add wait for remote CLI in X11 support
Browse files Browse the repository at this point in the history
- and only do this when CLI was created non-async, rather than
whenever we don't have a tty.

Signed-off-by: Christian Hopps <chopps@labn.net>
  • Loading branch information
choppsv1 committed Sep 14, 2024
1 parent f8dbefc commit 7a41244
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
35 changes: 30 additions & 5 deletions munet/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,7 @@ def flush(self):
await writer.drain()


async def remote_cli(unet, prompt, title, background):
async def remote_cli(unet, prompt, title, background, remote_wait=False):
"""Open a CLI in a new window."""
try:
if not unet.cli_sockpath:
Expand All @@ -756,7 +756,9 @@ async def remote_cli(unet, prompt, title, background):
unet.cli_sockpath = sockpath
logging.info("server created on :\n%s\n", sockpath)

wait_tmux = bool(os.getenv("TMUX", "")) and not sys.stdin.isatty()
if remote_wait:
wait_tmux = bool(os.getenv("TMUX", ""))
wait_x11 = not wait_tmux and bool(os.getenv("DISPLAY", ""))

# Open a new window with a new CLI
python_path = await unet.async_get_exec_path(["python3", "python"])
Expand All @@ -778,14 +780,21 @@ async def remote_cli(unet, prompt, title, background):
if channel is not None:
Commander.tmux_wait_gen += 1

unet.run_in_window(cmd, title=title, background=False, wait_for=channel)
pane_info = unet.run_in_window(
cmd, title=title, background=False, wait_for=channel
)

if wait_tmux and channel:
from .base import commander # pylint: disable=import-outside-toplevel

logger.debug("Waiting on TMUX CLI window")
await commander.async_cmd_raises(
[commander.get_exec_path("tmux"), "wait", channel]
)
elif wait_x11 and isinstance(pane_info, subprocess.Popen):
logger.debug("Waiting on xterm CLI process %s", pane_info)
if hasattr(asyncio, "to_thread"):
await asyncio.to_thread(pane_info.wait) # pylint: disable=no-member
except Exception as error:
logging.error("cli server: unexpected exception: %s", error)

Expand Down Expand Up @@ -926,8 +935,22 @@ def cli(
prompt=None,
background=True,
):
# In the case of no tty a remote_cli will be used, and we want it to wait on finish
# of the spawned cli.py script, otherwise it returns back here and exits async loop
# which kills the server side CLI socket operation.
remote_wait = not sys.stdin.isatty()

asyncio.run(
async_cli(unet, histfile, sockpath, force_window, title, prompt, background)
async_cli(
unet,
histfile,
sockpath,
force_window,
title,
prompt,
background,
remote_wait=remote_wait,
)
)


Expand All @@ -939,12 +962,14 @@ async def async_cli(
title=None,
prompt=None,
background=True,
remote_wait=False,
):
if prompt is None:
prompt = "munet> "

if force_window or not sys.stdin.isatty():
await remote_cli(unet, prompt, title, background)
await remote_cli(unet, prompt, title, background, remote_wait)
return

if not unet:
logger.debug("client-cli using sockpath %s", sockpath)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "munet"
version = "0.14.13"
version = "0.14.14"
description = "A package to facilitate network simulations"
authors = ["Christian Hopps <chopps@labn.net>"]
license = "GPL-2.0-or-later"
Expand Down

0 comments on commit 7a41244

Please sign in to comment.