guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/03: services: network-manager: Add support for VPN plug-ins.


From: Ludovic Courtès
Subject: 03/03: services: network-manager: Add support for VPN plug-ins.
Date: Thu, 21 Sep 2017 18:10:02 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 94d2a25091dc4bcaec319c46da96d588e3e63476
Author: Ludovic Courtès <address@hidden>
Date:   Fri Sep 22 00:00:41 2017 +0200

    services: network-manager: Add support for VPN plug-ins.
    
    * gnu/services.scm (directory-union): Export.
    * gnu/services/networking.scm 
(<network-manager-configuration>)[vpn-plugins]:
    New field.
    (vpn-plugin-directory, network-manager-environment): New procedure.
    (network-manager-shepherd-service): Pass #:environment-variables to
    'make-forkexec-constructor'.
    (network-manager-service-type): Add SESSION-ENVIRONMENT-SERVICE-TYPE
    extension.
    * doc/guix.texi (Networking Services): Document it.
---
 doc/guix.texi               |  5 +++++
 gnu/services.scm            |  3 ++-
 gnu/services/networking.scm | 54 ++++++++++++++++++++++++++++++---------------
 3 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 601cf51..0369a15 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -10125,6 +10125,11 @@ then update @code{resolv.conf} to point to the local 
nameserver.
 NetworkManager will not modify @code{resolv.conf}.
 @end table
 
address@hidden @code{vpn-plugins} (default: @code{'()})
+This is the list of available plugins for virtual private networks
+(VPNs).  An example of this is the @code{network-manager-openvpn}
+package, which allows NetworkManager to manage VPNs @i{via} OpenVPN.
+
 @end table
 @end deftp
 
diff --git a/gnu/services.scm b/gnu/services.scm
index 2ebd701..329b7b1 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -97,7 +97,8 @@
             %activation-service
             etc-service
 
-            file-union))                      ;XXX: for lack of a better place
+            file-union                        ;XXX: for lack of a better place
+            directory-union))
 
 ;;; Comment:
 ;;;
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index fbedaa5..42b96b4 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -25,6 +25,7 @@
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
   #:use-module (gnu services dbus)
+  #:use-module (gnu services base)
   #:use-module (gnu system shadow)
   #:use-module (gnu system pam)
   #:use-module (gnu packages admin)
@@ -909,7 +910,9 @@ and @command{wicd-curses} user interfaces."
   (network-manager network-manager-configuration-network-manager
                    (default network-manager))
   (dns network-manager-configuration-dns
-       (default "default")))
+       (default "default"))
+  (vpn-plugins network-manager-vpn-plugins        ;list of <package>
+               (default '())))
 
 (define %network-manager-activation
   ;; Activation gexp for NetworkManager.
@@ -917,25 +920,38 @@ and @command{wicd-curses} user interfaces."
       (use-modules (guix build utils))
       (mkdir-p "/etc/NetworkManager/system-connections")))
 
+(define (vpn-plugin-directory plugins)
+  "Return a directory containing PLUGINS, the NM VPN plugins."
+  (directory-union "network-manager-vpn-plugins" plugins))
+
+(define network-manager-environment
+  (match-lambda
+    (($ <network-manager-configuration> network-manager dns vpn-plugins)
+     ;; Define this variable in the global environment such that
+     ;; "nmcli connection import type openvpn file foo.ovpn" works.
+     `(("NM_VPN_PLUGIN_DIR"
+        . ,(file-append (vpn-plugin-directory vpn-plugins)
+                        "/lib/NetworkManager/VPN"))))))
+
 (define network-manager-shepherd-service
   (match-lambda
-    (($ <network-manager-configuration> network-manager dns)
-     (let
-         ((conf (plain-file "NetworkManager.conf"
-                            (string-append "
-[main]
-dns=" dns "
-"))))
-     (list (shepherd-service
-            (documentation "Run the NetworkManager.")
-            (provision '(networking))
-            (requirement '(user-processes dbus-system wpa-supplicant loopback))
-            (start #~(make-forkexec-constructor
-                      (list (string-append #$network-manager
-                                           "/sbin/NetworkManager")
-                            (string-append "--config=" #$conf)
-                            "--no-daemon")))
-            (stop #~(make-kill-destructor))))))))
+    (($ <network-manager-configuration> network-manager dns vpn-plugins)
+     (let ((conf (plain-file "NetworkManager.conf"
+                             (string-append "[main]\ndns=" dns "\n")))
+           (vpn  (vpn-plugin-directory vpn-plugins)))
+       (list (shepherd-service
+              (documentation "Run the NetworkManager.")
+              (provision '(networking))
+              (requirement '(user-processes dbus-system wpa-supplicant 
loopback))
+              (start #~(make-forkexec-constructor
+                        (list (string-append #$network-manager
+                                             "/sbin/NetworkManager")
+                              (string-append "--config=" #$conf)
+                              "--no-daemon")
+                        #:environment-variables
+                        (list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
+                                             "/lib/NetworkManager/VPN"))))
+              (stop #~(make-kill-destructor))))))))
 
 (define network-manager-service-type
   (let
@@ -953,6 +969,8 @@ dns=" dns "
             (service-extension polkit-service-type config->package)
             (service-extension activation-service-type
                                (const %network-manager-activation))
+            (service-extension session-environment-service-type
+                               network-manager-environment)
             ;; Add network-manager to the system profile.
             (service-extension profile-service-type config->package)))
      (default-value (network-manager-configuration))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]