services: Add murmur.
* gnu/services/telephony.scm: New file. * gnu/local.mk: Add it. * doc/guix.texi (Telephony Services): New node. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
		
							parent
							
								
									6692d8454a
								
							
						
					
					
						commit
						b6d2930d1f
					
				
					 3 changed files with 514 additions and 0 deletions
				
			
		
							
								
								
									
										208
									
								
								doc/guix.texi
									
										
									
									
									
								
							
							
						
						
									
										208
									
								
								doc/guix.texi
									
										
									
									
									
								
							|  | @ -221,6 +221,7 @@ Services | |||
| * Database Services::           SQL databases, key-value stores, etc. | ||||
| * Mail Services::               IMAP, POP3, SMTP, and all that. | ||||
| * Messaging Services::          Messaging services. | ||||
| * Telephony Services::          Telephony services. | ||||
| * Monitoring Services::         Monitoring services. | ||||
| * Kerberos Services::           Kerberos services. | ||||
| * Web Services::                Web servers. | ||||
|  | @ -9308,6 +9309,7 @@ declaration. | |||
| * Database Services::           SQL databases, key-value stores, etc. | ||||
| * Mail Services::               IMAP, POP3, SMTP, and all that. | ||||
| * Messaging Services::          Messaging services. | ||||
| * Telephony Services::          Telephony services. | ||||
| * Monitoring Services::         Monitoring services. | ||||
| * Kerberos Services::           Kerberos services. | ||||
| * Web Services::                Web servers. | ||||
|  | @ -14189,6 +14191,212 @@ string, you could instantiate a prosody service like this: | |||
|           (prosody.cfg.lua ""))) | ||||
| @end example | ||||
| 
 | ||||
| 
 | ||||
| @node Telephony Services | ||||
| @subsubsection Telephony Services | ||||
| 
 | ||||
| @cindex Murmur (VoIP server) | ||||
| @cindex VoIP server | ||||
| This section describes how to set up and run a Murmur server.  Murmur is | ||||
| the server of the @uref{https://mumble.info, Mumble} voice-over-IP | ||||
| (VoIP) suite. | ||||
| 
 | ||||
| @deftp {Data Type} murmur-configuration | ||||
| The service type for the Murmur server.  An example configuration can | ||||
| look like this: | ||||
| 
 | ||||
| @example | ||||
| (service murmur-service-type | ||||
|          (murmur-configuration | ||||
|           (welcome-text | ||||
|             "Welcome to this Mumble server running on GuixSD!") | ||||
|           (cert-required? #t) ;disallow text password logins | ||||
|           (ssl-cert "/etc/letsencrypt/live/mumble.example.com/fullchain.pem") | ||||
|           (ssl-key "/etc/letsencrypt/live/mumble.example.com/privkey.pem"))) | ||||
| @end example | ||||
| 
 | ||||
| After reconfiguring your system, you can manually set the murmur @code{SuperUser} | ||||
| password with the command that is printed during the activation phase. | ||||
| 
 | ||||
| It is recommended to register a normal Mumble user account | ||||
| and grant it admin or moderator rights. | ||||
| You can use the @code{mumble} client to | ||||
| login as new normal user, register yourself, and log out. | ||||
| For the next step login with the name @code{SuperUser} use | ||||
| the @code{SuperUser} password that you set previously, | ||||
| and grant your newly registered mumble user administrator or moderator | ||||
| rights and create some channels. | ||||
| 
 | ||||
| Available @code{murmur-configuration} fields are: | ||||
| 
 | ||||
| @table @asis | ||||
| @item @code{package} (default: @code{mumble}) | ||||
| Package that contains @code{bin/murmurd}. | ||||
| 
 | ||||
| @item @code{user} (default: @code{"murmur"}) | ||||
| User who will run the Murmur server. | ||||
| 
 | ||||
| @item @code{group} (default: @code{"murmur"}) | ||||
| Group of the user who will run the murmur server. | ||||
| 
 | ||||
| @item @code{port} (default: @code{64738}) | ||||
| Port on which the server will listen. | ||||
| 
 | ||||
| @item @code{welcome-text} (default: @code{""}) | ||||
| Welcome text sent to clients when they connect. | ||||
| 
 | ||||
| @item @code{server-password} (default: @code{""}) | ||||
| Password the clients have to enter in order to connect. | ||||
| 
 | ||||
| @item @code{max-users} (default: @code{100}) | ||||
| Maximum of users that can be connected to the server at once. | ||||
| 
 | ||||
| @item @code{max-user-bandwidth} (default: @code{#f}) | ||||
| Maximum voice traffic a user can send per second. | ||||
| 
 | ||||
| @item @code{database-file} (default: @code{"/var/lib/murmur/db.sqlite"}) | ||||
| File name of the sqlite database. | ||||
| The service's user will become the owner of the directory. | ||||
| 
 | ||||
| @item @code{log-file} (default: @code{"/var/log/murmur/murmur.log"}) | ||||
| File name of the log file. | ||||
| The service's user will become the owner of the directory. | ||||
| 
 | ||||
| @item @code{autoban-attempts} (default: @code{10}) | ||||
| Maximum number of logins a user can make in @code{autoban-timeframe} | ||||
| without getting auto banned for @code{autoban-time}. | ||||
| 
 | ||||
| @item @code{autoban-timeframe} (default: @code{120}) | ||||
| Timeframe for autoban in seconds. | ||||
| 
 | ||||
| @item @code{autoban-time} (default: @code{300}) | ||||
| Amount of time in seconds for which a client gets banned | ||||
| when violating the autoban limits. | ||||
| 
 | ||||
| @item @code{opus-threshold} (default: @code{100}) | ||||
| Percentage of clients that need to support opus | ||||
| before switching over to opus audio codec. | ||||
| 
 | ||||
| @item @code{channel-nesting-limit} (default: @code{10}) | ||||
| How deep channels can be nested at maximum. | ||||
| 
 | ||||
| @item @code{channelname-regex} (default: @code{#f}) | ||||
| A string in from of a Qt regular expression that channel names must conform to. | ||||
| 
 | ||||
| @item @code{username-regex} (default: @code{#f}) | ||||
| A string in from of a Qt regular expression that user names must conform to. | ||||
| 
 | ||||
| @item @code{text-message-length} (default: @code{5000}) | ||||
| Maximum size in bytes that a user can send in one text chat message. | ||||
| 
 | ||||
| @item @code{image-message-length} (default: @code{(* 128 1024)}) | ||||
| Maximum size in bytes that a user can send in one image message. | ||||
| 
 | ||||
| @item @code{cert-required?} (default: @code{#f}) | ||||
| If it is set to @code{#t} clients that use weak password authentification | ||||
| will not be accepted. Users must have completed the certificate wizard to join. | ||||
| 
 | ||||
| @item @code{remember-channel?} (defualt @code{#f}) | ||||
| Should murmur remember the last channel each user was in when they disconnected | ||||
| and put them into the remembered channel when they rejoin. | ||||
| 
 | ||||
| @item @code{allow-html?} (default: @code{#f}) | ||||
| Should html be allowed in text messages, user comments, and channel descriptions. | ||||
| 
 | ||||
| @item @code{allow-ping?} (default: @code{#f}) | ||||
| Setting to true exposes the current user count, the maximum user count, and | ||||
| the server's maximum bandwidth per client to unauthenticated users. In the | ||||
| Mumble client, this information is shown in the Connect dialog. | ||||
| 
 | ||||
| Disabling this setting will prevent public listing of the server. | ||||
| 
 | ||||
| @item @code{bonjour?} (default: @code{#f}) | ||||
| Should the server advertise itself in the local network through the bonjour protocol. | ||||
| 
 | ||||
| @item @code{send-version?} (default: @code{#f}) | ||||
| Should the murmur server version be exposed in ping requests. | ||||
| 
 | ||||
| @item @code{log-days} (default: @code{31}) | ||||
| Murmur also stores logs in the database, which are accessible via RPC. | ||||
| The default is 31 days of months, but you can set this setting to 0 to keep logs forever, | ||||
| or -1 to disable logging to the database. | ||||
| 
 | ||||
| @item @code{obfuscate-ips?} (default @code{#t}) | ||||
| Should logged ips be obfuscated to protect the privacy of users. | ||||
| 
 | ||||
| @item @code{ssl-cert} (default: @code{#f}) | ||||
| File name of the SSL/TLS certificate used for encrypted connections. | ||||
| 
 | ||||
| @example | ||||
| (ssl-cert "/etc/letsencrypt/live/example.com/fullchain.pem") | ||||
| @end example | ||||
| @item @code{ssl-key} (default: @code{#f}) | ||||
| Filepath to the ssl private key used for encrypted connections. | ||||
| @example | ||||
| (ssl-key "/etc/letsencrypt/live/example.com/privkey.pem") | ||||
| @end example | ||||
| 
 | ||||
| @item @code{ssl-dh-params} (default: @code{#f}) | ||||
| File name of a PEM-encoded file with Diffie-Hellman parameters | ||||
| for the SSL/TLS encryption.  Alternatively you set it to | ||||
| @code{"@@ffdhe2048"}, @code{"@@ffdhe3072"}, @code{"@@ffdhe4096"}, @code{"@@ffdhe6144"} | ||||
| or @code{"@@ffdhe8192"} to use bundled parameters from RFC 7919. | ||||
| 
 | ||||
| @item @code{ssl-ciphers} (default: @code{#f}) | ||||
| The @code{ssl-ciphers} option chooses the cipher suites to make available for use | ||||
| in SSL/TLS. | ||||
| 
 | ||||
| This option is specified using | ||||
| @uref{https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT, | ||||
| OpenSSL cipher list notation}. | ||||
| 
 | ||||
| It is recommended that you try your cipher string using 'openssl ciphers <string>' | ||||
| before setting it here, to get a feel for which cipher suites you will get. | ||||
| After setting this option, it is recommend that you inspect your Murmur log | ||||
| to ensure that Murmur is using the cipher suites that you expected it to. | ||||
| 
 | ||||
| Note: Changing this option may impact the backwards compatibility of your | ||||
| Murmur server, and can remove the ability for older Mumble clients to be able | ||||
| to connect to it. | ||||
| 
 | ||||
| @item @code{public-registration} (default: @code{#f}) | ||||
| Must be a @code{<murmur-public-registration-configuration>} record or @code{#f}. | ||||
| 
 | ||||
| You can optionally register your server in the public server list that the | ||||
| @code{mumble} client shows on startup. | ||||
| You cannot register your server if you have set a @code{server-password}, | ||||
| or set @code{allow-ping} to @code{#f}. | ||||
| 
 | ||||
| It might take a few hours until it shows up in the public list. | ||||
| 
 | ||||
| @item @code{file} (default: @code{#f}) | ||||
| Optional alternative override for this configuration. | ||||
| @end table | ||||
| @end deftp | ||||
| 
 | ||||
| @deftp {Data Type} murmur-public-registration-configuration | ||||
| Configuration for public registration of a murmur service. | ||||
| 
 | ||||
| @table @asis | ||||
| @item @code{name} | ||||
| This is a display name for your server. Not to be confused with the hostname. | ||||
| 
 | ||||
| @item @code{password} | ||||
| A password to identify your registration. | ||||
| Subsequent updates will need the same password. Don't lose your password. | ||||
| 
 | ||||
| @item @code{url} | ||||
| This should be a @code{http://} or @code{https://} link to your web | ||||
| site. | ||||
| 
 | ||||
| @item @code{hostname} (default: @code{#f}) | ||||
| By default your server will be listed by its IP address. | ||||
| If it is set your server will be linked by this host name instead. | ||||
| @end table | ||||
| @end deftp | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @node Monitoring Services | ||||
| @subsubsection Monitoring Services | ||||
| 
 | ||||
|  |  | |||
|  | @ -461,6 +461,7 @@ GNU_SYSTEM_MODULES =				\ | |||
|   %D%/services/spice.scm				\
 | ||||
|   %D%/services/ssh.scm				\
 | ||||
|   %D%/services/sysctl.scm			\
 | ||||
|   %D%/services/telephony.scm			\
 | ||||
|   %D%/services/version-control.scm              \
 | ||||
|   %D%/services/vpn.scm				\
 | ||||
|   %D%/services/web.scm				\
 | ||||
|  |  | |||
							
								
								
									
										305
									
								
								gnu/services/telephony.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								gnu/services/telephony.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,305 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2017 nee  <nee-git@hidamari.blue> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
| ;;; GNU Guix is free software; you can redistribute it and/or modify it | ||||
| ;;; under the terms of the GNU General Public License as published by | ||||
| ;;; the Free Software Foundation; either version 3 of the License, or (at | ||||
| ;;; your option) any later version. | ||||
| ;;; | ||||
| ;;; GNU Guix is distributed in the hope that it will be useful, but | ||||
| ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ;;; GNU General Public License for more details. | ||||
| ;;; | ||||
| ;;; You should have received a copy of the GNU General Public License | ||||
| ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| (define-module (gnu services telephony) | ||||
|   #:use-module (gnu services) | ||||
|   #:use-module (gnu services shepherd) | ||||
|   #:use-module (gnu system shadow) | ||||
|   #:use-module (gnu packages admin) | ||||
|   #:use-module (gnu packages telephony) | ||||
|   #:use-module (guix records) | ||||
|   #:use-module (guix gexp) | ||||
|   #:use-module (srfi srfi-1) | ||||
|   #:use-module (ice-9 match) | ||||
|   #:export (murmur-configuration | ||||
|             make-murmur-configuration | ||||
|             murmur-configuration? | ||||
|             murmur-configuration-package | ||||
|             murmur-configuration-user | ||||
|             murmur-configuration-group | ||||
|             murmur-configuration-port | ||||
|             murmur-configuration-welcome-text | ||||
|             murmur-configuration-server-password | ||||
|             murmur-configuration-max-users | ||||
|             murmur-configuration-max-user-bandwidth | ||||
|             murmur-configuration-database-file | ||||
|             murmur-configuration-log-file | ||||
|             murmur-configuration-pid-file | ||||
|             murmur-configuration-autoban-attempts | ||||
|             murmur-configuration-autoban-timeframe | ||||
|             murmur-configuration-autoban-time | ||||
|             murmur-configuration-opus-threshold | ||||
|             murmur-configuration-channel-nesting-limit | ||||
|             murmur-configuration-channelname-regex | ||||
|             murmur-configuration-username-regex | ||||
|             murmur-configuration-text-message-length | ||||
|             murmur-configuration-image-message-length | ||||
|             murmur-configuration-cert-required? | ||||
|             murmur-configuration-remember-channel? | ||||
|             murmur-configuration-allow-html? | ||||
|             murmur-configuration-allow-ping? | ||||
|             murmur-configuration-bonjour? | ||||
|             murmur-configuration-send-version? | ||||
|             murmur-configuration-log-days | ||||
|             murmur-configuration-obfuscate-ips? | ||||
|             murmur-configuration-ssl-cert | ||||
|             murmur-configuration-ssl-key | ||||
|             murmur-configuration-ssl-dh-params | ||||
|             murmur-configuration-ssl-ciphers | ||||
|             murmur-configuration-public-registration | ||||
|             murmur-configuration-file | ||||
| 
 | ||||
|             murmur-public-registration-configuration | ||||
|             make-murmur-public-registration-configuration | ||||
|             murmur-public-registration-configuration? | ||||
|             murmur-public-registration-configuration-name | ||||
|             murmur-public-registration-configuration-url | ||||
|             murmur-public-registration-configuration-password | ||||
|             murmur-public-registration-configuration-hostname | ||||
| 
 | ||||
|             murmur-service-type)) | ||||
| 
 | ||||
| ;; https://github.com/mumble-voip/mumble/blob/master/scripts/murmur.ini | ||||
| 
 | ||||
| (define-record-type* <murmur-configuration> murmur-configuration | ||||
|   make-murmur-configuration | ||||
|   murmur-configuration? | ||||
|   (package               murmur-configuration-package ;<package> | ||||
|                          (default mumble)) | ||||
|   (user                  murmur-configuration-user | ||||
|                          (default "murmur")) | ||||
|   (group                 murmur-configuration-group | ||||
|                          (default "murmur")) | ||||
|   (port                  murmur-configuration-port | ||||
|                          (default 64738)) | ||||
|   (welcome-text          murmur-configuration-welcome-text | ||||
|                          (default "")) | ||||
|   (server-password       murmur-configuration-server-password | ||||
|                          (default "")) | ||||
|   (max-users             murmur-configuration-max-users | ||||
|                          (default 100)) | ||||
|   (max-user-bandwidth    murmur-configuration-max-user-bandwidth | ||||
|                          (default #f)) | ||||
|   (database-file         murmur-configuration-database-file | ||||
|                          (default "/var/lib/murmur/db.sqlite")) | ||||
|   (log-file              murmur-configuration-log-file | ||||
|                          (default "/var/log/murmur/murmur.log")) | ||||
|   (pid-file              murmur-configuration-pid-file | ||||
|                          (default "/var/run/murmur/murmur.pid")) | ||||
|   (autoban-attempts      murmur-configuration-autoban-attempts | ||||
|                          (default 10)) | ||||
|   (autoban-timeframe     murmur-configuration-autoban-timeframe | ||||
|                          (default 120)) | ||||
|   (autoban-time          murmur-configuration-autoban-time | ||||
|                          (default 300)) | ||||
|   (opus-threshold        murmur-configuration-opus-threshold | ||||
|                          (default 100)) ; integer percent | ||||
|   (channel-nesting-limit murmur-configuration-channel-nesting-limit | ||||
|                          (default 10)) | ||||
|   (channelname-regex     murmur-configuration-channelname-regex | ||||
|                          (default #f)) | ||||
|   (username-regex        murmur-configuration-username-regex | ||||
|                          (default #f)) | ||||
|   (text-message-length   murmur-configuration-text-message-length | ||||
|                          (default 5000)) | ||||
|   (image-message-length  murmur-configuration-image-message-length | ||||
|                          (default (* 128 1024))) ; 128 Kilobytes | ||||
|   (cert-required?         murmur-configuration-cert-required? | ||||
|                           (default #f)) | ||||
|   (remember-channel?     murmur-configuration-remember-channel? | ||||
|                          (default #f)) | ||||
|   (allow-html?           murmur-configuration-allow-html? | ||||
|                          (default #f)) | ||||
|   (allow-ping?           murmur-configuration-allow-ping? | ||||
|                          (default #f)) | ||||
|   (bonjour?              murmur-configuration-bonjour? | ||||
|                          (default #f)) | ||||
|   (send-version?         murmur-configuration-send-version? | ||||
|                          (default #f)) | ||||
|   (log-days              murmur-configuration-log-days | ||||
|                          (default 31)) | ||||
|   (obfuscate-ips?        murmur-obfuscate-ips? | ||||
|                          (default #t)) | ||||
|   (ssl-cert              murmur-configuration-ssl-cert | ||||
|                          (default #f)) | ||||
|   (ssl-key               murmur-configuration-ssl-key | ||||
|                          (default #f)) | ||||
|   (ssl-dh-params         murmur-configuration-ssl-dh-params | ||||
|                          (default #f)) | ||||
|   (ssl-ciphers           murmur-configuration-ssl-ciphers | ||||
|                          (default #f)) | ||||
|   (public-registration   murmur-configuration-public-registration | ||||
|                          (default #f))  ; <murmur-public-registration-configuration> | ||||
|   (file                  murmur-configuration-file | ||||
|                          (default #f))) | ||||
| 
 | ||||
| (define-record-type* <murmur-public-registration-configuration> | ||||
|   murmur-public-registration-configuration | ||||
|   make-murmur-public-registration-configuration | ||||
|   murmur-public-registration-configuration? | ||||
|   (name         murmur-public-registration-configuration-name) | ||||
|   (password     murmur-public-registration-configuration-password) | ||||
|   (url          murmur-public-registration-configuration-url) | ||||
|   (hostname     murmur-public-registration-configuration-hostname | ||||
|                 (default #f))) | ||||
| 
 | ||||
| (define (flatten . lst) | ||||
|   "Return a list that recursively concatenates all sub-lists of LST." | ||||
|   (define (flatten1 head out) | ||||
|     (if (list? head) | ||||
|         (fold-right flatten1 out head) | ||||
|         (cons head out))) | ||||
|   (fold-right flatten1 '() lst)) | ||||
| 
 | ||||
| (define (default-murmur-config config) | ||||
|   (match-record | ||||
|    config | ||||
|    <murmur-configuration> | ||||
|    (user port welcome-text server-password max-users max-user-bandwidth | ||||
|     database-file log-file pid-file autoban-attempts autoban-timeframe | ||||
|     autoban-time opus-threshold channel-nesting-limit channelname-regex | ||||
|     username-regex text-message-length image-message-length cert-required? | ||||
|     remember-channel? allow-html? allow-ping? bonjour? send-version? | ||||
|     log-days obfuscate-ips? ssl-cert ssl-key ssl-dh-params ssl-ciphers | ||||
|     public-registration) | ||||
|    (apply mixed-text-file "murmur.ini" | ||||
|           (flatten | ||||
|            "welcometext=" welcome-text "\n" | ||||
|            "port=" (number->string port) "\n" | ||||
|            (if server-password (list "serverpassword=" server-password "\n") '()) | ||||
|            (if max-user-bandwidth (list "bandwidth=" (number->string max-user-bandwidth)) '()) | ||||
|            "users=" (number->string max-users) "\n" | ||||
|            "uname=" user "\n" | ||||
|            "database=" database-file "\n" | ||||
|            "logfile=" log-file "\n" | ||||
|            "pidfile=" pid-file "\n" | ||||
|            (if autoban-attempts (list "autobanAttempts=" (number->string autoban-attempts) "\n") '()) | ||||
|            (if autoban-timeframe (list "autobanTimeframe=" (number->string autoban-timeframe) "\n") '()) | ||||
|            (if autoban-time (list "autobanTime=" (number->string autoban-time) "\n") '()) | ||||
|            (if opus-threshold (list "opusthreshold=" (number->string opus-threshold) "\n") '()) | ||||
|            (if channel-nesting-limit (list "channelnestinglimit=" (number->string channel-nesting-limit) "\n") '()) | ||||
|            (if channelname-regex (list "channelname=" channelname-regex "\n") '()) | ||||
|            (if username-regex (list "username=" username-regex "\n") '()) | ||||
|            (if text-message-length (list "textmessagelength=" (number->string text-message-length) "\n") '()) | ||||
|            (if image-message-length (list "imagemessagelength=" (number->string image-message-length) "\n") '()) | ||||
|            (if log-days (list "logdays=" (number->string log-days) "\n") '()) | ||||
|            "obfuscate=" (if obfuscate-ips? "true" "false") "\n" | ||||
|            "certrequired=" (if cert-required? "true" "false") "\n" | ||||
|            "rememberchannel=" (if remember-channel? "true" "false") "\n" | ||||
|            "allowhtml=" (if allow-html? "true" "false") "\n" | ||||
|            "allowping=" (if allow-ping? "true" "false") "\n" | ||||
|            "bonjour=" (if bonjour? "true" "false") "\n" | ||||
|            "sendversion=" (if send-version? "true" "false") "\n" | ||||
|            (cond ((and ssl-cert ssl-key) | ||||
|                   (list | ||||
|                    "sslCert=" ssl-cert "\n" | ||||
|                    "sslKey=" ssl-key "\n")) | ||||
|                  ((or ssl-cert ssl-key) | ||||
|                   (error "ssl-cert and ssl-key must both be set" | ||||
|                          ssl-cert ssl-key)) | ||||
|                  (else '())) | ||||
|            (if ssl-dh-params (list "sslDHParams=" ssl-dh-params) '()) | ||||
|            (if ssl-ciphers (list "sslCiphers=" ssl-ciphers) '()) | ||||
| 
 | ||||
|            (match public-registration | ||||
|              (#f '()) | ||||
|              (($ <murmur-public-registration-configuration> | ||||
|                  name password url hostname) | ||||
|               (if (and (or (not server-password) (string-null? server-password)) | ||||
|                        allow-ping?) | ||||
|                   (list | ||||
|                    "registerName=" name "\n" | ||||
|                    "registerPassword=" password "\n" | ||||
|                    "registerUrl=" url "\n" | ||||
|                    (if hostname | ||||
|                        (string-append "registerHostname=" hostname "\n") | ||||
|                        "")) | ||||
|                   (error "To publicly register your murmur server your server must be publicy visible | ||||
| and users must be able to join without a password. To fix this set: | ||||
| (allow-ping? #t) | ||||
| (server-password \"\") | ||||
| Or set public-registration to #f")))))))) | ||||
| 
 | ||||
| (define (murmur-activation config) | ||||
|   #~(begin | ||||
|       (use-modules (guix build utils)) | ||||
|       (let* ((log-dir (dirname #$(murmur-configuration-log-file config))) | ||||
|              (pid-dir (dirname #$(murmur-configuration-pid-file config))) | ||||
|              (db-dir (dirname #$(murmur-configuration-database-file config))) | ||||
|              (user (getpwnam #$(murmur-configuration-user config))) | ||||
|              (init-dir | ||||
|               (lambda (name dir) | ||||
|                 (format #t "creating murmur ~a directory '~a'\n" name dir) | ||||
|                 (mkdir-p dir) | ||||
|                 (chown dir (passwd:uid user) (passwd:gid user)) | ||||
|                 (chmod dir #o700))) | ||||
|              (ini #$(or (murmur-configuration-file config) | ||||
|                         (default-murmur-config config)))) | ||||
|         (init-dir "log" log-dir) | ||||
|         (init-dir "pid" pid-dir) | ||||
|         (init-dir "database" db-dir) | ||||
| 
 | ||||
|         (format #t "murmur: use config file: ~a~%\n" ini) | ||||
|         (format #t "murmur: to set the SuperUser password run: | ||||
|     `~a -ini ~a -readsupw`\n" | ||||
|                 #$(file-append (murmur-configuration-package config) | ||||
|                                "/bin/murmurd") ini) | ||||
|         #t))) | ||||
| 
 | ||||
| (define murmur-accounts | ||||
|   (match-lambda | ||||
|     (($ <murmur-configuration> _ user group) | ||||
|      (list | ||||
|       (user-group | ||||
|        (name group) | ||||
|        (system? #t)) | ||||
|       (user-account | ||||
|        (name user) | ||||
|        (group group) | ||||
|        (system? #t) | ||||
|        (comment "Murmur Daemon") | ||||
|        (home-directory "/var/empty") | ||||
|        (shell (file-append shadow "/sbin/nologin"))))))) | ||||
| 
 | ||||
| (define (murmur-shepherd-service config) | ||||
|   (list (shepherd-service | ||||
|          (provision '(murmur)) | ||||
|          (documentation "Run the Murmur Mumble server.") | ||||
|          (requirement '(networking)) | ||||
|          (start #~(make-forkexec-constructor | ||||
|                    '(#$(file-append (murmur-configuration-package config) | ||||
|                                     "/bin/murmurd") | ||||
|                      "-ini" | ||||
|                      #$(or (murmur-configuration-file config) | ||||
|                            (default-murmur-config config))) | ||||
|                    #:pid-file #$(murmur-configuration-pid-file config))) | ||||
|          (stop #~(make-kill-destructor))))) | ||||
| 
 | ||||
| (define murmur-service-type | ||||
|   (service-type (name 'murmur) | ||||
|                 (description | ||||
|                  "Run the Murmur voice-over-IP (VoIP) server of the Mumble | ||||
| suite.") | ||||
|                 (extensions | ||||
|                  (list (service-extension shepherd-root-service-type | ||||
|                                           murmur-shepherd-service) | ||||
|                        (service-extension activation-service-type | ||||
|                                           murmur-activation) | ||||
|                        (service-extension account-service-type | ||||
|                                           murmur-accounts))) | ||||
|                 (default-value (murmur-configuration)))) | ||||
		Reference in a new issue