The master worker mode obsoletes the systemd-wrapper, to ensure that nobody uses it anymore, the code has been removed. --- Makefile | 18 +-- contrib/systemd/haproxy.service.in | 2 +- src/haproxy-systemd-wrapper.c | 319 ------------------------------------- 3 files changed, 3 insertions(+), 336 deletions(-) delete mode 100644 src/haproxy-systemd-wrapper.c
diff --git a/Makefile b/Makefile index 5b5ecca..1c90a3e 100644 --- a/Makefile +++ b/Makefile @@ -61,8 +61,7 @@ # by "haproxy -vv" in CFLAGS. # SILENT_DEFINE may be used to specify other defines which will not be # reported by "haproxy -vv". -# EXTRA is used to force building or not building some extra tools. By -# default on Linux 2.6+, it contains "haproxy-systemd-wrapper". +# EXTRA is used to force building or not building some extra tools. # DESTDIR is not set by default and is used for installation only. # It might be useful to set DESTDIR if you want to install haproxy # in a sandbox. @@ -175,7 +174,7 @@ ADDLIB = DEFINE = SILENT_DEFINE = -#### extra programs to build (eg: haproxy-systemd-wrapper) +#### extra programs to build # Force this to enable building extra programs or to disable them. # It's automatically appended depending on the targets. EXTRA = @@ -266,7 +265,6 @@ ifeq ($(TARGET),linux26) USE_TPROXY = implicit USE_LIBCRYPT = implicit USE_FUTEX = implicit - EXTRA += haproxy-systemd-wrapper USE_DL = implicit else ifeq ($(TARGET),linux2628) @@ -282,7 +280,6 @@ ifeq ($(TARGET),linux2628) USE_FUTEX = implicit USE_CPU_AFFINITY= implicit ASSUME_SPLICE_WORKS= implicit - EXTRA += haproxy-systemd-wrapper USE_DL = implicit else ifeq ($(TARGET),solaris) @@ -835,7 +832,6 @@ ifneq ($(TRACE),) OBJS += src/trace.o endif -WRAPPER_OBJS = src/haproxy-systemd-wrapper.o # Not used right now LIB_EBTREE = $(EBTREE_DIR)/libebtree.a @@ -850,9 +846,6 @@ DEP = $(INCLUDES) .build_opts haproxy: $(OPTIONS_OBJS) $(EBTREE_OBJS) $(OBJS) $(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS) -haproxy-systemd-wrapper: $(WRAPPER_OBJS) - $(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS) - $(LIB_EBTREE): $(EBTREE_OBJS) $(AR) rv $@ $^ @@ -875,11 +868,6 @@ src/haproxy.o: src/haproxy.c $(DEP) -DBUILD_OPTIONS='"$(strip $(BUILD_OPTIONS))"' \ -c -o $@ $< -src/haproxy-systemd-wrapper.o: src/haproxy-systemd-wrapper.c $(DEP) - $(CC) $(COPTS) \ - -DSBINDIR='"$(strip $(SBINDIR))"' \ - -c -o $@ $< - src/dlmalloc.o: $(DLMALLOC_SRC) $(DEP) $(CC) $(COPTS) -DDEFAULT_MMAP_THRESHOLD=$(DLMALLOC_THRES) -c -o $@ $< @@ -915,14 +903,12 @@ uninstall: done -rmdir "$(DESTDIR)$(DOCDIR)" rm -f "$(DESTDIR)$(SBINDIR)"/haproxy - rm -f "$(DESTDIR)$(SBINDIR)"/haproxy-systemd-wrapper clean: rm -f *.[oas] src/*.[oas] ebtree/*.[oas] haproxy test .build_opts .build_opts.new for dir in . src include/* doc ebtree; do rm -f $$dir/*~ $$dir/*.rej $$dir/core; done rm -f haproxy-$(VERSION).tar.gz haproxy-$(VERSION)$(SUBVERS).tar.gz rm -f haproxy-$(VERSION) haproxy-$(VERSION)$(SUBVERS) nohup.out gmon.out - rm -f haproxy-systemd-wrapper tags: find src include \( -name '*.c' -o -name '*.h' \) -print0 | \ diff --git a/contrib/systemd/haproxy.service.in b/contrib/systemd/haproxy.service.in index ca38d70..81b4951 100644 --- a/contrib/systemd/haproxy.service.in +++ b/contrib/systemd/haproxy.service.in @@ -7,7 +7,7 @@ After=network.target # socket if you want seamless reloads. Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid" ExecStartPre=@SBINDIR@/haproxy -f $CONFIG -c -q -ExecStart=@SBINDIR@/haproxy-systemd-wrapper -f $CONFIG -p $PIDFILE +ExecStart=@SBINDIR@/haproxy -W -f $CONFIG -p $PIDFILE ExecReload=@SBINDIR@/haproxy -f $CONFIG -c -q ExecReload=/bin/kill -USR2 $MAINPID KillMode=mixed diff --git a/src/haproxy-systemd-wrapper.c b/src/haproxy-systemd-wrapper.c deleted file mode 100644 index 457f5bd..0000000 --- a/src/haproxy-systemd-wrapper.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Wrapper to make haproxy systemd-compliant. - * - * Copyright 2013 Marc-Antoine Perennou <marc-anto...@perennou.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - */ - -#include <errno.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> - -#define REEXEC_FLAG "HAPROXY_SYSTEMD_REEXEC" -#define SD_DEBUG "<7>" -#define SD_NOTICE "<5>" - -static volatile sig_atomic_t caught_signal; - -static char *pid_file = "/run/haproxy.pid"; -static int wrapper_argc; -static char **wrapper_argv; - -static void setup_signal_handler(); -static void pause_signal_handler(); -static void reset_signal_handler(); - - -/* returns the path to the haproxy binary into <buffer>, whose size indicated - * in <buffer_size> must be at least 1 byte long. - */ -static void locate_haproxy(char *buffer, size_t buffer_size) -{ - char *end = NULL; - int len; - - len = readlink("/proc/self/exe", buffer, buffer_size - 1); - if (len == -1) - goto fail; - - buffer[len] = 0; - end = strrchr(buffer, '/'); - if (end == NULL) - goto fail; - - if (strcmp(end + strlen(end) - 16, "-systemd-wrapper") == 0) { - end[strlen(end) - 16] = '\0'; - return; - } - - end[1] = '\0'; - strncpy(end + 1, "haproxy", buffer + buffer_size - (end + 1)); - buffer[buffer_size - 1] = '\0'; - return; - fail: - strncpy(buffer, "/usr/sbin/haproxy", buffer_size); - buffer[buffer_size - 1] = '\0'; - return; -} - -/* Note: this function must not exit in case of error (except in the child), as - * it is only dedicated the starting a new haproxy process. By keeping the - * process alive it will ensure that future signal delivery may get rid of - * the issue. If the first startup fails, the wrapper will notice it and - * return an error thanks to wait() returning ECHILD. - */ -static void spawn_haproxy(char **pid_strv, int nb_pid) -{ - char haproxy_bin[512]; - pid_t pid; - int main_argc; - char **main_argv; - int pipefd[2]; - char fdstr[20]; - int ret; - - main_argc = wrapper_argc - 1; - main_argv = wrapper_argv + 1; - - if (pipe(pipefd) != 0) { - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to create a pipe, please try again later.\n"); - return; - } - - pid = fork(); - if (!pid) { - char **argv; - char *stats_socket = NULL; - int i; - int argno = 0; - - /* 3 for "haproxy -Ds -sf" */ - if (nb_pid > 0) - stats_socket = getenv("HAPROXY_STATS_SOCKET"); - argv = calloc(4 + main_argc + nb_pid + 1 + - (stats_socket != NULL ? 2 : 0), sizeof(char *)); - if (!argv) { - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to calloc(), please try again later.\n"); - exit(1); - } - - reset_signal_handler(); - - close(pipefd[0]); /* close the read side */ - - snprintf(fdstr, sizeof(fdstr), "%d", pipefd[1]); - if (setenv("HAPROXY_WRAPPER_FD", fdstr, 1) != 0) { - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to setenv(), please try again later.\n"); - exit(1); - } - - locate_haproxy(haproxy_bin, 512); - argv[argno++] = haproxy_bin; - for (i = 0; i < main_argc; ++i) - argv[argno++] = main_argv[i]; - argv[argno++] = "-Ds"; - if (nb_pid > 0) { - argv[argno++] = "-sf"; - for (i = 0; i < nb_pid; ++i) - argv[argno++] = pid_strv[i]; - if (stats_socket != NULL) { - argv[argno++] = "-x"; - argv[argno++] = stats_socket; - } - } - argv[argno] = NULL; - - fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: executing "); - for (i = 0; argv[i]; ++i) - fprintf(stderr, "%s ", argv[i]); - fprintf(stderr, "\n"); - - execv(argv[0], argv); - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: execv(%s) failed, please try again later.\n", argv[0]); - exit(1); - } - else if (pid == -1) { - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to fork(), please try again later.\n"); - } - - /* The parent closes the write side and waits for the child to close it - * as well. Also deal the case where the fd would unexpectedly be 1 or 2 - * by silently draining all data. - */ - close(pipefd[1]); - - do { - char c; - ret = read(pipefd[0], &c, sizeof(c)); - } while ((ret > 0) || (ret == -1 && errno == EINTR)); - /* the child has finished starting up */ - close(pipefd[0]); -} - -static int read_pids(char ***pid_strv) -{ - FILE *f = fopen(pid_file, "r"); - int read = 0, allocated = 8; - char pid_str[10]; - - if (!f) - return 0; - - *pid_strv = malloc(allocated * sizeof(char *)); - while (1 == fscanf(f, "%s\n", pid_str)) { - if (read == allocated) { - allocated *= 2; - *pid_strv = realloc(*pid_strv, allocated * sizeof(char *)); - } - (*pid_strv)[read++] = strdup(pid_str); - } - - fclose(f); - - return read; -} - -static void signal_handler(int signum) -{ - if (caught_signal != SIGINT && caught_signal != SIGTERM) - caught_signal = signum; -} - -static void setup_signal_handler() -{ - struct sigaction sa; - - memset(&sa, 0, sizeof(struct sigaction)); - sa.sa_handler = &signal_handler; - sigaction(SIGUSR2, &sa, NULL); - sigaction(SIGHUP, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - sigaction(SIGTERM, &sa, NULL); -} - -static void pause_signal_handler() -{ - signal(SIGUSR2, SIG_IGN); - signal(SIGHUP, SIG_IGN); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); -} - -static void reset_signal_handler() -{ - signal(SIGUSR2, SIG_DFL); - signal(SIGHUP, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); -} - -/* handles SIGUSR2 and SIGHUP only */ -static void do_restart(int sig) -{ - setenv(REEXEC_FLAG, "1", 1); - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-executing on %s.\n", - sig == SIGUSR2 ? "SIGUSR2" : "SIGHUP"); - - /* don't let the other process take one of those signals by accident */ - pause_signal_handler(); - execv(wrapper_argv[0], wrapper_argv); - /* failed, let's reinstall the signal handler and continue */ - setup_signal_handler(); - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-exec(%s) failed.\n", wrapper_argv[0]); -} - -/* handles SIGTERM and SIGINT only */ -static void do_shutdown(int sig) -{ - int i, pid; - char **pid_strv = NULL; - int nb_pid = read_pids(&pid_strv); - for (i = 0; i < nb_pid; ++i) { - pid = atoi(pid_strv[i]); - if (pid > 0) { - fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: %s -> %d.\n", - sig == SIGTERM ? "SIGTERM" : "SIGINT", pid); - kill(pid, sig); - free(pid_strv[i]); - } - } - free(pid_strv); -} - -static void init(int argc, char **argv) -{ - while (argc > 1) { - if ((*argv)[0] == '-' && (*argv)[1] == 'p') { - pid_file = *(argv + 1); - } - --argc; ++argv; - } -} - -int main(int argc, char **argv) -{ - int status; - - setup_signal_handler(); - - wrapper_argc = argc; - wrapper_argv = argv; - - --argc; ++argv; - init(argc, argv); - - if (getenv(REEXEC_FLAG) != NULL) { - /* We are being re-executed: restart HAProxy gracefully */ - int i; - char **pid_strv = NULL; - int nb_pid = read_pids(&pid_strv); - - unsetenv(REEXEC_FLAG); - spawn_haproxy(pid_strv, nb_pid); - - for (i = 0; i < nb_pid; ++i) - free(pid_strv[i]); - free(pid_strv); - } - else { - /* Start a fresh copy of HAProxy */ - spawn_haproxy(NULL, 0); - } - - status = -1; - while (caught_signal || wait(&status) != -1 || errno == EINTR) { - int sig = caught_signal; - - if (caught_signal == SIGUSR2 || caught_signal == SIGHUP) { - caught_signal = 0; - do_restart(sig); - } - else if (caught_signal == SIGINT || caught_signal == SIGTERM) { - caught_signal = 0; - do_shutdown(sig); - } - } - - /* return either exit code or signal+128 */ - if (WIFEXITED(status)) - status = WEXITSTATUS(status); - else if (WIFSIGNALED(status)) - status = 128 + WTERMSIG(status); - else if (WIFSTOPPED(status)) - status = 128 + WSTOPSIG(status); - else - status = 255; - - fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: exit, haproxy RC=%d\n", - status); - return status; -} -- 2.10.2