From b6dc69af1de806e8b3a70e9a1afe0e1590da5480 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 23 Aug 2017 18:39:16 +0200 Subject: services: mpd: Remove the mpd-file field. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since MPD switches user, the pid-file must be in a writable dir. This is now always /var/run/mpd/(user)/pid. * gnu/services/audio.scm (mpd-service-type): Add a activation-service extension. ()[pid-file]: Remove. (mpd-service): Rename to... (mpd-shepherd-service): ... this. (mpd-file-name, mpd-service-activation): New procedure. * doc/guix.texi (Audio Services): Document the changes. Signed-off-by: Ludovic Courtès --- gnu/services/audio.scm | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/audio.scm b/gnu/services/audio.scm index 22814a6c0..0a3e9f66b 100644 --- a/gnu/services/audio.scm +++ b/gnu/services/audio.scm @@ -45,9 +45,7 @@ (port mpd-configuration-port (default "6600")) (address mpd-configuration-address - (default "any")) - (pid-file mpd-configuration-pid-file - (default "/var/run/mpd.pid"))) + (default "any"))) (define (mpd-config->file config) (apply @@ -56,6 +54,7 @@ " type \"pulse\"\n" " name \"MPD\"\n" "}\n" + "pid_file \"" (mpd-file-name config "pid") "\"\n" (map (match-lambda ((config-name config-val) (string-append config-name " \"" (config-val config) "\"\n"))) @@ -63,10 +62,16 @@ ("music_directory" ,mpd-configuration-music-dir) ("playlist_directory" ,mpd-configuration-playlist-dir) ("port" ,mpd-configuration-port) - ("bind_to_address" ,mpd-configuration-address) - ("pid_file" ,mpd-configuration-pid-file))))) + ("bind_to_address" ,mpd-configuration-address))))) -(define (mpd-service config) +(define (mpd-file-name config file) + "Return a path in /var/run/mpd/ that is writable + by @code{user} from @code{config}." + (string-append "/var/run/mpd/" + (mpd-configuration-user config) + "/" file)) + +(define (mpd-shepherd-service config) (shepherd-service (documentation "Run the MPD (Music Player Daemon)") (provision '(mpd)) @@ -74,13 +79,27 @@ (list #$(file-append mpd "/bin/mpd") "--no-daemon" #$(mpd-config->file config)) - #:pid-file #$(mpd-configuration-pid-file config))) + #:pid-file #$(mpd-file-name config "pid") + #:log-file #$(mpd-file-name config "log"))) (stop #~(make-kill-destructor)))) +(define (mpd-service-activation config) + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + (define %user + (getpw #$(mpd-configuration-user config))) + + (let ((directory #$(mpd-file-name config ""))) + (mkdir-p directory) + (chown directory (passwd:uid %user) (passwd:gid %user)))))) + (define mpd-service-type (service-type (name 'mpd) (extensions (list (service-extension shepherd-root-service-type - (compose list mpd-service)))) + (compose list mpd-shepherd-service)) + (service-extension activation-service-type + mpd-service-activation))) (default-value (mpd-configuration)))) -- cgit v1.3 From 4110fbc6dd9e22f05ef738da7abbd72feaea93f9 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 2 Sep 2017 23:39:29 +0200 Subject: services: '%desktop-services' uses NetworkManager instead of Wicd. Discussed at . * gnu/services/desktop.scm (%desktop-services): Remove call to 'wicd-service'. Add instances of NETWORK-MANAGER-SERVICE-TYPE and WPA-SUPPLICANT-SERVICE-TYPE. * doc/guix.texi (Networking Services): Document 'network-manager-service-type' as being part of '%desktop-services'. (Desktop Services): Replace Wicd with NM. --- doc/guix.texi | 5 ++++- gnu/services/desktop.scm | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 781c5f04d..689173921 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10010,6 +10010,9 @@ This is the service type for the @uref{https://wiki.gnome.org/Projects/NetworkManager, NetworkManager} service. The value for this service type is a @code{network-manager-configuration} record. + +This service is part of @code{%desktop-services} (@pxref{Desktop +Services}). @end defvr @deftp {Data Type} network-manager-configuration @@ -11573,7 +11576,7 @@ adds or adjusts services for a typical ``desktop'' setup. In particular, it adds a graphical login manager (@pxref{X Window, @code{slim-service}}), screen lockers, a network management tool -(@pxref{Networking Services, @code{wicd-service}}), energy and color +(@pxref{Networking Services, @code{network-manager-service-type}}), energy and color management services, the @code{elogind} login and seat manager, the Polkit privilege service, the GeoClue location service, the AccountsService daemon that allows authorized users change system diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm index 0509bd8a4..4918a41dd 100644 --- a/gnu/services/desktop.scm +++ b/gnu/services/desktop.scm @@ -809,8 +809,9 @@ with the administrator's password." (simple-service 'mtp udev-service-type (list libmtp)) ;; The D-Bus clique. + (service network-manager-service-type) + (service wpa-supplicant-service-type) ;needed by NetworkManager (avahi-service) - (wicd-service) (udisks-service) (upower-service) (accountsservice-service) -- cgit v1.3 From b9f67d6dda12b97b5dce59de3dab230966083a5e Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Mon, 7 Aug 2017 00:07:53 -0400 Subject: services: Add auto-enable? parameter to the bluetooth-service. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/services/desktop.scm (bluetooth-configuration): New record. (bluetooth-shepherd-service): Use it. (bluetooth-directory): New method. (bluetooth-service-type): Use it to extend the etc-service-type service. (bluetooth-service): Add `auto-enable?' parameter. * doc/guix.texi (Desktop Services): Document it. Signed-off-by: Ludovic Courtès --- doc/guix.texi | 11 ++++++++--- gnu/services/desktop.scm | 50 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 51 insertions(+), 10 deletions(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 689173921..70a9e36f4 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -39,6 +39,7 @@ Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017 Christopher Allan Webber@* Copyright @copyright{} 2017 Marius Bakke@* Copyright @copyright{} 2017 Hartmut Goebel +Copyright @copyright{} 2017 Maxim Cournoyer@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -11818,9 +11819,13 @@ location databases. See web site} for more information. @end deffn -@deffn {Scheme Procedure} bluetooth-service [#:bluez @var{bluez}] -Return a service that runs the @command{bluetoothd} daemon, which manages -all the Bluetooth devices and provides a number of D-Bus interfaces. +@deffn {Scheme Procedure} bluetooth-service [#:bluez @var{bluez}] @ + [@w{#:auto-enable? #f}] +Return a service that runs the @command{bluetoothd} daemon, which +manages all the Bluetooth devices and provides a number of D-Bus +interfaces. When AUTO-ENABLE? is true, the bluetooth controller is +powered automatically at boot, which can be useful when using a +bluetooth keyboard or mouse. Users need to be in the @code{lp} group to access the D-Bus service. @end deffn diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm index 4918a41dd..98f1198f2 100644 --- a/gnu/services/desktop.scm +++ b/gnu/services/desktop.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2015 Andy Wingo ;;; Copyright © 2015 Mark H Weaver ;;; Copyright © 2016 Sou Bunnbu +;;; Copyright © 2017 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -384,32 +385,67 @@ site} for more information." ;;; Bluetooth. ;;; -(define (bluetooth-shepherd-service bluez) +(define-record-type* + bluetooth-configuration make-bluetooth-configuration + bluetooth-configuration? + (bluez bluetooth-configuration-bluez (default bluez)) + (auto-enable? bluetooth-configuration-auto-enable? (default #f))) + +(define (bluetooth-configuration-file config) + "Return a configuration file for the systemd bluetooth service, as a string." + (string-append + "[Policy]\n" + "AutoEnable=" (bool (bluetooth-configuration-auto-enable? + config)))) + +(define (bluetooth-directory config) + (computed-file "etc-bluetooth" + #~(begin + (mkdir #$output) + (chdir #$output) + (call-with-output-file "main.conf" + (lambda (port) + (display #$(bluetooth-configuration-file config) + port)))))) + +(define (bluetooth-shepherd-service config) "Return a shepherd service for @command{bluetoothd}." (shepherd-service (provision '(bluetooth)) (requirement '(dbus-system udev)) (documentation "Run the bluetoothd daemon.") (start #~(make-forkexec-constructor - (string-append #$bluez "/libexec/bluetooth/bluetoothd"))) + (string-append #$(bluetooth-configuration-bluez config) + "/libexec/bluetooth/bluetoothd"))) (stop #~(make-kill-destructor)))) (define bluetooth-service-type (service-type (name 'bluetooth) (extensions - (list (service-extension dbus-root-service-type list) - (service-extension udev-service-type list) + (list (service-extension dbus-root-service-type + (compose list bluetooth-configuration-bluez)) + (service-extension udev-service-type + (compose list bluetooth-configuration-bluez)) + (service-extension etc-service-type + (lambda (config) + `(("bluetooth" + ,(bluetooth-directory config))))) (service-extension shepherd-root-service-type (compose list bluetooth-shepherd-service)))))) -(define* (bluetooth-service #:key (bluez bluez)) +(define* (bluetooth-service #:key (bluez bluez) (auto-enable? #f)) "Return a service that runs the @command{bluetoothd} daemon, which manages -all the Bluetooth devices and provides a number of D-Bus interfaces. +all the Bluetooth devices and provides a number of D-Bus interfaces. When +AUTO-ENABLE? is true, the bluetooth controller is powered automatically at +boot. Users need to be in the @code{lp} group to access the D-Bus service. " - (service bluetooth-service-type bluez)) + (service bluetooth-service-type + (bluetooth-configuration + (bluez bluez) + (auto-enable? auto-enable?)))) ;;; -- cgit v1.3 From 352a5b639b2adfa343f5a786529bb112636757ea Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Tue, 5 Sep 2017 18:54:08 +0200 Subject: services: web: Fix nginx-service-type's ‘file’ procedure. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/services/web.scm (nginx-activation, nginx-shepherd-service): Replace references to non-existent ‘config-file’ with ‘file’. * doc/guix.texi (Web Services): Likewise. --- doc/guix.texi | 12 ++++++------ gnu/services/web.scm | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 0a18f71da..3e9593d0c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -39,7 +39,8 @@ Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017 Christopher Allan Webber@* Copyright @copyright{} 2017 Marius Bakke@* Copyright @copyright{} 2017 Hartmut Goebel@* -Copyright @copyright{} 2017 Maxim Cournoyer +Copyright @copyright{} 2017 Maxim Cournoyer@* +Copyright @copyright{} 2017 Tobias Geerinckx-Rice Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -14139,13 +14140,12 @@ requests with two servers. "server2.example.com"))))))) @end example -@item @code{config-file} (default: @code{#f}) -If the @var{config-file} is provided, this will be used, rather than +@item @code{file} (default: @code{#f}) +If a configuration @var{file} is provided, this will be used, rather than generating a configuration file from the provided @code{log-directory}, @code{run-directory}, @code{server-list} and @code{upstream-list}. For -proper operation, these arguments should match what is in -@var{config-file} to ensure that the directories are created when the -service is activated. +proper operation, these arguments should match what is in @var{file} to +ensure that the directories are created when the service is activated. This can be useful if you have an existing configuration file, or it's not possible to do what is required through the other parts of the diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 18278502e..4aa6fd501 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -262,7 +262,7 @@ of index files." (define nginx-activation (match-lambda (($ nginx log-directory run-directory server-blocks - upstream-blocks config-file) + upstream-blocks file) #~(begin (use-modules (guix build utils)) @@ -281,7 +281,7 @@ of index files." (mkdir-p (string-append #$run-directory "/logs")) ;; Check configuration file syntax. (system* (string-append #$nginx "/sbin/nginx") - "-c" #$(or config-file + "-c" #$(or file (default-nginx-config nginx log-directory run-directory server-blocks upstream-blocks)) "-t"))))) @@ -289,14 +289,14 @@ of index files." (define nginx-shepherd-service (match-lambda (($ nginx log-directory run-directory server-blocks - upstream-blocks config-file) + upstream-blocks file) (let* ((nginx-binary (file-append nginx "/sbin/nginx")) (nginx-action (lambda args #~(lambda _ (zero? (system* #$nginx-binary "-c" - #$(or config-file + #$(or file (default-nginx-config nginx log-directory run-directory server-blocks upstream-blocks)) #$@args)))))) -- cgit v1.3 From cf42428a4a3c182f9d99bebaba868ef47d88c3e2 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 7 Sep 2017 23:52:59 +0200 Subject: services: elogind: Add default value. * gnu/services/desktop.scm (elogind-service-type)[default-value]: New field. --- gnu/services/desktop.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gnu/services') diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm index 98f1198f2..527a3101c 100644 --- a/gnu/services/desktop.scm +++ b/gnu/services/desktop.scm @@ -732,7 +732,8 @@ seats.)" ;; We need /run/user, /run/systemd, etc. (service-extension file-system-service-type - (const %elogind-file-systems)))))) + (const %elogind-file-systems)))) + (default-value (elogind-configuration)))) (define* (elogind-service #:key (config (elogind-configuration))) "Return a service that runs the @command{elogind} login and seat management -- cgit v1.3 From 943e1b975fd0c44b2eaacec26df59e24ba9ef455 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 5 Sep 2017 21:47:08 +0200 Subject: services: base: Import the closure of (gnu build file-systems). * gnu/services/base.scm (file-system-shepherd-service): Use 'source-module-closure' in the 'with-imported-modules' form. --- gnu/services/base.scm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 5001298ab..23ef2d4bf 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -47,6 +47,7 @@ #:select (mount-flags->bit-mask)) #:use-module (guix gexp) #:use-module (guix records) + #:use-module (guix modules) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 match) @@ -286,8 +287,8 @@ FILE-SYSTEM." (dependencies (file-system-dependencies file-system)) (packages (file-system-packages (list file-system)))) (and (file-system-mount? file-system) - (with-imported-modules '((gnu build file-systems) - (guix build bournish)) + (with-imported-modules (source-module-closure + '((gnu build file-systems))) (shepherd-service (provision (list (file-system->shepherd-service-name file-system))) (requirement `(root-file-system -- cgit v1.3 From d1ff5f9db3e124af9f8aaa22d3758208f5080c50 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 6 Sep 2017 09:22:59 +0200 Subject: services: file-system: Use 'file-system->spec'. * gnu/services/base.scm (file-system-shepherd-service): Use 'file-system->spec' instead of in-line code. --- gnu/services/base.scm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 23ef2d4bf..b8feb725d 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -29,6 +29,7 @@ #:use-module (gnu services networking) #:use-module (gnu system pam) #:use-module (gnu system shadow) ; 'user-account', etc. + #:use-module (gnu system uuid) #:use-module (gnu system file-systems) ; 'file-system', etc. #:use-module (gnu system mapped-devices) #:use-module ((gnu system linux-initrd) @@ -277,12 +278,6 @@ FILE-SYSTEM." "Return the shepherd service for @var{file-system}, or @code{#f} if @var{file-system} is not auto-mounted upon boot." (let ((target (file-system-mount-point file-system)) - (device (file-system-device file-system)) - (type (file-system-type file-system)) - (title (file-system-title file-system)) - (flags (file-system-flags file-system)) - (options (file-system-options file-system)) - (check? (file-system-check? file-system)) (create? (file-system-create-mount-point? file-system)) (dependencies (file-system-dependencies file-system)) (packages (file-system-packages (list file-system)))) @@ -311,8 +306,7 @@ FILE-SYSTEM." '#$packages)))) (lambda () (mount-file-system - `(#$device #$title #$target #$type #$flags - #$options #$check?) + '#$(file-system->spec file-system) #:root "/")) (lambda () (setenv "PATH" $PATH))) -- cgit v1.3 From 1c05aab4732e2805d3fd21900ab53618915b7480 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Sep 2017 23:43:29 +0200 Subject: gnu: cuirrass: Default port to 8081. * gnu/services/cuirass.scm (): Default port to 8081. Fixes conflict with guix-publish default. * doc/guix.texi (Continuous Integration): Update. --- doc/guix.texi | 2 +- gnu/services/cuirass.scm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 97960e9e0..c9505f41d 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -15277,7 +15277,7 @@ Cuirass jobs. Location of sqlite database which contains the build results and previously added specifications. -@item @code{port} (default: @code{8080}) +@item @code{port} (default: @code{8081}) Port number used by the HTTP server. @item @code{specifications} (default: @code{#~'()}) diff --git a/gnu/services/cuirass.scm b/gnu/services/cuirass.scm index 73a30b240..2ad595220 100644 --- a/gnu/services/cuirass.scm +++ b/gnu/services/cuirass.scm @@ -60,7 +60,7 @@ (database cuirass-configuration-database ;string (file-name) (default "/var/run/cuirass/cuirass.db")) (port cuirass-configuration-port ;integer (port) - (default 8080)) + (default 8081)) (specifications cuirass-configuration-specifications) ;gexp that evaluates to specification-alist (use-substitutes? cuirass-configuration-use-substitutes? ;boolean -- cgit v1.3 From 6b9e1fefa40ecdd264fde9cb022b2b5359635ee5 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 13 Sep 2017 21:48:02 +0200 Subject: services: base: Add descriptions. * gnu/services/base.scm (fstab-service-type) (file-system-service-type, urandom-seed-service-type) (session-environment-service-type) (console-font-service-type) (login-service-type, agetty-service-type) (mingetty-service-type, nscd-service-type) (pam-limits-service-type, guix-service-type) (guix-publish-service-type, udev-service-type) (gpm-service-type): Add 'description' field. * po/packages/POTFILES.in: Add gnu/services/base.scm. --- gnu/services/base.scm | 85 +++++++++++++++++++++++++++++++++++++++++-------- po/packages/POTFILES.in | 1 + 2 files changed, 72 insertions(+), 14 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index b8feb725d..10c8f1b6a 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -210,7 +210,10 @@ (list (service-extension etc-service-type file-systems->fstab))) (compose concatenate) - (extend append))) + (extend append) + (description + "Populate the @file{/etc/fstab} based on the given file +system objects."))) (define %root-file-system-shepherd-service (shepherd-service @@ -349,7 +352,10 @@ FILE-SYSTEM." (service-extension fstab-service-type identity))) (compose concatenate) - (extend append))) + (extend append) + (description + "Provide Shepherd services to mount and unmount the given +file systems, as well as corresponding @file{/etc/fstab} entries."))) (define user-unmount-service-type (shepherd-service-type @@ -545,7 +551,11 @@ stopped before 'kill' is called." (service-type (name 'urandom-seed) (extensions (list (service-extension shepherd-root-service-type - urandom-seed-shepherd-service))))) + urandom-seed-shepherd-service))) + (description + "Seed the @file{/dev/urandom} pseudo-random number +generator (RNG) with the value recorded when the system was last shut +down."))) (define (urandom-seed-service) (service urandom-seed-service-type #f)) @@ -613,7 +623,15 @@ to add @var{device} to the kernel's entropy pool. The service will fail if (list `("environment" ,(environment-variables->environment-file vars))))))) (compose concatenate) - (extend append))) + (extend append) + (description + "Populate @file{/etc/environment} with the specified environment +variables. The value of this service is a list of name/value pairs for +environments variables, such as: + +@example +'((\"TZ\" . \"Canada/Pacific\")) +@end example\n"))) (define (session-environment-service vars) "Return a service that builds the @file{/etc/environment}, which can be read @@ -713,7 +731,15 @@ strings or string-valued gexps." (list (service-extension shepherd-root-service-type console-font-shepherd-services))) (compose concatenate) - (extend append))) + (extend append) + (description + "Install the given fonts on the specified ttys (fonts are per +virtual console on GNU/Linux). The value of this service is a list of +tty/font pairs like: + +@example +'((\"tty1\" . \"LatGrkCyr-8x16\")) +@end example\n"))) (define* (console-font-service tty #:optional (font "LatGrkCyr-8x16")) "This procedure is deprecated in favor of @code{console-font-service-type}. @@ -748,7 +774,10 @@ Return a service that sets up Unicode support in @var{tty} and loads (define login-service-type (service-type (name 'login) (extensions (list (service-extension pam-root-service-type - login-pam-service))))) + login-pam-service))) + (description + "Provide a console log-in service as specified by its +configuration value, a @code{login-configuration} object."))) (define* (login-service #:optional (config (login-configuration))) "Return a service configure login according to @var{config}, which specifies @@ -964,7 +993,10 @@ the message of the day, among other things." (define agetty-service-type (service-type (name 'agetty) (extensions (list (service-extension shepherd-root-service-type - agetty-shepherd-service))))) + agetty-shepherd-service))) + (description + "Provide console login using the @command{agetty} +program."))) (define* (agetty-service config) "Return a service to run agetty according to @var{config}, which specifies @@ -1015,7 +1047,10 @@ the tty to run, among other things." (define mingetty-service-type (service-type (name 'mingetty) (extensions (list (service-extension shepherd-root-service-type - mingetty-shepherd-service))))) + mingetty-shepherd-service))) + (description + "Provide console login using the @command{mingetty} +program."))) (define* (mingetty-service config) "Return a service to run mingetty according to @var{config}, which specifies @@ -1184,7 +1219,11 @@ the tty to run, among other things." (inherit config) (name-services (append (nscd-configuration-name-services config) - name-services))))))) + name-services))))) + (description + "Runs libc's @dfn{name service cache daemon} (nscd) with the +given configuration---an @code{} object. @xref{Name +Service Switch}, for an example."))) (define* (nscd-service #:optional (config %nscd-default-configuration)) "Return a service that runs libc's name service cache daemon (nscd) with the @@ -1280,7 +1319,11 @@ information on the configuration file syntax." (extensions (list (service-extension etc-service-type security-limits) (service-extension pam-root-service-type - (lambda _ (list pam-extension)))))))) + (lambda _ (list pam-extension))))) + (description + "Install the specified resource usage limits by populating +@file{/etc/security/limits.conf} and using the @code{pam_limits} +authentication module.")))) (define* (pam-limits-service #:optional (limits '())) "Return a service that makes selected programs respect the list of @@ -1456,7 +1499,9 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) (service-extension activation-service-type guix-activation) (service-extension profile-service-type (compose list guix-configuration-guix)))) - (default-value (guix-configuration)))) + (default-value (guix-configuration)) + (description + "Run the build daemon of GNU@tie{}Guix, aka. @command{guix-daemon}."))) (define* (guix-service #:optional (config %default-guix-configuration)) "Return a service that runs the Guix build daemon according to @@ -1554,7 +1599,10 @@ failed to register hydra.gnu.org public key: ~a~%" status)))))))) (const %guix-publish-accounts)) (service-extension activation-service-type guix-publish-activation))) - (default-value (guix-publish-configuration)))) + (default-value (guix-publish-configuration)) + (description + "Add a Shepherd service running @command{guix publish}, a +command that allows you to share pre-built binaries with others over HTTP."))) (define* (guix-publish-service #:key (guix guix) (port 80) (host "localhost")) "Return a service that runs @command{guix publish} listening on @var{host} @@ -1726,7 +1774,11 @@ item of @var{packages}." (($ udev initial-rules) (udev-configuration (udev udev) - (rules (append initial-rules rules))))))))) + (rules (append initial-rules rules))))))) + (description + "Run @command{udev}, which populates the @file{/dev} +directory dynamically. Get extra rules from the packages listed in the +@code{rules} field of its value, @code{udev-configuration} object."))) (define* (udev-service #:key (udev eudev) (rules '())) "Run @var{udev}, which populates the @file{/dev} directory dynamically. Get @@ -1797,7 +1849,12 @@ extra rules from the packages listed in @var{rules}." (service-type (name 'gpm) (extensions (list (service-extension shepherd-root-service-type - gpm-shepherd-service))))) + gpm-shepherd-service))) + (description + "Run GPM, the general-purpose mouse daemon, with the given +command-line options. GPM allows users to use the mouse in the console, +notably to select, copy, and paste text. The default options use the +@code{ps2} protocol, which works for both USB and PS/2 mice."))) (define* (gpm-service #:key (gpm gpm) (options '("-m" "/dev/input/mice" "-t" "ps2"))) diff --git a/po/packages/POTFILES.in b/po/packages/POTFILES.in index 32d34d645..d111a6ffc 100644 --- a/po/packages/POTFILES.in +++ b/po/packages/POTFILES.in @@ -57,3 +57,4 @@ gnu/packages/webkit.scm gnu/packages/web.scm gnu/packages/wordnet.scm gnu/packages/xiph.scm +gnu/services/base.scm -- cgit v1.3 From 3f0de257c4071fcbb167fd47dbe6ffa71e95631a Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 13 Sep 2017 22:55:04 +0200 Subject: services: networking: Add descriptions. * gnu/services/networking.scm (static-networking-service-type) (ntp-service-type, inetd-service-type, tor-service-type) (tor-hidden-service-type, bitlbee-service-type) (wicd-service-type, network-manager-service-type) (connman-service-type, openvswitch-service-type): Add 'description' field. * po/packages/POTFILES.in: Add gnu/services/networking.scm. --- gnu/services/networking.scm | 55 ++++++++++++++++++++++++++++++++++++--------- po/packages/POTFILES.in | 1 + 2 files changed, 46 insertions(+), 10 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index b45008de6..fbedaa5b3 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -253,7 +253,12 @@ fe80::1%lo0 apps.facebook.com\n") (service-extension etc-service-type static-networking-etc-files))) (compose concatenate) - (extend append))) + (extend append) + (description + "Turn up the specified network interfaces upon startup, +with the given IP address, gateway, netmask, and so on. The value for +services of this type is a list of @code{static-networking} objects, one per +network interface."))) (define* (static-networking-service interface ip #:key @@ -422,7 +427,11 @@ restrict -6 ::1\n")) (service-extension account-service-type (const %ntp-accounts)) (service-extension activation-service-type - ntp-service-activation))))) + ntp-service-activation))) + (description + "Run the @command{ntpd}, the Network Time Protocol (NTP) +daemon of the @uref{http://www.ntp.org, Network Time Foundation}. The daemon +will keep the system clock synchronized with that of the given servers."))) (define* (ntp-service #:key (ntp ntp) (servers %ntp-servers) @@ -520,7 +529,11 @@ make an initial adjustment of more than 1,000 seconds." (inetd-configuration (inherit config) (entries (append (inetd-configuration-entries config) - entries))))))) + entries))))) + (description + "Start @command{inetd}, the @dfn{Internet superserver}. It is responsible +for listening on Internet sockets and spawning the corresponding services on +demand."))) ;;; @@ -671,7 +684,10 @@ HiddenServicePort ~a ~a~%" (hidden-services (append (tor-configuration-hidden-services config) services))))) - (default-value (tor-configuration)))) + (default-value (tor-configuration)) + (description + "Run the @uref{https://torproject.org, Tor} anonymous +networking daemon."))) (define* (tor-service #:optional (config-file (plain-file "empty" "")) @@ -691,7 +707,9 @@ and lines for hidden services added via @code{tor-hidden-service}. Run ;; A type that extends Tor with hidden services. (service-type (name 'tor-hidden-service) (extensions - (list (service-extension tor-service-type list))))) + (list (service-extension tor-service-type list))) + (description + "Define a new Tor @dfn{hidden service}."))) (define (tor-hidden-service name mapping) "Define a new Tor @dfn{hidden service} called @var{name} and implementing @@ -798,7 +816,10 @@ project's documentation} for more information." (const %bitlbee-accounts)) (service-extension activation-service-type (const %bitlbee-activation)))) - (default-value (bitlbee-configuration)))) + (default-value (bitlbee-configuration)) + (description + "Run @url{http://bitlbee.org,BitlBee}, a daemon that acts as +a gateway between IRC and chat networks."))) (define* (bitlbee-service #:key (bitlbee bitlbee) (interface "127.0.0.1") (port 6667) @@ -862,7 +883,10 @@ configuration file." (const %wicd-activation)) ;; Add Wicd to the global profile. - (service-extension profile-service-type list))))) + (service-extension profile-service-type list))) + (description + "Run @url{https://launchpad.net/wicd,Wicd}, a network +management daemon that aims to simplify wired and wireless networking."))) (define* (wicd-service #:key (wicd wicd)) "Return a service that runs @url{https://launchpad.net/wicd,Wicd}, a network @@ -931,7 +955,11 @@ dns=" dns " (const %network-manager-activation)) ;; Add network-manager to the system profile. (service-extension profile-service-type config->package))) - (default-value (network-manager-configuration))))) + (default-value (network-manager-configuration)) + (description + "Run @uref{https://wiki.gnome.org/Projects/NetworkManager, +NetworkManager}, a network management daemon that aims to simplify wired and +wireless networking.")))) ;;; @@ -985,7 +1013,10 @@ dns=" dns " connman-activation) ;; Add connman to the system profile. (service-extension profile-service-type - connman-package)))))) + connman-package))) + (description + "Run @url{https://01.org/connman,Connman}, +a network connection manager.")))) ;;; @@ -1071,6 +1102,10 @@ dns=" dns " (service-extension profile-service-type (compose list openvswitch-configuration-package)) (service-extension shepherd-root-service-type - openvswitch-shepherd-service))))) + openvswitch-shepherd-service))) + (description + "Run @uref{http://www.openvswitch.org, Open vSwitch}, a multilayer virtual +switch designed to enable massive network automation through programmatic +extension."))) ;;; networking.scm ends here diff --git a/po/packages/POTFILES.in b/po/packages/POTFILES.in index d111a6ffc..cfc542f50 100644 --- a/po/packages/POTFILES.in +++ b/po/packages/POTFILES.in @@ -58,3 +58,4 @@ gnu/packages/web.scm gnu/packages/wordnet.scm gnu/packages/xiph.scm gnu/services/base.scm +gnu/services/networking.scm -- cgit v1.3 From 23290064c294a254ffa38ba0b772231087e01c54 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 20 Sep 2017 15:08:55 +0200 Subject: gnu: services: Add modesetting driver to xorg configuration path. * gnu/services/xorg.scm (xorg-configuration-file): Add drivers path from xorg-server. This includes the modesetting driver. Signed-off-by: Andy Wingo --- gnu/services/xorg.scm | 1 + 1 file changed, 1 insertion(+) (limited to 'gnu/services') diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm index 5a8ee6cd4..6200fa302 100644 --- a/gnu/services/xorg.scm +++ b/gnu/services/xorg.scm @@ -135,6 +135,7 @@ Section \"Files\" ModulePath \"" xf86-input-mouse "/lib/xorg/modules/input\" ModulePath \"" xf86-input-synaptics "/lib/xorg/modules/input\" ModulePath \"" xorg-server "/lib/xorg/modules\" + ModulePath \"" xorg-server "/lib/xorg/modules/drivers\" ModulePath \"" xorg-server "/lib/xorg/modules/extensions\" ModulePath \"" xorg-server "/lib/xorg/modules/multimedia\" EndSection -- cgit v1.3 From fbc31dc1247d3a494246e69f3cf28476af9eb9d6 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 21 Sep 2017 23:52:45 +0200 Subject: services: Move 'session-environment-service-type' to pam.scm. * gnu/services/base.scm (environment-variables->environment-file) (session-environment-service-type) (session-environment-service): Move to... * gnu/system/pam.scm: ... here. --- gnu/services/base.scm | 43 ------------------------------------------- gnu/system/pam.scm | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 44 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 10c8f1b6a..64620a9b0 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -59,8 +59,6 @@ user-unmount-service swap-service user-processes-service - session-environment-service - session-environment-service-type host-name-service console-keymap-service %default-console-font @@ -600,47 +598,6 @@ to add @var{device} to the kernel's entropy pool. The service will fail if (rng-tools rng-tools) (device device)))) - -;;; -;;; System-wide environment variables. -;;; - -(define (environment-variables->environment-file vars) - "Return a file for pam_env(8) that contains environment variables VARS." - (apply mixed-text-file "environment" - (append-map (match-lambda - ((key . value) - (list key "=" value "\n"))) - vars))) - -(define session-environment-service-type - (service-type - (name 'session-environment) - (extensions - (list (service-extension - etc-service-type - (lambda (vars) - (list `("environment" - ,(environment-variables->environment-file vars))))))) - (compose concatenate) - (extend append) - (description - "Populate @file{/etc/environment} with the specified environment -variables. The value of this service is a list of name/value pairs for -environments variables, such as: - -@example -'((\"TZ\" . \"Canada/Pacific\")) -@end example\n"))) - -(define (session-environment-service vars) - "Return a service that builds the @file{/etc/environment}, which can be read -by PAM-aware applications to set environment variables for sessions. - -VARS should be an association list in which both the keys and the values are -strings or string-valued gexps." - (service session-environment-service-type vars)) - ;;; ;;; Console & co. diff --git a/gnu/system/pam.scm b/gnu/system/pam.scm index eedf93394..13f76a50e 100644 --- a/gnu/system/pam.scm +++ b/gnu/system/pam.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès +;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -50,6 +50,9 @@ unix-pam-service base-pam-services + session-environment-service + session-environment-service-type + pam-root-service-type pam-root-service)) @@ -276,6 +279,48 @@ authenticate to run COMMAND." '("useradd" "userdel" "usermod" "groupadd" "groupdel" "groupmod")))) + +;;; +;;; System-wide environment variables. +;;; + +(define (environment-variables->environment-file vars) + "Return a file for pam_env(8) that contains environment variables VARS." + (apply mixed-text-file "environment" + (append-map (match-lambda + ((key . value) + (list key "=" value "\n"))) + vars))) + +(define session-environment-service-type + (service-type + (name 'session-environment) + (extensions + (list (service-extension + etc-service-type + (lambda (vars) + (list `("environment" + ,(environment-variables->environment-file vars))))))) + (compose concatenate) + (extend append) + (description + "Populate @file{/etc/environment}, which is honored by @code{pam_env}, +with the specified environment variables. The value of this service is a list +of name/value pairs for environments variables, such as: + +@example +'((\"TZ\" . \"Canada/Pacific\")) +@end example\n"))) + +(define (session-environment-service vars) + "Return a service that builds the @file{/etc/environment}, which can be read +by PAM-aware applications to set environment variables for sessions. + +VARS should be an association list in which both the keys and the values are +strings or string-valued gexps." + (service session-environment-service-type vars)) + + ;;; ;;; PAM root service. -- cgit v1.3 From 94d2a25091dc4bcaec319c46da96d588e3e63476 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 22 Sep 2017 00:00:41 +0200 Subject: services: network-manager: Add support for VPN plug-ins. * gnu/services.scm (directory-union): Export. * gnu/services/networking.scm ()[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(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 601cf51b3..0369a150f 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 +@item @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 2ebd701a5..329b7b151 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 fbedaa5b3..42b96b417 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 + (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 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 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 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)) -- cgit v1.3 From 9db7e9be59820190a97de22ba72e71fa25f9d168 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov Date: Thu, 27 Jul 2017 04:01:01 +0300 Subject: gnu: Add rsync service. * doc/guix.texi (Networking Services): Add rsync service documentation. * gnu/services/rsync.scm (): New file. * gnu/tests/rsync.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add new files. Signed-off-by: Christopher Baines --- doc/guix.texi | 69 ++++++++++++++++++++ gnu/local.mk | 2 + gnu/services/rsync.scm | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ gnu/tests/rsync.scm | 126 ++++++++++++++++++++++++++++++++++++ 4 files changed, 369 insertions(+) create mode 100644 gnu/services/rsync.scm create mode 100644 gnu/tests/rsync.scm (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 0369a150f..0462a6419 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10335,6 +10335,75 @@ In addition, @var{extra-settings} specifies a string to append to the configuration file. @end deffn +The @code{(gnu services rsync)} module provides the following services: + +You might want an rsync daemon if you have files that you want available +so anyone (or just yourself) can download existing files or upload new +files. + +@deffn {Scheme Variable} rsync-service-type +This is the type for the @uref{https://rsync.samba.org, rsync} rsync daemon, +@command{rsync-configuration} record as in this example: + +@example +(service rsync-service-type) +@end example + +See below for details about @code{rsync-configuration}. +@end deffn + +@deftp {Data Type} rsync-configuration +Data type representing the configuration for @code{rsync-service}. + +@table @asis +@item @code{package} (default: @var{rsync}) +@code{rsync} package to use. + +@item @code{port-number} (default: @code{873}) +TCP port on which @command{rsync} listens for incoming connections. If port +is less than @code{1024} @command{rsync} needs to be started as the +@code{root} user and group. + +@item @code{pid-file} (default: @code{"/var/run/rsyncd/rsyncd.pid"}) +Name of the file where @command{rsync} writes its PID. + +@item @code{lock-file} (default: @code{"/var/run/rsyncd/rsyncd.lock"}) +Name of the file where @command{rsync} writes its lock file. + +@item @code{log-file} (default: @code{"/var/log/rsyncd.log"}) +Name of the file where @command{rsync} writes its log file. + +@item @code{use-chroot?} (default: @var{#t}) +Whether to use chroot for @command{rsync} shared directory. + +@item @code{share-path} (default: @file{/srv/rsync}) +Location of the @command{rsync} shared directory. + +@item @code{share-comment} (default: @code{"Rsync share"}) +Comment of the @command{rsync} shared directory. + +@item @code{read-only?} (default: @var{#f}) +Read-write permissions to shared directory. + +@item @code{timeout} (default: @code{300}) +I/O timeout in seconds. + +@item @code{user} (default: @var{"root"}) +Owner of the @code{rsync} process. + +@item @code{group} (default: @var{"root"}) +Group of the @code{rsync} process. + +@item @code{uid} (default: @var{"rsyncd"}) +User name or user ID that file transfers to and from that module should take +place as when the daemon was run as @code{root}. + +@item @code{gid} (default: @var{"rsyncd"}) +Group name or group ID that will be used when accessing the module. + +@end table +@end deftp + Furthermore, @code{(gnu services ssh)} provides the following services. @cindex SSH @cindex SSH server diff --git a/gnu/local.mk b/gnu/local.mk index d7a881eb5..711f38c6b 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -452,6 +452,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/shepherd.scm \ %D%/services/herd.scm \ %D%/services/pm.scm \ + %D%/services/rsync.scm \ %D%/services/sddm.scm \ %D%/services/spice.scm \ %D%/services/ssh.scm \ @@ -498,6 +499,7 @@ GNU_SYSTEM_MODULES = \ %D%/tests/mail.scm \ %D%/tests/messaging.scm \ %D%/tests/networking.scm \ + %D%/tests/rsync.scm \ %D%/tests/ssh.scm \ %D%/tests/virtualization.scm \ %D%/tests/web.scm diff --git a/gnu/services/rsync.scm b/gnu/services/rsync.scm new file mode 100644 index 000000000..621e6c46d --- /dev/null +++ b/gnu/services/rsync.scm @@ -0,0 +1,172 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2017 Oleg Pykhalov +;;; +;;; 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 . + +(define-module (gnu services rsync) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #:use-module (gnu system shadow) + #:use-module (gnu packages rsync) + #:use-module (gnu packages admin) + #:use-module (guix records) + #:use-module (guix gexp) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match) + #:export (rsync-configuration + rsync-configuration? + rsync-service-type)) + +;;;; Commentary: +;;; +;;; This module implements a service that to run instance of Rsync, +;;; files synchronization tool. +;;; +;;;; Code: + +(define-record-type* + rsync-configuration + make-rsync-configuration + rsync-configuration? + (package rsync-configuration-package ; package + (default rsync)) + (port-number rsync-configuration-port-number ; integer + (default 873)) + (pid-file rsync-configuration-pid-file ; string + (default "/var/run/rsyncd/rsyncd.pid")) + (lock-file rsync-configuration-lock-file ; string + (default "/var/run/rsyncd/rsyncd.lock")) + (log-file rsync-configuration-log-file ; string + (default "/var/log/rsyncd.log")) + (use-chroot? rsync-configuration-use-chroot? ; boolean + (default #t)) + (share-path rsync-configuration-share-path ; string + (default "/srv/rsyncd")) + (share-comment rsync-configuration-share-comment ; string + (default "Rsync share")) + (read-only? rsync-configuration-read-only? ; boolean + (default #f)) + (timeout rsync-configuration-timeout ; integer + (default 300)) + (user rsync-configuration-user ; string + (default "root")) + (group rsync-configuration-group ; string + (default "root")) + (uid rsync-configuration-uid ; string + (default "rsyncd")) + (gid rsync-configuration-gid ; string + (default "rsyncd"))) + +(define (rsync-account config) + "Return the user accounts and user groups for CONFIG." + (let ((rsync-user (if (rsync-configuration-uid config) + (rsync-configuration-uid config) + (rsync-configuration-user config))) + (rsync-group (if (rsync-configuration-gid config) + (rsync-configuration-gid config) + (rsync-configuration-group config)))) + (list (user-group (name rsync-group) (system? #t)) + (user-account + (name rsync-user) + (system? #t) + (group rsync-group) + (comment "rsyncd privilege separation user") + (home-directory (string-append "/var/run/" + rsync-user)) + (shell #~(string-append #$shadow "/sbin/nologin")))))) + +(define (rsync-activation config) + "Return the activation GEXP for CONFIG." + (with-imported-modules '((guix build utils)) + #~(begin + (let ((share-directory #$(rsync-configuration-share-path config)) + (user (getpw (if #$(rsync-configuration-uid config) + #$(rsync-configuration-uid config) + #$(rsync-configuration-user config)))) + (group (getpw (if #$(rsync-configuration-gid config) + #$(rsync-configuration-gid config) + #$(rsync-configuration-group config))))) + (mkdir-p (dirname #$(rsync-configuration-pid-file config))) + (and=> share-directory mkdir-p) + (chown share-directory + (passwd:uid user) + (group:gid group)))))) + +(define rsync-config-file + ;; Return the rsync configuration file corresponding to CONFIG. + (match-lambda + (($ package port-number pid-file lock-file log-file + use-chroot? share-path share-comment read-only? + timeout user group uid gid) + (if (not (string=? user "root")) + (cond + ((<= port-number 1024) + (error (string-append "rsync-service: to run on port " + (number->string port-number) + ", user must be root."))) + (use-chroot? + (error (string-append "rsync-service: to run in a chroot" + ", user must be root."))) + (uid + (error "rsync-service: to use uid, user must be root.")) + (gid + (error "rsync-service: to use gid, user must be root.")))) + (mixed-text-file + "rsync.conf" + "# Generated by 'rsync-service'.\n\n" + "pid file = " pid-file "\n" + "lock file = " lock-file "\n" + "log file = " log-file "\n" + "port = " (number->string port-number) "\n" + "use chroot = " (if use-chroot? "true" "false") "\n" + (if uid (string-append "uid = " uid "\n") "") + "gid = " (if gid gid "nogroup") "\n" ; no group nobody + "\n" + "[files]\n" + "path = " share-path "\n" + "comment = " share-comment "\n" + "read only = " (if read-only? "true" "false") "\n" + "timeout = " (number->string timeout) "\n")))) + +(define (rsync-shepherd-service config) + "Return a for rsync with CONFIG." + (let* ((rsync (rsync-configuration-package config)) + (pid-file (rsync-configuration-pid-file config)) + (port-number (rsync-configuration-port-number config)) + (user (rsync-configuration-user config)) + (group (rsync-configuration-group config))) + (list (shepherd-service + (provision '(rsync)) + (documentation "Run rsync daemon.") + (start #~(make-forkexec-constructor + (list (string-append #$rsync "/bin/rsync") + "--config" #$(rsync-config-file config) + "--daemon") + #:pid-file #$pid-file + #:user #$user + #:group #$group)) + (stop #~(make-kill-destructor)))))) + +(define rsync-service-type + (service-type + (name 'rsync) + (extensions + (list (service-extension shepherd-root-service-type rsync-shepherd-service) + (service-extension account-service-type rsync-account) + (service-extension activation-service-type rsync-activation))) + (default-value (rsync-configuration)))) diff --git a/gnu/tests/rsync.scm b/gnu/tests/rsync.scm new file mode 100644 index 000000000..c97836788 --- /dev/null +++ b/gnu/tests/rsync.scm @@ -0,0 +1,126 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2017 Christopher Baines +;;; +;;; 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 . + +(define-module (gnu tests rsync) + #:use-module (gnu packages rsync) + #:use-module (gnu tests) + #:use-module (gnu system) + #:use-module (gnu system file-systems) + #:use-module (gnu system shadow) + #:use-module (gnu system vm) + #:use-module (gnu services) + #:use-module (gnu services rsync) + #:use-module (gnu services networking) + #:use-module (guix gexp) + #:use-module (guix store) + #:export (%test-rsync)) + +(define* (run-rsync-test rsync-os #:optional (rsync-port 873)) + "Run tests in %RSYNC-OS, which has rsync running and listening on +PORT." + (define os + (marionette-operating-system + rsync-os + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define vm + (virtual-machine + (operating-system os) + (port-forwardings '()))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (srfi srfi-11) (srfi srfi-64) + (gnu build marionette)) + + (define marionette + (make-marionette (list #$vm))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "rsync") + + ;; Wait for rsync to be up and running. + (test-eq "service running" + 'running! + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'rsync) + 'running!) + marionette)) + + ;; Make sure the PID file is created. + (test-assert "PID file" + (marionette-eval + '(file-exists? "/var/run/rsyncd/rsyncd.pid") + marionette)) + + (test-assert "Test file copied to share" + (marionette-eval + '(begin + (call-with-output-file "/tmp/input" + (lambda (port) + (display "test-file-contents\n" port))) + (zero? + (system* "rsync" "/tmp/input" + (string-append "rsync://localhost:" + (number->string #$rsync-port) + "/files/input")))) + marionette)) + + (test-equal "Test file correctly received from share" + "test-file-contents" + (marionette-eval + '(begin + (use-modules (ice-9 rdelim)) + (zero? + (system* "rsync" + (string-append "rsync://localhost:" + (number->string #$rsync-port) + "/files/input") + "/tmp/output")) + (call-with-input-file "/tmp/output" + (lambda (port) + (read-line port)))) + marionette)) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "rsync-test" test)) + +(define* %rsync-os + ;; Return operating system under test. + (let ((base-os + (simple-operating-system + (dhcp-client-service) + (service rsync-service-type)))) + (operating-system + (inherit base-os) + (packages (cons* rsync + (operating-system-packages base-os)))))) + +(define %test-rsync + (system-test + (name "rsync") + (description "Connect to a running RSYNC server.") + (value (run-rsync-test %rsync-os)))) -- cgit v1.3 From 326f6ef10f2ac774455751ab08cab8fc55e7e44d Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 18 Sep 2017 22:12:18 +0200 Subject: services: cuirass: Add host option. * gnu/services/cuirass.scm (): Add host option. (cuirass-shepherd-service): Pass host option. * doc/guix.texi (Continuous Integration): Document it. --- doc/guix.texi | 4 ++++ gnu/services/cuirass.scm | 5 +++++ 2 files changed, 9 insertions(+) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index 0462a6419..fff3fbd5f 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -15414,6 +15414,10 @@ added specifications. @item @code{port} (default: @code{8081}) Port number used by the HTTP server. +@item --listen=@var{host} +Listen on the network interface for @var{host}. The default is to +accept connections from localhost. + @item @code{specifications} (default: @code{#~'()}) A gexp (@pxref{G-Expressions}) that evaluates to a list of specifications, where a specification is an association list diff --git a/gnu/services/cuirass.scm b/gnu/services/cuirass.scm index 2ad595220..c5e9fcbb2 100644 --- a/gnu/services/cuirass.scm +++ b/gnu/services/cuirass.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2016 Mathieu Lirzin ;;; Copyright © 2016, 2017 Ludovic Courtès ;;; Copyright © 2017 Mathieu Othacehe +;;; Copyright © 2017 Jan Nieuwenhuizen ;;; ;;; This file is part of GNU Guix. ;;; @@ -61,6 +62,8 @@ (default "/var/run/cuirass/cuirass.db")) (port cuirass-configuration-port ;integer (port) (default 8081)) + (host cuirass-configuration-host ;string + (default "localhost")) (specifications cuirass-configuration-specifications) ;gexp that evaluates to specification-alist (use-substitutes? cuirass-configuration-use-substitutes? ;boolean @@ -84,6 +87,7 @@ (interval (cuirass-configuration-interval config)) (database (cuirass-configuration-database config)) (port (cuirass-configuration-port config)) + (host (cuirass-configuration-host config)) (specs (cuirass-configuration-specifications config)) (use-substitutes? (cuirass-configuration-use-substitutes? config)) (one-shot? (cuirass-configuration-one-shot? config)) @@ -100,6 +104,7 @@ #$(scheme-file "cuirass-specs.scm" specs) "--database" #$database "--port" #$(number->string port) + "--listen" #$host "--interval" #$(number->string interval) #$@(if use-substitutes? '("--use-substitutes") '()) #$@(if one-shot? '("--one-shot") '()) -- cgit v1.3 From 4d14808af4c01b4fb0a4564584aa68f0e53c4ef4 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov Date: Sat, 23 Sep 2017 03:27:49 +0300 Subject: services: web: Add try-files for the nginx-service-type. * gnu/services/web.scm (): Add nginx-server-configuration-try-files. (emit-nginx-server-config): Use it. * doc/guix.texi (Web Services): Document it. --- doc/guix.texi | 7 ++++++- gnu/services/web.scm | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'gnu/services') diff --git a/doc/guix.texi b/doc/guix.texi index dd0a46a63..1b329d255 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -14263,7 +14263,8 @@ blocks, as in this example: (https-port #f) (ssl-certificate #f) (ssl-certificate-key #f) - (root "/srv/http/extra-website")))) + (root "/srv/http/extra-website") + (try-files (list "$uri" "$uri/index.html"))))) @end example @end deffn @@ -14394,6 +14395,10 @@ server block. Index files to look for when clients ask for a directory. If it cannot be found, Nginx will send the list of files in the directory. +@item @code{try-files} (default: @code{'()}) +A list of files whose existence is checked in the specified order. +@code{nginx} will use the first file it finds to process the request. + @item @code{ssl-certificate} (default: @code{"/etc/nginx/cert.pem"}) Where to find the certificate for secure connections. Set it to @code{#f} if you don't have a certificate or you don't want to use HTTPS. diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 4aa6fd501..9d713003c 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -99,6 +99,8 @@ (default '())) (index nginx-server-configuration-index (default (list "index.html"))) + (try-files nginx-server-configuration-try-files + (default '())) (ssl-certificate nginx-server-configuration-ssl-certificate (default "/etc/nginx/cert.pem")) (ssl-certificate-key nginx-server-configuration-ssl-certificate-key @@ -179,6 +181,7 @@ of index files." (nginx-server-configuration-ssl-certificate-key server)) (root (nginx-server-configuration-root server)) (index (nginx-server-configuration-index server)) + (try-files (nginx-server-configuration-try-files server)) (server-tokens? (nginx-server-configuration-server-tokens? server)) (locations (nginx-server-configuration-locations server))) (define-syntax-parameter <> (syntax-rules ())) @@ -207,6 +210,9 @@ of index files." (and/l ssl-certificate-key " ssl_certificate_key " <> ";\n") " root " root ";\n" " index " (config-index-strings index) ";\n" + (if (not (nil? try-files)) + (and/l (config-index-strings try-files) " try_files " <> ";\n") + "") " server_tokens " (if server-tokens? "on" "off") ";\n" "\n" (map emit-nginx-location-config locations) -- cgit v1.3