(define-module (tw services games) #:use-module ((gnu packages admin) #:select (shadow)) #:use-module (gnu services) #:use-module (gnu services configuration) #:use-module (gnu services shepherd) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix records) #:use-module (tw packages games) #:export (minecraft-server-service-type minecraft-server-configuration)) ;; TODO: backups of Minecraft data (define-configuration/no-serialization minecraft-server-configuration (data-location (string "/var/lib/minecraft-server") "Path on disk where server data will be stored.") (port (integer 25565) "The port to bind the main server to.") (user-name (string "minecraft") "UNIX username to create for the server.") (group-name (string "minecraft") "UNIX group to create for the server.")) (define (minecraft-server-shepherd config) (match-record config (data-location port user-name group-name) (list (shepherd-service (provision '(minecraft-server)) (requirement '(networking)) (documentation "Run a Minecraft server.") (start #~(make-forkexec-constructor (list #$(file-append minecraft-server "/bin/minecraft-server") "--nogui" "--port" #$(number->string port)) #:user #$user-name #:group #$group-name #:directory #$data-location)) (stop #~(make-kill-destructor)))))) (define (minecraft-server-activation config) (match-record config (data-location) #~(with-output-to-file (string-append #$data-location "/eula.txt") (lambda () (display "eula=true") (newline))))) (define (minecraft-server-accounts config) (match-record config (data-location user-name group-name) (list (user-account (name user-name) (group group-name) (comment "Minecraft server user") (system? #t) (home-directory data-location) (shell (file-append shadow "/sbin/nologin"))) (user-group (name group-name) (system? #t))))) (define minecraft-server-service-type (service-type (name 'minecraft-server) (extensions (list (service-extension shepherd-root-service-type minecraft-server-shepherd) (service-extension activation-service-type minecraft-server-activation) (service-extension account-service-type minecraft-server-accounts))) (default-value (minecraft-server-configuration)) (description "Run a Minecraft server.")))