From patchwork Mon Nov 27 10:41:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos Santos X-Patchwork-Id: 841614 X-Patchwork-Delegate: thomas.petazzoni@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=busybox.net (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ylkKk00zvz9sRg for ; Mon, 27 Nov 2017 21:58:01 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id DE1D787E58; Mon, 27 Nov 2017 10:57:56 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id w+9gOzJj1O72; Mon, 27 Nov 2017 10:57:36 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by hemlock.osuosl.org (Postfix) with ESMTP id 6246A87709; Mon, 27 Nov 2017 10:57:31 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 039B11BFC2F for ; Mon, 27 Nov 2017 10:41:43 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id F0EDA86CF8 for ; Mon, 27 Nov 2017 10:41:42 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id V75xoihfP9sI for ; Mon, 27 Nov 2017 10:41:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail.datacom.ind.br (mx.datacom.ind.br [177.66.5.10]) by fraxinus.osuosl.org (Postfix) with ESMTPS id D617E86CE9 for ; Mon, 27 Nov 2017 10:41:40 +0000 (UTC) Received: from mail.datacom.ind.br (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTPS id 7B45F15855A4 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from localhost (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTP id 6D3BB1585B3C for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from mail.datacom.ind.br ([127.0.0.1]) by localhost (mail.datacom.ind.br [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id KArq0rAWGxXY for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from pedeld202344.datacom.net (pedeld202344.datacom.net [10.0.120.87]) by mail.datacom.ind.br (Postfix) with ESMTPSA id 4D7B61582DF6 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) From: Carlos Santos To: buildroot@buildroot.org Date: Mon, 27 Nov 2017 08:41:29 -0200 Message-Id: <20171127104131.27975-2-casantos@datacom.ind.br> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171127104131.27975-1-casantos@datacom.ind.br> References: <20171127104131.27975-1-casantos@datacom.ind.br> Subject: [Buildroot] [PATCH 1/3] nmap: add option to build/install ncat X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.24 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" The forthcoming "libvirt" package will need a "nc" command with support for Unix domain sockets in order to permit remote management using the virt-manager utility. netcat-openbsd provides such command but requires glibc, so we would not have remote management on uClibc-based systems. Ncat is a much-improved reimplementation of the venerable Netcat and is compatible with uClibc and musl. It provides features not available in the ancient GNU netcat and its Busybox double like IPv6, proxies, and Unix sockets. Tha nmap package now installs ncat if the BR2_PACKAGE_NMAP_NCAT option is selected. The other programs (nmap, ndiff, etc.) are chosen via the BR2_PACKAGE_NMAP_NMAP option. We symlink 'nc' to ncat if neiter netcat nor netcat-openbsd is selected, even though ncat does not have the same interface as netcat-openbsd. However, since Fedora/RHEL install nmap-ncat as 'nc', it can be assumed that packages that depend on 'nc' know how to deal with this diversity. For example, the virt-manager package does that. Also user-supplied scripts can be assumed to do the right thing, since the user also selects whether nmap-ncat, netcat or netcat-openbsd is installed. Signed-off-by: Carlos Santos --- Changes v1->v2: - Add dependens on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS, like netcat does - Remove forced dependence on busybox, since its installation script does not override existing programs. Changes v2->v3: - Use a better logic to select either ncat tools, nmap or both, as suggested by Arnout Vandecappelle and Thomas Petazzoni. - Add a prominent comment about the symlink to 'nc', as suggested by Arnout. Changes v3->v4: - Restore forced dependence on busybox, since it may be necessary if packages become built in parallel, leading to a race condition on the creation of the "nc" link. Changes v4->v5 - Rebase to "next" head. - Explain the this change is required by the forthcoming libvirt package. --- package/nmap/Config.in | 27 ++++++++++++++++++++++++++- package/nmap/nmap.mk | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/package/nmap/Config.in b/package/nmap/Config.in index 79f587afd1..1843bb6ade 100644 --- a/package/nmap/Config.in +++ b/package/nmap/Config.in @@ -4,6 +4,12 @@ config BR2_PACKAGE_NMAP depends on BR2_USE_MMU # fork() depends on BR2_TOOLCHAIN_HAS_THREADS select BR2_PACKAGE_LIBPCAP + select BR2_PACKAGE_NMAP_NMAP if !BR2_PACKAGE_NMAP_NCAT + +if BR2_PACKAGE_NMAP + +config BR2_PACKAGE_NMAP_NMAP + bool "install nmap tools" select BR2_PACKAGE_PCRE help Nmap ("Network Mapper") is a free and open source (license) @@ -11,6 +17,25 @@ config BR2_PACKAGE_NMAP http://nmap.org -comment "nmap needs a toolchain w/ C++, threads" +config BR2_PACKAGE_NMAP_NCAT + bool "install ncat" + depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS + help + Ncat is a feature-packed networking utility which reads and + writes data across networks from the command line. Ncat was + written for the Nmap Project as a much-improved + reimplementation of the venerable Netcat. + + If symlink to "nc" is installed if neither netcat or + netcat-openbsd is selected. + +comment "a symlink from ncat to 'nc' will be installed" + depends on BR2_PACKAGE_NMAP_NCAT + depends on !BR2_PACKAGE_NETCAT + depends on !BR2_PACKAGE_NETCAT_OPENBSD + +endif + +comment "nmap-nmap needs a toolchain w/ C++, threads" depends on BR2_USE_MMU depends on !(BR2_INSTALL_LIBSTDCPP && BR2_TOOLCHAIN_HAS_THREADS) diff --git a/package/nmap/nmap.mk b/package/nmap/nmap.mk index ceb08ec006..303eaf9a35 100644 --- a/package/nmap/nmap.mk +++ b/package/nmap/nmap.mk @@ -7,10 +7,10 @@ NMAP_VERSION = 7.60 NMAP_SITE = https://nmap.org/dist NMAP_SOURCE = nmap-$(NMAP_VERSION).tar.bz2 -NMAP_DEPENDENCIES = libpcap pcre host-autoconf +NMAP_DEPENDENCIES = libpcap host-autoconf NMAP_CONF_OPTS = --without-liblua --without-zenmap \ --with-libdnet=included --with-liblinear=included \ - --with-libpcre="$(STAGING_DIR)/usr" --without-ncat + --with-libpcre="$(STAGING_DIR)/usr" NMAP_LICENSE = GPL-2.0 NMAP_LICENSE_FILES = COPYING @@ -51,6 +51,16 @@ else NMAP_CONF_OPTS += --without-openssl endif +ifeq ($(BR2_PACKAGE_NMAP_NMAP),y) + +# Ensure Busybox gets built/installed before, so that this package +# overrides Busybox nc. +ifeq ($(BR2_PACKAGE_BUSYBOX),y) +NMAP_DEPENDENCIES += busybox +endif + +NMAP_DEPENDENCIES += pcre + # ndiff only works with python2.x ifeq ($(BR2_PACKAGE_PYTHON),y) NMAP_DEPENDENCIES += python @@ -58,4 +68,28 @@ else NMAP_CONF_OPTS += --without-ndiff endif +ifeq ($(BR2_PACKAGE_NMAP_NCAT),) +NMAP_CONF_OPTS += --without-ncat +endif + +else # only ncat + +NMAP_CONF_OPTS += --without-ndiff --without-zenmap --without-nping --without-nmap-update +define NMAP_BUILD_CMDS + $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) build-ncat +endef +define NMAP_INSTALL_TARGET_CMDS + $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) DESTDIR=$(TARGET_DIR) install-ncat +endef + +endif + +# Add a symlink to "nc" if none of the competing netcats is selected +ifeq ($(BR2_PACKAGE_NMAP_NCAT):$(BR2_PACKAGE_NETCAT)$(BR2_PACKAGE_NETCAT_OPENBSD),y:) +define NMAP_INSTALL_NCAT_SYMLINK + ln -fs ncat $(TARGET_DIR)/usr/bin/nc +endef +NMAP_POST_INSTALL_TARGET_HOOKS += NMAP_INSTALL_NCAT_SYMLINK +endif + $(eval $(autotools-package)) From patchwork Mon Nov 27 10:41:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos Santos X-Patchwork-Id: 841615 X-Patchwork-Delegate: thomas.petazzoni@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=busybox.net (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ylkL947Yxz9rxl for ; Mon, 27 Nov 2017 21:58:25 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 9F73A876CC; Mon, 27 Nov 2017 10:58:23 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Qx-gtjeFnTdV; Mon, 27 Nov 2017 10:57:40 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by hemlock.osuosl.org (Postfix) with ESMTP id A950287B5B; Mon, 27 Nov 2017 10:57:33 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by ash.osuosl.org (Postfix) with ESMTP id E01001BFC2F for ; Mon, 27 Nov 2017 10:41:44 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D824F8663C for ; Mon, 27 Nov 2017 10:41:44 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Rjktwd+Llb4Z for ; Mon, 27 Nov 2017 10:41:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail.datacom.ind.br (mx.datacom.ind.br [177.66.5.10]) by whitealder.osuosl.org (Postfix) with ESMTPS id 04D09865DF for ; Mon, 27 Nov 2017 10:41:41 +0000 (UTC) Received: from mail.datacom.ind.br (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTPS id 9AFD21585B3C for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from localhost (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTP id 8B39C1582CB1 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from mail.datacom.ind.br ([127.0.0.1]) by localhost (mail.datacom.ind.br [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id CzlaEJPtetoZ for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from pedeld202344.datacom.net (pedeld202344.datacom.net [10.0.120.87]) by mail.datacom.ind.br (Postfix) with ESMTPSA id 527D21583E25 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) From: Carlos Santos To: buildroot@buildroot.org Date: Mon, 27 Nov 2017 08:41:30 -0200 Message-Id: <20171127104131.27975-3-casantos@datacom.ind.br> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171127104131.27975-1-casantos@datacom.ind.br> References: <20171127104131.27975-1-casantos@datacom.ind.br> Subject: [Buildroot] [PATCH 2/3] netcf: new package X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.24 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" netcf is a cross-platform network configuration library. It takes the description of a network interface in its own platform-independent format and adapts the local system's network configuration to provide that interface. Both the ncftool utility and libnetcf are installed. The library is used by libvirt (forthcoming package) when udev is not available. netcf was originally hosted at fedorahosted.org, which was retired on March 1st, 2017, so we take the code fom the Debian snapshot archive. Five bug fixes were imported from Fedora 26. Four additional patches are required to clean-up the code and adapt it to the Buildroot directory hierarchy. Signed-off-by: Carlos Santos --- package/Config.in | 1 + package/netcf/0001-fix-misplaced-empty.patch | 36 +++++++ ...002-call-aug_load-at-most-once-per-second.patch | 83 +++++++++++++++ ...g_match-query-for-all-ifcfg-files-related.patch | 113 +++++++++++++++++++++ ...ude-bond-element-for-bonds-with-no-slaves.patch | 56 ++++++++++ ...erly-classify-bond-devices-with-no-slaves.patch | 35 +++++++ ...006-netcf-transaction.sh-remove-bash-isms.patch | 50 +++++++++ ...t-script-as-etc-init.d-S30netcf-transacti.patch | 35 +++++++ ...08-configure.ac-fix-AM_INIT_AUTOMAKE-call.patch | 29 ++++++ ...LUDES-by-AM_CPPFLAGS-in-some-Makefile.am-.patch | 52 ++++++++++ package/netcf/Config.in | 24 +++++ package/netcf/S30netcf-transaction | 9 ++ package/netcf/netcf.hash | 2 + package/netcf/netcf.mk | 22 ++++ 14 files changed, 547 insertions(+) create mode 100644 package/netcf/0001-fix-misplaced-empty.patch create mode 100644 package/netcf/0002-call-aug_load-at-most-once-per-second.patch create mode 100644 package/netcf/0003-optimize-aug_match-query-for-all-ifcfg-files-related.patch create mode 100644 package/netcf/0004-linux-include-bond-element-for-bonds-with-no-slaves.patch create mode 100644 package/netcf/0005-Properly-classify-bond-devices-with-no-slaves.patch create mode 100644 package/netcf/0006-netcf-transaction.sh-remove-bash-isms.patch create mode 100644 package/netcf/0007-Install-init-script-as-etc-init.d-S30netcf-transacti.patch create mode 100644 package/netcf/0008-configure.ac-fix-AM_INIT_AUTOMAKE-call.patch create mode 100644 package/netcf/0009-Replace-INCLUDES-by-AM_CPPFLAGS-in-some-Makefile.am-.patch create mode 100644 package/netcf/Config.in create mode 100644 package/netcf/S30netcf-transaction create mode 100644 package/netcf/netcf.hash create mode 100644 package/netcf/netcf.mk diff --git a/package/Config.in b/package/Config.in index 86acab6427..cdfb90151a 100644 --- a/package/Config.in +++ b/package/Config.in @@ -1710,6 +1710,7 @@ menu "Networking applications" source "package/nbd/Config.in" source "package/ncftp/Config.in" source "package/ndisc6/Config.in" + source "package/netcf/Config.in" source "package/netatalk/Config.in" source "package/netcat/Config.in" source "package/netcat-openbsd/Config.in" diff --git a/package/netcf/0001-fix-misplaced-empty.patch b/package/netcf/0001-fix-misplaced-empty.patch new file mode 100644 index 0000000000..74a3a63d7a --- /dev/null +++ b/package/netcf/0001-fix-misplaced-empty.patch @@ -0,0 +1,36 @@ +From 8e00e9c0ba6b66035defc94470ac863f04eba4b5 Mon Sep 17 00:00:00 2001 +From: Laine Stump +Date: Thu, 21 May 2015 11:40:53 -0400 +Subject: [PATCH 1/9] fix misplaced + +When transcribing the link-speed-state bits from libvirt's +interface.rng to netcf's, I accidentally added an "" in the +wrong place. It should have gone inside the definition of the +element, rather than just after in the element. +--- + data/xml/interface.rng | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/data/xml/interface.rng b/data/xml/interface.rng +index 8d70e8b..9098cc9 100644 +--- a/data/xml/interface.rng ++++ b/data/xml/interface.rng +@@ -41,7 +41,6 @@ + + + +- + + + +@@ -489,6 +488,7 @@ + + + ++ + + + +-- +2.13.6 + diff --git a/package/netcf/0002-call-aug_load-at-most-once-per-second.patch b/package/netcf/0002-call-aug_load-at-most-once-per-second.patch new file mode 100644 index 0000000000..c4f3a308df --- /dev/null +++ b/package/netcf/0002-call-aug_load-at-most-once-per-second.patch @@ -0,0 +1,83 @@ +From 9b5f4eb57af28a604cd7ac8b2c1be9e49f0b517d Mon Sep 17 00:00:00 2001 +From: Laine Stump +Date: Mon, 28 Sep 2015 17:11:11 -0400 +Subject: [PATCH 2/9] call aug_load() at most once per second + +Previously, netcf would call aug_load() at the start of each public +API call, and rely on augeas quickly determining if the files needed +to be reread based on checking the mtime of all files. With a large +number of files (i.e. several hundred ifcfg files) just checking the +mtime of all files ends up taking quite a long time; enough to turn a +simple "virsh iface-list" of 300 bridges + 300 vlans into a 22 second +ordeal. + +With this patch applied, netcf will only call aug_load() at most once +every second, resulting in runtime for virsh iface-list going down to +< 1 second. + +The trade-off is that the results of a netcf API call could be up to 1 +second out of date (but only due to changes in the config external to +netcf). Since ifcfg files change very infrequently, this is likely +acceptable. +--- + src/dutil_linux.c | 8 +++++++- + src/dutil_linux.h | 1 + + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/dutil_linux.c b/src/dutil_linux.c +index 0850593..24f4d95 100644 +--- a/src/dutil_linux.c ++++ b/src/dutil_linux.c +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -151,6 +152,7 @@ int remove_augeas_xfm_table(struct netcf *ncf, + */ + augeas *get_augeas(struct netcf *ncf) { + int r; ++ time_t current_time; + + if (ncf->driver->augeas == NULL) { + augeas *aug; +@@ -186,9 +188,12 @@ augeas *get_augeas(struct netcf *ncf) { + } + ncf->driver->copy_augeas_xfm = 0; + ncf->driver->load_augeas = 1; ++ ncf->driver->load_augeas_time = 0; + } + +- if (ncf->driver->load_augeas) { ++ current_time = time(NULL); ++ if (ncf->driver->load_augeas && ++ ncf->driver->load_augeas_time != current_time) { + augeas *aug = ncf->driver->augeas; + + r = aug_load(aug); +@@ -207,6 +212,7 @@ augeas *get_augeas(struct netcf *ncf) { + } + ERR_THROW(r > 0, ncf, EOTHER, "errors in loading some config files"); + ncf->driver->load_augeas = 0; ++ ncf->driver->load_augeas_time = current_time; + } + return ncf->driver->augeas; + error: +diff --git a/src/dutil_linux.h b/src/dutil_linux.h +index a06a15c..75ac631 100644 +--- a/src/dutil_linux.h ++++ b/src/dutil_linux.h +@@ -41,6 +41,7 @@ struct driver { + struct nl_sock *nl_sock; + struct nl_cache *link_cache; + struct nl_cache *addr_cache; ++ time_t load_augeas_time; + unsigned int load_augeas : 1; + unsigned int copy_augeas_xfm : 1; + unsigned int augeas_xfm_num_tables; +-- +2.13.6 + diff --git a/package/netcf/0003-optimize-aug_match-query-for-all-ifcfg-files-related.patch b/package/netcf/0003-optimize-aug_match-query-for-all-ifcfg-files-related.patch new file mode 100644 index 0000000000..2d4003e450 --- /dev/null +++ b/package/netcf/0003-optimize-aug_match-query-for-all-ifcfg-files-related.patch @@ -0,0 +1,113 @@ +From 396e4e0698d9fb542f2eb8b32790a069e1c0df61 Mon Sep 17 00:00:00 2001 +From: Laine Stump +Date: Wed, 7 Oct 2015 13:49:45 -0400 +Subject: [PATCH 3/9] optimize aug_match() query for all ifcfg files related to + an interface + +This resolves: + + https://bugzilla.redhat.com/show_bug.cgi?id=1269613 + +The original augeas search term used by netcf to find, for example, all the +ifcfg files associated with device "br1" was: + + "/files/etc/sysconfig/network-scripts/*[ " + "DEVICE = 'br1' or BRIDGE = 'br1' or MASTER = 'br1' or MASTER = " + "../*[BRIDGE = 'br1']/DEVICE ]/DEVICE" + +This is *extremely* inefficient - on a test host with 514 host +bridges, each with an attached vlan interface, a dumpxml of all +toplevel interfaces took 6m40s (*after* installing an augeas that +included augeas upstream commits a659f09a, 41e989ca, and 23d5e480 +which were all pushed after the augeas-1.4.0 release). + +In these two messages: + + https://www.redhat.com/archives/augeas-devel/2015-October/msg00003.html + https://www.redhat.com/archives/augeas-devel/2015-October/msg00004.html + +David Lutterkort suggested changing the search term to: + + "(/files/etc/sysconfig/network-scripts/*[(DEVICE|BRIDGE|MASTER) = 'br1']" + "|/files/etc/sysconfig/network-scripts/*[MASTER]" + "[MASTER = ../*[BRIDGE = 'br1']/DEVICE ])/DEVICE + +That's what this patch does. Testing shows that it is functionally +equivalent, and reduces the dumpxml time in the previously described +test from 6m40s down to 17 seconds. +--- + src/drv_redhat.c | 44 ++++++++++++++++++++++++++++++++++---------- + 1 file changed, 34 insertions(+), 10 deletions(-) + +diff --git a/src/drv_redhat.c b/src/drv_redhat.c +index 4935f98..092ef5c 100644 +--- a/src/drv_redhat.c ++++ b/src/drv_redhat.c +@@ -88,6 +88,38 @@ static const struct augeas_xfm_table augeas_xfm_common = + { .size = ARRAY_CARDINALITY(augeas_xfm_common_pv), + .pv = augeas_xfm_common_pv }; + ++/* aug_all_related_ifcfgs() - return the count of (and optionally a list ++ * of, if matches != NULL) the paths for all ifcfg files that are ++ * related to the interface "name". ++ */ ++static ++int aug_all_related_ifcfgs(struct netcf *ncf, char ***matches, const char *name) { ++ int nmatches; ++ ++ /* this includes the ifcfg files for: ++ * ++ * 1) the named interface itself (DEVICE=$name) ++ * ++ * 2) any interface naming $name as a bridge it is attached to ++ * (BRIDGE=$name) ++ * ++ * 3) any interface naming $name as the master of a bond it is ++ * enslaved to (MASTER=$name) ++ * ++ * 4) any interface with a MASTER, where the device named as ++ * MASTER contains a BRIDGE=$name *and* DEVICE=$itself (thus ++ * catching ethernet devices that are enslaved to a bond that ++ * is attached to a bridge). ++ */ ++ nmatches = aug_fmt_match(ncf, matches, ++ "(%s[(DEVICE|BRIDGE|MASTER) = '%s']" ++ "|%s[MASTER][MASTER = ../*[BRIDGE = '%s']/DEVICE " ++ "])/DEVICE", ++ ifcfg_path, name, ifcfg_path, name); ++ return nmatches; ++ ++} ++ + /* Entries in a ifcfg file that tell us that the interface + * is not a toplevel interface + */ +@@ -108,12 +140,7 @@ static int is_slave(struct netcf *ncf, const char *intf) { + static bool has_ifcfg_file(struct netcf *ncf, const char *name) { + int nmatches; + +- nmatches = aug_fmt_match(ncf, NULL, +- "%s[ DEVICE = '%s'" +- " or BRIDGE = '%s'" +- " or MASTER = '%s'" +- " or MASTER = ../*[BRIDGE = '%s']/DEVICE ]/DEVICE", +- ifcfg_path, name, name, name, name); ++ nmatches = aug_all_related_ifcfgs(ncf, NULL, name); + return nmatches > 0; + } + +@@ -588,10 +615,7 @@ static xmlDocPtr aug_get_xml_for_nif(struct netcf_if *nif) { + int ndevs = 0, nint = 0; + + ncf = nif->ncf; +- ndevs = aug_fmt_match(ncf, &devs, +- "%s[ DEVICE = '%s' or BRIDGE = '%s' or MASTER = '%s'" +- " or MASTER = ../*[BRIDGE = '%s']/DEVICE ]/DEVICE", +- ifcfg_path, nif->name, nif->name, nif->name, nif->name); ++ ndevs = aug_all_related_ifcfgs(ncf, &devs, nif->name); + ERR_BAIL(ncf); + + nint = uniq_ifcfg_paths(ncf, ndevs, devs, &intf); +-- +2.13.6 + diff --git a/package/netcf/0004-linux-include-bond-element-for-bonds-with-no-slaves.patch b/package/netcf/0004-linux-include-bond-element-for-bonds-with-no-slaves.patch new file mode 100644 index 0000000000..e552cff70b --- /dev/null +++ b/package/netcf/0004-linux-include-bond-element-for-bonds-with-no-slaves.patch @@ -0,0 +1,56 @@ +From cfe1eb87f7f152ab5d6456ef8ecd7aab38d376fa Mon Sep 17 00:00:00 2001 +From: Lubomir Rintel +Date: Wed, 27 May 2015 19:30:25 +0200 +Subject: [PATCH 4/9] linux: include element for bonds with no slaves + +The missing element makes libvirt sad: + + $ ncftool dumpxml --live nm-bond + + + + + + + + + $ virsh iface-dumpxml nm-bond + error: XML error: bond interface misses the bond element + +This is analogous what was done in d32a464c (Always add element to +bridge if, even if no physdev is attached) for bridges. +--- + src/dutil_linux.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/src/dutil_linux.c b/src/dutil_linux.c +index 24f4d95..022eed0 100644 +--- a/src/dutil_linux.c ++++ b/src/dutil_linux.c +@@ -1055,9 +1055,6 @@ static void add_bond_info_cb(struct nl_object *obj, + || rtnl_link_get_master(iflink) != cb_data->master_ifindex) + return; + +- cb_data->bond = xml_node(cb_data->doc, cb_data->root, "bond"); +- ERR_NOMEM(cb_data->bond == NULL, ncf); +- + /* XXX - if we learn where to get bridge "mode" property, set it here */ + + /* XXX - need to add node like one of these: +@@ -1089,7 +1086,13 @@ static void add_bond_info(struct netcf *ncf, + if (ifindex == RTNL_LINK_NOT_FOUND) + return; + ++ cb_data.bond = xml_node(doc, root, "bond"); ++ ERR_NOMEM(cb_data.bond == NULL, ncf); ++ + nl_cache_foreach(ncf->driver->link_cache, add_bond_info_cb, &cb_data); ++ ++error: ++ return; + } + + +-- +2.13.6 + diff --git a/package/netcf/0005-Properly-classify-bond-devices-with-no-slaves.patch b/package/netcf/0005-Properly-classify-bond-devices-with-no-slaves.patch new file mode 100644 index 0000000000..f255669dab --- /dev/null +++ b/package/netcf/0005-Properly-classify-bond-devices-with-no-slaves.patch @@ -0,0 +1,35 @@ +From f3ec5157c7fc97e31c7b48e3a56da268de7e4216 Mon Sep 17 00:00:00 2001 +From: Laine Stump +Date: Tue, 13 Oct 2015 14:42:35 -0400 +Subject: [PATCH 5/9] Properly classify bond devices with no slaves + +Although initscripts only considers an interface to be a bond if it +has slaves, there are times when setting up a bond, or testing, when a +bond may not have any slaves (yet) but does have a BONDING_OPTS +attribute. Previously in those situations netcf would identify the +interface as a plain ethernet. This patch makes the check more +inclusive - now any interface with slaves *or* with a BONDING_OPTS +attribute is considered to be a bond. + +This patch was inspired by an earlier patch sent by Lubomir Rintel +which looked for BONDING_OPTS *instead of* looking for slaves. +--- + data/xml/redhat-put.xsl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/data/xml/redhat-put.xsl b/data/xml/redhat-put.xsl +index ed56c66..89145e5 100644 +--- a/data/xml/redhat-put.xsl ++++ b/data/xml/redhat-put.xsl +@@ -135,7 +135,7 @@ + + + ++ match="tree[count(node[@label = 'BONDING_OPTS']) or (node[@label = 'DEVICE'][@value = //tree/node[@label = 'MASTER']/@value])][count(node[@label = 'BRIDGE']) = 0]"> + + + +-- +2.13.6 + diff --git a/package/netcf/0006-netcf-transaction.sh-remove-bash-isms.patch b/package/netcf/0006-netcf-transaction.sh-remove-bash-isms.patch new file mode 100644 index 0000000000..c25cc779af --- /dev/null +++ b/package/netcf/0006-netcf-transaction.sh-remove-bash-isms.patch @@ -0,0 +1,50 @@ +From 91cdbd05a82be014f43d549ddcf5a67471a5f029 Mon Sep 17 00:00:00 2001 +From: Carlos Santos +Date: Sun, 8 Oct 2017 09:36:42 -0300 +Subject: [PATCH 6/9] netcf-transaction.sh: remove bash-isms + +echo $"..." -> echo "..." +echo -n $"...$a $b" -> printf "... %s %s" "$a" "$b" + +Signed-off-by: Carlos Santos +--- + src/netcf-transaction.sh.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/netcf-transaction.sh.in b/src/netcf-transaction.sh.in +index c9aafdf..f668d40 100644 +--- a/src/netcf-transaction.sh.in ++++ b/src/netcf-transaction.sh.in +@@ -197,7 +197,7 @@ change_rollback () + # usage [val] + # Display usage string, then exit with VAL (defaults to 2). + usage() { +- echo $"Usage: $0 {change-begin|change-commit|change-rollback|snapshot-dir|start|stop|status|restart|condrestart|try-restart|reload|force-reload}" ++ echo "Usage: $0 {change-begin|change-commit|change-rollback|snapshot-dir|start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit ${1-2} + } + +@@ -210,7 +210,7 @@ retval=0 + case "$1" in + # commands required in all Fedora initscripts + start|restart|reload|force-reload|condrestart|try-restart) +- echo -n $"Running $prog $1: " ++ printf "Running %s %s: " "$0" "$1" + change_rollback + # ignore the "no pending transaction" error + test "$retval" != "$EINVALID_IN_THIS_STATE" && retval=$? +@@ -219,9 +219,9 @@ case "$1" in + stop|status) + if test -d "$snapshotdir" + then +- echo $"There is an open transaction" ++ echo "There is an open transaction" + else +- echo $"No open transaction" ++ echo "No open transaction" + fi + ;; + +-- +2.13.6 + diff --git a/package/netcf/0007-Install-init-script-as-etc-init.d-S30netcf-transacti.patch b/package/netcf/0007-Install-init-script-as-etc-init.d-S30netcf-transacti.patch new file mode 100644 index 0000000000..5e3c553958 --- /dev/null +++ b/package/netcf/0007-Install-init-script-as-etc-init.d-S30netcf-transacti.patch @@ -0,0 +1,35 @@ +From e7aa162d0a14684dafa5d8316c34d19ba01ed503 Mon Sep 17 00:00:00 2001 +From: Carlos Santos +Date: Sun, 8 Oct 2017 09:43:08 -0300 +Subject: [PATCH 7/9] Install init script as /etc/init.d/S30netcf-transaction + +This is for Buildroot, only. + +Signed-off-by: Carlos Santos +--- + src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/Makefile.am b/src/Makefile.am +index 2f76614..ce04b43 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -138,12 +138,12 @@ BUILT_SOURCES += netcf-transaction.sh + + if NETCF_USE_INITSCRIPTS + install-sysinit: netcf-transaction.init +- $(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d ++ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/init.d + $(INSTALL_SCRIPT) netcf-transaction.init \ +- $(DESTDIR)$(sysconfdir)/rc.d/init.d/netcf-transaction ++ $(DESTDIR)$(sysconfdir)/init.d/S30netcf-transaction + + uninstall-sysinit: +- rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/netcf-transaction \ ++ rm -f $(DESTDIR)$(sysconfdir)/init.d/S30netcf-transaction \ + $(DESTDIR)$(sysconfdir)/sysconfig/netcf-transaction + + netcf-transaction.init: netcf-transaction.init.in \ +-- +2.13.6 + diff --git a/package/netcf/0008-configure.ac-fix-AM_INIT_AUTOMAKE-call.patch b/package/netcf/0008-configure.ac-fix-AM_INIT_AUTOMAKE-call.patch new file mode 100644 index 0000000000..4331d84b55 --- /dev/null +++ b/package/netcf/0008-configure.ac-fix-AM_INIT_AUTOMAKE-call.patch @@ -0,0 +1,29 @@ +From 6daa25084b553351255e8f3e6b252a446e5f88fc Mon Sep 17 00:00:00 2001 +From: Carlos Santos +Date: Sun, 8 Oct 2017 13:16:41 -0300 +Subject: [PATCH 8/9] configure.ac: fix AM_INIT_AUTOMAKE call + +Add the subdir-objects options, since the main Makefile.am references +files in subdirectories, to silence a warning when autoreconfiguring. + +Signed-off-by: Carlos Santos +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 15c47cd..1ca80ef 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -3,7 +3,7 @@ AC_CONFIG_SRCDIR([src/netcf.c]) + AC_CONFIG_AUX_DIR([build-aux]) + AC_CONFIG_MACRO_DIR([gnulib/m4]) + AC_CONFIG_HEADERS([config.h]) +-AM_INIT_AUTOMAKE([-Wno-portability 1.11 color-tests parallel-tests]) ++AM_INIT_AUTOMAKE([-Wno-portability 1.11 subdir-objects color-tests parallel-tests]) + AM_SILENT_RULES([yes]) # make --enable-silent-rules the default. + AC_CANONICAL_HOST + +-- +2.13.6 + diff --git a/package/netcf/0009-Replace-INCLUDES-by-AM_CPPFLAGS-in-some-Makefile.am-.patch b/package/netcf/0009-Replace-INCLUDES-by-AM_CPPFLAGS-in-some-Makefile.am-.patch new file mode 100644 index 0000000000..c23e7a223c --- /dev/null +++ b/package/netcf/0009-Replace-INCLUDES-by-AM_CPPFLAGS-in-some-Makefile.am-.patch @@ -0,0 +1,52 @@ +From decbcbbea45b4511353dc5ff8cd9465d9cf8d1dd Mon Sep 17 00:00:00 2001 +From: Carlos Santos +Date: Sun, 8 Oct 2017 13:26:54 -0300 +Subject: [PATCH 9/9] Replace INCLUDES by AM_CPPFLAGS in some Makefile.am files + +Also, do not redefine AM_CPPFLAGS in gnulib/tests/Makefile.am, since +this is already done in gnulib.mk (generated file), which Makefile.am +includes. This silences some warnings when autoreconfiguring. + +Signed-off-by: Carlos Santos +--- + gnulib/lib/Makefile.am | 2 +- + gnulib/tests/Makefile.am | 2 -- + tests/Makefile.am | 2 +- + 3 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/gnulib/lib/Makefile.am b/gnulib/lib/Makefile.am +index 4009220..90383ca 100644 +--- a/gnulib/lib/Makefile.am ++++ b/gnulib/lib/Makefile.am +@@ -13,4 +13,4 @@ CLEANFILES= + + include gnulib.mk + +-INCLUDES = $(GETTEXT_CPPFLAGS) ++AM_CPPFLAGS = $(GETTEXT_CPPFLAGS) +diff --git a/gnulib/tests/Makefile.am b/gnulib/tests/Makefile.am +index 3445c6d..59041bb 100644 +--- a/gnulib/tests/Makefile.am ++++ b/gnulib/tests/Makefile.am +@@ -4,5 +4,3 @@ + ## See COPYING.LIB for the License of this software + + include gnulib.mk +- +-INCLUDES = $(GETTEXT_CPPFLAGS) +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 641222d..7635c2e 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -14,7 +14,7 @@ TESTS_ENVIRONMENT = \ + abs_top_builddir='$(abs_top_builddir)' \ + abs_top_srcdir='$(abs_top_srcdir)' + +-INCLUDES = -I$(top_srcdir)/src ++AM_CPPFLAGS = -I$(top_srcdir)/src + + TESTS= + check_PROGRAMS= +-- +2.13.6 + diff --git a/package/netcf/Config.in b/package/netcf/Config.in new file mode 100644 index 0000000000..d38c2dcef0 --- /dev/null +++ b/package/netcf/Config.in @@ -0,0 +1,24 @@ +config BR2_PACKAGE_NETCF + bool "netcf" + depends on !BR2_arc # augeas + depends on !BR2_STATIC_LIBS # libnl + depends on BR2_TOOLCHAIN_HAS_THREADS # libnl + depends on BR2_USE_MMU # fork() + depends on BR2_USE_WCHAR # augeas + select BR2_PACKAGE_AUGEAS + select BR2_PACKAGE_LIBNL + select BR2_PACKAGE_LIBXML2 + select BR2_PACKAGE_LIBXSLT + select BR2_PACKAGE_READLINE + help + netcf is a cross-platform network configuration library. + + It takes the description of a network interface in its own + platform-independent format and adapts the local system's + network configuration to provide that interface. + + Both the ncftool utility and libnetcf are installed. + +comment "netcf needs a toolchain w/ wchar" + depends on !BR2_arc + depends on !BR2_USE_WCHAR diff --git a/package/netcf/S30netcf-transaction b/package/netcf/S30netcf-transaction new file mode 100644 index 0000000000..ad67123916 --- /dev/null +++ b/package/netcf/S30netcf-transaction @@ -0,0 +1,9 @@ +#!/bin/sh +# +# This script can save the current state of network config, and later +# revert to that config, or commit the new config (by deleting the +# snapshot). At boot time, if there are uncommitted changes to the +# network config, they are reverted (and the discarded changes are +# archived in /var/lib/netcf/network-rollback-*). + +exec /usr/libexec/netcf-transaction.sh "$@" diff --git a/package/netcf/netcf.hash b/package/netcf/netcf.hash new file mode 100644 index 0000000000..2ba2a5c204 --- /dev/null +++ b/package/netcf/netcf.hash @@ -0,0 +1,2 @@ +# Locally computed: +sha256 fd81d607795547807150dfdb82bd164ab2569369ab48a30cb6b0d010d17b127c netcf_0.2.8.orig.tar.gz diff --git a/package/netcf/netcf.mk b/package/netcf/netcf.mk new file mode 100644 index 0000000000..bd2bc8715d --- /dev/null +++ b/package/netcf/netcf.mk @@ -0,0 +1,22 @@ +################################################################################ +# +# netcf +# +################################################################################ + +NETCF_VERSION = 0.2.8 +NETCF_SITE = http://snapshot.debian.org/archive/debian/20171007T103908Z/pool/main/n/netcf +NETCF_SOURCE = netcf_$(NETCF_VERSION).orig.tar.gz +NETCF_INSTALL_STAGING = YES +NETCF_LICENSE = LGPL-2.1+ +NETCF_LICENSE_FILES = COPYING +NETCF_DEPENDENCIES = augeas libnl libxml2 libxslt readline +NETCF_INSTALL_STAGING = YES + +# 0007-Install-init-script-as-etc-init.d-S30netcf-transacti.patch +NETCF_AUTORECONF = YES + +NETCF_CONF_OPTS = \ + --with-sysinit=$(if $(BR2_INIT_SYSTEMD),systemd,$(if $(BR2_INIT_NONE),none,initscripts)) + +$(eval $(autotools-package)) From patchwork Mon Nov 27 10:41:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos Santos X-Patchwork-Id: 841613 X-Patchwork-Delegate: thomas.petazzoni@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=busybox.net (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3ylkKL1Skyz9s9Y for ; Mon, 27 Nov 2017 21:57:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D090D86D60; Mon, 27 Nov 2017 10:57:36 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TDgt77lYye9P; Mon, 27 Nov 2017 10:57:32 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id A1D9186D12; Mon, 27 Nov 2017 10:57:32 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by ash.osuosl.org (Postfix) with ESMTP id BFEFB1BFC2F for ; Mon, 27 Nov 2017 10:41:43 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id B9E3F2DAE4 for ; Mon, 27 Nov 2017 10:41:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xoxctecnAan5 for ; Mon, 27 Nov 2017 10:41:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail.datacom.ind.br (mx.datacom.ind.br [177.66.5.10]) by silver.osuosl.org (Postfix) with ESMTPS id D72A82D184 for ; Mon, 27 Nov 2017 10:41:40 +0000 (UTC) Received: from mail.datacom.ind.br (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTPS id A89621582CB1 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from localhost (localhost [127.0.0.1]) by mail.datacom.ind.br (Postfix) with ESMTP id 9AA1A1584B81 for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from mail.datacom.ind.br ([127.0.0.1]) by localhost (mail.datacom.ind.br [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id M-I3WgBkC3cI for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) Received: from pedeld202344.datacom.net (pedeld202344.datacom.net [10.0.120.87]) by mail.datacom.ind.br (Postfix) with ESMTPSA id 690B515857FE for ; Mon, 27 Nov 2017 08:38:23 -0200 (BRST) From: Carlos Santos To: buildroot@buildroot.org Date: Mon, 27 Nov 2017 08:41:31 -0200 Message-Id: <20171127104131.27975-4-casantos@datacom.ind.br> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171127104131.27975-1-casantos@datacom.ind.br> References: <20171127104131.27975-1-casantos@datacom.ind.br> Subject: [Buildroot] [PATCH 3/3] libvirt: new package X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.24 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" Libvirt is collection of software that provides a convenient way to manage virtual machines and other virtualization functionality, such as storage and network interface management. These software pieces include an API library, a daemon (libvirtd), and a command line utility (virsh). http://libvirt.org/ Signed-off-by: Carlos Santos --- History: v1: primitive package, for experimental purposes only v1->v2: - Clarify dependence on !BR2_TOOLCHAIN_USES_MUSL - Add run-time dependence dnsmask - Add dependence on eudev and libpciaccess when eudev is selected (thus detected by configure). v2->v3: - Condition the use of libtirpc to !BR2_TOOLCHAIN_HAS_NATIVE_RPC - Check for BR2_PACKAGE_HAS_UDEV instead of BR2_PACKAGE_EUDEV v3->v4: - Fix version history :-). - Add optional dependency on several packages (e.g. attr, libpcap), depending on wether they are selected or not, and explicitly disable features whose required packages are not selected. This is very important to prevent selection of features based on leaks from the host environment (e.g. finding /usr/bin/numad on the host machine). - Enable the "interface" driver if either udev or netcf is available. - Disable pm-utils support, since there is no package for Buildroot. - Use either openssl or gnutls, if available. - Run qemu as user "qemu", group "kvm", not as root. - Add a LIBVIRT_USERS variable to create user "qemu" an group "kvm". - Add a device table file to set the ownership and permissions of the libvirt directories under /etc, /run and /var. - If udev is not available, add an init script to set the ownership and permissions of /dev/kvm to root:kvm and 0660; otherwise create a corresponding /etc/udev/rules.d/90-kvm.rules file. - Enable support for systemd, if applicable; otherwise install an init script to start/stop/restart libvirtd. - Ensure that a modern netcat is available. --- package/Config.in | 1 + package/libvirt/Config.in | 44 ++++++++ package/libvirt/S30devkvmperms | 28 +++++ package/libvirt/S90libvirt | 139 +++++++++++++++++++++++ package/libvirt/device_table.txt | 39 +++++++ package/libvirt/libvirt.hash | 2 + package/libvirt/libvirt.mk | 233 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 486 insertions(+) create mode 100644 package/libvirt/Config.in create mode 100755 package/libvirt/S30devkvmperms create mode 100644 package/libvirt/S90libvirt create mode 100644 package/libvirt/device_table.txt create mode 100644 package/libvirt/libvirt.hash create mode 100644 package/libvirt/libvirt.mk diff --git a/package/Config.in b/package/Config.in index cdfb90151a..1c040f0e1a 100644 --- a/package/Config.in +++ b/package/Config.in @@ -1925,6 +1925,7 @@ menu "System tools" source "package/keyutils/Config.in" source "package/kmod/Config.in" source "package/kvmtool/Config.in" + source "package/libvirt/Config.in" source "package/lxc/Config.in" source "package/monit/Config.in" source "package/ncdu/Config.in" diff --git a/package/libvirt/Config.in b/package/libvirt/Config.in new file mode 100644 index 0000000000..8e64c85188 --- /dev/null +++ b/package/libvirt/Config.in @@ -0,0 +1,44 @@ +config BR2_PACKAGE_LIBVIRT + bool "libvirt" + depends on !BR2_PACKAGE_NETCAT + depends on !BR2_STATIC_LIBS # libnl, lvm2 + depends on !BR2_TOOLCHAIN_USES_MUSL # lvm2 + depends on BR2_TOOLCHAIN_HAS_THREADS # libnl, libtirpc + depends on BR2_USE_MMU # fork() + select BR2_PACKAGE_LIBNL + select BR2_PACKAGE_LIBTIRPC if !BR2_TOOLCHAIN_HAS_NATIVE_RPC + # configure: You must install the pciaccess module to build with udev + select BR2_PACKAGE_LIBPCIACCESS if BR2_PACKAGE_HAS_UDEV + select BR2_PACKAGE_LIBXML2 + select BR2_PACKAGE_LVM2 + # use netcf, if possible, when udev is not available + select BR2_PACKAGE_NETCF if !BR2_PACKAGE_HAS_UDEV && !BR2_arc && BR2_USE_WCHAR + select BR2_PACKAGE_YAJL + # run-time dependencies + select BR2_PACKAGE_CGROUPFS_MOUNT if !BR2_INIT_SYSTEMD + select BR2_PACKAGE_DMIDECODE + select BR2_PACKAGE_DNSMASQ + select BR2_PACKAGE_IPTABLES + select BR2_PACKAGE_IPROUTE2 + select BR2_PACKAGE_RADVD + # These are required because there is no way to unequivocally select a modern netcat + select BR2_PACKAGE_NMAP if !BR2_PACKAGE_NETCAT_OPENBSD + select BR2_PACKAGE_NMAP_NCAT if !BR2_PACKAGE_NETCAT_OPENBSD + help + Libvirt is collection of software that provides a convenient + way to manage virtual machines and other virtualization + functionality, such as storage and network interface + management. These software pieces include an API library, a + daemon (libvirtd), and a command line utility (virsh). + + http://libvirt.org/ + +comment "libvirt needs 'nmap-ncat' or 'netcat-openbsd' but netcat is selected" + depends on BR2_PACKAGE_NETCAT + depends on !BR2_STATIC_LIBS + depends on !BR2_TOOLCHAIN_USES_MUSL + depends on BR2_TOOLCHAIN_HAS_THREADS + depends on BR2_USE_MMU + +comment "libvirt needs a glibc or uClibc toolchain w/ threads, dynamic library" + depends on BR2_STATIC_LIBS || BR2_TOOLCHAIN_USES_MUSL || !BR2_USE_MMU || !BR2_TOOLCHAIN_HAS_THREADS diff --git a/package/libvirt/S30devkvmperms b/package/libvirt/S30devkvmperms new file mode 100755 index 0000000000..8953256a03 --- /dev/null +++ b/package/libvirt/S30devkvmperms @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Set the permissions of /dev/kvm +# + +start() { + printf "Setting the ownership and permissions of /dev/kvm: " + chown qemu:kvm /dev/kvm && chmod 660 /dev/kvm \ + && echo "OK" || echo "FAIL" +} + +stop() { + printf "Restoring the ownership and permissions of /dev/kvm: " + chown root:root /dev/kvm && chmod 600 /dev/kvm \ + && echo "OK" || echo "FAIL" +} + +case "$1" in + start|restart|reload) + start + ;; + stop) + stop + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 +esac diff --git a/package/libvirt/S90libvirt b/package/libvirt/S90libvirt new file mode 100644 index 0000000000..8ff43b4539 --- /dev/null +++ b/package/libvirt/S90libvirt @@ -0,0 +1,139 @@ +#!/bin/sh + +my_name="$0" + +check_required_files() { + [ -x "$1" ] || { + echo "$my_name: $1 is missing" + exit 1 + } + [ -z "$2" ] || [ -f "$2" ] || { + echo "$my_name: $2 is missing" + exit 1 + } +} + +rm_stale_pidfile() { + if [ -e "$1" ]; then + exe="/proc/$(cat "$1")/exe" + { [ -s "$exe" ] && [ "$(readlink -f "$exe")" = "$2" ]; } || rm -f "$1" + fi +} + +start_virtlockd() { + printf "Starting virtlockd: " + rm_stale_pidfile /var/run/virtlockd.pid /usr/sbin/virtlockd + [ ! -e /var/run/virtlockd.pid ] \ + && start-stop-daemon -S -q -p /var/run/virtlockd.pid -x /usr/sbin/virtlockd -- -d \ + && echo "OK" || echo "FAIL" +} + +start_virtlogd() { + printf "Starting virtlogd: " + rm_stale_pidfile /var/run/virtlogd.pid /usr/sbin/virtlogd + [ ! -e /var/run/virtlogd.pid ] \ + && start-stop-daemon -S -q -p /var/run/virtlogd.pid -x /usr/sbin/virtlogd -- -d \ + && echo "OK" || echo "FAIL" +} + +start_libvirtd() { + printf "Starting libvirtd: " + rm_stale_pidfile /var/run/libvirtd.pid /usr/sbin/libvirtd + rm_stale_pidfile /var/run/libvirt/network/default.pid /usr/sbin/dnsmasq + [ ! -e /var/run/libvirtd.pid ] && [ -e /var/run/libvirt/network/default.pid ] \ + && start-stop-daemon -K -q -p /var/run/libvirt/network/default.pid -x /usr/sbin/dnsmasq + [ ! -e /var/run/libvirtd.pid ] \ + && start-stop-daemon -S -q -p /var/run/libvirtd.pid -x /usr/sbin/libvirtd -- -d \ + && echo "OK" || echo "FAIL" +} + +start_libvirt() { + start_virtlockd + start_virtlogd + start_libvirtd +} + +stop_libvirtd() { + printf "Stopping libvirtd: " + start-stop-daemon -K -q -p /var/run/libvirtd.pid -x /usr/sbin/libvirtd \ + && start-stop-daemon -K -q -p /var/run/libvirt/network/default.pid -x /usr/sbin/dnsmasq \ + && echo "OK" || echo "FAIL" + rm_stale_pidfile /var/run/libvirtd.pid /usr/sbin/libvirtd + rm_stale_pidfile /var/run/libvirt/network/default.pid /usr/sbin/dnsmasq +} + +stop_virtlogd() { + printf "Stopping virtlogd: " + start-stop-daemon -K -q -p /var/run/virtlogd.pid -x /usr/sbin/virtlogd \ + && echo "OK" || echo "FAIL" + rm_stale_pidfile /var/run/virtlogd.pid /usr/sbin/virtlogd +} + +stop_virtlockd() { + printf "Stopping virtlockd: " + start-stop-daemon -K -q -p /var/run/virtlockd.pid -x /usr/sbin/virtlockd \ + && echo "OK" || echo "FAIL" + rm_stale_pidfile /var/run/virtlockd.pid /usr/sbin/virtlockd +} + +stop_libvirt() { + stop_libvirtd + stop_virtlogd + stop_virtlockd +} + +reload_virtlockd() { + printf "Reloading virtlockd: " + rm_stale_pidfile /var/run/virtlockd.pid /usr/sbin/virtlockd + [ -e /var/run/virtlockd.pid ] \ + && start-stop-daemon -K -s USR1 -q -p /var/run/virtlockd.pid -x /usr/sbin/virtlockd \ + && echo "OK" || echo "FAIL" +} + +reload_virtlogd() { + printf "Reloading virtlogd: " + rm_stale_pidfile /var/run/virtlogd.pid /usr/sbin/virtlogd + [ -e /var/run/virtlogd.pid ] \ + && start-stop-daemon -K -s USR1 -q -p /var/run/virtlogd.pid -x /usr/sbin/virtlogd \ + && echo "OK" || echo "FAIL" +} + +reload_libvirtd() { + printf "Reloading libvirtd: " + rm_stale_pidfile /var/run/libvirtd.pid /usr/sbin/libvirtd + [ -e /var/run/libvirtd.pid ] \ + && start-stop-daemon -K -s HUP -q -p /var/run/libvirtd.pid -x /usr/sbin/libvirtd \ + && echo "OK" || echo "FAIL" +} + +reload_libvirt() { + reload_virtlockd + reload_virtlogd + reload_libvirtd +} + +check_required_files /usr/sbin/virtlockd /etc/libvirt/virtlockd.conf +check_required_files /usr/sbin/virtlogd /etc/libvirt/virtlogd.conf +check_required_files /usr/sbin/libvirtd /etc/libvirt/libvirtd.conf +check_required_files /usr/sbin/dnsmasq + +case "$1" in + start) + start_libvirt + ;; + stop) + stop_libvirt + ;; + restart) + stop_libvirt + start_libvirt + ;; + reload) + reload_libvirt + ;; + *) + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 +esac + +exit 0 diff --git a/package/libvirt/device_table.txt b/package/libvirt/device_table.txt new file mode 100644 index 0000000000..a0f155ef24 --- /dev/null +++ b/package/libvirt/device_table.txt @@ -0,0 +1,39 @@ +# See package/makedevs/README for details +# +# Libvirt directories ownership and permissions +# +# +/etc/libvirt d 700 0 0 - - - - - +/etc/libvirt/nwfilter d 700 0 0 - - - - - +/etc/libvirt/qemu d 700 0 0 - - - - - +/etc/libvirt/qemu/autostart d 700 0 0 - - - - - +/etc/libvirt/qemu/networks d 700 0 0 - - - - - +/etc/libvirt/qemu/networks/autostart d 700 0 0 - - - - - +/etc/libvirt/storage d 755 0 0 - - - - - +/etc/libvirt/storage/autostart d 755 0 0 - - - - - +/run/libvirt d 755 0 0 - - - - - +/run/libvirt/hostdevmgr d 755 0 0 - - - - - +/run/libvirt/network d 755 0 0 - - - - - +/run/libvirt/qemu d 755 0 0 - - - - - +/run/libvirt/storage d 755 0 0 - - - - - +/var/lib/libvirt d 755 0 0 - - - - - +/var/lib/libvirt/boot d 711 0 0 - - - - - +/var/lib/libvirt/dnsmasq d 755 0 0 - - - - - +/var/lib/libvirt/filesystems d 711 0 0 - - - - - +/var/lib/libvirt/images d 711 0 0 - - - - - +/var/lib/libvirt/network d 700 0 0 - - - - - +/var/lib/libvirt/qemu d 751 107 36 - - - - - +/var/lib/libvirt/qemu/channel d 755 107 36 - - - - - +/var/lib/libvirt/qemu/channel/target d 755 107 36 - - - - - +/var/lib/libvirt/qemu/dump d 755 107 36 - - - - - +/var/lib/libvirt/qemu/nvram d 755 107 36 - - - - - +/var/lib/libvirt/qemu/save d 755 107 36 - - - - - +/var/lib/libvirt/qemu/snapshot d 755 107 36 - - - - - +# These are lost if /var/cache and/or /var/log are mounted on a tmpfs but they are harmless, anyway +/var/cache/libvirt d 711 0 0 - - - - - +/var/cache/libvirt/lxc d 750 0 0 - - - - - +/var/cache/libvirt/qemu d 750 107 36 - - - - - +/var/cache/libvirt/qemu/capabilities d 755 0 0 - - - - - +/var/log/libvirt d 700 0 0 - - - - - +/var/log/libvirt/lxc d 750 0 0 - - - - - +/var/log/libvirt/qemu d 750 107 36 - - - - - diff --git a/package/libvirt/libvirt.hash b/package/libvirt/libvirt.hash new file mode 100644 index 0000000000..389a3c1670 --- /dev/null +++ b/package/libvirt/libvirt.hash @@ -0,0 +1,2 @@ +# locally computed +sha256 4e7bcb209eeef99f026484293abc733e30ed06dabcdde62c4c3e95f71b2b67ba libvirt-3.7.0.tar.xz diff --git a/package/libvirt/libvirt.mk b/package/libvirt/libvirt.mk new file mode 100644 index 0000000000..8d26869a06 --- /dev/null +++ b/package/libvirt/libvirt.mk @@ -0,0 +1,233 @@ +################################################################################ +# +# libvirt +# +################################################################################ + +LIBVIRT_VERSION = 3.7.0 +LIBVIRT_SITE = http://libvirt.org/sources +LIBVIRT_SOURCE = libvirt-$(LIBVIRT_VERSION).tar.xz +LIBVIRT_LICENSE = LGPL-2.1+ +LIBVIRT_LICENSE_FILES = COPYING +LIBVIRT_DEPENDENCIES = libnl libxml2 lvm2 yajl + +ifeq ($(BR2_PACKAGE_LIBTIRPC),y) +LIBVIRT_DEPENDENCIES += libtirpc +LIBVIRT_CONF_ENV += \ + CFLAGS="$(TARGET_CFLAGS) `$(PKG_CONFIG_HOST_BINARY) --cflags libtirpc`" \ + LIBS="`$(PKG_CONFIG_HOST_BINARY) --libs libtirpc`" +endif + +LIBVIRT_CONF_OPTS = \ + --disable-debug \ + --with-init-script=$(if $(BR2_INIT_SYSTEMD),systemd,none) \ + --with-macvtap \ + --with-qemu-user=qemu \ + --with-qemu-group=kvm \ + --with-remote \ + --with-uml \ + --with-virtualport \ + --without-apparmor \ + --without-bhyve \ + --without-dtrace \ + --without-esx \ + --without-firewalld \ + --without-glusterfs \ + --without-hal \ + --without-hyperv \ + --without-libxl \ + --without-numad \ + --without-openwsman \ + --without-phyp \ + --without-pm-utils \ + --without-sanlock \ + --without-sasl \ + --without-test-suite \ + --without-vmware \ + --without-vbox \ + --without-vz \ + --without-wireshark-dissector \ + --without-xen + +ifeq ($(BR2_PACKAGE_ATTR),y) +LIBVIRT_CONF_OPTS += --with-attr +LIBVIRT_DEPENDENCIES += attr +else +LIBVIRT_CONF_OPTS += --without-attr +endif + +ifeq ($(BR2_PACKAGE_AUDIT),y) +LIBVIRT_CONF_OPTS += --with-audit +LIBVIRT_DEPENDENCIES += audit +else +LIBVIRT_CONF_OPTS += --without-audit +endif + +ifeq ($(BR2_PACKAGE_AVAHI),y) +LIBVIRT_CONF_OPTS += --with-avahi +LIBVIRT_DEPENDENCIES += avahi +else +LIBVIRT_CONF_OPTS += --without-avahi +endif + +ifeq ($(BR2_PACKAGE_UTIL_LINUX_LIBBLKID),y) +LIBVIRT_CONF_OPTS += --with-blkid +LIBVIRT_DEPENDENCIES += util-linux +else +LIBVIRT_CONF_OPTS += --without-blkid +endif + +ifeq ($(BR2_PACKAGE_LIBCAP_NG),y) +LIBVIRT_CONF_OPTS += --with-capng +LIBVIRT_DEPENDENCIES += libcap-ng +else +LIBVIRT_CONF_OPTS += --without-capng +endif + +ifeq ($(BR2_PACKAGE_LIBCURL),y) +LIBVIRT_CONF_OPTS += --with-curl +LIBVIRT_DEPENDENCIES += libcurl +else +LIBVIRT_CONF_OPTS += --without-curl +endif + +ifeq ($(BR2_PACKAGE_DBUS),y) +LIBVIRT_CONF_OPTS += --with-dbus +LIBVIRT_DEPENDENCIES += dbus +else +LIBVIRT_CONF_OPTS += --without-dbus +endif + +ifeq ($(BR2_PACKAGE_LIBFUSE),y) +LIBVIRT_CONF_OPTS += --with-fuse +LIBVIRT_DEPENDENCIES += libfuse +else +LIBVIRT_CONF_OPTS += --without-fuse +endif + +# do not enable openssl and gnutls at the same time. +ifeq ($(BR2_PACKAGE_OPENSSL),y) +LIBVIRT_CONF_OPTS += --with-openssl --without-gnutls +LIBVIRT_DEPENDENCIES += openssl +else ifeq ($(BR2_PACKAGE_GNUTLS),y) +LIBVIRT_CONF_OPTS += --with-gnutls --without-openssl +LIBVIRT_DEPENDENCIES += gnutls +else +LIBVIRT_CONF_OPTS += --without-openssl --without-gnutls +endif + +# configure needs some help to find pcap-config at $(STAGING_DIR)/usr/bin +ifeq ($(BR2_PACKAGE_LIBPCAP),y) +LIBVIRT_CONF_OPTS += --with-libpcap=$(STAGING_DIR)/usr +LIBVIRT_DEPENDENCIES += libpcap +else +LIBVIRT_CONF_OPTS += --without-libpcap +endif + +ifeq ($(BR2_PACKAGE_LIBSSH),y) +LIBVIRT_CONF_OPTS += --with-libssh +LIBVIRT_DEPENDENCIES += libssh +else +LIBVIRT_CONF_OPTS += --without-libssh +endif + +ifeq ($(BR2_PACKAGE_LXC),y) +LIBVIRT_CONF_OPTS += --with-lxc +LIBVIRT_DEPENDENCIES += lxc +else +LIBVIRT_CONF_OPTS += --without-lxc +endif + +ifeq ($(BR2_PACKAGE_LIBNSS),y) +LIBVIRT_CONF_OPTS += --with-nss-plugin +LIBVIRT_DEPENDENCIES += libnss +else +LIBVIRT_CONF_OPTS += --without-nss-plugin +endif + +ifeq ($(BR2_PACKAGE_NUMACTL),y) +LIBVIRT_CONF_OPTS += --with-numactl +LIBVIRT_DEPENDENCIES += numactl +else +LIBVIRT_CONF_OPTS += --without-numactl +endif + +ifeq ($(BR2_PACKAGE_LIBPCIACCESS),y) +LIBVIRT_CONF_OPTS += --with-pciaccess +LIBVIRT_DEPENDENCIES += libpciaccess +else +LIBVIRT_CONF_OPTS += --without-pciaccess +endif + +ifeq ($(BR2_PACKAGE_POLKIT),y) +LIBVIRT_CONF_OPTS += --with-polkit +LIBVIRT_DEPENDENCIES += polkit +else +LIBVIRT_CONF_OPTS += --without-polkit +endif + +ifeq ($(BR2_PACKAGE_READLINE),y) +LIBVIRT_CONF_OPTS += --with-readline +LIBVIRT_DEPENDENCIES += readline +else +LIBVIRT_CONF_OPTS += --without-readline +endif + +ifeq ($(BR2_PACKAGE_LIBSELINUX),y) +LIBVIRT_CONF_OPTS += --with-selinux +LIBVIRT_DEPENDENCIES += libselinux +else +LIBVIRT_CONF_OPTS += --without-selinux --with-selinux-mount=/sys/fs/selinux +endif + +ifeq ($(BR2_PACKAGE_LIBSSH2),y) +LIBVIRT_CONF_OPTS += --with-ssh2 +LIBVIRT_DEPENDENCIES += libssh2 +else +LIBVIRT_CONF_OPTS += --without-ssh2 +endif + +# the interface driver requires either udev or netcf +ifeq ($(BR2_PACKAGE_HAS_UDEV),y) +LIBVIRT_CONF_OPTS += --with-udev --without-netcf --with-interface +LIBVIRT_DEPENDENCIES += udev +define LIBVIRT_INSTALL_UDEV_RULES + $(INSTALL) -d -m 755 $(TARGET_DIR)/etc/udev/rules.d + echo 'KERNEL=="kvm", OWNER="root", GROUP="kvm", MODE="0660"' > \ + $(TARGET_DIR)/etc/udev/rules.d/90-kvm.rules +endef +LIBVIRT_POST_INSTALL_TARGET_HOOKS += LIBVIRT_INSTALL_UDEV_RULES +LIBVIRT_INIT_DEV_KVM_PERMS = +else +# No udev, so we need an init script to set the permissions of /dev/kvm. +LIBVIRT_INIT_DEV_KVM_PERMS = package/libvirt/S30devkvmperms +ifeq ($(BR2_PACKAGE_NETCF),y) +LIBVIRT_CONF_OPTS += --with-netcf --without-udev --with-interface +LIBVIRT_DEPENDENCIES += netcf +else +LIBVIRT_CONF_OPTS += --without-udev --without-netcf --without-interface +endif +endif + +ifeq ($(BR2_PACKAGE_LIBVIRT),y) +BR2_ROOTFS_DEVICE_TABLE += package/libvirt/device_table.txt +endif + +define LIBVIRT_USERS + qemu 107 kvm 36 * - - - Libvirt qemu/kvm daemon +endef + +define LIBVIRT_SET_USER_GROUP + sed -i -e 's/^#user = "root"/user = "qemu"/;s/^#group = "root"/group = "kvm"/' \ + $(TARGET_DIR)/etc/libvirt/qemu.conf +endef + +LIBVIRT_POST_INSTALL_TARGET_HOOKS += LIBVIRT_SET_USER_GROUP + +# S90, to start after S40network, S50radvd and S80dnsmasq +define LIBVIRT_INSTALL_INIT_SYSV + $(INSTALL) -D -m 755 -t $(TARGET_DIR)/etc/init.d \ + $(LIBVIRT_INIT_DEV_KVM_PERMS) package/libvirt/S90libvirt +endef + +$(eval $(autotools-package))