summary refs log tree commit diff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/alpine/REQUIRED_PACKAGES3
-rwxr-xr-xcontrib/debian/REQUIRED_PACKAGES11
-rwxr-xr-xcontrib/fedora/REQUIRED_PACKAGES3
-rw-r--r--contrib/fedora/rpm/24-clat-auto.conf32
-rw-r--r--contrib/fedora/rpm/NetworkManager.spec67
-rwxr-xr-xcontrib/fedora/rpm/build.sh2
-rwxr-xr-xcontrib/fedora/rpm/build_clean.sh1
-rwxr-xr-xcontrib/fedora/rpm/configure-for-system.sh24
-rwxr-xr-xcontrib/scripts/nm-ci-run.sh12
-rwxr-xr-xcontrib/scripts/nm-copr-build.sh10
10 files changed, 125 insertions, 40 deletions
diff --git a/contrib/alpine/REQUIRED_PACKAGES b/contrib/alpine/REQUIRED_PACKAGES
index 3a3cc1ab..d263d87f 100755
--- a/contrib/alpine/REQUIRED_PACKAGES
+++ b/contrib/alpine/REQUIRED_PACKAGES
@@ -8,6 +8,7 @@ apk add \
     'alpine-sdk' \
     'autoconf' \
     'bash' \
+    'bpftool' \
     'clang' \
     'curl-dev' \
     'dbus' \
@@ -23,12 +24,12 @@ apk add \
     'iproute2' \
     'iptables' \
     'jansson-dev' \
+    'libbpf-dev' \
     'libgudev-dev' \
     'libndp-dev' \
     'libnvme-dev' \
     'libnl3-dev' \
     'libpsl-dev' \
-    'libsoup-dev' \
     'libteam-dev' \
     'linux-headers' \
     'meson' \
diff --git a/contrib/debian/REQUIRED_PACKAGES b/contrib/debian/REQUIRED_PACKAGES
index 68f62570..a4fb8985 100755
--- a/contrib/debian/REQUIRED_PACKAGES
+++ b/contrib/debian/REQUIRED_PACKAGES
@@ -43,6 +43,7 @@ install \
     iproute2 \
     iptables \
     libaudit-dev \
+    libbpf-dev \
     libcurl4-gnutls-dev \
     libdbus-1-dev \
     libgirepository1.0-dev \
@@ -80,6 +81,16 @@ install \
     \
     #end
 
+# bpftool is a virtual package on Ubuntu 22.04 and 24.04 (provided by
+# linux-tools-*), with no install candidate. Install it where a candidate
+# exists (Debian, Fedora, Ubuntu 25.04+) and skip it otherwise. It only
+# builds the CLAT skeleton, and CLAT needs libndp >= 1.9, which those images
+# lack (they ship 1.8), so their builds run with clat off and never use it.
+install_ignore_missing \
+    bpftool \
+    \
+    #end
+
 install_ignore_missing \
     python-setuptools \
     policykit-1 \
diff --git a/contrib/fedora/REQUIRED_PACKAGES b/contrib/fedora/REQUIRED_PACKAGES
index 6f70537d..48650202 100755
--- a/contrib/fedora/REQUIRED_PACKAGES
+++ b/contrib/fedora/REQUIRED_PACKAGES
@@ -49,6 +49,7 @@ install \
     ModemManager-glib-devel \
     audit-libs-devel \
     bluez-libs-devel \
+    bpftool \
     clang \
     dbus-devel \
     dbus-x11 \
@@ -64,6 +65,7 @@ install \
     iptables \
     jansson-devel \
     jq \
+    libbpf-devel \
     libcurl-devel \
     libndp-devel \
     libnvme-devel \
@@ -91,7 +93,6 @@ install \
 # some packages don't exist in certain distributions. Install them one-by-one, and ignore errors.
 install_ignore_missing \
     black \
-    dhclient \
     iproute-tc \
     libasan \
     libpsl-devel \
diff --git a/contrib/fedora/rpm/24-clat-auto.conf b/contrib/fedora/rpm/24-clat-auto.conf
new file mode 100644
index 00000000..668ec04e
--- /dev/null
+++ b/contrib/fedora/rpm/24-clat-auto.conf
@@ -0,0 +1,32 @@
+# CLAT implements the client part of 464XLAT (RFC 6877), an
+# architecture that provides IPv4 connectivity to hosts on IPv6-only
+# networks.
+#
+# The default value for the connection property 'ipv4.clat' is still
+# 'no'. Change it globally to 'auto' (1) so that CLAT gets enabled
+# automatically when the network advertises a PREF64 and there is no
+# native IPv4 configured (either because DHCPv4 option 108 was
+# received or because there is no DHCPv4 server).
+#
+# See: https://fedoraproject.org/wiki/Changes/IPv6-Mostly_Support_In_NetworkManager
+
+# Do not modify this file. You can hide/overwrite this file by
+# creating "/etc/NetworkManager/conf.d/24-clat-auto.conf". You can
+# also add configuration snippets with higher priority that override
+# this setting (see `man 5 NetworkManager.conf`). Most importantly,
+# this snippet only sets default values for the profile. You can
+# explicitly set the value for each profile, so that this default
+# value is not used.
+
+# For example, on a particular profile/network set
+#
+#   $ nmcli connection modify "$PROFILE" ipv4.clat no
+#
+# to disable CLAT. This prevents the default from this file to take
+# effect.
+
+[connection-24-clat-auto]
+ipv4.clat=1
+
+[.config]
+enable=nm-version-min:1.57
diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec
index 73ab88f3..c7521bff 100644
--- a/contrib/fedora/rpm/NetworkManager.spec
+++ b/contrib/fedora/rpm/NetworkManager.spec
@@ -42,11 +42,6 @@ Release: __RELEASE_VERSION__%{?dist}
 %global systemd_units_cloud_setup nm-cloud-setup.service nm-cloud-setup.timer
 
 ###############################################################################
-%if 0%{?fedora} > 40 || 0%{?rhel} >= 10
-%bcond_with dhclient
-%else
-%bcond_without dhclient
-%endif
 %bcond_without adsl
 %bcond_without bluetooth
 %bcond_without wwan
@@ -100,7 +95,13 @@ Release: __RELEASE_VERSION__%{?dist}
 %else
 %bcond_without iwd
 %endif
-
+%bcond_without polkit_noauth_group
+%ifarch %{ix86}
+# there is no bpftool in i686
+%bcond_with clat
+%else
+%bcond_without clat
+%endif
 ###############################################################################
 
 %global dbus_version 1.9.18
@@ -164,21 +165,21 @@ Source6: 22-wifi-mac-addr.conf
 Source7: 70-nm-connectivity.conf
 Source8: readme-ifcfg-rh.txt
 Source9: readme-ifcfg-rh-migrated.txt
+Source10: 24-clat-auto.conf
 
 #Patch1: 0001-some.patch
 
 Requires(post): systemd
-Requires(post): systemd-udev
-Requires(post): /usr/sbin/update-alternatives
 Requires(preun): systemd
-Requires(preun): /usr/sbin/update-alternatives
 Requires(postun): systemd
 
 Requires: dbus >= %{dbus_version}
 Requires: glib2 >= %{glib2_version}
 Requires: %{name}-libnm%{?_isa} = %{epoch}:%{version}-%{release}
 
-Recommends: iputils
+%if %{with clat}
+Requires: libbpf
+%endif
 
 %if 0%{?rhel} == 8
 # Older libndp versions use select() (rh#1933041). On well known distros,
@@ -227,6 +228,7 @@ Conflicts: NetworkManager-dispatcher-routing-rules <= 1:1.47.5-3
 %endif
 
 BuildRequires: gcc
+BuildRequires: clang
 BuildRequires: pkgconfig
 BuildRequires: meson
 BuildRequires: gettext-devel >= 0.19.8
@@ -281,6 +283,10 @@ BuildRequires: firewalld-filesystem
 BuildRequires: iproute
 BuildRequires: iproute-tc
 BuildRequires: libnvme-devel >= 1.5
+%if %{with clat}
+BuildRequires: libbpf-devel
+BuildRequires: bpftool
+%endif
 
 Provides: %{name}-dispatcher%{?_isa} = %{epoch}:%{version}-%{release}
 
@@ -549,6 +555,8 @@ Group: System Environment/Base
 BuildArch: noarch
 Requires: NetworkManager
 Requires: /usr/bin/nmcli
+Requires(post): /usr/sbin/update-alternatives
+Requires(preun): /usr/sbin/update-alternatives
 Obsoletes: NetworkManager < %{obsoletes_initscripts_updown}
 
 %description initscripts-updown
@@ -572,11 +580,6 @@ Preferably use nmcli instead.
 	-Dnft=%{_sbindir}/nft \
 	-Diptables=%{_sbindir}/iptables \
 	-Dip6tables=%{_sbindir}/ip6tables \
-%if %{with dhclient}
-	-Ddhclient=%{_sbindir}/dhclient \
-%else
-	-Ddhclient=no \
-%endif
 	-Ddhcpcd=no \
 	-Dcrypto=gnutls \
 %if %{with debug}
@@ -600,19 +603,20 @@ Preferably use nmcli instead.
 %endif
 %if %{with wifi}
 	-Dwifi=true \
-%if 0%{?fedora}
-	-Dwext=true \
-%else
-	-Dwext=false \
-%endif
 %else
 	-Dwifi=false \
 %endif
+	-Dwext=false \
 %if %{with iwd}
 	-Diwd=true \
 %else
 	-Diwd=false \
 %endif
+%if %{with clat}
+	-Dclat=true \
+%else
+	-Dclat=false \
+%endif
 %if %{with bluetooth}
 	-Dbluez5_dun=true \
 %else
@@ -649,7 +653,9 @@ Preferably use nmcli instead.
 	-Dselinux=true \
 	-Dpolkit=true  \
 	-Dconfig_auth_polkit_default=true \
-	-Dmodify_system=true \
+%if %{with polkit_noauth_group}
+	-Dpolkit_noauth_group=wheel \
+%endif
 	-Dconcheck=true \
 %if 0%{?fedora}
 	-Dlibpsl=true \
@@ -659,6 +665,7 @@ Preferably use nmcli instead.
 	-Dsession_tracking=systemd \
 	-Dsuspend_resume=systemd \
 	-Dsystemdsystemunitdir=%{_unitdir} \
+	-Dsystemdsystemgeneratordir=%{_systemdgeneratordir} \
 	-Dsystem_ca_path=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem \
 	-Ddbus_conf_dir=%{dbus_sys_dir} \
 	-Dtests=yes \
@@ -710,6 +717,9 @@ cp %{SOURCE7} %{buildroot}%{_sysctldir}
 %if 0%{?fedora} >= 40
 cp %{SOURCE6} %{buildroot}%{nmlibdir}/conf.d/
 %endif
+%if 0%{?fedora} >= 45
+cp %{SOURCE10} %{buildroot}%{nmlibdir}/conf.d/
+%endif
 
 %if %{with ifcfg_warning}
 cp %{SOURCE8} %{buildroot}%{_sysconfdir}/sysconfig/network-scripts
@@ -731,6 +741,7 @@ rm -f %{buildroot}%{_libdir}/pppd/%{ppp_version}/*.la
 rm -f %{buildroot}%{nmplugindir}/*.la
 
 # Don't use the *-initrd.service files yet, wait dracut to support them
+rm -f %{buildroot}%{_systemdgeneratordir}/nm-initrd-generator.sh
 rm -f %{buildroot}%{_unitdir}/NetworkManager-config-initrd.service
 rm -f %{buildroot}%{_unitdir}/NetworkManager-initrd.service
 rm -f %{buildroot}%{_unitdir}/NetworkManager-wait-online-initrd.service
@@ -822,8 +833,12 @@ fi
 
 
 %postun
-/usr/bin/udevadm control --reload-rules || :
-/usr/bin/udevadm trigger --subsystem-match=net || :
+# skip triggering if udevd isn't even accessible, e.g. containers or
+# rpm-ostree-based systems
+if [ -S /run/udev/control ]; then
+    /usr/bin/udevadm control --reload-rules || :
+    /usr/bin/udevadm trigger --subsystem-match=net || :
+fi
 %firewalld_reload
 
 %systemd_postun %{systemd_units}
@@ -858,6 +873,9 @@ fi
 %if 0%{?fedora} >= 40
 %{nmlibdir}/conf.d/22-wifi-mac-addr.conf
 %endif
+%if 0%{?fedora} >= 45
+%{nmlibdir}/conf.d/24-clat-auto.conf
+%endif
 %ghost %{_sysconfdir}/%{name}/VPN
 %{_bindir}/nm-online
 %{_libexecdir}/nm-dhcp-helper
@@ -896,6 +914,9 @@ fi
 %{_datadir}/dbus-1/system-services/org.freedesktop.nm_dispatcher.service
 %{_datadir}/dbus-1/system-services/org.freedesktop.nm_priv_helper.service
 %{_datadir}/polkit-1/actions/*.policy
+%if %{with polkit_noauth_group}
+%{_datadir}/polkit-1/rules.d/org.freedesktop.NetworkManager.rules
+%endif
 %{_prefix}/lib/udev/rules.d/*.rules
 %{_prefix}/lib/firewalld/zones/nm-shared.xml
 # systemd stuff
diff --git a/contrib/fedora/rpm/build.sh b/contrib/fedora/rpm/build.sh
index 10180587..9f988b65 100755
--- a/contrib/fedora/rpm/build.sh
+++ b/contrib/fedora/rpm/build.sh
@@ -143,6 +143,7 @@ SOURCE_CONFIG_WIFI_MAC_ADDR="$(abs_path "$SOURCE_CONFIG_WIFI_MAC_ADDR" "$SCRIPTD
 SOURCE_SYSCTL_RP_FILTER_REDHAT="$(abs_path "$SOURCE_SYSCTL_RP_FILTER_REDHAT" "$SCRIPTDIR/70-nm-connectivity.conf")" || die "invalid \$SOURCE_SYSCTL_RP_FILTER_REDHAT argument"
 SOURCE_README_IFCFG_FILES="$(abs_path "$SOURCE_README_IFCFG_FILES" "$SCRIPTDIR/readme-ifcfg-rh.txt")" || die "invalid \$SOURCE_README_IFCFG_FILES argument"
 SOURCE_README_IFCFG_MIGRATED="$(abs_path "$SOURCE_README_IFCFG_MIGRATED" "$SCRIPTDIR/readme-ifcfg-rh-migrated.txt")" || die "invalid \$SOURCE_README_IFCFG_MIGRATED argument"
+SOURCE_CONFIG_CLAT_AUTO="$(abs_path "$SOURCE_CONFIG_CLAT_AUTO" "$SCRIPTDIR/24-clat-auto.conf")" || die "invalid \$SOURCE_CONFIG_CLAT_AUTO argument"
 
 TEMP="$(mktemp -d "$SCRIPTDIR/NetworkManager.$DATE.XXXXXX")"
 TEMPBASE="$(basename "$TEMP")"
@@ -202,6 +203,7 @@ cp "$SOURCE_CONFIG_WIFI_MAC_ADDR" "$TEMP/SOURCES/22-wifi-mac-addr.conf" || die "
 cp "$SOURCE_SYSCTL_RP_FILTER_REDHAT" "$TEMP/SOURCES/70-nm-connectivity.conf" || die "Could not copy source $SOURCE_SYSCTL_RP_FILTER_REDHAT to $TEMP/SOURCES"
 cp "$SOURCE_README_IFCFG_FILES" "$TEMP/SOURCES/readme-ifcfg-rh.txt" || die "Could not copy source $SOURCE_README_IFCFG_FILES to $TEMP/SOURCES"
 cp "$SOURCE_README_IFCFG_MIGRATED" "$TEMP/SOURCES/readme-ifcfg-rh-migrated.txt" || die "Could not copy source $SOURCE_README_IFCFG_MIGRATED to $TEMP/SOURCES"
+cp "$SOURCE_CONFIG_CLAT_AUTO" "$TEMP/SOURCES/24-clat-auto.conf" || die "Could not copy source $SOURCE_CONFIG_CLAT_AUTO to $TEMP/SOURCES"
 
 write_changelog
 
diff --git a/contrib/fedora/rpm/build_clean.sh b/contrib/fedora/rpm/build_clean.sh
index 68599bda..4accc0d3 100755
--- a/contrib/fedora/rpm/build_clean.sh
+++ b/contrib/fedora/rpm/build_clean.sh
@@ -218,7 +218,6 @@ if [[ $NO_DIST != 1 ]]; then
         -Dlibaudit=yes-disabled-by-default \
         -Dpolkit=true \
         -Dnm_cloud_setup=true \
-        -Ddhclient=/usr/sbin/dhclient \
         -Dconfig_dhcp_default=internal \
         -Dconfig_dns_rc_manager_default=auto \
         -Diptables=/usr/sbin/iptables \
diff --git a/contrib/fedora/rpm/configure-for-system.sh b/contrib/fedora/rpm/configure-for-system.sh
index 6bdf6682..066d7fc9 100755
--- a/contrib/fedora/rpm/configure-for-system.sh
+++ b/contrib/fedora/rpm/configure-for-system.sh
@@ -173,6 +173,7 @@ P_WIFI="${WIFI-1}"
 P_WWAN="${WWAN-1}"
 P_TEAM="${TEAM-1}"
 P_BLUETOOTH="${BLUETOOTH-1}"
+P_IFCFG_RH="${IFCFG_RH-0}"
 P_NMTUI="${NMTUI-1}"
 P_NM_CLOUD_SETUP="${NM_CLOUD_SETUP-1}"
 P_OVS="${OVS-1}"
@@ -202,7 +203,7 @@ if [ -z "$P_FEDORA" -a -z "$P_RHEL" ] ; then
         P_FEDORA="$x"
         P_RHEL=0
     else
-        x="$(grep -q "ID=fedora" /etc/os-release && sed -n 's/VERSION_ID=//p' /etc/os-release)"
+        x="$(grep -q 'ID="rhel"' /etc/os-release && sed -n 's/^VERSION_ID="*\([0-9]*\).*/\1/p' /etc/os-release)"
         if test "$x" -gt 0 ; then
             P_FEDORA=0
             P_RHEL="$x"
@@ -262,11 +263,7 @@ if [ -z "$P_LOGGING_BACKEND_DEFAULT" ] ; then
 fi
 
 if [ -z "$P_DHCP_DEFAULT" ] ; then
-    if [ "$P_FEDORA" -ge 31 -o "$P_RHEL" -ge 8 ] ; then
-        P_DHCP_DEFAULT=internal
-    else
-        P_DHCP_DEFAULT=dhclient
-    fi
+    P_DHCP_DEFAULT=internal
 fi
 
 if [ -z "$P_FIREWALLD_ZONE" ] ; then
@@ -293,6 +290,14 @@ if [ -z "$P_MODEM_MANAGER_1" ] ; then
     fi
 fi
 
+if [ -z "$TEAM" ] && [ "${P_RHEL-0}" -ge 10 ] ; then
+    P_TEAM=0
+fi
+
+if [ -z "$IFCFG_RH" ] && [ -n "$P_RHEL" ] && [ "$P_RHEL" -le 9 ] ; then
+    P_IFCFG_RH=1
+fi
+
 if bool "$P_DEBUG" ; then
     P_CFLAGS="-g -Og -fexceptions${P_CFLAGS:+ }$P_CFLAGS"
 else
@@ -368,7 +373,6 @@ meson setup\
     -Dnft="${D_SBINDIR}/nft" \
     -Diptables="${D_SBINDIR}/iptables" \
     -Dip6tables="${D_SBINDIR}/ip6tables" \
-    -Ddhclient="${D_SBINDIR}/dhclient" \
     -Ddhcpcd=no \
     -Dconfig_dhcp_default="$P_DHCP_DEFAULT" \
     "-Dcrypto=$P_CRYPTO" \
@@ -378,7 +382,7 @@ meson setup\
     -Db_lto="$(bool_true "$P_LTO")" \
     -Dlibaudit=yes-disabled-by-default \
     -Dmodem_manager="$(bool_true "$P_MODEM_MANAGER_1")" \
-    $(args_enable "$P_WIFI"                    -Dwifi=true  -Dwext="$(bool_true "$P_FEDORA")") \
+    $(args_enable "$P_WIFI"                    -Dwifi=true  -Dwext=false) \
     $(args_enable "$(bool_not_true "$P_WIFI")" -Dwifi=false                                  ) \
     -Diwd="$(bool_true "$P_IWD")" \
     -Dbluez5_dun="$(bool_true "$P_BLUETOOTH")" \
@@ -392,17 +396,17 @@ meson setup\
     -Dselinux=true \
     -Dpolkit=true  \
     -Dconfig_auth_polkit_default=true \
-    -Dmodify_system=true \
     -Dconcheck=true \
     -Dlibpsl="$(bool_true "$P_FEDORA")" \
     -Dsession_tracking=systemd \
     -Dsuspend_resume=systemd \
     -Dsystemdsystemunitdir=/usr/lib/systemd/system \
+    -Dsystemdsystemgeneratordir=/usr/lib/systemd/system-generators \
     -Dsystem_ca_path=/etc/pki/tls/cert.pem \
     -Ddbus_conf_dir="$P_DBUS_SYS_DIR" \
     -Dtests=yes \
     -Dvalgrind=no \
-    -Difcfg_rh=true \
+    -Difcfg_rh="$(bool_true "$P_IFCFG_RH")" \
     -Difupdown=false \
     $(args_enable "$P_PPP"                    -Dppp=true  -Dpppd="$D_SBINDIR/pppd" -Dpppd_plugin_dir="$D_LIBDIR/pppd/$P_PPP_VERSION") \
     $(args_enable "$(bool_not_true "$P_PPP")" -Dppp=false                                                                           ) \
diff --git a/contrib/scripts/nm-ci-run.sh b/contrib/scripts/nm-ci-run.sh
index 57b867c5..49b31f6d 100755
--- a/contrib/scripts/nm-ci-run.sh
+++ b/contrib/scripts/nm-ci-run.sh
@@ -55,6 +55,7 @@ _WITH_LIBTEAM="true"
 _WITH_DOCS="true"
 _WITH_SYSTEMD_LOGIND="true"
 _WITH_NBFT="true"
+_WITH_CLAT="true"
 if [ $IS_ALPINE = 1 ]; then
     _WITH_SYSTEMD_LOGIND="false"
 fi
@@ -63,6 +64,14 @@ if ! pkgconf 'libnvme >= 1.5'; then
     _WITH_NBFT="false"
 fi
 
+if ! pkgconf 'libndp >= 1.9'; then
+    _WITH_CLAT="false"
+fi
+
+if ! pkgconf 'libbpf >= 1.3'; then
+    _WITH_CLAT="false"
+fi
+
 if [ -z "${NMTST_SEED_RAND+x}" ]; then
     NMTST_SEED_RAND="$SRANDOM"
     if [ -z "$NMTST_SEED_RAND" ]; then
@@ -169,6 +178,7 @@ meson setup build \
     -D ld_gc=false \
     -D session_tracking=no \
     -D systemdsystemunitdir=no \
+    -D systemdsystemgeneratordir=no \
     -D systemd_journal=false \
     -D selinux=false \
     -D libaudit=no \
@@ -184,7 +194,6 @@ meson setup build \
     -D ofono=true \
     -D teamdctl=$_WITH_LIBTEAM \
     \
-    -D dhclient=/bin/nowhere/dhclient \
     -D dhcpcd=/bin/nowhere/dhcpd \
     \
     -D netconfig=/bin/nowhere/netconfig \
@@ -194,6 +203,7 @@ meson setup build \
     -D ifupdown=true \
     \
     -D nbft=$_WITH_NBFT \
+    -D clat=$_WITH_CLAT \
     \
     #end
 
diff --git a/contrib/scripts/nm-copr-build.sh b/contrib/scripts/nm-copr-build.sh
index 93dcc083..0fdfdf6c 100755
--- a/contrib/scripts/nm-copr-build.sh
+++ b/contrib/scripts/nm-copr-build.sh
@@ -74,9 +74,13 @@ get_nm_git_bundle() {
     fi
     mkdir nm-git-bundle
     pushd nm-git-bundle
-    time curl "$NM_GIT_BUNDLE" \
-      | rpm2cpio - \
-      | cpio -idmv
+    if ! time curl --fail -o nm-git-bundle.rpm "$NM_GIT_BUNDLE"; then
+        # The bundle is only a fetch speed-up; fall back to the git fetch below.
+        echo "nm-git-bundle unavailable at $NM_GIT_BUNDLE, falling back to upstream git fetch" >&2
+        popd
+        return 0
+    fi
+    rpm2cpio nm-git-bundle.rpm | cpio -idmv
     popd
     git remote add nm-git-bundle "$PWD/nm-git-bundle/usr/share/NetworkManager/nm-git-bundle.git"
     git fetch nm-git-bundle