From 9d4b74f028575c9acc1ffa486be2a31b5e5e0ae5 Mon Sep 17 00:00:00 2001 From: ng0 Date: Tue, 9 May 2017 18:52:32 +0000 Subject: [PATCH 2/2] services: Add geomyidae-service. * gnu/services/web.scm (): New record type. (geomyidae-shepherd-service, geomyidae-activation): New procedures. (geomyidae-service-type, geomyidae-service, %geomyidae-accounts): New variables. * doc/guix.texi (Web Services): Document it. --- doc/guix.texi | 60 +++++++++++++++++++++++++- gnu/services/web.scm | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 174 insertions(+), 3 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 22dc8b3f9..03e66d395 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -26,7 +26,7 @@ Copyright @copyright{} 2016 Ben Woodcroft@* Copyright @copyright{} 2016 Chris Marusich@* Copyright @copyright{} 2016, 2017 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@* -Copyright @copyright{} 2016 ng0@* +Copyright @copyright{} 2016, 2017 ng0@* Copyright @copyright{} 2016 Jan Nieuwenhuizen@* Copyright @copyright{} 2016 Julien Lepiller@* Copyright @copyright{} 2016 Alex ter Weele@* @@ -13485,6 +13485,64 @@ Whether the server should add its configuration to response. @end table @end deftp +@cindex gopherd +@deffn {Scheme Procedure} geomyidae-service- [#:config (geomyidae-configuration)] + +Return a service that runs @command{geomyidae}, a simple gopherd server. + +The @var{config} argument should be a @code{} object, +by default its root directory is at @file{/srv/gopher} and it listens on the +default port for gopher, which is @var{70}. + +@end deffn + +@deftp {Data Type} geomyidae-configuration +Data type representing the configuration for @code{geomyidae-service}. + +@table @asis + +@item @code{package} (default: @var{geomyidae}) +Package object of the geomyidae gopherd. + +@item @code{logfile} (default: @var{#f}) +Logfile to use, the default is to use no logfile. + +@item @code{loglevel} (default: @var{#f}) +If a logfile is used, this sets the loglevel to be used: + +0 - no logging +1 - served plain files +2 - dir listings +4 - HTTP redirects +8 - not found queries +1 + 2 + 4 = 7 (files + dir listings + HTTP) + +Geomyidae defaults to '7' if this is used. + +@item @code{htdoc} (default: @var{"/srv/gopher"}) +Rootdirectory to serve from. + +@item @code{port} (default: @var{70}) +Port to use, the default gopher port is 70. + +@item @code{sport} (default: @var{#f}) +Set the port that should be shown in the gopher dir listings. + +@item @code{user} (default: @var{geomyidae}) +User to run the service as. + +@item @code{group} (default: @var{geomyidae}) +Group to run the service as. + +@item @code{host} (default: @var{localhost}) +Host that should be used in the gopher dir listings. + +@item @code{ip} (default: @var{#f}) +IP which geomyidae should bind to. + +@end table +@end deftp + @node VPN Services @subsubsection VPN Services @cindex VPN (virtual private network) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index f85b41215..2cfa835a7 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson ;;; Copyright © 2015, 2016, 2017 Ludovic Courtès -;;; Copyright © 2016 ng0 +;;; Copyright © 2016, 2017 ng0 ;;; Copyright © 2016, 2017 Julien Lepiller ;;; Copyright © 2017 Christopher Baines ;;; @@ -41,7 +41,12 @@ nginx-named-location-configuration nginx-named-location-configuration? nginx-service - nginx-service-type)) + nginx-service-type + + geomyidae-service + geomyidae-service-type + geomyidae-configuration + geomyidae-configuration?)) ;;; Commentary: ;;; @@ -305,3 +310,111 @@ files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY." (server-blocks server-list) (upstream-blocks upstream-list) (file config-file)))) + +;;; +;;; geomyidae +;;; + +(define-record-type* + geomyidae-configuration make-geomyidae-configuration + geomyidae-configuration? + (package geomyidae-configuration-package ;package + (default geomyidae)) + (logfile geomyidae-configuration-logfile ;string + (default "/var/log/geomyidae.log")) + (loglevel geomyidae-configuration-loglevel ;number + (default 7)) + (htdocs geomyidae-configuration-htdocs ;string + (default "/srv/gopher")) + (port geomyidae-configuration-port ;number + (default 70)) + (sport geomyidae-configuration-sport ;number + (default 70)) + (host geomyidae-configuration-host ;string + (default "localhost")) + (ip geomyidae-configuration-ip ;string + (default #f))) + +(define geomyidae-shepherd-service + (match-lambda + (($ + package logfile loglevel htdocs port + sport host ip);;user group + (let* ((geomyidae (file-append package "/bin/geomyidae")) + (cmd `(,geomyidae + "-d" + ,@(if logfile + `(,(string-append "-l " logfile)) + '()) + ,@(if loglevel + `(,(string-append + "-v " (number->string loglevel))) + '()) + ,@(if htdocs + `(,(string-append "-b " htdocs)) + '()) + ,@(if port + `(,(string-append + "-p " (number->string port))) + '()) + ,@(if sport + `(,(string-append + "-o " (number->string sport))) + '()) + ,@(if host + `(,(string-append "-h " host)) + '()) + ,@(if ip + `(,(string-append "-i " ip)) + '())))) + (list (shepherd-service + (documentation "Run the gopherd geomyidae") + (provision '(geomyidae)) + (requirement '(user-processes loopback networking)) + (start #~(make-forkexec-constructor + '#$cmd + #:user "geomyidae" + #:group "geomyidae" + #:pid-file "/var/run/geomyidae.pid")) + (stop #~(make-kill-destructor)))))))) + +(define %geomyidae-accounts + ;; User account and group for the geomyidae gopherd. + (list (user-group + (name "geomyidae") + (system? #t)) + (user-account + (name "geomyidae") + (system? #t) + (group "geomyidae") + (comment "geomyidae user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))))) + +(define (geomyidae-activation config) + "Return the activation gexp for geomyidae using CONFIG." + (let ((htdocs (geomyidae-configuration-htdocs config))) + #~(begin + (use-modules (guix build utils)) + ;; Create the 'htdocs' directory when it's not '#f'. + (and=> #$htdocs mkdir-p)))) + +(define geomyidae-service-type + (service-type + (name 'geomyidae) + (extensions + (list (service-extension shepherd-root-service-type + geomyidae-shepherd-service) + (service-extension account-service-type + (const %geomyidae-accounts)) + (service-extension activation-service-type + geomyidae-activation))))) + +(define* (geomyidae-service #:key (config (geomyidae-configuration))) + "Return a service that runs @command{geomyidae}, a simple gopherd server. + +The @var{config} argument should be a +@code{ oject, by default its root directory is +at @file{/srv/gopher} and it listens on the default port for gopher, which +is @var{70}." + (service geomyidae-service-type config)) -- 2.12.2