From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822095; cv=none; d=zohomail.com; s=zohoarc; b=YBSLfkQ4LkC8Oqgd0L2UdZD1l7sgRVRkPXwX9bA+OH4OqoxHomvWb2oXD+3n3IickFyPK8jVEbi+PUfasl3vxw5tiyMyT1ZNrCGLmo/hVcaj+GLvsL6hdcL2s0QseLKnhFrqXO5woOlxyWJ1Z/tYS+a2XvWzmiGNIgC8RpD21kI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822095; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=3tzMh6vunedueKAkWuJSklNk/8Jmq3WAiBCdWX27oOE=; b=Kna2qBjfyk9PYt9XlNhySiqPU37lDK33L/LGV+L4k0q9+2H2TO4BE3jAxqaAWfEa8Kbiw6+uLLEdo79zM4/oWxsATRG7DMNpYq8xgevxPyYUaBup/xjGjKlWxb858MwxUVdnRrQwd+iHwkFEUZ2nVufliV51Nuzd27ncb3M7xy4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1596822095238290.54518506656643; Fri, 7 Aug 2020 10:41:35 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-246-pORMGlT6Pj2xr0o3CaiekQ-1; Fri, 07 Aug 2020 13:41:31 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5C65C8014C1; Fri, 7 Aug 2020 17:41:25 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 86F441A919; Fri, 7 Aug 2020 17:41:23 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3FFB01809554; Fri, 7 Aug 2020 17:41:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077Hf6ZQ017649 for ; Fri, 7 Aug 2020 13:41:06 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6CB185D9D5; Fri, 7 Aug 2020 17:41:06 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3958A5DA36; Fri, 7 Aug 2020 17:41:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822093; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=3tzMh6vunedueKAkWuJSklNk/8Jmq3WAiBCdWX27oOE=; b=V6mtpS5MXrfp9QbF7ExXZWn1+yNNVJbzip0Tjd7RYnQBw2MX8tiFOdS6KQK3Q1nvqbpnDh OX/cZs+zeMFxNaVdwHVBez5+Zy4qI92rbqKHt6WUCO7+KskfZ/0AWCKRp+eoM51UOZ05j/ G5vyFYP/qon8DM/WkZH6znr4kmrj+Js= X-MC-Unique: pORMGlT6Pj2xr0o3CaiekQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 01/11] rpc: merge logic for generating remote SSH shell script Date: Fri, 7 Aug 2020 18:40:49 +0100 Message-Id: <20200807174059.312786-2-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Three parts of the code all build up the same SSH shell script snippet for remote tunneling the RPC protocol, but in slightly different ways. Combine them all into one helper method in the virNetClient code, since this logic doesn't really belong in the virNetSocket code. Note that the this change means the shell snippet is passed to the SSH binary as a single arg, instead of three separate args, but this is functionally identical, as the three separate args were combined into one already when passed to the remote system. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/libvirt_remote.syms | 1 + src/rpc/virnetclient.c | 108 ++++++++++++++++++++------------------- src/rpc/virnetclient.h | 3 ++ src/rpc/virnetsocket.c | 37 +------------- src/rpc/virnetsocket.h | 3 +- tests/virnetsockettest.c | 9 +++- 6 files changed, 69 insertions(+), 92 deletions(-) diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms index 0018a0c41d..0b00bce1fa 100644 --- a/src/libvirt_remote.syms +++ b/src/libvirt_remote.syms @@ -42,6 +42,7 @@ virNetClientSendStream; virNetClientSendWithReply; virNetClientSetCloseCallback; virNetClientSetTLSSession; +virNetClientSSHHelperCommand; =20 =20 # rpc/virnetclientprogram.h diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 441f1502a6..bd818df953 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -391,28 +391,74 @@ virNetClientPtr virNetClientNewTCP(const char *nodena= me, return virNetClientNew(sock, nodename); } =20 + +/* + * The SSH Server uses shell to spawn the command we give + * it. Our command then invokes shell again. Thus we need + * to apply two levels of escaping, so that commands with + * whitespace in their path get correctly interpreted. + */ +static char * +virNetClientDoubleEscapeShell(const char *str) +{ + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + g_autofree char *tmp =3D NULL; + + virBufferEscapeShell(&buf, str); + + tmp =3D virBufferContentAndReset(&buf); + + virBufferEscapeShell(&buf, tmp); + + return virBufferContentAndReset(&buf); +} + +char * +virNetClientSSHHelperCommand(const char *netcatPath, + const char *socketPath) +{ + g_autofree char *netcatPathSafe =3D virNetClientDoubleEscapeShell(netc= atPath); + + return g_strdup_printf( + "sh -c " + "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1;= then " + "ARG=3D-q0;" + "else " + "ARG=3D;" + "fi;" + "'%s' $ARG -U %s'", + netcatPathSafe, netcatPathSafe, socketPath); +} + + +#define DEFAULT_VALUE(VAR, VAL) \ + if (!VAR) \ + VAR =3D VAL; + virNetClientPtr virNetClientNewSSH(const char *nodename, const char *service, const char *binary, const char *username, bool noTTY, bool noVerify, - const char *netcat, + const char *netcatPath, const char *keyfile, - const char *path) + const char *socketPath) { virNetSocketPtr sock; + g_autofree char *command =3D NULL; + + DEFAULT_VALUE(netcatPath, "nc"); + + command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); =20 if (virNetSocketNewConnectSSH(nodename, service, binary, username, noT= TY, - noVerify, netcat, keyfile, path, &sock) = < 0) + noVerify, keyfile, command, &sock) < 0) return NULL; =20 return virNetClientNew(sock, NULL); } =20 -#define DEFAULT_VALUE(VAR, VAL) \ - if (!VAR) \ - VAR =3D VAL; virNetClientPtr virNetClientNewLibSSH2(const char *host, const char *port, int family, @@ -427,11 +473,7 @@ virNetClientPtr virNetClientNewLibSSH2(const char *hos= t, virURIPtr uri) { virNetSocketPtr sock =3D NULL; - - g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; - g_autofree char *nc =3D NULL; g_autofree char *command =3D NULL; - g_autofree char *homedir =3D NULL; g_autofree char *confdir =3D NULL; g_autofree char *knownhosts =3D NULL; @@ -442,9 +484,7 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host, knownhosts =3D g_strdup(knownHostsPath); } else { confdir =3D virGetUserConfigDirectory(); - virBufferAsprintf(&buf, "%s/known_hosts", confdir); - if (!(knownhosts =3D virBufferContentAndReset(&buf))) - return NULL; + knownhosts =3D g_strdup_printf("%s/known_hosts", confdir); } =20 if (privkeyPath) { @@ -468,26 +508,7 @@ virNetClientPtr virNetClientNewLibSSH2(const char *hos= t, DEFAULT_VALUE(netcatPath, "nc"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 - virBufferEscapeShell(&buf, netcatPath); - if (!(nc =3D virBufferContentAndReset(&buf))) - return NULL; - virBufferEscapeShell(&buf, nc); - VIR_FREE(nc); - if (!(nc =3D virBufferContentAndReset(&buf))) - return NULL; - - virBufferAsprintf(&buf, - "sh -c " - "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1= ; then " - "ARG=3D-q0;" - "else " - "ARG=3D;" - "fi;" - "'%s' $ARG -U %s'", - nc, nc, socketPath); - - if (!(command =3D virBufferContentAndReset(&buf))) - return NULL; + command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); =20 if (virNetSocketNewConnectLibSSH2(host, port, family, @@ -498,11 +519,7 @@ virNetClientPtr virNetClientNewLibSSH2(const char *hos= t, =20 return virNetClientNew(sock, NULL); } -#undef DEFAULT_VALUE =20 -#define DEFAULT_VALUE(VAR, VAL) \ - if (!VAR) \ - VAR =3D VAL; virNetClientPtr virNetClientNewLibssh(const char *host, const char *port, int family, @@ -517,11 +534,7 @@ virNetClientPtr virNetClientNewLibssh(const char *host, virURIPtr uri) { virNetSocketPtr sock =3D NULL; - - g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; - g_autofree char *nc =3D NULL; g_autofree char *command =3D NULL; - g_autofree char *homedir =3D NULL; g_autofree char *confdir =3D NULL; g_autofree char *knownhosts =3D NULL; @@ -556,18 +569,7 @@ virNetClientPtr virNetClientNewLibssh(const char *host, DEFAULT_VALUE(netcatPath, "nc"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 - virBufferEscapeShell(&buf, netcatPath); - if (!(nc =3D virBufferContentAndReset(&buf))) - return NULL; - virBufferEscapeShell(&buf, nc); - VIR_FREE(nc); - if (!(nc =3D virBufferContentAndReset(&buf))) - return NULL; - - command =3D g_strdup_printf("sh -c " - "'if '%s' -q 2>&1 | grep \"requires an argum= ent\" >/dev/null 2>&1; then " - "ARG=3D-q0;" "else " "ARG=3D;" "fi;" "'%s' $= ARG -U %s'", nc, nc, - socketPath); + command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); =20 if (virNetSocketNewConnectLibssh(host, port, family, diff --git a/src/rpc/virnetclient.h b/src/rpc/virnetclient.h index 778910b575..0005de46f3 100644 --- a/src/rpc/virnetclient.h +++ b/src/rpc/virnetclient.h @@ -30,6 +30,9 @@ #include "virobject.h" #include "viruri.h" =20 +char * +virNetClientSSHHelperCommand(const char *netcatPath, + const char *socketPath); =20 virNetClientPtr virNetClientNewUNIX(const char *path, bool spawnDaemon, diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index 977d2875fe..485e8229a8 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -862,14 +862,11 @@ int virNetSocketNewConnectSSH(const char *nodename, const char *username, bool noTTY, bool noVerify, - const char *netcat, const char *keyfile, - const char *path, + const char *command, virNetSocketPtr *retsock) { - char *quoted; virCommandPtr cmd; - g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; =20 *retsock =3D NULL; =20 @@ -894,38 +891,8 @@ int virNetSocketNewConnectSSH(const char *nodename, if (noVerify) virCommandAddArgList(cmd, "-o", "StrictHostKeyChecking=3Dno", NULL= ); =20 - if (!netcat) - netcat =3D "nc"; - - virCommandAddArgList(cmd, "--", nodename, "sh", "-c", NULL); - - virBufferEscapeShell(&buf, netcat); - quoted =3D virBufferContentAndReset(&buf); + virCommandAddArgList(cmd, "--", nodename, command, NULL); =20 - virBufferEscapeShell(&buf, quoted); - VIR_FREE(quoted); - quoted =3D virBufferContentAndReset(&buf); - - /* - * This ugly thing is a shell script to detect availability of - * the -q option for 'nc': debian and suse based distros need this - * flag to ensure the remote nc will exit on EOF, so it will go away - * when we close the connection tunnel. If it doesn't go away, subsequ= ent - * connection attempts will hang. - * - * Fedora's 'nc' doesn't have this option, and defaults to the desired - * behavior. - */ - virCommandAddArgFormat(cmd, - "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1= ; then " - "ARG=3D-q0;" - "else " - "ARG=3D;" - "fi;" - "'%s' $ARG -U %s'", - quoted, quoted, path); - - VIR_FREE(quoted); return virNetSocketNewConnectCommand(cmd, retsock); } =20 diff --git a/src/rpc/virnetsocket.h b/src/rpc/virnetsocket.h index f2b74f3ccb..d39b270480 100644 --- a/src/rpc/virnetsocket.h +++ b/src/rpc/virnetsocket.h @@ -78,9 +78,8 @@ int virNetSocketNewConnectSSH(const char *nodename, const char *username, bool noTTY, bool noVerify, - const char *netcat, const char *keyfile, - const char *path, + const char *command, virNetSocketPtr *addr); =20 int virNetSocketNewConnectLibSSH2(const char *host, diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 96c582216c..31fe1f86f4 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -32,6 +32,7 @@ #include "virstring.h" =20 #include "rpc/virnetsocket.h" +#include "rpc/virnetclient.h" =20 #define VIR_FROM_THIS VIR_FROM_RPC =20 @@ -468,6 +469,8 @@ static int testSocketSSH(const void *opaque) virNetSocketPtr csock =3D NULL; /* Client socket */ int ret =3D -1; char buf[1024]; + g_autofree char *command =3D virNetClientSSHHelperCommand(data->netcat, + data->path); =20 if (virNetSocketNewConnectSSH(data->nodename, data->service, @@ -475,9 +478,8 @@ static int testSocketSSH(const void *opaque) data->username, data->noTTY, data->noVerify, - data->netcat, data->keyfile, - data->path, + command, &csock) < 0) goto cleanup; =20 @@ -575,6 +577,7 @@ mymain(void) struct testSSHData sshData1 =3D { .nodename =3D "somehost", .path =3D "/tmp/socket", + .netcat =3D "nc", .expectOut =3D "-T -e none -- somehost sh -c '" "if 'nc' -q 2>&1 | grep \"requires an argument\" >/de= v/null 2>&1; then " "ARG=3D-q0;" @@ -635,6 +638,7 @@ mymain(void) struct testSSHData sshData5 =3D { .nodename =3D "crashyhost", .path =3D "/tmp/socket", + .netcat =3D "nc", .expectOut =3D "-T -e none -- crashyhost sh -c " "'if 'nc' -q 2>&1 | grep \"requires an argument\" >/d= ev/null 2>&1; then " "ARG=3D-q0;" @@ -650,6 +654,7 @@ mymain(void) struct testSSHData sshData6 =3D { .nodename =3D "example.com", .path =3D "/tmp/socket", + .netcat =3D "nc", .keyfile =3D "/root/.ssh/example_key", .noVerify =3D true, .expectOut =3D "-i /root/.ssh/example_key -T -e none -o StrictHost= KeyChecking=3Dno -- example.com sh -c '" --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822105; cv=none; d=zohomail.com; s=zohoarc; b=DRwkRZzFUbR5jxsPyAC2+XsEaCnzB0InLKXbMhAfox6ElPh467SCgNG6qi0PjJExzn21cEhHez0oKBN+NZww3dMpLBr/BNl4KES18+pGfZ5cJ+PNrbHWrhu/M/HJrNR9ZCTfoG8gFjdZPDkBew8PvFUgCfkgcBRQbpH6cT4J8zk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822105; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pdQpj6h6Y8lKuPuM7iJeOZh+C1yC9paCjTtT9x08HkE=; b=H1KhNIc52LJ3x71R9vklN0qIsqqgGqgBTjidZ+LAoh5cIE6Hdcx4oWJEFycFdKBtMSaYyBoR+2MU3NiBqMLCDWBM6J2lQ9rCOM5v7EduqqIiOjd44pSQ5h0vnYailT7knxqa6Hned9PrROej79TiUKW0Y8si1ZALiASLpSRdOMQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 15968221055161020.2607851708484; Fri, 7 Aug 2020 10:41:45 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-342-H7NgtscQMGyIOr3bnbiUcg-1; Fri, 07 Aug 2020 13:41:41 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 12F5C101C8A5; Fri, 7 Aug 2020 17:41:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E48592DE7F; Fri, 7 Aug 2020 17:41:35 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6D9B99693C; Fri, 7 Aug 2020 17:41:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077Hf7iM017660 for ; Fri, 7 Aug 2020 13:41:07 -0400 Received: by smtp.corp.redhat.com (Postfix) id C81945DA30; Fri, 7 Aug 2020 17:41:07 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id DCAC05D9D5; Fri, 7 Aug 2020 17:41:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822104; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=pdQpj6h6Y8lKuPuM7iJeOZh+C1yC9paCjTtT9x08HkE=; b=WgLe2g3Z46QTl8uFO0cbmdG/lkp6jZPdXGC3qoiU7Qb+xzeoBRa1h2oew3+Hdu+1u19Ts1 7TasRfIqy7zr82S4EuQVOiY+NvVQ86TnSBfBmBUjaFVFxaWfblhHJ7mcadSDPoXFpMgiWg jD2pwg3xiPkb1/GE5Cru0JzAROrNXsI= X-MC-Unique: H7NgtscQMGyIOr3bnbiUcg-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 02/11] remote: push logic for default netcat binary into common helper Date: Fri, 7 Aug 2020 18:40:50 +0100 Message-Id: <20200807174059.312786-3-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) We don't want to repeat the choice of default netcat binary setting in three different places. This will also make it possible to do better error reporting in the helper. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 2 +- src/rpc/virnetclient.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 0331060a2d..f511a9bc33 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1226,7 +1226,7 @@ doRemoteOpen(virConnectPtr conn, username, !tty, !verify, - netcat ? netcat : "nc", + netcat, keyfile, sockname))) goto failed; diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index bd818df953..f65cda0d7f 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -419,6 +419,9 @@ virNetClientSSHHelperCommand(const char *netcatPath, { g_autofree char *netcatPathSafe =3D virNetClientDoubleEscapeShell(netc= atPath); =20 + if (!netcatPath) + netcatPath =3D "nc"; + return g_strdup_printf( "sh -c " "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1;= then " @@ -505,7 +508,6 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host, DEFAULT_VALUE(host, "localhost"); DEFAULT_VALUE(port, "22"); DEFAULT_VALUE(username, "root"); - DEFAULT_VALUE(netcatPath, "nc"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); @@ -566,7 +568,6 @@ virNetClientPtr virNetClientNewLibssh(const char *host, DEFAULT_VALUE(host, "localhost"); DEFAULT_VALUE(port, "22"); DEFAULT_VALUE(username, "root"); - DEFAULT_VALUE(netcatPath, "nc"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822107; cv=none; d=zohomail.com; s=zohoarc; b=N07AZ9hVD59juXcjN5Vxs/FlR5YMymXNR51o+ErcFOdhJ2uwGhwnPfc4Qryd2+JfilNf8vU1DB3yB1IFXusqRkJn6OlPeeZ4wzJRjNMLsj6bOvcKzPmdHoky0RRjl00fIngt91rcDYPukTgBnPynAgtmZ8HCvGlvgw++ep1h2EA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822107; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=M6ertR1txzIHXhCOvBtrSIayh4BparvgxFV7ZJMKVXc=; b=YTOGKyOv0KXlToZFgQTbwRyo7YPhdtauauTd3qlBpUKYYDkGtsSr3FBt8HtBZZBJ0RnOSORZxrF9ELYTTOtjeWJHAN2C5ycgYuG9fygtfcIfsYsjKVxh58SXGOtwbUzavQqEPsGcqICLNohmyThmP9SB80MNT3+bMay6Q1JO+00= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1596822107712536.9896616902945; Fri, 7 Aug 2020 10:41:47 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-321-6Jp_Bu5wNxmwDp9e8Q_1LA-1; Fri, 07 Aug 2020 13:41:43 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B2DD0800476; Fri, 7 Aug 2020 17:41:38 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9351A712DB; Fri, 7 Aug 2020 17:41:38 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 632589A11C; Fri, 7 Aug 2020 17:41:38 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077Hf9Fs017672 for ; Fri, 7 Aug 2020 13:41:09 -0400 Received: by smtp.corp.redhat.com (Postfix) id 022065D9E8; Fri, 7 Aug 2020 17:41:09 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 23B145D9D5; Fri, 7 Aug 2020 17:41:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822106; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=M6ertR1txzIHXhCOvBtrSIayh4BparvgxFV7ZJMKVXc=; b=Qqq+M8RPSWTj5ifeiTCwtElD88LNdBaktZlp5FBvOD2MkwScmujx/WNnVA9snLoAuoiR6M JTXxdITtGvZ+geZuTIwoAPpiUm/kZ9KRaipuirlZgosrZ7MPkj+L3llS//myaOOgU/tfUQ 22z2sCHslmZwWOhzvineqUTKujIZFHo= X-MC-Unique: 6Jp_Bu5wNxmwDp9e8Q_1LA-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 03/11] remote: split off enums into separate source file Date: Fri, 7 Aug 2020 18:40:51 +0100 Message-Id: <20200807174059.312786-4-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) The remoteDriverTransport and remoteDriverMode enums are going to be needed by source files beyond the remote driver client. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/meson.build | 1 + src/remote/remote_driver.c | 41 +----------------------------- src/remote/remote_sockets.c | 39 +++++++++++++++++++++++++++++ src/remote/remote_sockets.h | 50 +++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 40 deletions(-) create mode 100644 src/remote/remote_sockets.c create mode 100644 src/remote/remote_sockets.h diff --git a/src/remote/meson.build b/src/remote/meson.build index 5983238a0a..91dd587cba 100644 --- a/src/remote/meson.build +++ b/src/remote/meson.build @@ -1,5 +1,6 @@ remote_driver_sources =3D [ 'remote_driver.c', + 'remote_sockets.c', ] =20 remote_driver_generated =3D [] diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index f511a9bc33..b214632bdf 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -38,6 +38,7 @@ #include "virbuffer.h" #include "remote_driver.h" #include "remote_protocol.h" +#include "remote_sockets.h" #include "lxc_protocol.h" #include "qemu_protocol.h" #include "viralloc.h" @@ -54,46 +55,6 @@ =20 VIR_LOG_INIT("remote.remote_driver"); =20 -typedef enum { - REMOTE_DRIVER_TRANSPORT_TLS, - REMOTE_DRIVER_TRANSPORT_UNIX, - REMOTE_DRIVER_TRANSPORT_SSH, - REMOTE_DRIVER_TRANSPORT_LIBSSH2, - REMOTE_DRIVER_TRANSPORT_EXT, - REMOTE_DRIVER_TRANSPORT_TCP, - REMOTE_DRIVER_TRANSPORT_LIBSSH, - - REMOTE_DRIVER_TRANSPORT_LAST, -} remoteDriverTransport; - -VIR_ENUM_DECL(remoteDriverTransport); -VIR_ENUM_IMPL(remoteDriverTransport, - REMOTE_DRIVER_TRANSPORT_LAST, - "tls", - "unix", - "ssh", - "libssh2", - "ext", - "tcp", - "libssh"); - -typedef enum { - /* Try to figure out the "best" choice magically */ - REMOTE_DRIVER_MODE_AUTO, - /* Always use the legacy libvirtd */ - REMOTE_DRIVER_MODE_LEGACY, - /* Always use the per-driver virt*d daemons */ - REMOTE_DRIVER_MODE_DIRECT, - - REMOTE_DRIVER_MODE_LAST -} remoteDriverMode; - -VIR_ENUM_DECL(remoteDriverMode); -VIR_ENUM_IMPL(remoteDriverMode, - REMOTE_DRIVER_MODE_LAST, - "auto", - "legacy", - "direct"); =20 #if SIZEOF_LONG < 8 # define HYPER_TO_TYPE(_type, _to, _from) \ diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c new file mode 100644 index 0000000000..0662cbad14 --- /dev/null +++ b/src/remote/remote_sockets.c @@ -0,0 +1,39 @@ +/* + * remote_sockets.c: helpers for getting remote driver socket paths + * + * Copyright (C) 2007-2019 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "remote_sockets.h" + +VIR_ENUM_IMPL(remoteDriverTransport, + REMOTE_DRIVER_TRANSPORT_LAST, + "tls", + "unix", + "ssh", + "libssh2", + "ext", + "tcp", + "libssh"); + +VIR_ENUM_IMPL(remoteDriverMode, + REMOTE_DRIVER_MODE_LAST, + "auto", + "legacy", + "direct"); diff --git a/src/remote/remote_sockets.h b/src/remote/remote_sockets.h new file mode 100644 index 0000000000..1d4ae3f9c1 --- /dev/null +++ b/src/remote/remote_sockets.h @@ -0,0 +1,50 @@ +/* + * remote_sockets.h: helpers for getting remote driver socket paths + * + * Copyright (C) 2007-2020 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#pragma once + +#include "virenum.h" + +typedef enum { + REMOTE_DRIVER_TRANSPORT_TLS, + REMOTE_DRIVER_TRANSPORT_UNIX, + REMOTE_DRIVER_TRANSPORT_SSH, + REMOTE_DRIVER_TRANSPORT_LIBSSH2, + REMOTE_DRIVER_TRANSPORT_EXT, + REMOTE_DRIVER_TRANSPORT_TCP, + REMOTE_DRIVER_TRANSPORT_LIBSSH, + + REMOTE_DRIVER_TRANSPORT_LAST, +} remoteDriverTransport; + +VIR_ENUM_DECL(remoteDriverTransport); + +typedef enum { + /* Try to figure out the "best" choice magically */ + REMOTE_DRIVER_MODE_AUTO, + /* Always use the legacy libvirtd */ + REMOTE_DRIVER_MODE_LEGACY, + /* Always use the per-driver virt*d daemons */ + REMOTE_DRIVER_MODE_DIRECT, + + REMOTE_DRIVER_MODE_LAST +} remoteDriverMode; + +VIR_ENUM_DECL(remoteDriverMode); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822280; cv=none; d=zohomail.com; s=zohoarc; b=GNcxkXpYhSeMP6QPyOFKwz5V2RMy6UXmP7oLUdWBkIhvCDDqx/G+UdEXCrVvoIRUK0B0oXaOrDDPlqzJQflYzRrrF97Nn4LV3kDbM0vXcLIct0AQ/5ZSHgYEP5kqcuSdiU3Y/jvSEsV4quttNkLh4JlcMbqNZ/ZWLgza1caa2us= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822280; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=51rnCE45QbNnaoGmokqjLMZ9MUxmsJXKbo8zLYcyegI=; b=B00BgoxlR8NjjSIACPkKDwomBdE9kDUYRtwb+G+8Ok8FNdXZ8R7hVM7Pg9AcY2T0z4lfOYooOg5wvOnx2h7p3gREDGEnO/nf5VtF1zKESZ21r7OW7RXvKhIc9qCsiE0Xjy+L2HejD6ccsX7c92/gE/5I9ISPVI2c2t7vKYSwvlU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 15968222805431015.4487208828467; Fri, 7 Aug 2020 10:44:40 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-87-RDVLMK6DM5uTYYPSeUW4rQ-1; Fri, 07 Aug 2020 13:44:36 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 85CC2800474; Fri, 7 Aug 2020 17:44:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 65E4987A6F; Fri, 7 Aug 2020 17:44:30 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 34C41A552E; Fri, 7 Aug 2020 17:44:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfAao017680 for ; Fri, 7 Aug 2020 13:41:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3C3A55D9E8; Fri, 7 Aug 2020 17:41:10 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 58B0F5D9D5; Fri, 7 Aug 2020 17:41:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822279; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=51rnCE45QbNnaoGmokqjLMZ9MUxmsJXKbo8zLYcyegI=; b=KDHUrhGXZB1VO+2/O8F6AFyrp2H0TB8XC9BRGfu5fhCxeOKPmPtnnODFFS3v96nCzGR7Sa geLUB+CVRrXF7TyGIE+3+l4mde/3O4S8uEmPTnBuiJglkPWmSs+xJQ12ArpCmzFFG7wDKV 3o7T9Q0K3C2WP1cCAqfLJuOLRzRlwco= X-MC-Unique: RDVLMK6DM5uTYYPSeUW4rQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 04/11] remote: split out function for parsing URI scheme Date: Fri, 7 Aug 2020 18:40:52 +0100 Message-Id: <20200807174059.312786-5-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) The remoteSplitURISCheme method will be needed by source files beyond the remote driver client. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 25 ------------------------- src/remote/remote_sockets.c | 28 ++++++++++++++++++++++++++++ src/remote/remote_sockets.h | 6 ++++++ 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index b214632bdf..8952484b8e 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -165,31 +165,6 @@ static void make_nonnull_domain_snapshot(remote_nonnul= l_domain_snapshot *snapsho /*----------------------------------------------------------------------*/ =20 /* Helper functions for remoteOpen. */ -static int remoteSplitURIScheme(virURIPtr uri, - char **driver, - char **transport) -{ - char *p =3D strchr(uri->scheme, '+'); - - *driver =3D *transport =3D NULL; - - if (p) - *driver =3D g_strndup(uri->scheme, p - uri->scheme); - else - *driver =3D g_strdup(uri->scheme); - - if (p) { - *transport =3D g_strdup(p + 1); - - p =3D *transport; - while (*p) { - *p =3D g_ascii_tolower(*p); - p++; - } - } - - return 0; -} =20 =20 static int diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c index 0662cbad14..976124d0ed 100644 --- a/src/remote/remote_sockets.c +++ b/src/remote/remote_sockets.c @@ -37,3 +37,31 @@ VIR_ENUM_IMPL(remoteDriverMode, "auto", "legacy", "direct"); + + +int +remoteSplitURIScheme(virURIPtr uri, + char **driver, + char **transport) +{ + char *p =3D strchr(uri->scheme, '+'); + + *driver =3D *transport =3D NULL; + + if (p) + *driver =3D g_strndup(uri->scheme, p - uri->scheme); + else + *driver =3D g_strdup(uri->scheme); + + if (p) { + *transport =3D g_strdup(p + 1); + + p =3D *transport; + while (*p) { + *p =3D g_ascii_tolower(*p); + p++; + } + } + + return 0; +} diff --git a/src/remote/remote_sockets.h b/src/remote/remote_sockets.h index 1d4ae3f9c1..bef3cdada9 100644 --- a/src/remote/remote_sockets.h +++ b/src/remote/remote_sockets.h @@ -21,6 +21,7 @@ #pragma once =20 #include "virenum.h" +#include "viruri.h" =20 typedef enum { REMOTE_DRIVER_TRANSPORT_TLS, @@ -48,3 +49,8 @@ typedef enum { } remoteDriverMode; =20 VIR_ENUM_DECL(remoteDriverMode); + +int +remoteSplitURIScheme(virURIPtr uri, + char **driver, + char **transport); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822111; cv=none; d=zohomail.com; s=zohoarc; b=WQ20/B3EPnMrUYy0H7s8J/k7Y/uegJVhLpgYVom70ezjoelxA4jxfMjc9iQYdBpMxUfLdjQ1y8xJcrOs9D9tG5Ha9SLfYi9rwo00dHYAzgCkw8m4MVJmcYaeCWfJu0IFrG7tfz4a3kkJqfQgrF+3835dXKcIWCve8wqYyl+Dlbk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822111; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=4ePY7Z9fnpTMloSn8twmAor1mKWsPwYvfeo0fBUG7Tk=; b=gdqfpSs6SSUB60tC00C7lXZxUZ8jSnO4i+yCa85hboWA1TiqA4Npeo/1yD0D5uo+5oyRLr4kkGgSfzg5YbmeNqYQ+9F4PAc2GysvhXQeyd1h/w6sFCmcyRac0HfQE1AQ+qceFL04Icq0+50qCMDTUtz04Rbn+kMqcqfPOfLUzkw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1596822111547554.4184912779623; Fri, 7 Aug 2020 10:41:51 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-376-5YOnuSpCOjKQyYLE445d1g-1; Fri, 07 Aug 2020 13:41:47 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7DF2B800477; Fri, 7 Aug 2020 17:41:42 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5A02260BE2; Fri, 7 Aug 2020 17:41:42 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 28128A35B3; Fri, 7 Aug 2020 17:41:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfBf6017700 for ; Fri, 7 Aug 2020 13:41:11 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7C09C5D9E8; Fri, 7 Aug 2020 17:41:11 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8F9435DA36; Fri, 7 Aug 2020 17:41:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822110; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=4ePY7Z9fnpTMloSn8twmAor1mKWsPwYvfeo0fBUG7Tk=; b=WfYqR+M/ddpqqp/3kntdDMtUc48S/dl7E6/+LV0i1wiebFmP2EVSkVWhYhyzqkVO4RQtGq gJ8ILXbb08cCFtdKO+uMVd6MhgmFcUqs60bCPGeLZnC5bhi3ciM6i/0d/1ZATLy7wnKc1X GkbzO2irOb0SN7xqCOdWVye0jUCO5Q4= X-MC-Unique: 5YOnuSpCOjKQyYLE445d1g-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 05/11] remote: parse the remote transport string earlier Date: Fri, 7 Aug 2020 18:40:53 +0100 Message-Id: <20200807174059.312786-6-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) We delay converting the remote transport string to enum form until fairly late. As a result we're doing string comparisons when we could be just doing enum comparisons. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- po/POTFILES.in | 1 + src/remote/remote_driver.c | 51 ++++++++++--------------------------- src/remote/remote_sockets.c | 35 +++++++++++++++++++++---- src/remote/remote_sockets.h | 2 +- 4 files changed, 45 insertions(+), 44 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index c5b43df7b5..c4197604ef 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -181,6 +181,7 @@ @SRCDIR@src/remote/remote_daemon_dispatch.c @SRCDIR@src/remote/remote_daemon_stream.c @SRCDIR@src/remote/remote_driver.c +@SRCDIR@src/remote/remote_sockets.c @SRCDIR@src/rpc/virkeepalive.c @SRCDIR@src/rpc/virnetclient.c @SRCDIR@src/rpc/virnetclientprogram.c diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 8952484b8e..66d66c1284 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -863,12 +863,11 @@ static int doRemoteOpen(virConnectPtr conn, struct private_data *priv, const char *driver_str, - const char *transport_str, + remoteDriverTransport transport, virConnectAuthPtr auth G_GNUC_UNUSED, virConfPtr conf, unsigned int flags) { - int transport; #ifndef WIN32 g_autofree char *daemonPath =3D NULL; #endif @@ -903,34 +902,6 @@ doRemoteOpen(virConnectPtr conn, /* We handle *ALL* URIs here. The caller has rejected any * URIs we don't care about */ =20 - if (conn->uri) { - if (!transport_str) { - if (conn->uri->server) - transport =3D REMOTE_DRIVER_TRANSPORT_TLS; - else - transport =3D REMOTE_DRIVER_TRANSPORT_UNIX; - } else { - if ((transport =3D remoteDriverTransportTypeFromString(transpo= rt_str)) < 0) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("remote_open: transport in URL not recogn= ised " - "(should be tls|unix|ssh|ext|tcp|libssh2|= libssh)")); - return VIR_DRV_OPEN_ERROR; - } - - if (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX && - conn->uri->server) { - virReportError(VIR_ERR_INVALID_ARG, - _("using unix socket and remote " - "server '%s' is not supported."), - conn->uri->server); - return VIR_DRV_OPEN_ERROR; - } - } - } else { - /* No URI, then must be probing so use UNIX socket */ - transport =3D REMOTE_DRIVER_TRANSPORT_UNIX; - } - /* Remote server defaults to "localhost" if not specified. */ if (conn->uri && conn->uri->port !=3D 0) { port =3D g_strdup_printf("%d", conn->uri->port); @@ -1352,11 +1323,16 @@ remoteConnectOpen(virConnectPtr conn, int rflags =3D 0; const char *autostart =3D getenv("LIBVIRT_AUTOSTART"); char *driver =3D NULL; - char *transport =3D NULL; + remoteDriverTransport transport; + + if (conn->uri) { + if (remoteSplitURIScheme(conn->uri, &driver, &transport) < 0) + goto cleanup; + } else { + /* No URI, then must be probing so use UNIX socket */ + transport =3D REMOTE_DRIVER_TRANSPORT_UNIX; + } =20 - if (conn->uri && - remoteSplitURIScheme(conn->uri, &driver, &transport) < 0) - goto cleanup; =20 if (inside_daemon) { if (!conn->uri) { @@ -1398,12 +1374,12 @@ remoteConnectOpen(virConnectPtr conn, rflags |=3D VIR_DRV_OPEN_REMOTE_USER; =20 /* - * Furthermore if no servername is given, and no +XXX - * transport is listed, or transport is unix, + * Furthermore if no servername is given, + * and the transport is unix, * and uid is unprivileged then auto-spawn a daemon. */ if (!conn->uri->server && - (transport =3D=3D NULL || STREQ(transport, "unix")) && + (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX) && (!autostart || STRNEQ(autostart, "0"))) { VIR_DEBUG("Try daemon autostart"); @@ -1438,7 +1414,6 @@ remoteConnectOpen(virConnectPtr conn, =20 cleanup: VIR_FREE(driver); - VIR_FREE(transport); return ret; } =20 diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c index 976124d0ed..cdc0a00293 100644 --- a/src/remote/remote_sockets.c +++ b/src/remote/remote_sockets.c @@ -21,6 +21,9 @@ #include =20 #include "remote_sockets.h" +#include "virerror.h" + +#define VIR_FROM_THIS VIR_FROM_REMOTE =20 VIR_ENUM_IMPL(remoteDriverTransport, REMOTE_DRIVER_TRANSPORT_LAST, @@ -42,25 +45,47 @@ VIR_ENUM_IMPL(remoteDriverMode, int remoteSplitURIScheme(virURIPtr uri, char **driver, - char **transport) + remoteDriverTransport *transport) { char *p =3D strchr(uri->scheme, '+'); =20 - *driver =3D *transport =3D NULL; - if (p) *driver =3D g_strndup(uri->scheme, p - uri->scheme); else *driver =3D g_strdup(uri->scheme); =20 if (p) { - *transport =3D g_strdup(p + 1); + g_autofree char *tmp =3D g_strdup(p + 1); + int val; =20 - p =3D *transport; + p =3D tmp; while (*p) { *p =3D g_ascii_tolower(*p); p++; } + + if ((val =3D remoteDriverTransportTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("remote_open: transport in URL not recognised= " + "(should be tls|unix|ssh|ext|tcp|libssh2|libs= sh)")); + return -1; + } + + if (val =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX && + uri->server) { + virReportError(VIR_ERR_INVALID_ARG, + _("using unix socket and remote " + "server '%s' is not supported."), + uri->server); + return -1; + } + + *transport =3D val; + } else { + if (uri->server) + *transport =3D REMOTE_DRIVER_TRANSPORT_TLS; + else + *transport =3D REMOTE_DRIVER_TRANSPORT_UNIX; } =20 return 0; diff --git a/src/remote/remote_sockets.h b/src/remote/remote_sockets.h index bef3cdada9..ade3feab88 100644 --- a/src/remote/remote_sockets.h +++ b/src/remote/remote_sockets.h @@ -53,4 +53,4 @@ VIR_ENUM_DECL(remoteDriverMode); int remoteSplitURIScheme(virURIPtr uri, char **driver, - char **transport); + remoteDriverTransport *transport); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822282; cv=none; d=zohomail.com; s=zohoarc; b=XSpt42zBNUHdKl5ruYxvYhSHBsWdLEN8qrXDYaxInw2GMlEUkwoV7jMXPEiaQW+Ksk3ju5VN2u+l1BIoDpRtdrkuQaMUFjk0QVgZiC3Y9U8OknbtgcHYBItqQgefoVAUGgF9Y53MN61u6fJJWxvKU5TutmqXYzd3g4gHfrw/Dc8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822282; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=DTqtM8q2x4qf9H6BVGKVtaSDFb8AvqcprKcW+yEUPig=; b=C0HGyx7aMpMICD4FqtmZHHEvrRPxbsEijW7r7RsWkCLabfFkqMOuCYwDnOORZxj93dTO72gfzrKJP/cYlau7SUJSdIk3W4GjmubpE5++gVtCUoSEnEtXFw6gyy+SrQamZcEThH/xJzKyepCmFjFnzmJOLN4Qkk2hh/gCy1D0Fxc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1596822282557743.7218384884924; Fri, 7 Aug 2020 10:44:42 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-25-C3B42QxgPXKAck-6BL7JNA-1; Fri, 07 Aug 2020 13:44:38 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DA04918C63F3; Fri, 7 Aug 2020 17:44:32 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B40C32DE6F; Fri, 7 Aug 2020 17:44:32 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 832ED1809563; Fri, 7 Aug 2020 17:44:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfCHw017711 for ; Fri, 7 Aug 2020 13:41:12 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7FDFA5DA30; Fri, 7 Aug 2020 17:41:12 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id CC5C05D9D5; Fri, 7 Aug 2020 17:41:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822281; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=DTqtM8q2x4qf9H6BVGKVtaSDFb8AvqcprKcW+yEUPig=; b=AVYSNo/YT2lX5JkmyOfdBVEICJkWNwV/nun/UaKtRbxc+9JevwdAG0WsrDygJ3p8m7JkND iqDZGrjXWCkBSxtID1bZ2jfdE+Ki9HvYkSZLN59UTxoMOAYB1eMv52s8/peJosUR7PpjHv DrGZ5vNeM1a9TTmu0iqwgUU/c1qF3rE= X-MC-Unique: C3B42QxgPXKAck-6BL7JNA-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 06/11] remote: split out function for constructing socket path Date: Fri, 7 Aug 2020 18:40:54 +0100 Message-Id: <20200807174059.312786-7-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) The remoteGetUNIXSocketHelper method will be needed by source files beyond the remote driver client. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 129 +--------------------------------- src/remote/remote_sockets.c | 134 ++++++++++++++++++++++++++++++++++++ src/remote/remote_sockets.h | 8 +++ 3 files changed, 145 insertions(+), 126 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 66d66c1284..6ab0d67854 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -697,131 +697,6 @@ remoteConnectSupportsFeatureUnlocked(virConnectPtr co= nn, } =20 =20 -static char * -remoteGetUNIXSocketHelper(remoteDriverTransport transport, - const char *sock_prefix, - unsigned int flags) -{ - char *sockname =3D NULL; - g_autofree char *userdir =3D NULL; - - if (flags & VIR_DRV_OPEN_REMOTE_USER) { - if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("Connecting to session instance without " - "socket path is not supported by the %s " - "transport"), - remoteDriverTransportTypeToString(transport)); - return NULL; - } - userdir =3D virGetUserRuntimeDirectory(); - - sockname =3D g_strdup_printf("%s/%s-sock", userdir, sock_prefix); - } else { - /* Intentionally do *NOT* use RUNSTATEDIR here. We might - * be connecting to a remote machine, and cannot assume - * the remote host has /run. The converse is ok though, - * any machine with /run will have a /var/run symlink. - * The portable option is to thus use $LOCALSTATEDIR/run - */ - sockname =3D g_strdup_printf("%s/run/libvirt/%s-%s", LOCALSTATEDIR, - sock_prefix, - flags & VIR_DRV_OPEN_REMOTE_RO ? "sock-= ro" : "sock"); - } - - VIR_DEBUG("Built UNIX sockname %s for transport %s prefix %s flags=3D0= x%x", - sockname, remoteDriverTransportTypeToString(transport), - sock_prefix, flags); - return sockname; -} - - -static char * -remoteGetUNIXSocket(remoteDriverTransport transport, - remoteDriverMode mode, - const char *driver, - char **daemon, - unsigned int flags) -{ - char *sock_name =3D NULL; - g_autofree char *direct_daemon =3D NULL; - g_autofree char *legacy_daemon =3D NULL; - g_autofree char *direct_sock_name =3D NULL; - g_autofree char *legacy_sock_name =3D NULL; - - if (driver) - direct_daemon =3D g_strdup_printf("virt%sd", driver); - - legacy_daemon =3D g_strdup("libvirtd"); - - if (driver && - !(direct_sock_name =3D remoteGetUNIXSocketHelper(transport, direct= _daemon, flags))) - return NULL; - - if (!(legacy_sock_name =3D remoteGetUNIXSocketHelper(transport, "libvi= rt", flags))) - return NULL; - - if (mode =3D=3D REMOTE_DRIVER_MODE_AUTO) { - if (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX) { - if (direct_sock_name && virFileExists(direct_sock_name)) { - mode =3D REMOTE_DRIVER_MODE_DIRECT; - } else if (virFileExists(legacy_sock_name)) { - mode =3D REMOTE_DRIVER_MODE_LEGACY; - } else if (driver) { - /* - * This constant comes from the configure script and - * maps to either the direct or legacy mode constant - */ - mode =3D REMOTE_DRIVER_MODE_DEFAULT; - } else { - mode =3D REMOTE_DRIVER_MODE_LEGACY; - } - } else { - mode =3D REMOTE_DRIVER_MODE_LEGACY; - } - } - - switch ((remoteDriverMode)mode) { - case REMOTE_DRIVER_MODE_LEGACY: - sock_name =3D g_steal_pointer(&legacy_sock_name); - *daemon =3D g_steal_pointer(&legacy_daemon); - break; - - case REMOTE_DRIVER_MODE_DIRECT: - if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("Cannot use direct socket mode for %s transpo= rt"), - remoteDriverTransportTypeToString(transport)); - return NULL; - } - - if (!direct_sock_name) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("Cannot use direct socket mode if no URI is s= et")); - return NULL; - } - - sock_name =3D g_steal_pointer(&direct_sock_name); - *daemon =3D g_steal_pointer(&direct_daemon); - break; - - case REMOTE_DRIVER_MODE_AUTO: - case REMOTE_DRIVER_MODE_LAST: - default: - virReportEnumRangeError(remoteDriverMode, mode); - return NULL; - } - - VIR_DEBUG("Chosen UNIX sockname %s daemon %s " - "for mode %s transport %s flags=3D0x%x", - sock_name, NULLSTR(*daemon), - remoteDriverModeTypeToString(mode), - remoteDriverTransportTypeToString(transport), - flags); - return sock_name; -} - - #ifndef WIN32 static const char * remoteGetDaemonPathEnv(void) @@ -1015,7 +890,9 @@ doRemoteOpen(virConnectPtr conn, case REMOTE_DRIVER_TRANSPORT_LIBSSH2: if (!sockname && !(sockname =3D remoteGetUNIXSocket(transport, mode, driver_str, - &daemon_name, flags))) + flags & VIR_DRV_OPEN_REMOTE_R= O, + flags & VIR_DRV_OPEN_REMOTE_U= SER, + &daemon_name))) goto failed; break; =20 diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c index cdc0a00293..28e02e24d5 100644 --- a/src/remote/remote_sockets.c +++ b/src/remote/remote_sockets.c @@ -22,9 +22,15 @@ =20 #include "remote_sockets.h" #include "virerror.h" +#include "virlog.h" +#include "virfile.h" +#include "virutil.h" +#include "configmake.h" =20 #define VIR_FROM_THIS VIR_FROM_REMOTE =20 +VIR_LOG_INIT("remote.remote_sockets"); + VIR_ENUM_IMPL(remoteDriverTransport, REMOTE_DRIVER_TRANSPORT_LAST, "tls", @@ -90,3 +96,131 @@ remoteSplitURIScheme(virURIPtr uri, =20 return 0; } + + +static char * +remoteGetUNIXSocketHelper(remoteDriverTransport transport, + const char *sock_prefix, + bool ro, + bool session) +{ + char *sockname =3D NULL; + g_autofree char *userdir =3D NULL; + + if (session) { + if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("Connecting to session instance without " + "socket path is not supported by the %s " + "transport"), + remoteDriverTransportTypeToString(transport)); + return NULL; + } + userdir =3D virGetUserRuntimeDirectory(); + + sockname =3D g_strdup_printf("%s/%s-sock", userdir, sock_prefix); + } else { + /* Intentionally do *NOT* use RUNSTATEDIR here. We might + * be connecting to a remote machine, and cannot assume + * the remote host has /run. The converse is ok though, + * any machine with /run will have a /var/run symlink. + * The portable option is to thus use $LOCALSTATEDIR/run + */ + sockname =3D g_strdup_printf("%s/run/libvirt/%s-%s", LOCALSTATEDIR, + sock_prefix, + ro ? "sock-ro" : "sock"); + } + + VIR_DEBUG("Built UNIX sockname=3D%s for transport=3D%s " + "prefix=3D%s ro=3D%d session=3D%d", + sockname, remoteDriverTransportTypeToString(transport), + sock_prefix, ro, session); + return sockname; +} + + +char * +remoteGetUNIXSocket(remoteDriverTransport transport, + remoteDriverMode mode, + const char *driver, + bool ro, + bool session, + char **daemon) +{ + char *sock_name =3D NULL; + g_autofree char *direct_daemon =3D NULL; + g_autofree char *legacy_daemon =3D NULL; + g_autofree char *direct_sock_name =3D NULL; + g_autofree char *legacy_sock_name =3D NULL; + + if (driver) + direct_daemon =3D g_strdup_printf("virt%sd", driver); + + legacy_daemon =3D g_strdup("libvirtd"); + + if (driver && + !(direct_sock_name =3D remoteGetUNIXSocketHelper(transport, direct= _daemon, ro, session))) + return NULL; + + if (!(legacy_sock_name =3D remoteGetUNIXSocketHelper(transport, "libvi= rt", ro, session))) + return NULL; + + if (mode =3D=3D REMOTE_DRIVER_MODE_AUTO) { + if (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX) { + if (direct_sock_name && virFileExists(direct_sock_name)) { + mode =3D REMOTE_DRIVER_MODE_DIRECT; + } else if (virFileExists(legacy_sock_name)) { + mode =3D REMOTE_DRIVER_MODE_LEGACY; + } else if (driver) { + /* + * This constant comes from the configure script and + * maps to either the direct or legacy mode constant + */ + mode =3D REMOTE_DRIVER_MODE_DEFAULT; + } else { + mode =3D REMOTE_DRIVER_MODE_LEGACY; + } + } else { + mode =3D REMOTE_DRIVER_MODE_LEGACY; + } + } + + switch ((remoteDriverMode)mode) { + case REMOTE_DRIVER_MODE_LEGACY: + sock_name =3D g_steal_pointer(&legacy_sock_name); + *daemon =3D g_steal_pointer(&legacy_daemon); + break; + + case REMOTE_DRIVER_MODE_DIRECT: + if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("Cannot use direct socket mode for %s transpo= rt"), + remoteDriverTransportTypeToString(transport)); + return NULL; + } + + if (!direct_sock_name) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("Cannot use direct socket mode if no URI is s= et")); + return NULL; + } + + sock_name =3D g_steal_pointer(&direct_sock_name); + *daemon =3D g_steal_pointer(&direct_daemon); + break; + + case REMOTE_DRIVER_MODE_AUTO: + case REMOTE_DRIVER_MODE_LAST: + default: + virReportEnumRangeError(remoteDriverMode, mode); + return NULL; + } + + VIR_DEBUG("Chosen UNIX sockname=3D%s daemon=3D%s " + "for mode=3D%s transport=3D%s ro=3D%d session=3D%d", + sock_name, NULLSTR(*daemon), + remoteDriverModeTypeToString(mode), + remoteDriverTransportTypeToString(transport), + ro, session); + return sock_name; +} diff --git a/src/remote/remote_sockets.h b/src/remote/remote_sockets.h index ade3feab88..64055f3d44 100644 --- a/src/remote/remote_sockets.h +++ b/src/remote/remote_sockets.h @@ -54,3 +54,11 @@ int remoteSplitURIScheme(virURIPtr uri, char **driver, remoteDriverTransport *transport); + +char * +remoteGetUNIXSocket(remoteDriverTransport transport, + remoteDriverMode mode, + const char *driver, + bool ro, + bool session, + char **daemon); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822279; cv=none; d=zohomail.com; s=zohoarc; b=E1rKFosYs0hSRahmacpNiJb+fY2LvD/knYMRGs1MUx7q45My8+dALDnGUlS9c4vOR6KnEXZlbaOmn7dzQma2BUTWKr5w3YWU8K74Vzy4Bs4dWMm0IWayUWjM5WJuq/O3Y/48hApVrxDjQ/fhw0gmSLNK/DA+cLnuJpQlv5b4hrc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822279; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8zfdEnfeoAXYxH+1qsYVAc9uj306NAinpkzEpyNtUVM=; b=GdE3ZJB+sMtIxsLwoX69xRd+QqmUsoLolOrYDLGO/qUKpz7wwy2776uvsUZ4sL553B8RyyjQ33TJAu+M687XOeAfE0h1ikND8CtvZqm55dd1rft2MM1wGC56jUHp5LDOnMaJimB7x5DG3pECVr+dYWDu5YKgrtRIC+dqkUSHsvE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1596822279096723.7265570730181; Fri, 7 Aug 2020 10:44:39 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-408-EpjX774rPlGCcKcv8Kl2xg-1; Fri, 07 Aug 2020 13:44:35 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F00B158; Fri, 7 Aug 2020 17:44:29 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CBF0C1A919; Fri, 7 Aug 2020 17:44:29 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 829311800B71; Fri, 7 Aug 2020 17:44:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfDhs017729 for ; Fri, 7 Aug 2020 13:41:13 -0400 Received: by smtp.corp.redhat.com (Postfix) id EA6415D9E8; Fri, 7 Aug 2020 17:41:13 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id ED1C55DA30; Fri, 7 Aug 2020 17:41:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822277; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=8zfdEnfeoAXYxH+1qsYVAc9uj306NAinpkzEpyNtUVM=; b=B5nppzGk8urtU5cqy1ud9l7ZByG1yMY+VGM0IEcoOpuFMB6V+2ZwvZIErYlS/F3C6brtw1 GcaKAr21zGhcEWbNZ8SZUNFU+yH73DXG+CfaNZy+aDgB4NXcFdVW7xL7KhZPfSMwpqn3DS ZLGwnmKGwkrR+TThfrhhlJB43cuRoUQ= X-MC-Unique: EpjX774rPlGCcKcv8Kl2xg-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 07/11] remote: extract logic for determining daemon to connect to Date: Fri, 7 Aug 2020 18:40:55 +0100 Message-Id: <20200807174059.312786-8-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) We'll shortly want to reuse code for determining whether to connect to the system or session daemon from places outside the remote driver client. Pulling it out into a self contained function facilitates reuse. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 51 ++++---------------------------- src/remote/remote_sockets.c | 59 +++++++++++++++++++++++++++++++++++++ src/remote/remote_sockets.h | 6 ++++ 3 files changed, 71 insertions(+), 45 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 6ab0d67854..df10cfaef6 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1198,7 +1198,8 @@ remoteConnectOpen(virConnectPtr conn, struct private_data *priv; int ret =3D VIR_DRV_OPEN_ERROR; int rflags =3D 0; - const char *autostart =3D getenv("LIBVIRT_AUTOSTART"); + bool user; + bool autostart; char *driver =3D NULL; remoteDriverTransport transport; =20 @@ -1233,51 +1234,11 @@ remoteConnectOpen(virConnectPtr conn, if (flags & VIR_CONNECT_RO) rflags |=3D VIR_DRV_OPEN_REMOTE_RO; =20 - /* - * User session daemon is used for - * - * - Any URI with /session suffix - * - Test driver, if a protocol is given - * - * provided we are running non-root - */ - if (conn->uri && - conn->uri->path && - conn->uri->scheme && - (STREQ(conn->uri->path, "/session") || - STRPREFIX(conn->uri->scheme, "test+")) && - geteuid() > 0) { - VIR_DEBUG("User session daemon required"); + remoteGetURIDaemonInfo(conn->uri, transport, &user, &autostart); + if (user) rflags |=3D VIR_DRV_OPEN_REMOTE_USER; - - /* - * Furthermore if no servername is given, - * and the transport is unix, - * and uid is unprivileged then auto-spawn a daemon. - */ - if (!conn->uri->server && - (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX) && - (!autostart || - STRNEQ(autostart, "0"))) { - VIR_DEBUG("Try daemon autostart"); - rflags |=3D VIR_DRV_OPEN_REMOTE_AUTOSTART; - } - } - - /* - * If URI is NULL, then do a UNIX connection possibly auto-spawning - * unprivileged server and probe remote server for URI. - */ - if (!conn->uri) { - VIR_DEBUG("Auto-probe remote URI"); - if (geteuid() > 0) { - VIR_DEBUG("Auto-spawn user daemon instance"); - rflags |=3D VIR_DRV_OPEN_REMOTE_USER; - if (!autostart || - STRNEQ(autostart, "0")) - rflags |=3D VIR_DRV_OPEN_REMOTE_AUTOSTART; - } - } + if (autostart) + rflags |=3D VIR_DRV_OPEN_REMOTE_AUTOSTART; =20 ret =3D doRemoteOpen(conn, priv, driver, transport, auth, conf, rflags= ); if (ret !=3D VIR_DRV_OPEN_SUCCESS) { diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c index 28e02e24d5..854775f401 100644 --- a/src/remote/remote_sockets.c +++ b/src/remote/remote_sockets.c @@ -224,3 +224,62 @@ remoteGetUNIXSocket(remoteDriverTransport transport, ro, session); return sock_name; } + + +void +remoteGetURIDaemonInfo(virURIPtr uri, + remoteDriverTransport transport, + bool *session, + bool *autostart) +{ + const char *autostart_str =3D getenv("LIBVIRT_AUTOSTART"); + + *session =3D false; + *autostart =3D false; + + /* + * User session daemon is used for + * + * - Any URI with /session suffix + * - Test driver, if a protocol is given + * + * provided we are running non-root + */ + if (uri && + uri->path && + uri->scheme && + (STREQ(uri->path, "/session") || + STRPREFIX(uri->scheme, "test+")) && + geteuid() > 0) { + VIR_DEBUG("User session daemon required"); + *session =3D true; + + /* + * Furthermore if no servername is given, + * and the transport is unix, + * and uid is unprivileged then auto-spawn a daemon. + */ + if (!uri->server && + (transport =3D=3D REMOTE_DRIVER_TRANSPORT_UNIX) && + (!autostart_str || + STRNEQ(autostart_str, "0"))) { + VIR_DEBUG("Try daemon autostart"); + *autostart =3D true; + } + } + + /* + * If URI is NULL, then do a UNIX connection possibly auto-spawning + * unprivileged server and probe remote server for URI. + */ + if (!uri) { + VIR_DEBUG("Auto-probe remote URI"); + if (geteuid() > 0) { + VIR_DEBUG("Auto-spawn user daemon instance"); + *session =3D true; + if (!autostart_str || + STRNEQ(autostart_str, "0")) + *autostart =3D true; + } + } +} diff --git a/src/remote/remote_sockets.h b/src/remote/remote_sockets.h index 64055f3d44..7526752835 100644 --- a/src/remote/remote_sockets.h +++ b/src/remote/remote_sockets.h @@ -62,3 +62,9 @@ remoteGetUNIXSocket(remoteDriverTransport transport, bool ro, bool session, char **daemon); + +void +remoteGetURIDaemonInfo(virURIPtr uri, + remoteDriverTransport transport, + bool *session, + bool *autostart); --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822441; cv=none; d=zohomail.com; s=zohoarc; b=WJjQSEioVq4MJa6+mxi9rBHtcb1ulcFkLWFkRWfof75DBaEInkZJkE9B9akGRoR068pHTXlbQ8CD4Ve6TppFvJRZJAnoqVY7tdmQLHywH3v+VftNmIleYeTrdv5y5ePTa5DW2OgJ3Zw2Zdmg/twYnWxhD3BKYtmwxGOgWhu3A/E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822441; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=rWyaVudclO3HWYGtyFpDKX6ft9qPd4b/Ub5gkvip3t4=; b=C9XGw+2yDJd8GOW7pgHGUfNmmhxtfxvWegrcWpYKExI/djXxPMmri5ZBwW5pa2HOhPOv5kl1nFuwgiPmf/QcQ6QRKZPTo0q5zkh8wJDfvdCRJPtTGWbM5r6wXhHAWOFPJnz+z2Dt3pVkwuK/jCHqX8j4kWnibKPT/nqT6r5QG9w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1596822441528863.4411910970585; Fri, 7 Aug 2020 10:47:21 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-63-Zg6UqXzJM5mdN3kAnD6xdQ-1; Fri, 07 Aug 2020 13:44:42 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8CD7D18C63F4; Fri, 7 Aug 2020 17:44:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6AA856111F; Fri, 7 Aug 2020 17:44:36 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3906D1806B0A; Fri, 7 Aug 2020 17:44:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfItN017757 for ; Fri, 7 Aug 2020 13:41:18 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1D6BE5D9E8; Fri, 7 Aug 2020 17:41:18 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 520115D9D5; Fri, 7 Aug 2020 17:41:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822440; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=rWyaVudclO3HWYGtyFpDKX6ft9qPd4b/Ub5gkvip3t4=; b=I4KTLn0vbt7OqclAPFjrf885FU9yXLVIGWCCP0VRN7hrrovGN4Xw9biytxlJXyejEj55xU WVvhJUIVUwoJffGBrRPIH6Qk9hhs62ORG2KpgX6VTfGwsaSH3HC9jA6TqPVmNXqafmchVI qw2tiRxXlHVT6eVYZM2yK3ulYaDGPtQ= X-MC-Unique: Zg6UqXzJM5mdN3kAnD6xdQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 08/11] remote: introduce virt-ssh-helper binary Date: Fri, 7 Aug 2020 18:40:56 +0100 Message-Id: <20200807174059.312786-9-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) When accessing libvirtd over a SSH tunnel, the remote driver needs a way to proxy the SSH input/output stream to a suitable libvirt daemon. Tihs is currently done by spawning netcat, pointing it to the libvirtd socket path. This is problematic for a number of reasons: - The socket path varies according to the --prefix chosen at build time. The remote client is seeing the local prefix, but what we need is the remote prefix - The socket path varies according to remote env variables, such as the XDG_RUNTIME_DIR location. Again we see the local XDG_RUNTIME_DIR value, but what we need is the remote value (if any) - The remote driver doesn't know whether it must connect to the legacy libvirtd or the modular daemons, so must always assume legacy libvirtd for back-compat. This means we'll always end up using the virtproxyd daemon adding an extra hop in the RPC layer. - We can not able to autospawn the libvirtd daemon for session mode access To address these problems this patch introduces the 'virtd-ssh-helper' program which takes the URI for the remote driver as a CLI parameter. It then figures out which daemon to connect to and its socket path, using the same code that the remote driver client would on the remote host's build of libvirt. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- build-aux/syntax-check.mk | 2 +- libvirt.spec.in | 2 + po/POTFILES.in | 1 + src/remote/meson.build | 17 ++ src/remote/remote_ssh_helper.c | 425 +++++++++++++++++++++++++++++++++ src/rpc/virnetsocket.h | 1 + 6 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 src/remote/remote_ssh_helper.c diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 6eb59cf90e..151f7a4767 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -1864,7 +1864,7 @@ sc_group-qemu-caps: # List all syntax-check exemptions: exclude_file_name_regexp--sc_avoid_strcase =3D ^tools/vsh\.h$$ =20 -_src1=3Dlibvirt-stream|qemu/qemu_monitor|util/vir(command|file|fdstream)|r= pc/virnetsocket|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon +_src1=3Dlibvirt-stream|qemu/qemu_monitor|util/vir(command|file|fdstream)|r= pc/virnetsocket|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon|r= emote/remote_ssh_helper _test1=3Dshunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupm= ock|commandhelper exclude_file_name_regexp--sc_avoid_write =3D \ ^(src/($(_src1))|tools/virsh-console|tests/($(_test1)))\.c$$ diff --git a/libvirt.spec.in b/libvirt.spec.in index e64cfdb561..35125e4f8e 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1561,6 +1561,8 @@ exit 0 =20 %attr(0755, root, root) %{_libexecdir}/libvirt_iohelper =20 +%attr(0755, root, root) %{_bindir}/virt-ssh-helper + %attr(0755, root, root) %{_sbindir}/libvirtd %attr(0755, root, root) %{_sbindir}/virtproxyd %attr(0755, root, root) %{_sbindir}/virtlogd diff --git a/po/POTFILES.in b/po/POTFILES.in index c4197604ef..1ab94972c7 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -182,6 +182,7 @@ @SRCDIR@src/remote/remote_daemon_stream.c @SRCDIR@src/remote/remote_driver.c @SRCDIR@src/remote/remote_sockets.c +@SRCDIR@src/remote/remote_ssh_helper.c @SRCDIR@src/rpc/virkeepalive.c @SRCDIR@src/rpc/virnetclient.c @SRCDIR@src/rpc/virnetclientprogram.c diff --git a/src/remote/meson.build b/src/remote/meson.build index 91dd587cba..9ad2f6ab1c 100644 --- a/src/remote/meson.build +++ b/src/remote/meson.build @@ -51,6 +51,15 @@ remote_daemon_sources =3D files( =20 remote_daemon_generated =3D [] =20 +virt_ssh_helper_sources =3D files( + 'remote_sockets.c', + 'remote_ssh_helper.c', +) + +virt_ssh_helper_dep =3D [ + src_dep, +] + foreach name : [ 'remote', 'qemu', 'lxc' ] protocol_x =3D '@0@_protocol.x'.format(name) dispatch_h =3D '@0@_daemon_dispatch_stubs.h'.format(name) @@ -278,6 +287,14 @@ if conf.has('WITH_REMOTE') rename: [ '50-libvirt.rules' ], ) endif + + virt_helpers +=3D { + 'name': 'virt-ssh-helper', + 'sources': [ + virt_ssh_helper_sources + ], + 'install_dir': bindir, + } endif endif =20 diff --git a/src/remote/remote_ssh_helper.c b/src/remote/remote_ssh_helper.c new file mode 100644 index 0000000000..0da55c1d1f --- /dev/null +++ b/src/remote/remote_ssh_helper.c @@ -0,0 +1,425 @@ +/* + * remote_ssh_helper.c: a netcat replacement for proxying ssh tunnel to da= emon + * + * Copyright (C) 2020 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include + +#include "rpc/virnetsocket.h" +#include "viralloc.h" +#include "virlog.h" +#include "virgettext.h" +#include "virfile.h" + +#include "remote_sockets.h" + +#define VIR_FROM_THIS VIR_FROM_REMOTE + +VIR_LOG_INIT("remote.remote_ssh_helper"); + +struct virRemoteSSHHelperBuffer { + size_t length; + size_t offset; + char *data; +}; + +typedef struct virRemoteSSHHelper virRemoteSSHHelper; +typedef virRemoteSSHHelper *virRemoteSSHHelperPtr; +struct virRemoteSSHHelper { + bool quit; + virNetSocketPtr sock; + int stdinWatch; + int stdoutWatch; + + struct virRemoteSSHHelperBuffer sockToTerminal; + struct virRemoteSSHHelperBuffer terminalToSock; +}; + + +static void +virRemoteSSHHelperShutdown(virRemoteSSHHelperPtr proxy) +{ + if (proxy->sock) { + virNetSocketRemoveIOCallback(proxy->sock); + virNetSocketClose(proxy->sock); + virObjectUnref(proxy->sock); + proxy->sock =3D NULL; + } + VIR_FREE(proxy->sockToTerminal.data); + VIR_FREE(proxy->terminalToSock.data); + if (proxy->stdinWatch !=3D -1) + virEventRemoveHandle(proxy->stdinWatch); + if (proxy->stdoutWatch !=3D -1) + virEventRemoveHandle(proxy->stdoutWatch); + proxy->stdinWatch =3D -1; + proxy->stdoutWatch =3D -1; + if (!proxy->quit) + proxy->quit =3D true; +} + + +static void +virRemoteSSHHelperEventOnSocket(virNetSocketPtr sock, + int events, + void *opaque) +{ + virRemoteSSHHelperPtr proxy =3D opaque; + + /* we got late event after proxy was shutdown */ + if (!proxy->sock) + return; + + if (events & VIR_EVENT_HANDLE_READABLE) { + size_t avail =3D proxy->sockToTerminal.length - + proxy->sockToTerminal.offset; + int got; + + if (avail < 1024) { + if (VIR_REALLOC_N(proxy->sockToTerminal.data, + proxy->sockToTerminal.length + 1024) < 0) { + virRemoteSSHHelperShutdown(proxy); + return; + } + proxy->sockToTerminal.length +=3D 1024; + avail +=3D 1024; + } + + got =3D virNetSocketRead(sock, + proxy->sockToTerminal.data + + proxy->sockToTerminal.offset, + avail); + if (got =3D=3D -2) + return; /* blocking */ + if (got =3D=3D 0) { + VIR_DEBUG("EOF on socket, shutting down"); + virRemoteSSHHelperShutdown(proxy); + return; + } + if (got < 0) { + virRemoteSSHHelperShutdown(proxy); + return; + } + proxy->sockToTerminal.offset +=3D got; + if (proxy->sockToTerminal.offset) + virEventUpdateHandle(proxy->stdoutWatch, + VIR_EVENT_HANDLE_WRITABLE); + } + + if (events & VIR_EVENT_HANDLE_WRITABLE && + proxy->terminalToSock.offset) { + ssize_t done; + size_t avail; + done =3D virNetSocketWrite(proxy->sock, + proxy->terminalToSock.data, + proxy->terminalToSock.offset); + if (done =3D=3D -2) + return; /* blocking */ + if (done < 0) { + virRemoteSSHHelperShutdown(proxy); + return; + } + memmove(proxy->terminalToSock.data, + proxy->terminalToSock.data + done, + proxy->terminalToSock.offset - done); + proxy->terminalToSock.offset -=3D done; + + avail =3D proxy->terminalToSock.length - proxy->terminalToSock.off= set; + if (avail > 1024) { + ignore_value(VIR_REALLOC_N(proxy->terminalToSock.data, + proxy->terminalToSock.offset + 1024= )); + proxy->terminalToSock.length =3D proxy->terminalToSock.offset = + 1024; + } + } + if (!proxy->terminalToSock.offset) + virNetSocketUpdateIOCallback(proxy->sock, + VIR_EVENT_HANDLE_READABLE); + + if (events & VIR_EVENT_HANDLE_ERROR || + events & VIR_EVENT_HANDLE_HANGUP) { + virRemoteSSHHelperShutdown(proxy); + } +} + + +static void +virRemoteSSHHelperEventOnStdin(int watch G_GNUC_UNUSED, + int fd G_GNUC_UNUSED, + int events, + void *opaque) +{ + virRemoteSSHHelperPtr proxy =3D opaque; + + /* we got late event after console was shutdown */ + if (!proxy->sock) + return; + + if (events & VIR_EVENT_HANDLE_READABLE) { + size_t avail =3D proxy->terminalToSock.length - + proxy->terminalToSock.offset; + int got; + + if (avail < 1024) { + if (VIR_REALLOC_N(proxy->terminalToSock.data, + proxy->terminalToSock.length + 1024) < 0) { + virRemoteSSHHelperShutdown(proxy); + return; + } + proxy->terminalToSock.length +=3D 1024; + avail +=3D 1024; + } + + got =3D read(fd, + proxy->terminalToSock.data + + proxy->terminalToSock.offset, + avail); + if (got < 0) { + if (errno !=3D EAGAIN) { + virReportSystemError(errno, "%s", _("cannot read from stdi= n")); + virRemoteSSHHelperShutdown(proxy); + } + return; + } + if (got =3D=3D 0) { + VIR_DEBUG("EOF on stdin, shutting down"); + virRemoteSSHHelperShutdown(proxy); + return; + } + + proxy->terminalToSock.offset +=3D got; + if (proxy->terminalToSock.offset) + virNetSocketUpdateIOCallback(proxy->sock, + VIR_EVENT_HANDLE_READABLE | + VIR_EVENT_HANDLE_WRITABLE); + } + + if (events & VIR_EVENT_HANDLE_ERROR) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("IO error on stdin"= )); + virRemoteSSHHelperShutdown(proxy); + return; + } + + if (events & VIR_EVENT_HANDLE_HANGUP) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("EOF on stdin")); + virRemoteSSHHelperShutdown(proxy); + return; + } +} + + +static void +virRemoteSSHHelperEventOnStdout(int watch G_GNUC_UNUSED, + int fd, + int events, + void *opaque) +{ + virRemoteSSHHelperPtr proxy =3D opaque; + + /* we got late event after console was shutdown */ + if (!proxy->sock) + return; + + if (events & VIR_EVENT_HANDLE_WRITABLE && + proxy->sockToTerminal.offset) { + ssize_t done; + size_t avail; + done =3D write(fd, + proxy->sockToTerminal.data, + proxy->sockToTerminal.offset); + if (done < 0) { + if (errno !=3D EAGAIN) { + virReportSystemError(errno, "%s", _("cannot write to stdou= t")); + virRemoteSSHHelperShutdown(proxy); + } + return; + } + memmove(proxy->sockToTerminal.data, + proxy->sockToTerminal.data + done, + proxy->sockToTerminal.offset - done); + proxy->sockToTerminal.offset -=3D done; + + avail =3D proxy->sockToTerminal.length - proxy->sockToTerminal.off= set; + if (avail > 1024) { + ignore_value(VIR_REALLOC_N(proxy->sockToTerminal.data, + proxy->sockToTerminal.offset + 1024= )); + proxy->sockToTerminal.length =3D proxy->sockToTerminal.offset = + 1024; + } + } + + if (!proxy->sockToTerminal.offset) + virEventUpdateHandle(proxy->stdoutWatch, 0); + + if (events & VIR_EVENT_HANDLE_ERROR) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("IO error stdout")); + virRemoteSSHHelperShutdown(proxy); + return; + } + + if (events & VIR_EVENT_HANDLE_HANGUP) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("EOF on stdout")); + virRemoteSSHHelperShutdown(proxy); + return; + } +} + + +static int +virRemoteSSHHelperRun(virNetSocketPtr sock) +{ + int ret =3D -1; + virRemoteSSHHelper proxy =3D { + .sock =3D sock, + .stdinWatch =3D -1, + .stdoutWatch =3D -1, + }; + + virEventRegisterDefaultImpl(); + + if ((proxy.stdinWatch =3D virEventAddHandle(STDIN_FILENO, + VIR_EVENT_HANDLE_READABLE, + virRemoteSSHHelperEventOnStd= in, + &proxy, + NULL)) < 0) + goto cleanup; + + if ((proxy.stdoutWatch =3D virEventAddHandle(STDOUT_FILENO, + 0, + virRemoteSSHHelperEventOnSt= dout, + &proxy, + NULL)) < 0) + goto cleanup; + + if (virNetSocketAddIOCallback(proxy.sock, + VIR_EVENT_HANDLE_READABLE, + virRemoteSSHHelperEventOnSocket, + &proxy, + NULL) < 0) + goto cleanup; + + while (!proxy.quit) + virEventRunDefaultImpl(); + + if (virGetLastErrorCode() !=3D VIR_ERR_OK) + goto cleanup; + + ret =3D 0; + cleanup: + if (proxy.stdinWatch !=3D -1) + virEventRemoveHandle(proxy.stdinWatch); + if (proxy.stdoutWatch !=3D -1) + virEventRemoveHandle(proxy.stdoutWatch); + return ret; +} + +int main(int argc, char **argv) +{ + const char *uri_str =3D NULL; + g_autoptr(virURI) uri =3D NULL; + g_autofree char *driver =3D NULL; + remoteDriverTransport transport; + bool user =3D false; + bool autostart =3D false; + gboolean version =3D false; + gboolean readonly =3D false; + g_autofree char *sock_path =3D NULL; + g_autofree char *daemon_name =3D NULL; + g_autoptr(virNetSocket) sock =3D NULL; + GError *error =3D NULL; + g_autoptr(GOptionContext) context =3D NULL; + GOptionEntry entries[] =3D { + { "readonly", 'r', 0, G_OPTION_ARG_NONE, &readonly, "Connect read-= only", NULL }, + { "version", 'V', 0, G_OPTION_ARG_NONE, &version, "Display version= information", NULL }, + { NULL, '\0', 0, 0, NULL, NULL, NULL } + }; + + context =3D g_option_context_new("- libvirt socket proxy"); + g_option_context_add_main_entries(context, entries, PACKAGE); + if (!g_option_context_parse(context, &argc, &argv, &error)) { + g_printerr(_("option parsing failed: %s\n"), error->message); + exit(EXIT_FAILURE); + } + + if (version) { + g_print("%s (%s) %s\n", argv[0], PACKAGE_NAME, PACKAGE_VERSION); + exit(EXIT_SUCCESS); + } + + virSetErrorFunc(NULL, NULL); + virSetErrorLogPriorityFunc(NULL); + + if (virGettextInitialize() < 0 || + virErrorInitialize() < 0) { + g_printerr(_("%s: initialization failed\n"), argv[0]); + exit(EXIT_FAILURE); + } + + virFileActivateDirOverrideForProg(argv[0]); + + /* Initialize the log system */ + virLogSetFromEnv(); + + if (optind !=3D (argc - 1)) { + g_printerr("%s: expected a URI\n", argv[0]); + exit(EXIT_FAILURE); + } + + uri_str =3D argv[optind]; + VIR_DEBUG("Using URI %s", uri_str); + + if (!(uri =3D virURIParse(uri_str))) { + g_printerr(("%s: cannot parse '%s': %s\n"), + argv[0], uri_str, virGetLastErrorMessage()); + exit(EXIT_FAILURE); + } + + if (remoteSplitURIScheme(uri, &driver, &transport) < 0) { + g_printerr(_("%s: cannot parse URI transport '%s': %s\n"), + argv[0], uri_str, virGetLastErrorMessage()); + exit(EXIT_FAILURE); + } + + if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { + g_printerr(_("%s: unexpected URI transport '%s'\n"), + argv[0], uri_str); + exit(EXIT_FAILURE); + } + + remoteGetURIDaemonInfo(uri, transport, &user, &autostart); + + sock_path =3D remoteGetUNIXSocket(transport, + REMOTE_DRIVER_MODE_AUTO, + driver, + !!readonly, + user, + &daemon_name); + + if (virNetSocketNewConnectUNIX(sock_path, autostart, daemon_name, &soc= k) < 0) { + g_printerr(_("%s: cannot connect to '%s': %s\n"), + argv[0], sock_path, virGetLastErrorMessage()); + exit(EXIT_FAILURE); + } + + if (virRemoteSSHHelperRun(sock) < 0) { + g_printerr(_("%s: could not proxy traffic: %s\n"), + argv[0], virGetLastErrorMessage()); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} diff --git a/src/rpc/virnetsocket.h b/src/rpc/virnetsocket.h index d39b270480..3996d264fb 100644 --- a/src/rpc/virnetsocket.h +++ b/src/rpc/virnetsocket.h @@ -34,6 +34,7 @@ typedef struct _virNetSocket virNetSocket; typedef virNetSocket *virNetSocketPtr; =20 +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetSocket, virObjectUnref); =20 typedef void (*virNetSocketIOFunc)(virNetSocketPtr sock, int events, --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822364; cv=none; d=zohomail.com; s=zohoarc; b=BrHbw6Afl5Ar8FrrUTSVG4buDX0o0VLh3TkmQLBySeNOJcjb8XZMzRK1kLukkL8IXvUclH7vz3yvdomEPSgUO7NE16nIq9pkKM5N/0lsHWopSAFH23c33IE6naBvOW6lO2vjM8EzBfFkw/9sFDCOR1lDjtBAWXCrJeuR57fpFi8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822364; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JL/96E9JhSuPtTEBaP5R2WHHUruzpuUzWPl5KLV9/MU=; b=IC1kwO8W5QVbEzs6uDPdNNbTLNsiUfypAd+andiRlXHXvCpA0yVgkw55h/WUlXtvH9is98USmc6XaHogBw3MSDt6mnAA0rE5rmcAFA4oq55hpk5r629k1VVelPLkEp41ewvZrW//rNzsOvqidsLPc4kuSbhCz0tkptBZH/bEBus= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1596822364375294.5027830365475; Fri, 7 Aug 2020 10:46:04 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-400-2V-18RsPMU2vQLfLCQokEQ-1; Fri, 07 Aug 2020 13:44:41 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D966E101C8A0; Fri, 7 Aug 2020 17:44:34 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BB8B087A6D; Fri, 7 Aug 2020 17:44:34 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 8B085A5530; Fri, 7 Aug 2020 17:44:34 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfJZ3017769 for ; Fri, 7 Aug 2020 13:41:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id 64ADF5D9E8; Fri, 7 Aug 2020 17:41:19 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 90E895D9D5; Fri, 7 Aug 2020 17:41:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822363; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=JL/96E9JhSuPtTEBaP5R2WHHUruzpuUzWPl5KLV9/MU=; b=bZA6G3Jf0ueKEMfkvwNfCyjKCP1ZAEj+sulAibNUi2pwXMhyTEq3iCeKRfu5PkFosWCqC6 qLzhNmcKXn7mvhVh0I3HNr5HyuH45xXdY6Fn6/Or87fT3B7Hb0l77WoLk4pkWb7rcbzsl1 74B9hZ0qGLe9CAQksyyYXkB1jT0Z7PE= X-MC-Unique: 2V-18RsPMU2vQLfLCQokEQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 09/11] rpc: switch order of args in virNetClientNewSSH Date: Fri, 7 Aug 2020 18:40:57 +0100 Message-Id: <20200807174059.312786-10-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Switch keyfile and netcat parameters, since the netcat path and socket path are a logical pair that belong together. This patches the other constructors. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 2 +- src/rpc/virnetclient.c | 2 +- src/rpc/virnetclient.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index df10cfaef6..d56f4b7260 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1010,8 +1010,8 @@ doRemoteOpen(virConnectPtr conn, username, !tty, !verify, - netcat, keyfile, + netcat, sockname))) goto failed; =20 diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index f65cda0d7f..72ece28f59 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -444,8 +444,8 @@ virNetClientPtr virNetClientNewSSH(const char *nodename, const char *username, bool noTTY, bool noVerify, - const char *netcatPath, const char *keyfile, + const char *netcatPath, const char *socketPath) { virNetSocketPtr sock; diff --git a/src/rpc/virnetclient.h b/src/rpc/virnetclient.h index 0005de46f3..6fdc370083 100644 --- a/src/rpc/virnetclient.h +++ b/src/rpc/virnetclient.h @@ -48,9 +48,9 @@ virNetClientPtr virNetClientNewSSH(const char *nodename, const char *username, bool noTTY, bool noVerify, - const char *netcat, const char *keyfile, - const char *path); + const char *netcat, + const char *socketPath); =20 virNetClientPtr virNetClientNewLibSSH2(const char *host, const char *port, --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822117; cv=none; d=zohomail.com; s=zohoarc; b=MVHnbX7vlXRlUCVA4LJGSU2piATSxCcFUd+PfRJdBxCnUbtemD+OfBC/T2/cyt01gKJk2Ja/t4ErQnsKXwf596paPv1HCzz36k7IUHv9aofc7GvI6oKs2Obor+hYFhoAlXlc4YiuxngXR08PuTml5daub9XeEFTi27ckbvjpBDA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822117; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=b3Efry1mTSbH4YTiz5zU5f6k8KnHirufVtshLs+cd74=; b=NJBiYqcKfPXrCYOHbXJ+cinYZSJ8tyq6q2/LqfCP2HiSsTFWBbd8KrCqU9c1xiYOMxMpDtDwx8Zgu2pzvMWDaqoEbqjgYvE2Auuxzt9yw3P2Unq6XmRvNq9qbXtwA9OCo3N44LyLCt2jaQeFQ9xlrg68YBOmOcNq57hUFj16tes= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1596822117449978.6836604952825; Fri, 7 Aug 2020 10:41:57 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-458-0KFl1xbTOD68RnACAuQVCQ-1; Fri, 07 Aug 2020 13:41:51 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D4C69101C8A9; Fri, 7 Aug 2020 17:41:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B580B8AC05; Fri, 7 Aug 2020 17:41:45 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 834B61809554; Fri, 7 Aug 2020 17:41:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfNTM017791 for ; Fri, 7 Aug 2020 13:41:23 -0400 Received: by smtp.corp.redhat.com (Postfix) id 947E35D9E8; Fri, 7 Aug 2020 17:41:23 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 77BF35D9D5; Fri, 7 Aug 2020 17:41:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822116; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=b3Efry1mTSbH4YTiz5zU5f6k8KnHirufVtshLs+cd74=; b=edk3GYH/PGVse5aL5pYj/LwjDGMdM6z7H8pGZ1ggyivVKwtYEwyl4XfkGvpDg2eTsHjcax nKL5EwhhLdUsVZS1MWI0rId3OCWd7dCquox0aosvXMlX0msLOZhp67w8ODN/WRB9Im9yEj fv7r+aB9VcjZsWk/ccjtqG33q9pangY= X-MC-Unique: 0KFl1xbTOD68RnACAuQVCQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 10/11] rpc: use new virt-ssh-helper binary for remote tunnelling Date: Fri, 7 Aug 2020 18:40:58 +0100 Message-Id: <20200807174059.312786-11-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) This wires up support for using the new virt-ssh-helper binary with the ssh, libssh and libssh2 protocols. The new binary will be used preferentially if it is available in $PATH, otherwise we fall back to traditional netcat. The "proxy" URI parameter can be used to force use of netcat e.g. qemu+ssh://host/system?proxy=3Dnetcat or the disable fallback e.g. qemu+ssh://host/system?proxy=3Dnative With use of virt-ssh-helper, we can now support remote session URIs qemu+ssh://host/session and this will only use virt-ssh-helper, with no fallback. This also lets the libvirtd process be auto-started, and connect directly to the modular daemons, avoiding use of virtproxyd back-compat tunnelling. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- docs/uri.html.in | 24 +++++++++- src/remote/remote_driver.c | 33 ++++++++++++- src/remote/remote_sockets.c | 8 ---- src/rpc/virnetclient.c | 96 +++++++++++++++++++++++++++++-------- src/rpc/virnetclient.h | 30 ++++++++++-- tests/virnetsockettest.c | 7 ++- 6 files changed, 162 insertions(+), 36 deletions(-) diff --git a/docs/uri.html.in b/docs/uri.html.in index 49f92773f8..27e36e099b 100644 --- a/docs/uri.html.in +++ b/docs/uri.html.in @@ -259,6 +259,24 @@ Note that parameter values must be Example: mode=3Ddirect + + + proxy + + auto, netcat, native + +
+
auto
try native, fallback to netcat +
netcat
only use netcat
+
native
only use native
+
+ Can also be set in libvirt.conf as remote_pro= xy + + + + + Example: proxy=3Dnative + command @@ -296,8 +314,10 @@ Note that parameter values must be ssh, libssh2, libssh The name of the netcat command on the remote machine. - The default is nc. For ssh transport, libvirt - constructs an ssh command which looks like: + The default is nc. This is not permitted + when using the native proxy mode. For ssh + transport, libvirt constructs an ssh command which looks + like: =20
command -p port [-l username] hostname netcat -U socket
 
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index d56f4b7260..88eb52ec4b 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -761,12 +761,14 @@ doRemoteOpen(virConnectPtr conn, g_autofree char *knownHosts =3D NULL; g_autofree char *mode_str =3D NULL; g_autofree char *daemon_name =3D NULL; + g_autofree char *proxy_str =3D NULL; bool sanity =3D true; bool verify =3D true; #ifndef WIN32 bool tty =3D true; #endif int mode; + int proxy; =20 if (inside_daemon && !conn->uri->server) { mode =3D REMOTE_DRIVER_MODE_DIRECT; @@ -774,6 +776,14 @@ doRemoteOpen(virConnectPtr conn, mode =3D REMOTE_DRIVER_MODE_AUTO; } =20 + /* Historically we didn't allow ssh tunnel with session mode, + * since we can't construct the accurate path remotely, + * so we can default to modern virt-ssh-helper */ + if (flags & VIR_DRV_OPEN_REMOTE_USER) + proxy =3D VIR_NET_CLIENT_PROXY_NATIVE; + else + proxy =3D VIR_NET_CLIENT_PROXY_AUTO; + /* We handle *ALL* URIs here. The caller has rejected any * URIs we don't care about */ =20 @@ -813,6 +823,7 @@ doRemoteOpen(virConnectPtr conn, EXTRACT_URI_ARG_STR("known_hosts_verify", knownHostsVerify); EXTRACT_URI_ARG_STR("tls_priority", tls_priority); EXTRACT_URI_ARG_STR("mode", mode_str); + EXTRACT_URI_ARG_STR("proxy", proxy_str); EXTRACT_URI_ARG_BOOL("no_sanity", sanity); EXTRACT_URI_ARG_BOOL("no_verify", verify); #ifndef WIN32 @@ -865,6 +876,17 @@ doRemoteOpen(virConnectPtr conn, (mode =3D remoteDriverModeTypeFromString(mode_str)) < 0) goto failed; =20 + if (conf && !proxy_str && + virConfGetValueString(conf, "remote_proxy", &proxy_str) < 0) + goto failed; + + if (proxy_str && + (proxy =3D virNetClientProxyTypeFromString(proxy_str)) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Unnkown proxy type '%s'"), proxy_str); + goto failed; + } + /* Sanity check that nothing requested !direct mode by mistake */ if (inside_daemon && !conn->uri->server && mode !=3D REMOTE_DRIVER_MOD= E_DIRECT) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -949,8 +971,11 @@ doRemoteOpen(virConnectPtr conn, knownHosts, knownHostsVerify, sshauth, + proxy, netcat, sockname, + name, + flags & VIR_DRV_OPEN_REMOTE_= RO, auth, conn->uri); if (!priv->client) @@ -970,8 +995,11 @@ doRemoteOpen(virConnectPtr conn, knownHosts, knownHostsVerify, sshauth, + proxy, netcat, sockname, + name, + flags & VIR_DRV_OPEN_REMOTE_R= O, auth, conn->uri); if (!priv->client) @@ -1011,8 +1039,11 @@ doRemoteOpen(virConnectPtr conn, !tty, !verify, keyfile, + proxy, netcat, - sockname))) + sockname, + name, + flags & VIR_DRV_OPEN_REMOT= E_RO))) goto failed; =20 priv->is_secure =3D 1; diff --git a/src/remote/remote_sockets.c b/src/remote/remote_sockets.c index 854775f401..7c69ed9e7f 100644 --- a/src/remote/remote_sockets.c +++ b/src/remote/remote_sockets.c @@ -108,14 +108,6 @@ remoteGetUNIXSocketHelper(remoteDriverTransport transp= ort, g_autofree char *userdir =3D NULL; =20 if (session) { - if (transport !=3D REMOTE_DRIVER_TRANSPORT_UNIX) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("Connecting to session instance without " - "socket path is not supported by the %s " - "transport"), - remoteDriverTransportTypeToString(transport)); - return NULL; - } userdir =3D virGetUserRuntimeDirectory(); =20 sockname =3D g_strdup_printf("%s/%s-sock", userdir, sock_prefix); diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 72ece28f59..46a875a0cb 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -50,6 +50,10 @@ enum { VIR_NET_CLIENT_MODE_COMPLETE, }; =20 +VIR_ENUM_IMPL(virNetClientProxy, + VIR_NET_CLIENT_PROXY_LAST, + "auto", "netcat", "native"); + struct _virNetClientCall { int mode; =20 @@ -414,23 +418,64 @@ virNetClientDoubleEscapeShell(const char *str) } =20 char * -virNetClientSSHHelperCommand(const char *netcatPath, - const char *socketPath) -{ - g_autofree char *netcatPathSafe =3D virNetClientDoubleEscapeShell(netc= atPath); - - if (!netcatPath) - netcatPath =3D "nc"; +virNetClientSSHHelperCommand(virNetClientProxy proxy, + const char *netcatPath, + const char *socketPath, + const char *driverURI, + bool readonly) +{ + g_autofree char *netcatPathSafe =3D virNetClientDoubleEscapeShell(netc= atPath ? netcatPath : "nc"); + g_autofree char *driverURISafe =3D virNetClientDoubleEscapeShell(drive= rURI); + g_autofree char *nccmd =3D NULL; + g_autofree char *helpercmd =3D NULL; + + /* If user gave a 'netcat' path in the URI, we must + * assume they want the legacy 'nc' based proxy, not + * our new virt-ssh-helper + */ + if (proxy =3D=3D VIR_NET_CLIENT_PROXY_AUTO && + netcatPath !=3D NULL) { + proxy =3D VIR_NET_CLIENT_PROXY_NETCAT; + } =20 - return g_strdup_printf( - "sh -c " - "'if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1;= then " - "ARG=3D-q0;" + nccmd =3D g_strdup_printf( + "if '%s' -q 2>&1 | grep \"requires an argument\" >/dev/null 2>&1; = then " + "ARG=3D-q0;" "else " - "ARG=3D;" + "ARG=3D;" "fi;" - "'%s' $ARG -U %s'", + "'%s' $ARG -U %s", netcatPathSafe, netcatPathSafe, socketPath); + + helpercmd =3D g_strdup_printf("virt-ssh-helper%s'%s'", + readonly ? " -r " : " ", + driverURISafe); + + switch (proxy) { + case VIR_NET_CLIENT_PROXY_AUTO: + return g_strdup_printf("sh -c 'which virt-nc 1>/dev/null 2>&1; " + "if test $? =3D 0; then " + " %s; " + "else" + " %s; " + "fi'", helpercmd, nccmd); + + case VIR_NET_CLIENT_PROXY_NETCAT: + return g_strdup_printf("sh -c '%s'", nccmd); + + case VIR_NET_CLIENT_PROXY_NATIVE: + if (netcatPath) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("netcat path not valid with native proxy mode= ")); + return NULL; + } + return g_strdup_printf("sh -c '%s'", helpercmd); + + case VIR_NET_CLIENT_PROXY_LAST: + default: + virReportEnumRangeError(virNetClientProxy, proxy); + return NULL; + } } =20 =20 @@ -445,15 +490,18 @@ virNetClientPtr virNetClientNewSSH(const char *nodena= me, bool noTTY, bool noVerify, const char *keyfile, + virNetClientProxy proxy, const char *netcatPath, - const char *socketPath) + const char *socketPath, + const char *driverURI, + bool readonly) { virNetSocketPtr sock; g_autofree char *command =3D NULL; =20 - DEFAULT_VALUE(netcatPath, "nc"); - - command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); + if (!(command =3D virNetClientSSHHelperCommand(proxy, netcatPath, sock= etPath, + driverURI, readonly))) + return NULL; =20 if (virNetSocketNewConnectSSH(nodename, service, binary, username, noT= TY, noVerify, keyfile, command, &sock) < 0) @@ -470,8 +518,11 @@ virNetClientPtr virNetClientNewLibSSH2(const char *hos= t, const char *knownHostsPath, const char *knownHostsVerify, const char *authMethods, + virNetClientProxy proxy, const char *netcatPath, const char *socketPath, + const char *driverURI, + bool readonly, virConnectAuthPtr authPtr, virURIPtr uri) { @@ -510,7 +561,9 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host, DEFAULT_VALUE(username, "root"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 - command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); + if (!(command =3D virNetClientSSHHelperCommand(proxy, netcatPath, sock= etPath, + driverURI, readonly))) + return NULL; =20 if (virNetSocketNewConnectLibSSH2(host, port, family, @@ -530,8 +583,11 @@ virNetClientPtr virNetClientNewLibssh(const char *host, const char *knownHostsPath, const char *knownHostsVerify, const char *authMethods, + virNetClientProxy proxy, const char *netcatPath, const char *socketPath, + const char *driverURI, + bool readonly, virConnectAuthPtr authPtr, virURIPtr uri) { @@ -570,7 +626,9 @@ virNetClientPtr virNetClientNewLibssh(const char *host, DEFAULT_VALUE(username, "root"); DEFAULT_VALUE(knownHostsVerify, "normal"); =20 - command =3D virNetClientSSHHelperCommand(netcatPath, socketPath); + if (!(command =3D virNetClientSSHHelperCommand(proxy, netcatPath, sock= etPath, + driverURI, readonly))) + return NULL; =20 if (virNetSocketNewConnectLibssh(host, port, family, diff --git a/src/rpc/virnetclient.h b/src/rpc/virnetclient.h index 6fdc370083..4789316e32 100644 --- a/src/rpc/virnetclient.h +++ b/src/rpc/virnetclient.h @@ -30,9 +30,22 @@ #include "virobject.h" #include "viruri.h" =20 +typedef enum { + VIR_NET_CLIENT_PROXY_AUTO, + VIR_NET_CLIENT_PROXY_NETCAT, + VIR_NET_CLIENT_PROXY_NATIVE, + + VIR_NET_CLIENT_PROXY_LAST, +} virNetClientProxy; + +VIR_ENUM_DECL(virNetClientProxy); + char * -virNetClientSSHHelperCommand(const char *netcatPath, - const char *socketPath); +virNetClientSSHHelperCommand(virNetClientProxy proxy, + const char *netcatPath, + const char *socketPath, + const char *driverURI, + bool readonly); =20 virNetClientPtr virNetClientNewUNIX(const char *path, bool spawnDaemon, @@ -49,8 +62,11 @@ virNetClientPtr virNetClientNewSSH(const char *nodename, bool noTTY, bool noVerify, const char *keyfile, - const char *netcat, - const char *socketPath); + virNetClientProxy proxy, + const char *netcatPath, + const char *socketPath, + const char *driverURI, + bool readonly); =20 virNetClientPtr virNetClientNewLibSSH2(const char *host, const char *port, @@ -60,8 +76,11 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host, const char *knownHostsPath, const char *knownHostsVerify, const char *authMethods, + virNetClientProxy proxy, const char *netcatPath, const char *socketPath, + const char *driverURI, + bool readonly, virConnectAuthPtr authPtr, virURIPtr uri); =20 @@ -73,8 +92,11 @@ virNetClientPtr virNetClientNewLibssh(const char *host, const char *knownHostsPath, const char *knownHostsVerify, const char *authMethods, + virNetClientProxy proxy, const char *netcatPath, const char *socketPath, + const char *driverURI, + bool readonly, virConnectAuthPtr authPtr, virURIPtr uri); =20 diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 31fe1f86f4..93835af62f 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -469,8 +469,11 @@ static int testSocketSSH(const void *opaque) virNetSocketPtr csock =3D NULL; /* Client socket */ int ret =3D -1; char buf[1024]; - g_autofree char *command =3D virNetClientSSHHelperCommand(data->netcat, - data->path); + g_autofree char *command =3D virNetClientSSHHelperCommand(VIR_NET_CLIE= NT_PROXY_AUTO, + data->netcat, + data->path, + "qemu:///sessi= on", + true); =20 if (virNetSocketNewConnectSSH(data->nodename, data->service, --=20 2.26.2 From nobody Wed May 8 22:18:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1596822288; cv=none; d=zohomail.com; s=zohoarc; b=WLX1QVjP0NxMznredWZcB3Dz0mT3eq6BiXIfIgnoAoKf650EDfacOZct+6Vn9rTzDgzShVbIszd9Vg/9X7URzfYWIRY9LR+FOlYM2IyuhnXHkdndZjzgK9Ht4hdctAJ91aOsjJu4H76KWxa4lQBh8/9IwmYfQNDCJtPLPLki9zI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1596822288; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=eZMJmmI7296WB8Wq/W8PYenPDE76WjQz4d046yI3qgU=; b=BWRffvbGeeW9/4Nwt5JSUk+HvzQwY8Q5xrj2HD1wPjzgXf7L5QS5y0twmkFz/Dy9Cvy95Z6Bmyo02XcRISVyheSj1jhkez/67OH8D/cjCJmL/R/9oaM5Ncuh0hZ/tLF9KiIH0n47Tu8QtJtdVHT4bgRn5CHPPsL/55UboBgI1HQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 159682228885651.574287378688496; Fri, 7 Aug 2020 10:44:48 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-71-kF0Dm662MQmJb84awPq0ug-1; Fri, 07 Aug 2020 13:44:45 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AB9BC10CE780; Fri, 7 Aug 2020 17:44:39 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8B8AB5F207; Fri, 7 Aug 2020 17:44:39 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 241E81806B0D; Fri, 7 Aug 2020 17:44:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 077HfOaM017804 for ; Fri, 7 Aug 2020 13:41:24 -0400 Received: by smtp.corp.redhat.com (Postfix) id E0A075D9E8; Fri, 7 Aug 2020 17:41:24 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 01AF95D9D5; Fri, 7 Aug 2020 17:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596822287; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=eZMJmmI7296WB8Wq/W8PYenPDE76WjQz4d046yI3qgU=; b=i6QUfG8Zw0k1Mr285koHPy1WJCcq7BXEaz96DUGsFDOkrScfauquffAdGCTseB5TZlHpUt LMJRbB9yoV0TQZS2WcYRxPE3HCgBdNIM2MifN3F6gC82/U1Bj06h2hzc4s2NtIJAuyjA19 /Ie/j+jrd87J3Mn+rdIeX5yjMIOMXdU= X-MC-Unique: kF0Dm662MQmJb84awPq0ug-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH v4 11/11] remote: fix error reporting for invalid daemon mode Date: Fri, 7 Aug 2020 18:40:59 +0100 Message-Id: <20200807174059.312786-12-berrange@redhat.com> In-Reply-To: <20200807174059.312786-1-berrange@redhat.com> References: <20200807174059.312786-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/remote/remote_driver.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 88eb52ec4b..cc1a10b775 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -873,8 +873,11 @@ doRemoteOpen(virConnectPtr conn, goto failed; =20 if (mode_str && - (mode =3D remoteDriverModeTypeFromString(mode_str)) < 0) + (mode =3D remoteDriverModeTypeFromString(mode_str)) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Unknown remote mode '%s'"), mode_str); goto failed; + } =20 if (conf && !proxy_str && virConfGetValueString(conf, "remote_proxy", &proxy_str) < 0) --=20 2.26.2