diff options
author | Vivien Kraus <vivien@planete-kraus.eu> | 2021-08-26 21:59:10 +0200 |
---|---|---|
committer | Vivien Kraus <vivien@planete-kraus.eu> | 2021-08-27 00:30:27 +0200 |
commit | cc99fc576dc2cf1ac54b83cc1c71f5259695abb3 (patch) | |
tree | 3906b34ef2927fb36a98b6c52cdb940aec5e3e93 | |
parent | 787820d8c3e3404e791a0a7d0091f4a497c57277 (diff) |
Add a minetest service type
-rw-r--r-- | guix/vkraus/modules/firewall.scm | 4 | ||||
-rw-r--r-- | guix/vkraus/modules/minetest.scm | 127 |
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))))) |