unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#44099] [PATCH] gnu: Add gmnisrv.
@ 2020-10-20 19:17 Alexandru-Sergiu Marton
  2020-10-24 23:19 ` [bug#44099] [PATCH] services: Add gmnisrv web service Alexandru-Sergiu Marton
  2020-10-27 16:36 ` bug#44099: [PATCH] gnu: Add gmnisrv Ludovic Courtès
  0 siblings, 2 replies; 3+ messages in thread
From: Alexandru-Sergiu Marton @ 2020-10-20 19:17 UTC (permalink / raw)
  To: 44099; +Cc: Alexandru-Sergiu Marton

* gnu/packages/web.scm (gmnisrv): New variable.
---
 gnu/packages/web.scm | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 5be95e4741..2ce3ab89bf 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -46,6 +46,7 @@
 ;;; Copyright © 2020 Paul Garlick <pgarlick@tourbillion-technology.com>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020 Ryan Prior <rprior@protonmail.com>
+;;; Copyright © 2020 Alexandru-Sergiu Marton <brown121407@posteo.ro>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -128,6 +129,7 @@
   #:use-module (gnu packages lisp-xyz)
   #:use-module (gnu packages lsof)
   #:use-module (gnu packages lua)
+  #:use-module (gnu packages man)
   #:use-module (gnu packages markup)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages networking)
@@ -7702,3 +7704,44 @@ solution for any project's interface needs:
 @item Easily integrated and extensible with Python or Lua scripting.
 @end itemize\n")
     (license license:expat)))
+
+(define-public gmnisrv
+  (let ((commit "a22bec51494a50c044416d469cc33e043480e7fd"))
+    (package
+      (name "gmnisrv")
+      (version (git-version "0" "0" commit))
+      (home-page "https://git.sr.ht/~sircmpwn/gmnisrv")
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url home-page)
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "1k1n7cqd37jgbhxyh231bagdxdxqwpr6n5pk3gax2516w6xbzlb9"))
+                (file-name (git-file-name name version))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-before 'configure 'set-variables
+             (lambda _
+               (setenv "CC" "gcc")
+               #t))
+           (delete 'check)
+           (add-after 'install 'install-config
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((etc (string-append (assoc-ref outputs "out")
+                                         "/etc")))
+                 (mkdir-p etc)
+                 (copy-file "config.ini" (string-append etc "/gmnisrv.ini"))
+                 #t))))))
+      (inputs
+       `(("openssl" ,openssl)))
+      (native-inputs
+       `(("pkg-config" ,pkg-config)
+         ("scdoc" ,scdoc)))
+      (synopsis "Simple Gemini protocol server")
+      (description "gmnisrv is a simple Gemini protocol server written in C.")
+      (license (list license:gpl3
+                     license:bsd-3))))) ;; for ini.c and ini.h
-- 
2.28.0





^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [bug#44099] [PATCH] services: Add gmnisrv web service.
  2020-10-20 19:17 [bug#44099] [PATCH] gnu: Add gmnisrv Alexandru-Sergiu Marton
@ 2020-10-24 23:19 ` Alexandru-Sergiu Marton
  2020-10-27 16:36 ` bug#44099: [PATCH] gnu: Add gmnisrv Ludovic Courtès
  1 sibling, 0 replies; 3+ messages in thread
From: Alexandru-Sergiu Marton @ 2020-10-24 23:19 UTC (permalink / raw)
  To: 44099; +Cc: Alexandru-Sergiu Marton

* gnu/services/web.scm (<gmnisrv-configuration>): New record type.
(%default-gmnisrv-config-file): New variable.
(%gmnisrv-accounts, %gmnisrv-activation): New variables.
(gmnisrv-shepherd-service): New procedure.
(gmnisrv-service-type): New variable.
* doc/guix.texi (Web Services): Document it.
---
 doc/guix.texi        | 35 +++++++++++++++++++++
 gnu/services/web.scm | 73 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)

diff --git a/doc/guix.texi b/doc/guix.texi
index b5061877e2..83e61aa374 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -81,6 +81,7 @@ Copyright @copyright{} 2020 R Veera Kumar@*
 Copyright @copyright{} 2020 Pierre Langlois@*
 Copyright @copyright{} 2020 pinoaffe@*
 Copyright @copyright{} 2020 André Batista@*
+Copyright @copyright{} 2020 Alexandru-Sergiu Marton@*
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -23357,6 +23358,40 @@ Thus, make sure to add @code{nss-certs} or another certificate package to the
 more information on X.509 certificates.
 @end quotation
 
+@subsubheading gmnisrv
+
+@cindex gmnisrv
+The @uref{https://git.sr.ht/~sircmpwn/gmnisrv, gmnisrv} program is a
+simple @uref{https://gemini.circumlunar.space/, Gemini} protocol server.
+
+@deffn {Scheme Variable} gmnisrv-service-type
+This is the type of the gmnisrv service, whose value should be a
+@code{gmnisrv-configuration} object, as in this example:
+
+@lisp
+(service gmnisrv-service-type
+         (gmnisrv-configuration
+           (config-file (local-file "./my-gmnisrv.ini"))))
+@end lisp
+@end deffn
+
+@deftp {Data Type} gmnisrv-configuration
+Data type representing the configuration of gmnisrv.
+
+@table @asis
+@item @code{package} (default: @var{gmnisrv})
+Package object of the gmnisrv server.
+
+@item @code{config-file} (default: @code{%default-gmnisrv-config-file})
+File-like object of the gmnisrv configuration file to use.  The default
+configuration listens on port 1965 and serves files from
+@file{/srv/gemini}.  Certificates are stored in
+@file{/var/lib/gemini/certs}.  For more information, run @command{man
+gmnisrv} and @command{man gmnisrv.ini}.
+
+@end table
+@end deftp
+
 @node Certificate Services
 @subsection Certificate Services
 
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index a74c6c54b4..69465d8ba6 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2020 Oleg Pykhalov <go.wigust@gmail.com>
+;;; Copyright © 2020 Alexandru-Sergiu Marton <brown121407@posteo.ro>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1798,3 +1799,75 @@ WSGIPassAuthorization On
     "Run Mumi, a Web interface to the Debbugs bug-tracking server.")
    (default-value
      (mumi-configuration))))
+
+(define %default-gmnisrv-config-file
+  (plain-file "gmnisrv.ini" "
+listen=0.0.0.0:1965 [::]:1965
+
+[:tls]
+store=/var/lib/gemini/certs
+
+organization=gmnisrv on Guix user
+
+[localhost]
+root=/srv/gemini
+"))
+
+(define-record-type* <gmnisrv-configuration>
+  gmnisrv-configuration make-gmnisrv-configuration
+  gmnisrv-configuration?
+  (package     gmnisrv-configuration-package
+               (default gmnisrv))
+  (config-file gmnisrv-configuration-config-file
+               (default %default-gmnisrv-config-file)))
+
+(define gmnisrv-shepherd-service
+  (match-lambda
+    (($ <gmnisrv-configuration> package config-file)
+     (list (shepherd-service
+            (provision '(gmnisrv))
+            (requirement '(networking))
+            (documentation "Run the gmnisrv Gemini server.")
+            (start (let ((gmnisrv (file-append package "/bin/gmnisrv")))
+                     #~(make-forkexec-constructor
+                        (list #$gmnisrv "-C" #$config-file)
+                        #:user "gmnisrv" #:group "gmnisrv"
+                        #:log-file "/var/log/gmnisrv.log")))
+            (stop #~(make-kill-destructor)))))))
+
+(define %gmnisrv-accounts
+  (list (user-group (name "gmnisrv") (system? #t))
+        (user-account
+         (name "gmnisrv")
+         (group "gmnisrv")
+         (system? #t)
+         (comment "gmnisrv Gemini server")
+         (home-directory "/var/empty")
+         (shell (file-append shadow "/sbin/nologin")))))
+
+(define %gmnisrv-activation
+  (with-imported-modules '((guix build utils))
+    #~(begin
+        (use-modules (guix build utils))
+
+        (mkdir-p "/var/lib/gemini/certs")
+        (let* ((pw  (getpwnam "gmnisrv"))
+               (uid (passwd:uid pw))
+               (gid (passwd:gid pw)))
+          (chown "/var/lib/gemini" uid gid)
+          (chown "/var/lib/gemini/certs" uid gid)))))
+
+(define gmnisrv-service-type
+  (service-type
+   (name 'guix)
+   (extensions
+    (list (service-extension activation-service-type
+                             (const %gmnisrv-activation))
+          (service-extension account-service-type
+                             (const %gmnisrv-accounts))
+          (service-extension shepherd-root-service-type
+                             gmnisrv-shepherd-service)))
+   (description
+    "Run the gmnisrv Gemini server.")
+   (default-value
+     (gmnisrv-configuration))))
-- 
2.28.0





^ permalink raw reply related	[flat|nested] 3+ messages in thread

* bug#44099: [PATCH] gnu: Add gmnisrv.
  2020-10-20 19:17 [bug#44099] [PATCH] gnu: Add gmnisrv Alexandru-Sergiu Marton
  2020-10-24 23:19 ` [bug#44099] [PATCH] services: Add gmnisrv web service Alexandru-Sergiu Marton
@ 2020-10-27 16:36 ` Ludovic Courtès
  1 sibling, 0 replies; 3+ messages in thread
From: Ludovic Courtès @ 2020-10-27 16:36 UTC (permalink / raw)
  To: Alexandru-Sergiu Marton; +Cc: 44099-done

Hi,

Alexandru-Sergiu Marton <brown121407@posteo.ro> skribis:

> * gnu/packages/web.scm (gmnisrv): New variable.

[...]

> +      (synopsis "Simple Gemini protocol server")
> +      (description "gmnisrv is a simple Gemini protocol server written in C.")
> +      (license (list license:gpl3

It’s ‘gpl3+’ since there’s nothing saying “version 3 only”.

> * gnu/services/web.scm (<gmnisrv-configuration>): New record type.
> (%default-gmnisrv-config-file): New variable.
> (%gmnisrv-accounts, %gmnisrv-activation): New variables.
> (gmnisrv-shepherd-service): New procedure.
> (gmnisrv-service-type): New variable.
> * doc/guix.texi (Web Services): Document it.

Nice, applied!

> +(define %default-gmnisrv-config-file
> +  (plain-file "gmnisrv.ini" "
> +listen=0.0.0.0:1965 [::]:1965
> +
> +[:tls]
> +store=/var/lib/gemini/certs
> +
> +organization=gmnisrv on Guix user
> +
> +[localhost]
> +root=/srv/gemini
> +"))
> +
> +(define-record-type* <gmnisrv-configuration>
> +  gmnisrv-configuration make-gmnisrv-configuration
> +  gmnisrv-configuration?
> +  (package     gmnisrv-configuration-package
> +               (default gmnisrv))
> +  (config-file gmnisrv-configuration-config-file
> +               (default %default-gmnisrv-config-file)))
> +
> +(define gmnisrv-shepherd-service
> +  (match-lambda
> +    (($ <gmnisrv-configuration> package config-file)
> +     (list (shepherd-service
> +            (provision '(gmnisrv))
> +            (requirement '(networking))
> +            (documentation "Run the gmnisrv Gemini server.")
> +            (start (let ((gmnisrv (file-append package "/bin/gmnisrv")))
> +                     #~(make-forkexec-constructor
> +                        (list #$gmnisrv "-C" #$config-file)
> +                        #:user "gmnisrv" #:group "gmnisrv"
> +                        #:log-file "/var/log/gmnisrv.log")))

Suggestions for future work.  :-)

  1. We could provide “bindings” to the config file, using
     ‘define-configuration’ for instance, which has direct mapping to
     the ini file format.

  2. Then we could probably use ‘make-forkexec-constructor/container’ to
     run the process in a namespace that contains just what’s needed:
     the root of the files to be served, and the relevant /gnu/store
     bits.

Thanks!

Ludo’.




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-27 16:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-20 19:17 [bug#44099] [PATCH] gnu: Add gmnisrv Alexandru-Sergiu Marton
2020-10-24 23:19 ` [bug#44099] [PATCH] services: Add gmnisrv web service Alexandru-Sergiu Marton
2020-10-27 16:36 ` bug#44099: [PATCH] gnu: Add gmnisrv Ludovic Courtès

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).