This is an automated email from the git hooks/post-receive script.

guix_mirror_bot pushed a commit to branch master
in repository guix.

The following commit(s) were added to refs/heads/master by this push:
     new 8dc57904e3 services: Add endlessh-service-type.
8dc57904e3 is described below

commit 8dc57904e385b9219f548601afc6dc9b26dadd68
Author: Clombrong <[email protected]>
AuthorDate: Thu Oct 2 01:51:08 2025 +0200

    services: Add endlessh-service-type.
    
    * docs/guix.texi: Document EndleSSH service and configuration.
    * gnu/services/ssh.scm: New service.
    * gnu/services/ssh.scm: Define shepherd service.
    
    Merges: https://codeberg.org/guix/guix/pulls/5910
    Co-Authored-By: Giacomo Leidi <[email protected]>
    Change-Id: Ief4520b536276b88f2e5027ef0897bf84b2835df
    Signed-off-by: Giacomo Leidi <[email protected]>
---
 doc/guix.texi        | 52 +++++++++++++++++++++++++++++++++++++
 gnu/services/ssh.scm | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+)

diff --git a/doc/guix.texi b/doc/guix.texi
index 436ae58878..0d57b516ba 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -24321,6 +24321,58 @@ Whether to enable password-based authentication.
 @end table
 @end deftp
 
+@cindex EndleSSH
+@defvar endlessh-service-type
+This is the type for the
+@uref{https://github.com/skeeto/endlessh,EndleSSH} program that runs an
+SSH tar pit. By very slowly sending an SSH banner, this program keeps
+unwanted visitors locked away from the actual SSH daemon.
+
+For example, to specify a service running Endlessh on port @code{2222}, add
+this call to the operating system's @code{services} field:
+
+@lisp
+(service endlessh-service-type
+         (endlessh-configuration
+          (port-number 2222)))
+@end lisp
+@end defvar
+
+@deftp {Data Type} endlessh-configuration
+This data type represents the configuration of an EndleSSH service.
+
+@table @asis
+@item @code{endlessh} (default: @var{endlessh})
+The EndleSSH package to use.
+
+@item @code{port-number} (default: @code{22})
+The TCP port where the daemon waits for incoming connections.
+
+@item @code{log-level} (default: @code{1})
+The log level. @code{0} is quiet, @code{2} is very noisy.
+
+@item @code{syslog-output?} (default: @code{#t})
+Whether to enable syslog output.
+
+@item @code{pid-file} (default: @code{"/var/run/endlessh.pid"})
+File name of the daemon's PID file.
+
+@item @code{message-delay} (default: @code{10000})
+The endless banner is sent one line at a time. This is the delay in
+milliseconds between individual lines.
+
+@item @code{max-banner-length} (default: @code{32})
+The length of each line is randomized. This controls the maximum length
+of each line. Shorter lines may keep clients on for longer if they give
+up after a certain number of bytes.
+
+@item @code{max-clients} (default: @code{4096})
+Maximum number of connections to accept at a time. Connections beyond
+this are not immediately rejected, but will wait in the queue.
+
+@end table
+@end deftp
+
 @cindex AutoSSH
 @defvar autossh-service-type
 This is the type for the @uref{https://www.harding.motd.ca/autossh,
diff --git a/gnu/services/ssh.scm b/gnu/services/ssh.scm
index 77359501e4..d5c1c77800 100644
--- a/gnu/services/ssh.scm
+++ b/gnu/services/ssh.scm
@@ -70,6 +70,17 @@
             dropbear-service-type
             dropbear-service  ; deprecated
 
+            endlessh-configuration
+            endlessh-configuration?
+            endlessh-configuration-endlessh
+            endlessh-configuration-port-number
+            endlessh-configuration-log-level
+            endlessh-configuration-syslog-output?
+            endlessh-configuration-message-delay
+            endlessh-configuration-max-banner-length
+            endlessh-configuration-max-clients
+            endlessh-service-type
+
             autossh-configuration
             autossh-configuration?
             autossh-service-type
@@ -524,6 +535,68 @@ object."
   (service dropbear-service-type config))
 
 
+;;;
+;;; Endlessh.
+;;;
+
+(define-record-type* <endlessh-configuration>
+  endlessh-configuration make-endlessh-configuration
+  endlessh-configuration?
+  (endlessh               endlessh-configuration-endlessh
+                          (default endlessh))
+  (port-number            endlessh-configuration-port-number
+                          (default 22))
+  (log-level              endlessh-configuration-log-level
+                          (default 1))
+  (syslog-output?         endlessh-configuration-syslog-output?
+                          (default #t))
+  (message-delay          endlessh-configuration-message-delay
+                          (default 10000))
+  (max-banner-length      endlessh-configuration-max-banner-length
+                          (default 32))
+  (max-clients            endlessh-configuration-max-clients
+                          (default 4096)))
+
+(define (endlessh-shepherd-service config)
+  "Return a <shepherd-service> for endlessh with CONFIG."
+  (define endlessh
+    (endlessh-configuration-endlessh config))
+
+  (define endlessh-config
+    (format #f "Port ~a~%Delay ~a~%MaxLineLength ~a~%MaxClients ~a~%LogLevel 
~a"
+            (endlessh-configuration-port-number config)
+            (endlessh-configuration-message-delay config)
+            (endlessh-configuration-max-banner-length config)
+            (endlessh-configuration-max-clients config)
+            (endlessh-configuration-log-level config)))
+
+  (define endlessh-command
+    #~(list (string-append #$endlessh "/bin/endlessh")
+            "-f" #$(plain-file "endlessh_config" endlessh-config)
+            #$@(if (endlessh-configuration-syslog-output? config) '("-s") 
'())))
+
+  (define requires
+    (if (endlessh-configuration-syslog-output? config)
+        '(user-processes networking syslogd)
+        '(user-processes networking)))
+
+  (list (shepherd-service
+          (documentation "EndleSSH server.")
+          (requirement requires)
+          (provision '(endlessh))
+          (start #~(make-forkexec-constructor #$endlessh-command))
+          (stop #~(make-kill-destructor)))))
+
+(define endlessh-service-type
+  (service-type (name 'endlessh)
+                (description
+                 "Run the EndleSSH secure shell (SSH) tarpit.")
+                (extensions
+                 (list (service-extension shepherd-root-service-type
+                                          endlessh-shepherd-service)))
+                (default-value (endlessh-configuration))))
+
+
 ;;;
 ;;; AutoSSH.
 ;;;

Reply via email to