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 address@hidden
Copyright @copyright{} 2016 Chris address@hidden
Copyright @copyright{} 2016, 2017 Efraim address@hidden
Copyright @copyright{} 2016 John address@hidden
-Copyright @copyright{} 2016 address@hidden
+Copyright @copyright{} 2016, 2017 address@hidden
Copyright @copyright{} 2016 Jan address@hidden
Copyright @copyright{} 2016 Julien address@hidden
Copyright @copyright{} 2016 Alex ter address@hidden
@@ -13485,6 +13485,64 @@ Whether the server should add its configuration to response.
@end table
@end deftp
address@hidden gopherd
address@hidden {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}.
+
address@hidden deffn
+
address@hidden {Data Type} geomyidae-configuration
+Data type representing the configuration for @code{geomyidae-service}.
+
address@hidden @asis
+
address@hidden @code{package} (default: @var{geomyidae})
+Package object of the geomyidae gopherd.
+
address@hidden @code{logfile} (default: @var{#f})
+Logfile to use, the default is to use no logfile.
+
address@hidden @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.
+
address@hidden @code{htdoc} (default: @var{"/srv/gopher"})
+Rootdirectory to serve from.
+
address@hidden @code{port} (default: @var{70})
+Port to use, the default gopher port is 70.
+
address@hidden @code{sport} (default: @var{#f})
+Set the port that should be shown in the gopher dir listings.
+
address@hidden @code{user} (default: @var{geomyidae})
+User to run the service as.
+
address@hidden @code{group} (default: @var{geomyidae})
+Group to run the service as.
+
address@hidden @code{host} (default: @var{localhost})
+Host that should be used in the gopher dir listings.
+
address@hidden @code{ip} (default: @var{#f})
+IP which geomyidae should bind to.
+
address@hidden table
address@hidden 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
address@hidden 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