diff --git a/ipvsadm-1.29.tar.gz b/ipvsadm-1.29.tar.gz new file mode 100644 index 0000000..303544e Binary files /dev/null and b/ipvsadm-1.29.tar.gz differ diff --git a/ipvsadm-catch-the-original-errno-from-netlink-answer.patch b/ipvsadm-catch-the-original-errno-from-netlink-answer.patch new file mode 100644 index 0000000..a9ffeec --- /dev/null +++ b/ipvsadm-catch-the-original-errno-from-netlink-answer.patch @@ -0,0 +1,80 @@ +From f8cff0808a24b1dd141e86cc8039108aa1763071 Mon Sep 17 00:00:00 2001 +From: Julian Anastasov +Date: Sat, 5 Aug 2017 14:38:28 +0300 +Subject: [PATCH 1/2] ipvsadm: catch the original errno from netlink answer + +nl_recvmsgs_default() returns NLE_* error codes and not +errno values. As result, attempt to delete virtual service +returns NLE_OBJ_NOTFOUND (12) which matches the ENOMEM value. + +Problem as reported by Emanuele Rocca: + +ipvsadm -D -t example.org:80 +Memory allocation problem + +Fix it by providing generic error handler to catch the errno +value as returned in netlink answer. By this way all netlink +commands will get proper error string. The problem is present +only when ipvsadm is compiled with libnl. + +ipvsadm -D -t example.org:80 +No such service + +Reported-by: Emanuele Rocca +Signed-off-by: Julian Anastasov +Signed-off-by: Jesper Dangaard Brouer +--- + libipvs/libipvs.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +diff --git a/libipvs/libipvs.c b/libipvs/libipvs.c +index 180ea42..d271c48 100644 +--- a/libipvs/libipvs.c ++++ b/libipvs/libipvs.c +@@ -74,9 +74,23 @@ static int ipvs_nl_noop_cb(struct nl_msg *msg, void *arg) + return NL_OK; + } + ++struct cb_err_data { ++ int err; ++}; ++ ++static int ipvs_nl_err_cb(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, ++ void *arg) ++{ ++ struct cb_err_data *data = arg; ++ ++ data->err = nlerr->error; ++ return -nl_syserr2nlerr(nlerr->error); ++} ++ + int ipvs_nl_send_message(struct nl_msg *msg, nl_recvmsg_msg_cb_t func, void *arg) + { + int err = EINVAL; ++ struct cb_err_data err_data = { .err = 0 }; + + sock = nl_socket_alloc(); + if (!sock) { +@@ -100,12 +114,18 @@ int ipvs_nl_send_message(struct nl_msg *msg, nl_recvmsg_msg_cb_t func, void *arg + + if (nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, func, arg) != 0) + goto fail_genl; ++ if (nl_socket_modify_err_cb(sock, NL_CB_CUSTOM, ipvs_nl_err_cb, ++ &err_data) != 0) ++ goto fail_genl; + + if (nl_send_auto_complete(sock, msg) < 0) + goto fail_genl; + +- if ((err = -nl_recvmsgs_default(sock)) > 0) ++ if (nl_recvmsgs_default(sock) < 0) { ++ if (err_data.err) ++ err = -err_data.err; + goto fail_genl; ++ } + + nlmsg_free(msg); + +-- +2.14.3 + diff --git a/ipvsadm-use-CFLAGS-and-LDFLAGS-environment-variables.patch b/ipvsadm-use-CFLAGS-and-LDFLAGS-environment-variables.patch new file mode 100644 index 0000000..20e0cbe --- /dev/null +++ b/ipvsadm-use-CFLAGS-and-LDFLAGS-environment-variables.patch @@ -0,0 +1,52 @@ +From 25d7aa2faef0c36f053ee1ba418fe14022ef6f7c Mon Sep 17 00:00:00 2001 +From: Ryan O'Hara +Date: Tue, 27 Feb 2018 11:49:44 -0600 +Subject: [PATCH] ipvsadm: use CFLAGS and LDFLAGS environment variables + +Signed-off-by: Ryan O'Hara +--- + Makefile | 6 +++--- + libipvs/Makefile | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/Makefile b/Makefile +index 91a2991..2a1d179 100644 +--- a/Makefile ++++ b/Makefile +@@ -46,9 +46,9 @@ INSTALL = install + STATIC_LIBS = libipvs/libipvs.a + + ifeq "${ARCH}" "sparc64" +- CFLAGS = -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow ++ CFLAGS += -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow + else +- CFLAGS = -Wall -Wunused -Wstrict-prototypes -g ++ CFLAGS += -Wall -Wunused -Wstrict-prototypes -g + endif + + +@@ -87,7 +87,7 @@ libs: + make -C libipvs + + ipvsadm: $(OBJS) $(STATIC_LIBS) +- $(CC) $(CFLAGS) -o $@ $^ $(LIBS) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + + install: all + if [ ! -d $(SBIN) ]; then $(MKDIR) -p $(SBIN); fi +diff --git a/libipvs/Makefile b/libipvs/Makefile +index f845c8b..780f3f3 100644 +--- a/libipvs/Makefile ++++ b/libipvs/Makefile +@@ -1,7 +1,7 @@ + # Makefile for libipvs + + CC = gcc +-CFLAGS = -Wall -Wunused -Wstrict-prototypes -g -fPIC ++CFLAGS += -Wall -Wunused -Wstrict-prototypes -g -fPIC + ifneq (0,$(HAVE_NL)) + CFLAGS += -DLIBIPVS_USE_NL + CFLAGS += $(shell \ +-- +2.14.3 + diff --git a/ipvsadm.service b/ipvsadm.service new file mode 100644 index 0000000..a1d497f --- /dev/null +++ b/ipvsadm.service @@ -0,0 +1,14 @@ +[Unit] +Description=Initialise the Linux Virtual Server +After=syslog.target network.target + +[Service] +Type=oneshot +ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" +ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" +ExecStop=/sbin/ipvsadm -C +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/ipvsadm.spec b/ipvsadm.spec new file mode 100644 index 0000000..68becc0 --- /dev/null +++ b/ipvsadm.spec @@ -0,0 +1,65 @@ +Name: ipvsadm +Version: 1.29 +Release: 11 +Summary: A utility to administer the IP virtual server services +License: GPLv2+ +URL: https://kernel.org/pub/linux/utils/kernel/ipvsadm/ +Source0: https://kernel.org/pub/linux/utils/kernel/ipvsadm/%{name}-%{version}.tar.gz +Source1: ipvsadm.service + +Patch6000: ipvsadm-catch-the-original-errno-from-netlink-answer.patch +Patch6001: libipvs-discrepancy-with-libnl-genlmsg_put.patch +Patch6002: ipvsadm-use-CFLAGS-and-LDFLAGS-environment-variables.patch + +BuildRequires: gcc libnl3-devel popt-devel systemd +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd + +%description +Ipvsadm is a utility to administer the IP virtual server services +offered by the Linux kernel with IP virtual server support. + +%package_help + +%prep +%autosetup -n %{name}-%{version} -p1 + +%build +%set_build_flags +make + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}%{_sysconfdir}/rc.d/init.d +make install BUILD_ROOT=%{buildroot}%{_prefix} SBIN=%{buildroot}%{_sbindir} MANDIR=%{buildroot}%{_mandir} MAN=%{buildroot}%{_mandir}/man8 INIT=%{buildroot}%{_sysconfdir}/rc.d/init.d +rm -f %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name} +install -p -D -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}/%{name}.service + +%preun +%systemd_preun %{name}.service + +%post +%systemd_post %{name}.service + +%postun +%systemd_postun_with_restart %{name}.service + +%files +%defattr(-,root,root) +%doc MAINTAINERS README +%{_sbindir}/ipvsadm* +%{_unitdir}/ipvsadm.service + +%files help +%{_mandir}/man8/*8* + +%changelog +* Mon Dec 30 2019 openEuler Buildteam - 1.29-11 +- Type:bugfix +- ID:NA +- SUG:NA +- DESC:optimization the spec + +* Thu Nov 7 2019 openEuler Buildteam - 1.29-10 +- Package init for openEuler diff --git a/libipvs-discrepancy-with-libnl-genlmsg_put.patch b/libipvs-discrepancy-with-libnl-genlmsg_put.patch new file mode 100644 index 0000000..09e0b3d --- /dev/null +++ b/libipvs-discrepancy-with-libnl-genlmsg_put.patch @@ -0,0 +1,40 @@ +From 76c1270148161242f240d9a00746cf06d916b3e3 Mon Sep 17 00:00:00 2001 +From: Arthur Gautier +Date: Wed, 27 Sep 2017 15:31:05 +0000 +Subject: [PATCH 2/2] libipvs: discrepancy with libnl genlmsg_put + +There is a mixup between NL_AUTO_PORT and NL_AUTO_PID. The +first should be used with genlmsg_put while the second with +nlmsg_put. + +This is not a problem, because both NL_AUTO_PORT and NL_AUTO_PID +have the same value, but still a discrepancy with libnl documentation. + +see documentation of genlmsg_put here: + http://www.infradead.org/~tgr/libnl/doc/api/group__genl.html#ga9a86a71bbba6961d41b8a75f62f9e946 + +Cc: Julian Anastasov +Cc: Simon Horman +Cc: Jesper Dangaard Brouer +Signed-off-by: Arthur Gautier +Signed-off-by: Jesper Dangaard Brouer +--- + libipvs/libipvs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libipvs/libipvs.c b/libipvs/libipvs.c +index d271c48..a843243 100644 +--- a/libipvs/libipvs.c ++++ b/libipvs/libipvs.c +@@ -63,7 +63,7 @@ struct nl_msg *ipvs_nl_message(int cmd, int flags) + if (!msg) + return NULL; + +- genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags, ++ genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, family, 0, flags, + cmd, IPVS_GENL_VERSION); + + return msg; +-- +2.14.3 +