From 49e3e7f9e83a5fced6c666d724cbc3edc0d362d0 Mon Sep 17 00:00:00 2001 From: Marc Hartmayer Date: Thu, 28 Sep 2023 17:37:08 +0200 Subject: [PATCH] virsh: add `console --resume` support This patch adds the command line flag `--resume` to the `virsh console` command. This resumes a paused guest after connecting to the console. This might be handy since it's a "common" pattern to start a guest paused, connect to the console, and then resume it so as not to miss any console messages. Reviewed-by: Boris Fiuczynski Signed-off-by: Marc Hartmayer Signed-off-by: Michal Privoznik Reviewed-by: Thomas Huth Reviewed-by: Michal Privoznik --- docs/manpages/virsh.rst | 5 ++++- tools/virsh-console.c | 9 +++++++++ tools/virsh-console.h | 1 + tools/virsh-domain.c | 14 ++++++++++---- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index c425974912..3e7a4c6c22 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -1442,7 +1442,7 @@ console :: - console domain [devname] [--safe] [--force] + console domain [devname] [--safe] [--force] [--resume] Connect the virtual serial console for the guest. The optional *devname* parameter refers to the device alias of an alternate @@ -1455,6 +1455,9 @@ the server has to ensure exclusive access to console devices. Optionally the *--force* flag may be specified, requesting to disconnect any existing sessions, such as in a case of a broken connection. +If the flag *--resume* is specified then the guest is resumed after connecting +to the console. + cpu-stats --------- diff --git a/tools/virsh-console.c b/tools/virsh-console.c index 6bfb44a190..7c561a11f3 100644 --- a/tools/virsh-console.c +++ b/tools/virsh-console.c @@ -401,6 +401,7 @@ int virshRunConsole(vshControl *ctl, virDomainPtr dom, const char *dev_name, + const bool resume_domain, unsigned int flags) { virConsole *con = NULL; @@ -476,6 +477,14 @@ virshRunConsole(vshControl *ctl, goto cleanup; } + if (resume_domain) { + if (virDomainResume(dom) != 0) { + vshError(ctl, _("Failed to resume domain '%1$s'"), + virDomainGetName(dom)); + goto cleanup; + } + } + while (!con->quit) { if (virCondWait(&con->cond, &con->parent.lock) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/tools/virsh-console.h b/tools/virsh-console.h index e89484d24b..2d00ed90cf 100644 --- a/tools/virsh-console.h +++ b/tools/virsh-console.h @@ -27,6 +27,7 @@ int virshRunConsole(vshControl *ctl, virDomainPtr dom, const char *dev_name, + const bool resume_domain, unsigned int flags); #endif /* !WIN32 */ diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 7abafe2ba3..5c3c6d18ae 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -3012,6 +3012,10 @@ static const vshCmdOptDef opts_console[] = { .type = VSH_OT_BOOL, .help = N_("force console connection (disconnect already connected sessions)") }, + {.name = "resume", + .type = VSH_OT_BOOL, + .help = N_("resume a paused guest after connecting to console") + }, {.name = "safe", .type = VSH_OT_BOOL, .help = N_("only connect if safe console handling is supported") @@ -3022,6 +3026,7 @@ static const vshCmdOptDef opts_console[] = { static bool cmdRunConsole(vshControl *ctl, virDomainPtr dom, const char *name, + const bool resume_domain, unsigned int flags) { int state; @@ -3048,7 +3053,7 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom, vshPrintExtra(ctl, " (Ctrl + %c)", priv->escapeChar[1]); vshPrintExtra(ctl, "\n"); fflush(stdout); - if (virshRunConsole(ctl, dom, name, flags) == 0) + if (virshRunConsole(ctl, dom, name, resume_domain, flags) == 0) return true; return false; @@ -3059,6 +3064,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd) { g_autoptr(virshDomain) dom = NULL; bool force = vshCommandOptBool(cmd, "force"); + bool resume = vshCommandOptBool(cmd, "resume"); bool safe = vshCommandOptBool(cmd, "safe"); unsigned int flags = 0; const char *name = NULL; @@ -3074,7 +3080,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd) if (safe) flags |= VIR_DOMAIN_CONSOLE_SAFE; - return cmdRunConsole(ctl, dom, name, flags); + return cmdRunConsole(ctl, dom, name, resume, flags); } #endif /* WIN32 */ @@ -4136,7 +4142,7 @@ cmdStart(vshControl *ctl, const vshCmd *cmd) vshPrintExtra(ctl, _("Domain '%1$s' started\n"), virDomainGetName(dom)); #ifndef WIN32 - if (console && !cmdRunConsole(ctl, dom, NULL, 0)) + if (console && !cmdRunConsole(ctl, dom, NULL, false, 0)) return false; #endif @@ -8232,7 +8238,7 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd) virDomainGetName(dom), from); #ifndef WIN32 if (console) - cmdRunConsole(ctl, dom, NULL, 0); + cmdRunConsole(ctl, dom, NULL, false, 0); #endif return true; }