unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 47741@debbugs.gnu.org
Cc: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Subject: [bug#47741] [PATCH 3/3] services: Add opendht.
Date: Tue, 13 Apr 2021 00:17:10 -0400	[thread overview]
Message-ID: <20210413041710.1708-3-maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <20210413041710.1708-1-maxim.cournoyer@gmail.com>

* gnu/services/networking.scm (serialize-boolean)
(serialize-number, serialize-string): New dummy procedures.
(maybe-number, opendht-configuration): New syntaxes.
(%opendht-accounts): New variable.
(opendht-configuration->command-line-arguments): Likewise.
(opendht-shepherd-service, opendht-service-type): New variables.
* doc/guix.texi: Document it.
---
 doc/guix.texi               |  84 ++++++++++++++++++++++
 gnu/services/networking.scm | 135 +++++++++++++++++++++++++++++++++++-
 2 files changed, 218 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 84d8bf50be..d2593b2180 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -16653,6 +16653,90 @@ must be @code{'()} or @code{'("internal")}.
 detailed discussion of each configuration field.
 @end deftp
 
+@cindex opendht, distributed hash table network service
+@cindex dhtproxy, for use with jami
+@defvr {Scheme Variable} opendht-service-type
+This is the type of the service running a @uref{https://opendht.net,
+OpenDHT} node, @command{dhtnode}.  The daemon can be used to host your
+own proxy service to the DHT, for example to connect to with Jami, among
+other applications.
+
+The value of this service is a @code{opendht-configuration} object, as
+described below.
+@end defvr
+
+@deftp {Data Type} opendht-configuration
+This is the data type for the OpenDHT service configuration.
+
+@c The fields documentation has been auto-generated using the
+@c configuration->documentation procedure from (gnu services
+@c configuration).
+@c TODO: Tweak the tool so that it generates doc that matches our
+@c current standard.
+Available @code{opendht-configuration} fields are:
+
+@deftypevr {@code{opendht-configuration} parameter} package opendht
+The @code{opendht} package to use.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} boolean peer-discovery?
+Whether to enable the multicast local peer discovery mechanism.
+
+Defaults to @samp{#f}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} boolean enable-logging?
+Whether to enable logging messages to syslog.  It is disabled by default
+as it is rather verbose.
+
+Defaults to @samp{#f}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} boolean debug?
+Whether to enable debug-level logging messages.  This has no effect if
+logging is disabled.
+
+Defaults to @samp{#f}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} maybe-string bootstrap-host
+The node host name that is used to make the first connection to the
+network.  A specific port value can be provided by appending the
+@code{:PORT} suffix.  By default, it uses the Jami bootstrap nodes, but
+any host can be specified here.  It's also possible to disable
+bootsrapping by setting this to the @code{'disabled} symbol.
+
+Defaults to @samp{"bootstrap.jami.net:4222"}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} maybe-number port
+The UDP port to bind to.  When set to @code{'disabled}, an available
+port is automatically selected.
+
+Defaults to @samp{4222}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} maybe-number proxy-server-port
+Spawn a proxy server listening on the specified port.
+
+Defaults to @samp{disabled}.
+
+@end deftypevr
+
+@deftypevr {@code{opendht-configuration} parameter} maybe-number proxy-server-port-tls
+Spawn a proxy server listening to TLS connections on the specified port.
+
+Defaults to @samp{disabled}.
+
+@end deftypevr
+@end deftp
+
 @cindex Tor
 @defvr {Scheme Variable} tor-service-type
 This is the type for a service that runs the @uref{https://torproject.org,
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index 231a9f66c7..8c22f0eec3 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -10,7 +10,7 @@
 ;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2019 Florian Pelz <pelzflorian@pelzflorian.de>
-;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2019, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2019 Sou Bunnbu <iyzsong@member.fsf.org>
 ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
@@ -108,6 +108,18 @@
             inetd-entry
             inetd-service-type
 
+            opendht-configuration
+            opendht-configuration-peer-discovery?
+            opendht-configuration-verbose?
+            opendht-configuration-bootstrap-host
+            opendht-configuration-port
+            opendht-configuration-proxy-server-port
+            opendht-configuration-proxy-server-port-tls
+            opendht-configuration->command-line-arguments
+
+            opendht-shepherd-service
+            opendht-service-type
+
             tor-configuration
             tor-configuration?
             tor-hidden-service
@@ -730,6 +742,127 @@ daemon will keep the system clock synchronized with that of the given servers.")
 for listening on Internet sockets and spawning the corresponding services on
 demand.")))
 
+\f
+;;;
+;;; OpenDHT, the distributed hash table network used by Jami
+;;;
+
+;;; XXX: These dummy definitions is because there's no way to disable the
+;;; serialization code from define-configuration.
+(define (serialize-boolean option value) "")
+(define (serialize-number option value) "")
+(define (serialize-string option value) "")
+
+(define-maybe number)
+(define-maybe string)
+
+;;; To generate the documentation of the following configuration record, you
+;;; can evaluate: (configuration->documentation 'opendht-configuration)
+(define-configuration opendht-configuration
+  (opendht
+   (package opendht)
+   "The @code{opendht} package to use.")
+  (peer-discovery?
+   (boolean #false)
+   "Whether to enable the multicast local peer discovery mechanism.")
+  (enable-logging?
+   (boolean #false)
+   "Whether to enable logging messages to syslog.  It is disabled by default
+as it is rather verbose.")
+  (debug?
+   (boolean #false)
+   "Whether to enable debug-level logging messages.  This has no effect if
+logging is disabled.")
+  (bootstrap-host
+   (maybe-string "bootstrap.jami.net:4222")
+   "The node host name that is used to make the first connection to the
+network.  A specific port value can be provided by appending the @code{:PORT}
+suffix.  By default, it uses the Jami bootstrap nodes, but any host can be
+specified here.  It's also possible to disable bootstrapping by setting this
+to the @code{'disabled} symbol.")
+  (port
+   (maybe-number 4222)
+   "The UDP port to bind to.  When set to @code{'disabled}, an available port
+is automatically selected.")
+  (proxy-server-port
+   (maybe-number 'disabled)
+   "Spawn a proxy server listening on the specified port.")
+  (proxy-server-port-tls
+   (maybe-number 'disabled)
+   "Spawn a proxy server listening to TLS connections on the specified
+port."))
+
+(define %opendht-accounts
+  ;; User account and groups for Tor.
+  (list (user-group (name "opendht") (system? #t))
+        (user-account
+         (name "opendht")
+         (group "opendht")
+         (system? #t)
+         (comment "OpenDHT daemon user")
+         (home-directory "/var/empty")
+         (shell (file-append shadow "/sbin/nologin")))))
+
+(define (opendht-configuration->command-line-arguments config)
+  "Derive the command line arguments to used from CONFIG, an
+<opendht-configuration> object."
+  (match-record config <opendht-configuration>
+    (opendht bootstrap-host enable-logging? port debug? peer-discovery?
+             proxy-server-port proxy-server-port-tls)
+    (let ((dhtnode #~(string-append #$opendht:tools "/bin/dhtnode")))
+      `(,dhtnode
+        "--service"                     ;non-forking mode
+        ,@(if (string? bootstrap-host)
+              (list "--bootstrap" bootstrap-host))
+        ,@(if enable-logging?
+              (list "--syslog")
+              '())
+        ,@(if (number? port)
+              (list "--port" (number->string port))
+              '())
+        ,@(if debug?
+              (list "--verbose")
+              '())
+        ,@(if peer-discovery?
+              (list "--peer-discovery")
+              '())
+        ,@(if (number? proxy-server-port)
+              (list "--proxyserver" (number->string proxy-server-port))
+              '())
+        ,@(if (number? proxy-server-port-tls)
+              (list "--proxyserverssl" (number->string proxy-server-port-tls))
+              '())))))
+
+(define (opendht-shepherd-service config)
+  "Return a <shepherd-service> running OpenDHT."
+  (shepherd-service
+   (documentation "Run an OpenDHT node.")
+   (provision '(opendht dhtnode dhtproxy))
+   (requirement '(user-processes syslogd))
+   (start #~(make-forkexec-constructor/container
+             (list #$@(opendht-configuration->command-line-arguments config))
+             #:mappings (list (file-system-mapping
+                               (source "/dev/log") ;for syslog
+                               (target source)))
+             #:user "opendht"))
+   (stop #~(make-kill-destructor))))
+
+(define opendht-service-type
+  (service-type
+   (name 'opendht)
+   (default-value (opendht-configuration))
+   (extensions
+    (list (service-extension shepherd-root-service-type
+                             (compose list opendht-shepherd-service))
+          (service-extension account-service-type
+                             (const %opendht-accounts))))
+   (description "Run the OpenDHT @command{dhtnode} command that allows
+participating in the distributed hash table based OpenDHT network.  The
+service can be configured to act as a proxy to the distributed network, which
+can be useful for portable devices where minimizing energy consumption is
+paramount.  OpenDHT was originally based on Kademlia and adapted for
+applications in communication.  It is used by Jami, for example.")))
+
 \f
 ;;;
 ;;; Tor.
-- 
2.31.1





  parent reply	other threads:[~2021-04-13  4:18 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-13  4:14 [bug#47741] [PATCH 0/3] Add a service for OpenDHT Maxim Cournoyer
2021-04-13  4:17 ` [bug#47741] [PATCH 1/3] gnu: opendht: Add Python bindings, tools Maxim Cournoyer
2021-04-13  4:17   ` [bug#47741] [PATCH 2/3] services: configuration: Add syntactic sugar to easily generate documentation Maxim Cournoyer
2021-04-13  4:17   ` Maxim Cournoyer [this message]
2021-05-18  3:59     ` bug#47741: [PATCH 0/3] Add a service for OpenDHT Maxim Cournoyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210413041710.1708-3-maxim.cournoyer@gmail.com \
    --to=maxim.cournoyer@gmail.com \
    --cc=47741@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).