summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu-system.am2
-rw-r--r--gnu/packages/network-manager.scm224
-rw-r--r--gnu/packages/patches/network-manager-platform-managed.patch15
3 files changed, 241 insertions, 0 deletions
diff --git a/gnu-system.am b/gnu-system.am
index 9f46f7b7e4..e3fa7147b9 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -223,6 +223,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/ncurses.scm			\
   gnu/packages/netpbm.scm			\
   gnu/packages/nettle.scm			\
+  gnu/packages/network-manager.scm		\
   gnu/packages/networking.scm			\
   gnu/packages/ninja.scm			\
   gnu/packages/node.scm				\
@@ -564,6 +565,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/mutt-CVE-2014-9116.patch			\
   gnu/packages/patches/mutt-store-references.patch		\
   gnu/packages/patches/net-tools-bitrot.patch			\
+  gnu/packages/patches/network-manager-platform-managed.patch	\
   gnu/packages/patches/ngircd-handle-zombies.patch		\
   gnu/packages/patches/ngircd-no-dns-in-tests.patch		\
   gnu/packages/patches/ninja-tests.patch			\
diff --git a/gnu/packages/network-manager.scm b/gnu/packages/network-manager.scm
new file mode 100644
index 0000000000..c8721fb2b2
--- /dev/null
+++ b/gnu/packages/network-manager.scm
@@ -0,0 +1,224 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages network-manager)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix utils)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages dns)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnupg)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages networking)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages polkit)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages slang)
+  #:use-module (gnu packages tls))
+
+(define-public network-manager
+  (package
+    (name "network-manager")
+    (version "1.0.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnome/sources/NetworkManager/"
+                                  (version-major+minor version)
+                                  "/NetworkManager-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1j8qw3759gzckbvhnl7shm888q09q8zd1zfr19fxkf7lyji9y2g4"))
+              ;; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+              (patches
+               (list (search-patch "network-manager-platform-managed.patch")))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("intltool" ,intltool)
+       ("glib:bin" ,glib "bin") ; for gdbus-codegen, etc.
+       ("gobject-introspection" ,gobject-introspection)
+       ("python" ,python-wrapper)
+       ("python-pygobject" ,python-pygobject)  ; for tests
+       ("python-dbus" ,python-dbus)            ; for tests
+       ("perl" ,perl)
+       ("pkg-config" ,pkg-config)))
+    (propagated-inputs
+     `(("dbus-glib" ,dbus-glib)
+       ("gnutls" ,gnutls)
+       ("libgcrypt" ,libgcrypt)))
+    (inputs
+     `(("wireless-tools" ,wireless-tools)
+       ;; XXX Investigate:
+       ;;   checking for LIBNL... yes
+       ;;   checking for rtnl_link_inet6_get_addr_gen_mode in -lnl-route-3... no
+       ;;   checking Linux kernel IN6_ADDR_GEN_MODE enum... no
+       ;;   checking for rtnl_link_inet6_get_token in -lnl-route-3... no
+       ("libnl" ,libnl)
+       ("ppp" ,ppp)
+       ("libndp" ,libndp)
+       ("newt" ,newt)
+       ;; TODO: libmm, libteam, resolvconf, pppoe, open-iscsi
+       ("bash-host" ,bash)
+       ("sed-host" ,sed)
+       ("coreutils-host" ,coreutils)
+       ("kmod" ,kmod)
+       ("tzdata" ,tzdata)
+       ("iproute" ,iproute)
+       ("inetutils" ,inetutils)
+       ("ethtool" ,ethtool)
+       ("dnsmasq" ,dnsmasq)
+       ("polkit" ,polkit)
+       ("libuuid" ,util-linux)
+       ("libgudev" ,libgudev)   ; XXX should we use eudev instead?
+       ("libsoup" ,libsoup)
+       ("iptables" ,iptables)
+       ("isc-dhcp" ,isc-dhcp)
+       ("bluez" ,bluez)
+       ("readline" ,readline)))
+    ;; XXX FIXME Investigate:
+    ;; [nm-session-monitor-ck.c:290] nm_session_monitor_init(): Error loading /var/run/ConsoleKit/database: Error statting file /var/run/ConsoleKit/database: No such file or directory
+    (arguments
+     `(#:configure-flags
+       (list "--with-distro=exherbo"
+             "--with-crypto=gnutls"
+             "--with-libsoup=yes"
+             "--sysconfdir=/etc"
+             "--localstatedir=/var"
+             "--with-kernel-firmware-dir=/run/current-system/kernel/lib/firmware"
+             (string-append "--with-dbus-sys-dir="
+                            (assoc-ref %outputs "out")
+                            "/etc/dbus-1/system.d")
+             (string-append "--with-udev-dir="
+                            (assoc-ref %outputs "out")
+                            "/lib/udev")
+             (string-append "--with-dhclient="
+                            (assoc-ref %build-inputs "isc-dhcp")
+                            "/sbin/dhclient")
+             (string-append "--with-iptables="
+                            (assoc-ref %build-inputs "iptables")
+                            "/bin/iptables")
+             (string-append "--with-dnsmasq="
+                            (assoc-ref %build-inputs "dnsmasq")
+                            "/sbin/dnsmasq")
+             #;
+             (string-append "--with-resolvconf="
+                            (assoc-ref %build-inputs "resolvconf")
+                            "/sbin/resolvconf")
+             (string-append "--with-pppd="
+                            (assoc-ref %build-inputs "ppp")
+                            "/bin/pppd"))
+       #:strip-binaries? #f   ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+       #:phases
+       (modify-phases %standard-phases
+         (add-after
+          'unpack 'patch-file-names
+          (lambda* (#:key inputs #:allow-other-keys)
+            (substitute* "data/85-nm-unmanaged.rules"
+              (("/bin/sh")
+               (string-append (assoc-ref inputs "bash-host") "/bin/sh"))
+              (("/bin/sed")
+               (string-append (assoc-ref inputs "sed-host") "/bin/sed"))
+              (("/bin/cat")
+               (string-append (assoc-ref inputs "coreutils-host") "/bin/cat"))
+              (("/usr/sbin/ethtool")
+               (string-append (assoc-ref inputs "ethtool") "/sbin/ethtool")))
+            (substitute* "src/NetworkManagerUtils.c"
+              (("/sbin/modprobe")
+               (string-append (assoc-ref inputs "kmod") "/bin/modprobe")))
+            (substitute* "src/dhcp-manager/systemd-dhcp/src/shared/util.c"
+              (("/bin/sh")
+               (string-append (assoc-ref inputs "bash-host") "/bin/sh")))
+            (substitute* "src/dhcp-manager/systemd-dhcp/src/shared/time-util.c"
+              (("/usr/share/zoneinfo")
+               (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo")))
+            (substitute* "src/devices/nm-device.c"
+              (("/usr/bin/ping") "/run/setuid-programs/ping"))
+            ;; XXX TODO:
+            ;;
+            ;; ./src/dns-manager/nm-dns-unbound.c:45:
+            ;;   return nm_spawn_process ("/usr/libexec/dnssec-trigger-script --async --update", NULL) == 0;
+            ;;
+            ;; ./src/NetworkManagerUtils.c:1062:
+            ;;   const char *const NM_PATHS_DEFAULT[] = {
+            ;;     PREFIX "/sbin/",
+            ;;     PREFIX "/bin/",
+            ;;     "/sbin/",
+            ;;     "/usr/sbin/",
+            ;;     "/usr/local/sbin/",
+            ;;     "/bin/",
+            ;;     "/usr/bin/",
+            ;;     "/usr/local/bin/",
+            ;;     NULL,
+            ;;   };
+            ;;
+            ;; The following substitution will be needed if we add open-iscsi
+            ;; support.
+            #;
+            (substitute* "src/settings/plugins/ibft/plugin.c"
+              (("/sbin/iscsiadm")
+               (string-append (assoc-ref inputs "open-iscsi")
+                              "/sbin/iscsiadm")))
+            #t))
+         (add-after
+          'unpack 'fix-tests
+          (lambda _
+            (substitute* (find-files "src/settings/plugins/ibft/tests"
+                                     "^iscsiadm-test-")
+              (("^cat") (which "cat")))
+            (substitute* "src/settings/plugins/ifupdown/tests/test-ifupdown.c"
+              (("/sbin/ifconfig") (which "ifconfig")))
+            (substitute* "src/platform/tests/test-link.c"
+              (("/sbin/ip") (which "ip")))
+            (substitute* "src/platform/tests/test-common.c"
+              (("/usr/sbin") (dirname (which "ip")))
+              ;; XXX FIXME Fix tests that use linux containers.  For now, we
+              ;; disable unsharing, which causes those tests to be skipped.
+              (("!unshare_user \\(\\)") "1"))
+            #t))
+         (replace
+          'install
+          (lambda* (#:key outputs (make-flags '()) #:allow-other-keys)
+            ;; Override sysconfdir and localstatedir during "make install", to
+            ;; avoid attempting to install in /etc and /var, and to instead
+            ;; install the skeletons in the output directory.
+            ;; XXX FIXME: consider setting these instead to /tmp/{etc,var}.
+            (let ((out (assoc-ref outputs "out")))
+             (zero? (apply system*
+                           "make" "install"
+                           (string-append "sysconfdir=" out "/etc")
+                           (string-append "localstatedir=" out "/var")
+                           make-flags))))))))
+    (home-page "https://wiki.gnome.org/Projects/NetworkManager")
+    (synopsis "Network management framework")
+    (description
+     "NetworkManager is a system network service that manages your network
+devices and connections, attempting to keep active network connectivity when
+available.  It manages ethernet, WiFi, mobile broadband (WWAN), and PPPoE
+devices, and provides VPN integration with a variety of different VPN
+services.")
+    ;; Most files are under gpl2+, but libnm-util/* and libnm-glib/* are under
+    ;; lgpl2.0+.
+    (license (list license:gpl2+ license:lgpl2.0+))))
diff --git a/gnu/packages/patches/network-manager-platform-managed.patch b/gnu/packages/patches/network-manager-platform-managed.patch
new file mode 100644
index 0000000000..c180c8a165
--- /dev/null
+++ b/gnu/packages/patches/network-manager-platform-managed.patch
@@ -0,0 +1,15 @@
+Check the boolean result of nm_platform_link_get_unmanaged, and if it fails,
+assume the device is unmanaged.
+
+--- NetworkManager-1.0.4/src/devices/nm-device.c	2015-07-14 12:31:56.000000000 -0400
++++ NetworkManager-1.0.4/src/devices/nm-device.c	2015-07-26 19:49:07.004024031 -0400
+@@ -1131,7 +1131,8 @@
+ 			 * Currently it can happen that NM deletes 127.0.0.1 address. */
+ 			nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_DEFAULT, TRUE);
+ 		} else if (priv->platform_link_initialized || (priv->is_nm_owned && nm_device_is_software (self))) {
+-			nm_platform_link_get_unmanaged (NM_PLATFORM_GET, priv->ifindex, &platform_unmanaged);
++			if (!nm_platform_link_get_unmanaged (NM_PLATFORM_GET, priv->ifindex, &platform_unmanaged))
++				platform_unmanaged = TRUE;
+ 			nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_DEFAULT, platform_unmanaged);
+ 		} else {
+ 			/* Hardware and externally-created software links stay unmanaged