From nobody Wed May 14 21:35:58 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1516714311209856.5621383748658; Tue, 23 Jan 2018 05:31:51 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54EFE629C4; Tue, 23 Jan 2018 13:31:50 +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 12CF3798D0; Tue, 23 Jan 2018 13:31:50 +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 C72033FB1C; Tue, 23 Jan 2018 13:31:49 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w0NDOhiQ027090 for ; Tue, 23 Jan 2018 08:24:43 -0500 Received: by smtp.corp.redhat.com (Postfix) id 5BD3F7BB51; Tue, 23 Jan 2018 13:24:43 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id CD79A7BB4D; Tue, 23 Jan 2018 13:24:41 +0000 (UTC) From: "Daniel P. Berrange" To: libvir-list@redhat.com Date: Tue, 23 Jan 2018 13:23:46 +0000 Message-Id: <20180123132347.21944-11-berrange@redhat.com> In-Reply-To: <20180123132347.21944-1-berrange@redhat.com> References: <20180123132347.21944-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 10/11] logd: add support for admin protocol in virtlogd 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 23 Jan 2018 13:31:50 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add a virtlogd-admin-sock can serves the admin protocol for the virtlogd daemon and define a virtlogd:///{system,session} URI scheme for connecting to it. Signed-off-by: Daniel P. Berrange --- src/Makefile.am | 1 + src/libvirt-admin.c | 20 +++-- src/logging/log_daemon.c | 149 +++++++++++++++++++++++++++----= ---- src/logging/log_daemon_config.c | 3 + src/logging/log_daemon_config.h | 1 + src/logging/test_virtlogd.aug.in | 4 + src/logging/virtlogd-admin.socket.in | 10 +++ src/logging/virtlogd.aug | 1 + src/logging/virtlogd.service.in | 1 + 9 files changed, 149 insertions(+), 41 deletions(-) create mode 100644 src/logging/virtlogd-admin.socket.in diff --git a/src/Makefile.am b/src/Makefile.am index fd8756f10c..828306fd35 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2672,6 +2672,7 @@ virtlogd_LDFLAGS =3D \ $(PIE_LDFLAGS) \ $(NULL) virtlogd_LDADD =3D \ + libvirt_driver_admin.la \ libvirt-net-rpc-server.la \ libvirt-net-rpc.la \ libvirt_util.la \ diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c index 48e6d7fc8a..9d1bff536b 100644 --- a/src/libvirt-admin.c +++ b/src/libvirt-admin.c @@ -38,8 +38,9 @@ =20 #define VIR_FROM_THIS VIR_FROM_ADMIN =20 -#define LIBVIRTD_ADMIN_SOCK_NAME "/libvirt-admin-sock" -#define LIBVIRTD_ADMIN_UNIX_SOCKET LOCALSTATEDIR "/run/libvirt" LIBVIRTD_A= DMIN_SOCK_NAME +#define LIBVIRTD_ADMIN_SOCK_NAME "libvirt-admin-sock" +#define VIRTLOGD_ADMIN_SOCK_NAME "virtlogd-admin-sock" + =20 VIR_LOG_INIT("libvirt-admin"); =20 @@ -128,18 +129,25 @@ getSocketPath(virURIPtr uri) } =20 if (!sock_path) { - if (STRNEQ_NULLABLE(uri->scheme, "libvirtd")) { + const char *sockbase =3D NULL; + if (STREQ_NULLABLE(uri->scheme, "libvirtd")) { + sockbase =3D LIBVIRTD_ADMIN_SOCK_NAME; + } else if (STREQ_NULLABLE(uri->scheme, "virtlogd")) { + sockbase =3D VIRTLOGD_ADMIN_SOCK_NAME; + } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported URI scheme '%s'"), NULLSTR(uri->scheme)); goto error; } + if (STREQ_NULLABLE(uri->path, "/system")) { - if (VIR_STRDUP(sock_path, LIBVIRTD_ADMIN_UNIX_SOCKET) < 0) + if (virAsprintf(&sock_path, LOCALSTATEDIR "/run/libvirt/%s", + sockbase) < 0) goto error; } else if (STREQ_NULLABLE(uri->path, "/session")) { - if (!rundir || virAsprintf(&sock_path, "%s%s", rundir, - LIBVIRTD_ADMIN_SOCK_NAME) < 0) + if (!rundir || virAsprintf(&sock_path, "%s/%s", rundir, + sockbase) < 0) goto error; } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c index 33133af2af..d54d26ab9d 100644 --- a/src/logging/log_daemon.c +++ b/src/logging/log_daemon.c @@ -32,6 +32,7 @@ =20 #include "log_daemon.h" #include "log_daemon_config.h" +#include "admin/admin_server_dispatch.h" #include "virutil.h" #include "virfile.h" #include "virpidfile.h" @@ -137,7 +138,7 @@ static virLogDaemonPtr virLogDaemonNew(virLogDaemonConfigPtr config, bool privileged) { virLogDaemonPtr logd; - virNetServerPtr srv; + virNetServerPtr srv =3D NULL; =20 if (VIR_ALLOC(logd) < 0) return NULL; @@ -149,6 +150,9 @@ virLogDaemonNew(virLogDaemonConfigPtr config, bool priv= ileged) return NULL; } =20 + if (!(logd->dmn =3D virNetDaemonNew())) + goto error; + if (!(srv =3D virNetServerNew("virtlogd", 1, 1, 1, 0, config->max_clients, config->max_clients, -1, 0, @@ -159,8 +163,22 @@ virLogDaemonNew(virLogDaemonConfigPtr config, bool pri= vileged) (void*)(intptr_t)(privileged ? 0x1 : 0x0))= )) goto error; =20 - if (!(logd->dmn =3D virNetDaemonNew()) || - virNetDaemonAddServer(logd->dmn, srv) < 0) + if (virNetDaemonAddServer(logd->dmn, srv) < 0) + goto error; + virObjectUnref(srv); + srv =3D NULL; + + if (!(srv =3D virNetServerNew("admin", 1, + 1, 1, 0, config->admin_max_clients, + config->admin_max_clients, -1, 0, + NULL, + remoteAdmClientNew, + remoteAdmClientPreExecRestart, + remoteAdmClientFree, + logd->dmn))) + goto error; + + if (virNetDaemonAddServer(logd->dmn, srv) < 0) goto error; virObjectUnref(srv); srv =3D NULL; @@ -189,7 +207,7 @@ virLogDaemonGetHandler(virLogDaemonPtr dmn) =20 =20 static virNetServerPtr -virLogDaemonNewServerPostExecRestart(virNetDaemonPtr dmn ATTRIBUTE_UNUSED, +virLogDaemonNewServerPostExecRestart(virNetDaemonPtr dmn, const char *name, virJSONValuePtr object, void *opaque) @@ -202,6 +220,14 @@ virLogDaemonNewServerPostExecRestart(virNetDaemonPtr d= mn ATTRIBUTE_UNUSED, virLogDaemonClientPreExecRes= tart, virLogDaemonClientFree, opaque); + } else if (STREQ(name, "admin")) { + return virNetServerNewPostExecRestart(object, + name, + remoteAdmClientNew, + remoteAdmClientNewPostExecRe= start, + remoteAdmClientPreExecRestar= t, + remoteAdmClientFree, + dmn); } else { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected server name '%s' during restart"), @@ -354,10 +380,12 @@ virLogDaemonForkIntoBackground(const char *argv0) =20 static int virLogDaemonUnixSocketPaths(bool privileged, - char **sockfile) + char **sockfile, + char **adminSockfile) { if (privileged) { - if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/virtlogd-soc= k") < 0) + if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/virtlogd-soc= k") < 0 || + VIR_STRDUP(*adminSockfile, LOCALSTATEDIR "/run/libvirt/virtlog= d-admin-sock") < 0) goto error; } else { char *rundir =3D NULL; @@ -374,7 +402,8 @@ virLogDaemonUnixSocketPaths(bool privileged, } umask(old_umask); =20 - if (virAsprintf(sockfile, "%s/virtlogd-sock", rundir) < 0) { + if (virAsprintf(sockfile, "%s/virtlogd-sock", rundir) < 0 || + virAsprintf(adminSockfile, "%s/virtlogd-admin-sock", rundir) <= 0) { VIR_FREE(rundir); goto error; } @@ -485,29 +514,50 @@ virLogDaemonSetupSignals(virNetDaemonPtr dmn) =20 =20 static int -virLogDaemonSetupNetworkingSystemD(virNetServerPtr srv) +virLogDaemonSetupNetworkingSystemD(virNetServerPtr logSrv, virNetServerPtr= adminSrv) { - virNetServerServicePtr svc; unsigned int nfds; + size_t i; =20 if ((nfds =3D virGetListenFDs()) =3D=3D 0) return 0; - if (nfds > 1) + if (nfds > 2) VIR_DEBUG("Too many (%d) file descriptors from systemd", nfds); - nfds =3D 1; =20 - /* Systemd passes FDs, starting immediately after stderr, - * so the first FD we'll get is '3'. */ - if (!(svc =3D virNetServerServiceNewFD(3, 0, + for (i =3D 0; i < nfds && i < 2; i++) { + virNetServerServicePtr svc; + char *path =3D virGetUNIXSocketPath(3 + i); + virNetServerPtr srv; + + if (!path) + return -1; + + if (strstr(path, "virtlogd-admin-sock")) { + srv =3D adminSrv; + } else if (strstr(path, "virtlogd-sock")) { + srv =3D logSrv; + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown UNIX socket %s passed in"), + path); + VIR_FREE(path); + return -1; + } + VIR_FREE(path); + + /* Systemd passes FDs, starting immediately after stderr, + * so the first FD we'll get is '3'. */ + if (!(svc =3D virNetServerServiceNewFD(3 + i, 0, #if WITH_GNUTLS - NULL, + NULL, #endif - false, 0, 1))) - return -1; + false, 0, 1))) + return -1; =20 - if (virNetServerAddService(srv, svc, NULL) < 0) { - virObjectUnref(svc); - return -1; + if (virNetServerAddService(srv, svc, NULL) < 0) { + virObjectUnref(svc); + return -1; + } } return 1; } @@ -878,8 +928,10 @@ virLogDaemonUsage(const char *argv0, bool privileged) } =20 int main(int argc, char **argv) { - virNetServerPtr srv =3D NULL; + virNetServerPtr logSrv =3D NULL; + virNetServerPtr adminSrv =3D NULL; virNetServerProgramPtr logProgram =3D NULL; + virNetServerProgramPtr adminProgram =3D NULL; char *remote_config_file =3D NULL; int statuswrite =3D -1; int ret =3D 1; @@ -889,6 +941,7 @@ int main(int argc, char **argv) { char *pid_file =3D NULL; int pid_file_fd =3D -1; char *sock_file =3D NULL; + char *admin_sock_file =3D NULL; int timeout =3D -1; /* -t: Shutdown timeout */ char *state_file =3D NULL; bool implicit_conf =3D false; @@ -1016,12 +1069,13 @@ int main(int argc, char **argv) { VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file)); =20 if (virLogDaemonUnixSocketPaths(privileged, - &sock_file) < 0) { + &sock_file, + &admin_sock_file) < 0) { VIR_ERROR(_("Can't determine socket paths")); exit(EXIT_FAILURE); } - VIR_DEBUG("Decided on socket paths '%s'", - sock_file); + VIR_DEBUG("Decided on socket paths '%s' and '%s'", + sock_file, admin_sock_file); =20 if (virLogDaemonExecRestartStatePath(privileged, &state_file) < 0) { @@ -1098,22 +1152,30 @@ int main(int argc, char **argv) { goto cleanup; } =20 - srv =3D virNetDaemonGetServer(logDaemon->dmn, "virtlogd"); - if ((rv =3D virLogDaemonSetupNetworkingSystemD(srv)) < 0) { + logSrv =3D virNetDaemonGetServer(logDaemon->dmn, "virtlogd"); + adminSrv =3D virNetDaemonGetServer(logDaemon->dmn, "admin"); + if ((rv =3D virLogDaemonSetupNetworkingSystemD(logSrv, adminSrv)) = < 0) { ret =3D VIR_LOG_DAEMON_ERR_NETWORK; goto cleanup; } =20 /* Only do this, if systemd did not pass a FD */ - if (rv =3D=3D 0 && - virLogDaemonSetupNetworkingNative(srv, sock_file) < 0) { - ret =3D VIR_LOG_DAEMON_ERR_NETWORK; - goto cleanup; + if (rv =3D=3D 0) { + if (virLogDaemonSetupNetworkingNative(logSrv, sock_file) < 0 || + virLogDaemonSetupNetworkingNative(adminSrv, admin_sock_fil= e) < 0) { + ret =3D VIR_LOG_DAEMON_ERR_NETWORK; + goto cleanup; + } } - virObjectUnref(srv); + virObjectUnref(logSrv); + virObjectUnref(adminSrv); } =20 - srv =3D virNetDaemonGetServer(logDaemon->dmn, "virtlogd"); + logSrv =3D virNetDaemonGetServer(logDaemon->dmn, "virtlogd"); + /* If exec-restarting from old virtlogd, we won't have an + * admin server present */ + if (virNetDaemonHasServer(logDaemon->dmn, "admin")) + adminSrv =3D virNetDaemonGetServer(logDaemon->dmn, "admin"); =20 if (timeout !=3D -1) { VIR_DEBUG("Registering shutdown timeout %d", timeout); @@ -1133,11 +1195,25 @@ int main(int argc, char **argv) { ret =3D VIR_LOG_DAEMON_ERR_INIT; goto cleanup; } - if (virNetServerAddProgram(srv, logProgram) < 0) { + if (virNetServerAddProgram(logSrv, logProgram) < 0) { ret =3D VIR_LOG_DAEMON_ERR_INIT; goto cleanup; } =20 + if (adminSrv !=3D NULL) { + if (!(adminProgram =3D virNetServerProgramNew(ADMIN_PROGRAM, + ADMIN_PROTOCOL_VERSION, + adminProcs, + adminNProcs))) { + ret =3D VIR_LOG_DAEMON_ERR_INIT; + goto cleanup; + } + if (virNetServerAddProgram(adminSrv, adminProgram) < 0) { + ret =3D VIR_LOG_DAEMON_ERR_INIT; + goto cleanup; + } + } + /* Disable error func, now logging is setup */ virSetErrorFunc(NULL, virLogDaemonErrorHandler); =20 @@ -1155,7 +1231,7 @@ int main(int argc, char **argv) { =20 /* Start accepting new clients from network */ =20 - virNetServerUpdateServices(srv, true); + virNetDaemonUpdateServices(logDaemon->dmn, true); virNetDaemonRun(logDaemon->dmn); =20 if (execRestart && @@ -1168,7 +1244,9 @@ int main(int argc, char **argv) { =20 cleanup: virObjectUnref(logProgram); - virObjectUnref(srv); + virObjectUnref(adminProgram); + virObjectUnref(logSrv); + virObjectUnref(adminSrv); virLogDaemonFree(logDaemon); if (statuswrite !=3D -1) { if (ret !=3D 0) { @@ -1184,6 +1262,7 @@ int main(int argc, char **argv) { virPidFileReleasePath(pid_file, pid_file_fd); VIR_FREE(pid_file); VIR_FREE(sock_file); + VIR_FREE(admin_sock_file); VIR_FREE(state_file); VIR_FREE(run_dir); VIR_FREE(remote_config_file); diff --git a/src/logging/log_daemon_config.c b/src/logging/log_daemon_confi= g.c index cf58e6230e..3226b2c484 100644 --- a/src/logging/log_daemon_config.c +++ b/src/logging/log_daemon_config.c @@ -73,6 +73,7 @@ virLogDaemonConfigNew(bool privileged ATTRIBUTE_UNUSED) return NULL; =20 data->max_clients =3D 1024; + data->admin_max_clients =3D 5000; data->max_size =3D 1024 * 1024 * 2; data->max_backups =3D 3; =20 @@ -103,6 +104,8 @@ virLogDaemonConfigLoadOptions(virLogDaemonConfigPtr dat= a, return -1; if (virConfGetValueUInt(conf, "max_clients", &data->max_clients) < 0) return -1; + if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_cl= ients) < 0) + return -1; if (virConfGetValueSizeT(conf, "max_size", &data->max_size) < 0) return -1; if (virConfGetValueSizeT(conf, "max_backups", &data->max_backups) < 0) diff --git a/src/logging/log_daemon_config.h b/src/logging/log_daemon_confi= g.h index 72d77d5e6f..53101b0610 100644 --- a/src/logging/log_daemon_config.h +++ b/src/logging/log_daemon_config.h @@ -34,6 +34,7 @@ struct _virLogDaemonConfig { char *log_filters; char *log_outputs; unsigned int max_clients; + unsigned int admin_max_clients; =20 size_t max_backups; size_t max_size; diff --git a/src/logging/test_virtlogd.aug.in b/src/logging/test_virtlogd.a= ug.in index 3e6888fd48..ee3fae5cde 100644 --- a/src/logging/test_virtlogd.aug.in +++ b/src/logging/test_virtlogd.aug.in @@ -2,6 +2,8 @@ module Test_virtlogd =3D let conf =3D "log_level =3D 3 log_filters=3D\"3:remote 4:event\" log_outputs=3D\"3:syslog:virtlogd\" +max_clients =3D 10 +admin_max_clients =3D 10 max_size =3D 131072 max_backups =3D 3 " @@ -10,5 +12,7 @@ max_backups =3D 3 { "log_level" =3D "3" } { "log_filters" =3D "3:remote 4:event" } { "log_outputs" =3D "3:syslog:virtlogd" } + { "max_clients" =3D "10" } + { "admin_max_clients" =3D "10" } { "max_size" =3D "131072" } { "max_backups" =3D "3" } diff --git a/src/logging/virtlogd-admin.socket.in b/src/logging/virtlogd-ad= min.socket.in new file mode 100644 index 0000000000..595e6c4c4b --- /dev/null +++ b/src/logging/virtlogd-admin.socket.in @@ -0,0 +1,10 @@ +[Unit] +Description=3DVirtual machine log manager socket +Before=3Dlibvirtd.service + +[Socket] +ListenStream=3D@localstatedir@/run/libvirt/virtlogd-admin-sock +Service=3Dvirtlogd.service + +[Install] +WantedBy=3Dsockets.target diff --git a/src/logging/virtlogd.aug b/src/logging/virtlogd.aug index 5ed174230d..4fdcba72af 100644 --- a/src/logging/virtlogd.aug +++ b/src/logging/virtlogd.aug @@ -29,6 +29,7 @@ module Virtlogd =3D | str_entry "log_outputs" | int_entry "log_buffer_size" | int_entry "max_clients" + | int_entry "admin_max_clients" | int_entry "max_size" | int_entry "max_backups" =20 diff --git a/src/logging/virtlogd.service.in b/src/logging/virtlogd.service= .in index aa9aa698b5..3d9ae36150 100644 --- a/src/logging/virtlogd.service.in +++ b/src/logging/virtlogd.service.in @@ -1,6 +1,7 @@ [Unit] Description=3DVirtual machine log manager Requires=3Dvirtlogd.socket +Requires=3Dvirtlogd-admin.socket Before=3Dlibvirtd.service Documentation=3Dman:virtlogd(8) Documentation=3Dhttps://libvirt.org --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list