summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivien Kraus <vivien@planete-kraus.eu>2021-08-26 21:59:10 +0200
committerVivien Kraus <vivien@planete-kraus.eu>2021-08-27 00:30:27 +0200
commitcc99fc576dc2cf1ac54b83cc1c71f5259695abb3 (patch)
tree3906b34ef2927fb36a98b6c52cdb940aec5e3e93
parent787820d8c3e3404e791a0a7d0091f4a497c57277 (diff)
Add a minetest service type
-rw-r--r--guix/vkraus/modules/firewall.scm4
-rw-r--r--guix/vkraus/modules/minetest.scm127
2 files changed, 129 insertions, 2 deletions
diff --git a/guix/vkraus/modules/firewall.scm b/guix/vkraus/modules/firewall.scm
index 87eaf78..0ffc9ad 100644
--- a/guix/vkraus/modules/firewall.scm
+++ b/guix/vkraus/modules/firewall.scm
@@ -70,5 +70,5 @@ table inet firewall {
(make-firewall
;; TCP ports: SSH, HTTP, HTTPS, IMAP, IPAMS, SMTP, SMTP, SMTPS, SMTPAUTH, XMPP-client, XMPP-server, MUMBLE
'(22 http https 143 993 25 10025 465 587 5222 5269 64738)
- ;; UDP ports
- '(http https 64738)))
+ ;; UDP ports with Minetest
+ '(http https 64738 30000)))
diff --git a/guix/vkraus/modules/minetest.scm b/guix/vkraus/modules/minetest.scm
new file mode 100644
index 0000000..e84e5bb
--- /dev/null
+++ b/guix/vkraus/modules/minetest.scm
@@ -0,0 +1,127 @@
+(define-module (vkraus modules minetest)
+ #:use-module (gnu services)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu services admin)
+ #:use-module (gnu system shadow)
+ #:use-module (guix gexp)
+ #:use-module (guix modules)
+ #:use-module (guix records)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages minetest)
+ #:use-module (gnu packages admin)
+ #:use-module (srfi srfi-9)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 optargs)
+ #:export
+ (<minetest-server-configuration>
+ make-minetest-server-configuration
+ minetest-server-configuration?
+ minetest-server-configuration-password
+ minetest-server-configuration-games
+ minetest-server-configuration-mods
+ minetest-shepherd-service
+ minetest-service-type))
+
+(define-record-type <minetest-server-configuration>
+ (make-minetest-server-configuration games mods)
+ minetest-server-configuration?
+ (games minetest-server-configuration-games)
+ (mods minetest-server-configuration-mods))
+
+(define minetest-shepherd-service
+ (match-lambda
+ (($ <minetest-server-configuration> games mods)
+ (let ((script-file
+ (computed-file
+ "minetest-with-log-files"
+ #~(begin
+ (call-with-output-file #$output
+ (lambda (port)
+ (format port "#!~a/bin/bash
+
+~a/bin/minetest \"$@\" >> /var/log/minetest/server.log 2>>/var/log/minetest/server.err
+"
+ #$bash #$minetest)))
+ (chmod #$output #o755))))
+ (game-pack
+ (directory-union
+ "minetest-game-pack"
+ (map (cute file-append <> "/share/minetest/games")
+ games)))
+ (mod-pack
+ (directory-union
+ "minetest-mod-pack"
+ (map (cute file-append <> "/share/minetest/mods")
+ mods)))
+ (config-file
+ (plain-file "minetest.conf"
+ "bind_address = eno1
+ipv6_server = true
+")))
+ (list
+ (shepherd-service
+ (provision '(minetest))
+ (documentation "Run a sensible minetest server")
+ (requirement '(user-processes))
+ (modules '((gnu build shepherd)
+ (gnu system file-systems)))
+ (start
+ (with-imported-modules
+ (source-module-closure
+ '((gnu build shepherd)
+ (gnu system file-systems)))
+ #~(begin
+ (let ((user (getpwnam "minetest")))
+ (for-each
+ (lambda (dir)
+ (mkdir-p dir)
+ (chown dir (passwd:uid user) (passwd:gid user))
+ (chmod dir #o700))
+ '("/var/log/minetest" "/var/lib/minetest"))
+ (chown "/etc/minetest/password" (passwd:uid user) (passwd:gid user))
+ (chmod "/etc/minetest/password" #o700)
+ (false-if-exception
+ (delete-file "/var/lib/minetest/home/.minetest/debug.txt"))
+ (make-forkexec-constructor
+ (list #$script-file
+ "--server"
+ "--password-file" "/etc/minetest/password"
+ "--world" "/var/lib/minetest/world"
+ "--config" #$config-file)
+ #:user "minetest"
+ #:group "minetest"
+ #:environment-variables
+ `(,(format #f "MINETEST_SUBGAME_PATH=~a" #$game-pack)
+ ,(format #f "MINETEST_MOD_PATH=~a" #$mod-pack)
+ "HOME=/var/lib/minetest/home"))))))
+ (stop #~(make-kill-destructor))))))))
+
+(define %minetest-accounts
+ (list (user-group
+ (name "minetest")
+ (system? #t))
+ (user-account
+ (name "minetest")
+ (group "minetest")
+ (system? #t)
+ (comment "The user that runs the minetest server.")
+ (home-directory "/var/empty")
+ (shell (file-append shadow "/sbin/nologin")))))
+
+(define %minetest-rottlog
+ `(,(log-rotation
+ (frequency 'weekly)
+ (files
+ (list "/var/log/minetest/server.log"
+ "/var/log/minetest/server.err"))
+ (options '("sharedscripts" "storedir /var/log/minetest")))))
+
+(define minetest-service-type
+ (service-type
+ (name 'minetest)
+ (extensions
+ (list
+ (service-extension account-service-type (const %minetest-accounts))
+ (service-extension rottlog-service-type (const %minetest-rottlog))
+ (service-extension shepherd-root-service-type minetest-shepherd-service)))))