barnard/barnard-ui

175 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
# barnard-ui
# Description: Make managing servers with barnard easy.
#
# Copyright 2019, F123 Consulting, <information@f123.org>
# Copyright 2019, Stormux, <storm_dragon@linux-a11y.org>
# Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
#
# This 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, or (at your option) any later
# version.
#
# This software 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 this package; see the file COPYING. If not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
#--code--
# the gettext essentials
export TEXTDOMAIN=barnard-ui
export TEXTDOMAINDIR=/usr/share/locale
source gettext.sh
# Log writing function
log() {
# Usage: command | log for just stdout.
# Or command |& log for stderr and stdout.
while read -r line ; do
echo "$line" | tee -a "$logFile" &> /dev/null
done
}
# Log file name is ~/.cache/scriptname.log
logFile="$HOME/.cache/${0##*/}.log"
# Clear previous logs
echo -n | tee "$logFile" &> /dev/null
# Settings to improve accessibility of dialog.
export DIALOGOPTS='--insecure --no-lines --visit-items'
inputbox() {
# Returns: text entered by the user
# Args 1, Instructions for box.
# args: 2 initial text (optional)
dialog --clear --backtitle "$(gettext "Enter text and press enter.")" \
--inputbox "$1" 0 0 "$2" --stdout
}
passwordbox() {
# Returns: text entered by the user
# Args 1, Instructions for box.
# args: 2 initial text (optional)
dialog --clear --backtitle "$(gettext "Enter text and press enter.")" \
--passwordbox "$1" 0 0 "$2" --stdout
}
msgbox() {
# Returns: None
# Shows the provided message on the screen with an ok button.
dialog --clear --msgbox "$*" 10 72
}
yesno() {
# Returns: Yes or No
# Args: Question to user.
# Called in if $(yesno) == "Yes"
# Or variable=$(yesno)
dialog --clear --backtitle "$(gettext "Press 'Enter' for \"yes\" or 'Escape' for \"no\".")" --yesno "$*" 10 80 --stdout
if [[ $? -eq 0 ]]; then
echo "Yes"
else
echo "No"
fi
}
menulist() {
# Args: menu options.
# returns: selected tag
local i
local menuList
for i in $@ ; do
menuList+=("$i" "$i")
done
dialog --backtitle "$(gettext "Use the up and down arrow keys to find the option you want, then press enter to select it.")" \
--clear \
--no-tags \
--menu "$(gettext "Please select one")" 0 0 0 "${menuList[@]}" --stdout
}
[[ -d ~/.config/barnard ]] || mkdir ~/.config/barnard
if [[ ! -r ~/.config/barnard/servers.conf ]]; then
echo "Adding default mumble server." | log
echo "declare -Ag mumbleServerList=(" > ~/.config/barnard/servers.conf
echo "[Slint]=\"slint.fr:64738 -insecure\"" >> ~/.config/barnard/servers.conf
echo ")" >> ~/.config/barnard/servers.conf
fi
source ~/.config/barnard/servers.conf
function add-server() {
local serverName="$(inputbox "$(gettext "Enter a name for the new server:")")"
[[ $? -ne 0 ]] && return
local serverAddress="$(inputbox "$(gettext "Enter the address of the server. If there is a password, do it in the form, password@address, if the port is not standard, add it after a :, address:port:")")"
[[ $? -ne 0 ]] && return
local serverPassword="${serverAddress%@*}"
local serverAddress="${serverAddress#*@}"
local serverPort="${serverAddress##*:}"
local serverAddress="${serverAddress%:*}"
if ! [[ "$serverPort" =~ ^[0-9]+ ]]; then
serverPort=64738
fi
mumbleServerList[$serverName]="${serverAddress}:${serverPort}${serverPassword:+ -password ${serverPassword}}"
echo "declare -Ag mumbleServerList=(" > ~/.config/barnard/servers.conf
for i in "${!mumbleServerList[@]}" ; do
echo "[${i}]=\"${mumbleServerList[$i]}\"" >> ~/.config/barnard/servers.conf
done
echo ")" >> ~/.config/barnard/servers.conf
echo "Added server $serverName ${serverAddress}:${serverPort}" | log
msgbox "$(gettext "Added server") $serverName"
}
connect() {
ifs="$IFS"
IFS=$'\n'
local serverName
serverName="$(menulist "${!mumbleServerList[@]}" "Go Back")"
[[ $? -eq 1 ]] && exit 0
IFS="$ifs"
if [[ -z "$serverName" || "$serverName" == "Go Back" ]]; then
return
fi
local username="$(grep '^username: .*$' ~/.barnard.yaml 2> /dev/null | cut -d ' ' -f2-)"
username="${username//[[:space:]]/_}"
username="${username//\"/}"
command barnard -username "${username:-${USER}-${HOSTNAME}}" -server ${mumbleServerList[$serverName]} --fifo ~/.config/barnard/cmd --buffers 16 |& log
}
remove-server() {
ifs="$IFS"
IFS=$'\n'
local serverName="$(menulist "${!mumbleServerList[@]}" "Go Back")"
IFS="$ifs"
if [[ -z "$serverName" || "$serverName" == "Go Back" ]]; then
return
fi
unset "mumbleServerList[$serverName]"
echo "declare -Ag mumbleServerList=(" > ~/.config/barnard/servers.conf
for i in "${!mumbleServerList[@]}" ; do
echo "[${i}]=\"${mumbleServerList[$i]}\"" >> ~/.config/barnard/servers.conf
done
echo ")" >> ~/.config/barnard/servers.conf
echo "Removed server $serverName ${serverAddress}:${serverPort}" | log
msgbox "$(gettext "Removed server") $serverName"
}
# main menu
while : ; do
action="$(menulist "Connect" "Add_server" "Remove_server")"
[[ $? -eq 1 ]] && exit 0
action="${action,,}"
action="${action//_/-}"
if [[ "$action" == "exit" ]]; then
exit 0
fi
eval "$action"
done