Files
configure-server/.includes/mumble.sh
2026-04-16 19:46:49 -04:00

243 lines
6.4 KiB
Bash

#!/usr/bin/env bash
mumbleConfigFile="/etc/mumble/mumble-server.ini"
mumbleWelcomeFile="/etc/mumble/welcomefile.html"
mumbleDefaultPort="64738"
mumble_installed() {
pacman -Q mumble-server &> /dev/null
}
ufw_installed() {
pacman -Q ufw &> /dev/null
}
valid_port() {
local portValue="$1"
[[ "$portValue" =~ ^[0-9]+$ ]] && (( portValue >= 1 && portValue <= 65535 ))
}
install_mumble_server() {
if mumble_installed; then
return 0
fi
if ! install_package mumble-server; then
msgbox "Failed to install mumble-server."
return 1
fi
return 0
}
set_mumble_config_value() {
local keyName="$1"
local keyValue="$2"
local tempFile=""
tempFile="$(mktemp)"
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2024,SC2154
if ! sudo "${sudoFlags[@]}" awk -v keyName="$keyName" -v keyValue="$keyValue" '
BEGIN {
updated = 0
}
$0 ~ "^[;#]?[[:space:]]*" keyName "[[:space:]]*=" {
print keyName "=" keyValue
updated = 1
next
}
{
print
}
END {
if (!updated) {
print keyName "=" keyValue
}
}
' "$mumbleConfigFile" > "$tempFile"; then
rm -f "$tempFile"
msgbox "Failed to update ${keyName} in ${mumbleConfigFile}."
return 1
fi
if ! sudo "${sudoFlags[@]}" install -m 640 "$tempFile" "$mumbleConfigFile"; then
rm -f "$tempFile"
msgbox "Failed to save ${mumbleConfigFile}."
return 1
fi
rm -f "$tempFile"
return 0
}
clear_mumble_config_value() {
local keyName="$1"
set_mumble_config_value "$keyName" ""
}
read_mumble_port() {
local configuredPort=""
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2154
if sudo "${sudoFlags[@]}" test -r "$mumbleConfigFile"; then
configuredPort="$(sudo "${sudoFlags[@]}" awk -F '=' '
BEGIN { IGNORECASE = 1 }
/^[[:space:]]*port[[:space:]]*=/ {
value = $2
sub(/[[:space:]]*#.*$/, "", value)
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
port = value
}
END {
if (port != "") {
print port
}
}
' "$mumbleConfigFile")"
fi
if valid_port "$configuredPort"; then
printf '%s\n' "$configuredPort"
else
printf '%s\n' "$mumbleDefaultPort"
fi
}
capture_welcome_message() {
local tempFile=""
local messageSize=0
if [[ "$(yesno "Would you like to create a welcome message now?")" != "Yes" ]]; then
return 1
fi
tempFile="$(mktemp)"
clear
cat <<'EOF'
Enter the Mumble welcome message below.
HTML is supported.
Press Ctrl+D on a new line when you are finished.
Leave it blank and press Ctrl+D to skip it.
EOF
cat > "$tempFile"
messageSize="$(wc -c < "$tempFile")"
if [[ "$messageSize" -eq 0 ]]; then
rm -f "$tempFile"
return 1
fi
printf '%s\n' "$tempFile"
return 0
}
install_welcome_message() {
local messageFile="$1"
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2154
if ! sudo "${sudoFlags[@]}" install -m 644 "$messageFile" "$mumbleWelcomeFile"; then
msgbox "Failed to write ${mumbleWelcomeFile}."
return 1
fi
set_mumble_config_value "welcometextfile" "$mumbleWelcomeFile"
}
set_mumble_superuser_password() {
local superuserPassword="$1"
if [[ -z "$superuserPassword" ]]; then
msgbox "The SuperUser password cannot be blank."
return 1
fi
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2154
if ! printf '%s\n' "$superuserPassword" | sudo "${sudoFlags[@]}" mumble-server -ini "$mumbleConfigFile" -readsupw; then
msgbox "Failed to set the Mumble SuperUser password."
return 1
fi
return 0
}
enable_mumble_service() {
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2154
if ! sudo "${sudoFlags[@]}" systemctl enable --now mumble-server; then
msgbox "Mumble was configured, but the service failed to enable or start."
return 1
fi
return 0
}
configure_mumble_firewall() {
local mumblePort=""
if ! ufw_installed; then
return 0
fi
if [[ "$(yesno "ufw is installed. Open the default Mumble port now?")" != "Yes" ]]; then
return 0
fi
mumblePort="$(read_mumble_port)"
# `sudoFlags` is initialized by the main launcher before sourcing this file.
# shellcheck disable=SC2154
if ! sudo "${sudoFlags[@]}" ufw allow "${mumblePort}/tcp"; then
msgbox "Failed to allow ${mumblePort}/tcp for Mumble."
return 1
fi
# shellcheck disable=SC2154
if ! sudo "${sudoFlags[@]}" ufw allow "${mumblePort}/udp"; then
msgbox "Failed to allow ${mumblePort}/udp for Mumble."
return 1
fi
msgbox "The default Mumble firewall rules were added."
return 0
}
install_mumble_server || return 1
superuserPassword="$(passwordbox "Enter the Mumble SuperUser password.")" || return 1
serverPassword="$(passwordbox "Enter a server password, or leave blank for no server password.")" || return 1
allowRecordingChoice="$(yesno "Allow users to record audio on this server?")"
welcomeMessageFile=""
welcomeMessageFile="$(capture_welcome_message || true)"
reset
set_mumble_superuser_password "$superuserPassword" || return 1
if [[ -n "$serverPassword" ]]; then
set_mumble_config_value "serverpassword" "$serverPassword" || return 1
else
clear_mumble_config_value "serverpassword" || return 1
fi
if [[ "$allowRecordingChoice" == "Yes" ]]; then
set_mumble_config_value "allowRecording" "true" || return 1
else
set_mumble_config_value "allowRecording" "false" || return 1
fi
if [[ -n "$welcomeMessageFile" ]]; then
install_welcome_message "$welcomeMessageFile" || {
rm -f "$welcomeMessageFile"
return 1
}
rm -f "$welcomeMessageFile"
else
clear_mumble_config_value "welcometextfile" || return 1
fi
enable_mumble_service || return 1
configure_mumble_firewall || return 1
msgbox "Basic Mumble configuration is complete. To fine tune your setup, edit ${mumbleConfigFile} as root."