[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v3 1/4] tools: remove systemd xenstore socket definitions



On a system with systemd the xenstore sockets are created via systemd.
Remove the related configuration files in order to be able to decide
at runtime whether the sockets should be created or not. This will
enable Xen to start xenstore either via a daemon or via a stub domain.

As the xenstore domain start program will exit after it has done its
job prepare the same behaviour to be tolerated by systemd for the
xenstore daemon by specifying the appropriate flags in the service
file.

A rerun of autogen.sh is required.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V3: re-add sd_notify() call
---
 tools/configure                                    |   4 +-
 tools/configure.ac                                 |   2 -
 tools/hotplug/Linux/systemd/Makefile               |   5 -
 tools/hotplug/Linux/systemd/xenstored.service.in   |   5 +-
 tools/hotplug/Linux/systemd/xenstored.socket.in    |  13 ---
 tools/hotplug/Linux/systemd/xenstored_ro.socket.in |  13 ---
 tools/ocaml/xenstored/systemd.ml                   |   1 -
 tools/ocaml/xenstored/systemd.mli                  |   5 -
 tools/ocaml/xenstored/systemd_stubs.c              | 113 ++++-----------------
 tools/ocaml/xenstored/utils.ml                     |  21 ++--
 tools/xenstore/xenstored_core.c                    |  92 +----------------
 11 files changed, 33 insertions(+), 241 deletions(-)
 delete mode 100644 tools/hotplug/Linux/systemd/xenstored.socket.in
 delete mode 100644 tools/hotplug/Linux/systemd/xenstored_ro.socket.in

diff --git a/tools/configure b/tools/configure
index 5b5dcce..1c84c6c 100755
--- a/tools/configure
+++ b/tools/configure
@@ -9670,7 +9670,7 @@ fi
 
 if test "x$systemd" = "xy"; then :
 
-    ac_config_files="$ac_config_files hotplug/Linux/systemd/proc-xen.mount 
hotplug/Linux/systemd/var-lib-xenstored.mount 
hotplug/Linux/systemd/xen-init-dom0.service 
hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service 
hotplug/Linux/systemd/xen-watchdog.service 
hotplug/Linux/systemd/xenconsoled.service 
hotplug/Linux/systemd/xendomains.service 
hotplug/Linux/systemd/xendriverdomain.service 
hotplug/Linux/systemd/xenstored.service hotplug/Linux/systemd/xenstored.socket 
hotplug/Linux/systemd/xenstored_ro.socket"
+    ac_config_files="$ac_config_files hotplug/Linux/systemd/proc-xen.mount 
hotplug/Linux/systemd/var-lib-xenstored.mount 
hotplug/Linux/systemd/xen-init-dom0.service 
hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service 
hotplug/Linux/systemd/xen-watchdog.service 
hotplug/Linux/systemd/xenconsoled.service 
hotplug/Linux/systemd/xendomains.service 
hotplug/Linux/systemd/xendriverdomain.service 
hotplug/Linux/systemd/xenstored.service"
 
 
 fi
@@ -10394,8 +10394,6 @@ do
     "hotplug/Linux/systemd/xendomains.service") CONFIG_FILES="$CONFIG_FILES 
hotplug/Linux/systemd/xendomains.service" ;;
     "hotplug/Linux/systemd/xendriverdomain.service") 
CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xendriverdomain.service" ;;
     "hotplug/Linux/systemd/xenstored.service") CONFIG_FILES="$CONFIG_FILES 
hotplug/Linux/systemd/xenstored.service" ;;
-    "hotplug/Linux/systemd/xenstored.socket") CONFIG_FILES="$CONFIG_FILES 
hotplug/Linux/systemd/xenstored.socket" ;;
-    "hotplug/Linux/systemd/xenstored_ro.socket") CONFIG_FILES="$CONFIG_FILES 
hotplug/Linux/systemd/xenstored_ro.socket" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
diff --git a/tools/configure.ac b/tools/configure.ac
index 87e14a8..f991ab3 100644
--- a/tools/configure.ac
+++ b/tools/configure.ac
@@ -438,8 +438,6 @@ AS_IF([test "x$systemd" = "xy"], [
     hotplug/Linux/systemd/xendomains.service
     hotplug/Linux/systemd/xendriverdomain.service
     hotplug/Linux/systemd/xenstored.service
-    hotplug/Linux/systemd/xenstored.socket
-    hotplug/Linux/systemd/xenstored_ro.socket
     ])
 ])
 
diff --git a/tools/hotplug/Linux/systemd/Makefile 
b/tools/hotplug/Linux/systemd/Makefile
index 558e459..7d24bbe 100644
--- a/tools/hotplug/Linux/systemd/Makefile
+++ b/tools/hotplug/Linux/systemd/Makefile
@@ -6,9 +6,6 @@ XEN_SYSTEMD_MODULES = xen.conf
 XEN_SYSTEMD_MOUNT =  proc-xen.mount
 XEN_SYSTEMD_MOUNT += var-lib-xenstored.mount
 
-XEN_SYSTEMD_SOCKET  = xenstored.socket
-XEN_SYSTEMD_SOCKET += xenstored_ro.socket
-
 XEN_SYSTEMD_SERVICE  = xenstored.service
 XEN_SYSTEMD_SERVICE += xenconsoled.service
 XEN_SYSTEMD_SERVICE += xen-qemu-dom0-disk-backend.service
@@ -19,7 +16,6 @@ XEN_SYSTEMD_SERVICE += xendriverdomain.service
 
 ALL_XEN_SYSTEMD =      $(XEN_SYSTEMD_MODULES)  \
                        $(XEN_SYSTEMD_MOUNT)    \
-                       $(XEN_SYSTEMD_SOCKET)   \
                        $(XEN_SYSTEMD_SERVICE)
 
 .PHONY: all
@@ -38,7 +34,6 @@ install: $(ALL_XEN_SYSTEMD)
                $(INSTALL_DIR) $(DESTDIR)$(XEN_SYSTEMD_DIR)
        [ -d $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD) ] || \
                $(INSTALL_DIR) $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD)
-       $(INSTALL_DATA) *.socket $(DESTDIR)$(XEN_SYSTEMD_DIR)
        $(INSTALL_DATA) *.service $(DESTDIR)$(XEN_SYSTEMD_DIR)
        $(INSTALL_DATA) *.mount $(DESTDIR)$(XEN_SYSTEMD_DIR)
        $(INSTALL_DATA) *.conf $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD)
diff --git a/tools/hotplug/Linux/systemd/xenstored.service.in 
b/tools/hotplug/Linux/systemd/xenstored.service.in
index a5f836b..d520d70 100644
--- a/tools/hotplug/Linux/systemd/xenstored.service.in
+++ b/tools/hotplug/Linux/systemd/xenstored.service.in
@@ -1,6 +1,6 @@
 [Unit]
 Description=The Xen xenstore
-Requires=xenstored_ro.socket xenstored.socket proc-xen.mount 
var-lib-xenstored.mount
+Requires=proc-xen.mount var-lib-xenstored.mount
 After=proc-xen.mount var-lib-xenstored.mount
 Before=libvirtd.service libvirt-guests.service
 RefuseManualStop=true
@@ -8,6 +8,8 @@ ConditionPathExists=/proc/xen/capabilities
 
 [Service]
 Type=notify
+NotifyAccess=all
+RemainAfterExit=true
 KillMode=none
 Environment=XENSTORED_ARGS=
 Environment=XENSTORED=@XENSTORED@
@@ -19,6 +21,5 @@ ExecStart=/bin/sh -c "exec $XENSTORED --no-fork 
$XENSTORED_ARGS"
 
 [Install]
 WantedBy=multi-user.target
-Also=xenstored_ro.socket xenstored.socket
 Also=proc-xen.mount
 Also=var-lib-xenstored.mount
diff --git a/tools/hotplug/Linux/systemd/xenstored.socket.in 
b/tools/hotplug/Linux/systemd/xenstored.socket.in
deleted file mode 100644
index 375c4b7..0000000
--- a/tools/hotplug/Linux/systemd/xenstored.socket.in
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=xenstore socket
-Requires=proc-xen.mount var-lib-xenstored.mount
-After=proc-xen.mount var-lib-xenstored.mount
-ConditionPathExists=/proc/xen/capabilities
-
-[Socket]
-ListenStream=@XEN_RUN_STORED@/socket
-SocketMode=0600
-Service=xenstored.service
-
-[Install]
-WantedBy=sockets.target
diff --git a/tools/hotplug/Linux/systemd/xenstored_ro.socket.in 
b/tools/hotplug/Linux/systemd/xenstored_ro.socket.in
deleted file mode 100644
index 82fe377..0000000
--- a/tools/hotplug/Linux/systemd/xenstored_ro.socket.in
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=xenstore ro socket
-Requires=proc-xen.mount var-lib-xenstored.mount
-After=proc-xen.mount var-lib-xenstored.mount
-ConditionPathExists=/proc/xen/capabilities
-
-[Socket]
-ListenStream=@XEN_RUN_STORED@/socket_ro
-SocketMode=0660
-Service=xenstored.service
-
-[Install]
-WantedBy=sockets.target
diff --git a/tools/ocaml/xenstored/systemd.ml b/tools/ocaml/xenstored/systemd.ml
index 732446d..b3090e5 100644
--- a/tools/ocaml/xenstored/systemd.ml
+++ b/tools/ocaml/xenstored/systemd.ml
@@ -12,6 +12,5 @@
  * GNU Lesser General Public License for more details.
  *)
 
-external sd_listen_fds: string -> Unix.file_descr = "ocaml_sd_listen_fds"
 external launched_by_systemd: unit -> bool = "ocaml_launched_by_systemd"
 external sd_notify_ready: unit -> unit = "ocaml_sd_notify_ready"
diff --git a/tools/ocaml/xenstored/systemd.mli 
b/tools/ocaml/xenstored/systemd.mli
index 538fc5e..9871137 100644
--- a/tools/ocaml/xenstored/systemd.mli
+++ b/tools/ocaml/xenstored/systemd.mli
@@ -12,11 +12,6 @@
  * GNU Lesser General Public License for more details.
  *)
 
-(** Calls the C library sd_listen_fds() function for us. Although
- *  the library doesn't accept argument we send one over to help
- *  us do sanity checks on the expected sockets *)
-val sd_listen_fds: string -> Unix.file_descr
-
 (** Tells us whether the process is launched by systemd *)
 val launched_by_systemd: unit -> bool
 
diff --git a/tools/ocaml/xenstored/systemd_stubs.c 
b/tools/ocaml/xenstored/systemd_stubs.c
index 322f1e0..c9af95e 100644
--- a/tools/ocaml/xenstored/systemd_stubs.c
+++ b/tools/ocaml/xenstored/systemd_stubs.c
@@ -25,129 +25,54 @@
 
 #if defined(HAVE_SYSTEMD)
 
-#include <sys/socket.h>
 #include <systemd/sd-daemon.h>
 
 #include "_paths.h"
 
-/* Will work regardless of the order systemd gives them to us */
-static int oxen_get_sd_fd(const char *connect_to)
-{
-       int fd = SD_LISTEN_FDS_START;
-       int r;
-
-       while (fd <= SD_LISTEN_FDS_START + 1) {
-               r = sd_is_socket_unix(fd, SOCK_STREAM, 1, connect_to, 0);
-               if (r > 0)
-                       return fd;
-               fd++;
-       }
-
-       return -EBADR;
-}
-
-static int oxen_verify_socket_socket(const char *connect_to)
-{
-       if ((strcmp(XEN_RUN_STORED "/socket_ro", connect_to) != 0) &&
-           (strcmp(XEN_RUN_STORED "/socket", connect_to) != 0)) {
-               sd_notifyf(0, "STATUS=unexpected socket: %s\n"
-                          "ERRNO=%i",
-                          connect_to,
-                          EBADR);
-               return -EBADR;
-       }
-
-       return oxen_get_sd_fd(connect_to);
-}
-
-CAMLprim value ocaml_sd_listen_fds(value connect_to)
-{
-       CAMLparam1(connect_to);
-       CAMLlocal1(sock_ret);
-       int sock = -EBADR, n;
-
-       n = sd_listen_fds(0);
-       if (n <= 0) {
-               sd_notifyf(0, "STATUS=Failed to get any active sockets: %s\n"
-                          "ERRNO=%i",
-                          strerror(errno),
-                          errno);
-               caml_failwith("ocaml_sd_listen_fds() failed to get any 
sockets");
-       } else if (n != 2) {
-               fprintf(stderr, SD_ERR "Expected 2 fds but given %d\n", n);
-               sd_notifyf(0, "STATUS=Mismatch on number (2): %s\n"
-                          "ERRNO=%d",
-                          strerror(EBADR),
-                          EBADR);
-               caml_failwith("ocaml_sd_listen_fds() mismatch");
-       }
-
-       sock = oxen_verify_socket_socket(String_val(connect_to));
-       if (sock <= 0) {
-               fprintf(stderr, "failed to verify sock %s\n",
-                       String_val(connect_to));
-               caml_failwith("ocaml_sd_listen_fds_init() invalid socket");
-       }
-
-       sock_ret = Val_int(sock);
-
-       CAMLreturn(sock_ret);
-}
-
 CAMLprim value ocaml_launched_by_systemd(value ignore)
 {
-       CAMLparam1(ignore);
-       CAMLlocal1(ret);
+       CAMLparam1(ignore);
+       CAMLlocal1(ret);
 
-       ret = Val_false;
+       ret = Val_false;
 
-       if (sd_listen_fds(0) > 0)
-               ret = Val_true;
+       if (sd_booted() > 0)
+               ret = Val_true;
 
-       CAMLreturn(ret);
+       CAMLreturn(ret);
 }
 
 CAMLprim value ocaml_sd_notify_ready(value ignore)
 {
-       CAMLparam1(ignore);
-       CAMLlocal1(ret);
+       CAMLparam1(ignore);
+       CAMLlocal1(ret);
 
-       ret = Val_int(0);
+       ret = Val_int(0);
 
-       sd_notify(1, "READY=1");
+       sd_notify(1, "READY=1");
 
-       CAMLreturn(ret);
+       CAMLreturn(ret);
 }
 
 #else
 
-CAMLprim value ocaml_sd_listen_fds(value connect_to)
-{
-       CAMLparam1(connect_to);
-       CAMLlocal1(sock_ret);
-
-       sock_ret = Val_int(-1U);
-
-       CAMLreturn(sock_ret);
-}
-
 CAMLprim value ocaml_launched_by_systemd(value ignore)
 {
-       CAMLparam1(ignore);
-       CAMLlocal1(ret);
+       CAMLparam1(ignore);
+       CAMLlocal1(ret);
 
-       ret = Val_false;
+       ret = Val_false;
 
-       CAMLreturn(ret);
+       CAMLreturn(ret);
 }
 
 CAMLprim value ocaml_sd_notify_ready(value ignore)
 {
-       CAMLparam1(ignore);
-       CAMLlocal1(ret);
+       CAMLparam1(ignore);
+       CAMLlocal1(ret);
 
-       ret = Val_int(-1U);
+       ret = Val_int(-1U);
 
-       CAMLreturn(ret);
+       CAMLreturn(ret);
 }
 #endif
diff --git a/tools/ocaml/xenstored/utils.ml b/tools/ocaml/xenstored/utils.ml
index 9f82c1c..68b70c5 100644
--- a/tools/ocaml/xenstored/utils.ml
+++ b/tools/ocaml/xenstored/utils.ml
@@ -73,21 +73,14 @@ let trim_path path =
 let join_by_null ls = String.concat "\000" ls
 
 (* unix utils *)
-let create_regular_unix_socket name =
-        Unixext.unlink_safe name;
-        Unixext.mkdir_rec (Filename.dirname name) 0o700;
-        let sockaddr = Unix.ADDR_UNIX(name) in
-        let sock = Unix.socket Unix.PF_UNIX Unix.SOCK_STREAM 0 in
-        Unix.set_close_on_exec sock;
-        Unix.bind sock sockaddr;
-        Unix.listen sock 1;
-        sock
-
 let create_unix_socket name =
-        if Systemd.launched_by_systemd() then
-                Systemd.sd_listen_fds name
-        else
-                create_regular_unix_socket name
+       Unixext.unlink_safe name;
+       Unixext.mkdir_rec (Filename.dirname name) 0o700;
+       let sockaddr = Unix.ADDR_UNIX(name) in
+       let sock = Unix.socket Unix.PF_UNIX Unix.SOCK_STREAM 0 in
+       Unix.bind sock sockaddr;
+       Unix.listen sock 1;
+       sock
 
 let read_file_single_integer filename =
        let fd = Unix.openfile filename [ Unix.O_RDONLY ] 0o640 in
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 693d47d..5ac2970 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -1788,84 +1788,6 @@ static int destroy_fd(void *_fd)
        return 0;
 }
 
-#if defined(XEN_SYSTEMD_ENABLED)
-/* Will work regardless of the order systemd gives them to us */
-static int xs_get_sd_fd(const char *connect_to)
-{
-       int fd = SD_LISTEN_FDS_START;
-       int r;
-
-       while (fd <= SD_LISTEN_FDS_START + 1) {
-               r = sd_is_socket_unix(fd, SOCK_STREAM, 1, connect_to, 0);
-               if (r > 0)
-                       return fd;
-               fd++;
-       }
-
-       return -EBADR;
-}
-
-static int xs_validate_active_socket(const char *connect_to)
-{
-       if ((strcmp(xs_daemon_socket_ro(), connect_to) != 0) &&
-           (strcmp(xs_daemon_socket(), connect_to) != 0)) {
-               sd_notifyf(0, "STATUS=unexpected socket: %s\n"
-                          "ERRNO=%i",
-                          connect_to,
-                          EBADR);
-               return -EBADR;
-       }
-
-       return xs_get_sd_fd(connect_to);
-}
-
-/* Return true if started by systemd and false if not. Exit with
- * error if things go wrong.
- */
-static bool systemd_checkin(int **psock, int **pro_sock)
-{
-       int *sock, *ro_sock;
-       const char *soc_str = xs_daemon_socket();
-       const char *soc_str_ro = xs_daemon_socket_ro();
-       int n;
-
-       n = sd_listen_fds(0);
-
-       if (n == 0)
-               return false;
-
-       if (n < 0) {
-               sd_notifyf(0, "STATUS=Failed to get any active sockets: %s\n"
-                          "ERRNO=%i",
-                          strerror(errno),
-                          errno);
-               barf_perror("sd_listen_fds() failed\n");
-       } else if (n != 2) {
-               fprintf(stderr, SD_ERR "Expected 2 fds but given %d\n", n);
-               sd_notifyf(0, "STATUS=Mismatch on number (2): %s\n"
-                          "ERRNO=%d",
-                          strerror(EBADR),
-                          EBADR);
-               barf_perror("sd_listen_fds() gave too many fds\n");
-       }
-
-       *psock = sock = talloc(talloc_autofree_context(), int);
-       *sock = xs_validate_active_socket(soc_str);
-       if (*sock <= 0)
-               barf_perror("%s", soc_str);
-
-       *pro_sock = ro_sock = talloc(talloc_autofree_context(), int);
-       *ro_sock = xs_validate_active_socket(soc_str_ro);
-       if (*ro_sock <= 0)
-               barf_perror("%s", soc_str_ro);
-
-       talloc_set_destructor(sock, destroy_fd);
-       talloc_set_destructor(ro_sock, destroy_fd);
-
-       return true;
-}
-#endif
-
 static void init_sockets(int **psock, int **pro_sock)
 {
        struct sockaddr_un addr;
@@ -1988,6 +1910,7 @@ int main(int argc, char *argv[])
        bool systemd;
 #endif
 
+
        while ((opt = getopt_long(argc, argv, "DE:F:HNPS:t:T:RLVW:M:", options,
                                  NULL)) != -1) {
                switch (opt) {
@@ -2051,13 +1974,7 @@ int main(int argc, char *argv[])
                barf("%s: No arguments desired", argv[0]);
 
 #if defined(XEN_SYSTEMD_ENABLED)
-       systemd = systemd_checkin(&sock, &ro_sock);
-       if (systemd) {
-               dofork = false;
-               if (pidfile)
-                       xprintf("%s: PID file not needed on systemd", argv[0]);
-               pidfile = NULL;
-       }
+       systemd = (sd_booted() > 0);
 #endif
 
        reopen_log();
@@ -2086,10 +2003,7 @@ int main(int argc, char *argv[])
                signal(SIGUSR1, do_talloc_report);
        }
 
-#if defined(XEN_SYSTEMD_ENABLED)
-       if (!systemd)
-#endif
-               init_sockets(&sock, &ro_sock);
+       init_sockets(&sock, &ro_sock);
 
        init_pipe(reopen_log_pipe);
 
-- 
2.6.6


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.