wait for container station on start, web panel update

This commit is contained in:
crieke
2026-04-15 03:12:19 +02:00
parent a1fc9585d3
commit 1222396af4
9 changed files with 224 additions and 153 deletions

View File

@@ -112,7 +112,7 @@ QPKG_NAME="RoonServer"
PKG_MAIN_REMOVE="{ PKG_MAIN_REMOVE="{
## Remove Roon Servers docker image ## Remove Roon Servers docker image
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f SYS_QPKG_CONFIG_FILE` CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f "${SYS_QPKG_CONFIG_FILE}"`
$CS_DIR/bin/system-docker image rm 'ghcr.io/roonlabs/roonserver:latest' $CS_DIR/bin/system-docker image rm 'ghcr.io/roonlabs/roonserver:latest'
}" }"
@@ -153,7 +153,7 @@ pkg_install(){
## Creating required folders and setting permissions ## Creating required folders and setting permissions
"${CMD_MKDIR}" -m 777 "${SYS_QPKG_DIR}"/id "${CMD_MKDIR}" -m 777 "${SYS_QPKG_DIR}"/id
CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f SYS_QPKG_CONFIG_FILE` CS_DIR=`$CMD_GETCFG "container-station" Install_Path -f "${SYS_QPKG_CONFIG_FILE}"`
# Pull Roon Server docker image, so the first qpkg launch will take less time. # Pull Roon Server docker image, so the first qpkg launch will take less time.
$CS_DIR/bin/system-docker pull 'ghcr.io/roonlabs/roonserver:latest' $CS_DIR/bin/system-docker pull 'ghcr.io/roonlabs/roonserver:latest'

View File

@@ -3,7 +3,7 @@ QPKG_NAME="RoonServer"
# Name of the display application. # Name of the display application.
QPKG_DISPLAY_NAME="Roon Server" QPKG_DISPLAY_NAME="Roon Server"
# Version of the packaged application. # Version of the packaged application.
QPKG_VER="2026-04-14" QPKG_VER="2026-04-15"
# Author or maintainer of the package # Author or maintainer of the package
QPKG_AUTHOR="Christopher Rieke" QPKG_AUTHOR="Christopher Rieke"
# License for the packaged application # License for the packaged application
@@ -12,7 +12,7 @@ QPKG_AUTHOR="Christopher Rieke"
QPKG_SUMMARY="Roon organizes your personal music files, TIDAL streams, and internet radio stations and adds rich data like artist photos, bios, tour dates, lyrics, credits, and more. Using Roon Server with remote apps for Mac, Windows, iOS, and Android you can stream audio around your home to Sonos, AirPlay, Squeezebox, and Roon Ready devices." QPKG_SUMMARY="Roon organizes your personal music files, TIDAL streams, and internet radio stations and adds rich data like artist photos, bios, tour dates, lyrics, credits, and more. Using Roon Server with remote apps for Mac, Windows, iOS, and Android you can stream audio around your home to Sonos, AirPlay, Squeezebox, and Roon Ready devices."
# Preferred number in start/stop sequence. # Preferred number in start/stop sequence.
QPKG_RC_NUM="101" QPKG_RC_NUM="200"
# Init-script used to control the start and stop of the installed application. # Init-script used to control the start and stop of the installed application.
QPKG_SERVICE_PROGRAM="RoonServer.sh" QPKG_SERVICE_PROGRAM="RoonServer.sh"

View File

@@ -4,10 +4,10 @@ QPKG_NAME="RoonServer"
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}` QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}`
QCS_NAME="container-station" QCS_NAME="container-station"
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f $CONF) QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f ${CONF})
DOCKER_CMD=$QCS_QPKG_DIR/bin/system-docker DOCKER_CMD="${QCS_QPKG_DIR}/bin/system-docker"
CONTAINER_NAME=roonserver CONTAINER_NAME=roonserver
COMPOSE_YML_DIR=$QPKG_ROOT/docker/compose COMPOSE_YML_DIR="${QPKG_ROOT}/docker/compose"
ROONSERVER_OPTIONS=(`/sbin/getcfg $QPKG_NAME options -f ${CONF}`) ROONSERVER_OPTIONS=(`/sbin/getcfg $QPKG_NAME options -f ${CONF}`)
ROON_CHANNEL="production" ROON_CHANNEL="production"
@@ -34,6 +34,9 @@ ROON_DATABASE_DIR_FREE_INODES=`df -PThi "${ROON_DATAROOT}" | awk '{print $5}' |
ROON_FFMPEG_DIR="${ROON_DATAROOT}/bin" ROON_FFMPEG_DIR="${ROON_DATAROOT}/bin"
ROON_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt" ROON_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt"
echo $(basename "$0") >> ${ROON_LOG_FILE}
echo $@ >> ${ROON_LOG_FILE}
ST_COLOR="\033[38;5;34m" ST_COLOR="\033[38;5;34m"
HL_COLOR="\033[38;5;197m" HL_COLOR="\033[38;5;197m"
REG_COLOR="\033[0m" REG_COLOR="\033[0m"
@@ -44,22 +47,6 @@ do
declare $i=true declare $i=true
done done
compose_docker_yml_files () {
COMPOSE_FILES="\
-f ${COMPOSE_YML_DIR}/roonserver.yml \
-f ${COMPOSE_YML_DIR}/platform_specific.yml "
[ -z ${smb_cifs+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/smb_cifs_support.yml"
( [ -z ${usb_audio+x} ] && [ -z ${hdmi_audio+x} ] ) || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio.yml"
[ -z ${usb_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_usb.yml"
[ -z ${hdmi_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_hdmi.yml"
}
## Log Function ## Log Function
echolog () { echolog () {
TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S) TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S)
@@ -77,8 +64,18 @@ echolog () {
fi fi
} }
info () compose_docker_yml_files () {
{ COMPOSE_FILES="\
-f ${COMPOSE_YML_DIR}/roonserver.yml \
-f ${COMPOSE_YML_DIR}/platform_specific.yml "
[ -z ${smb_cifs+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/smb_cifs_support.yml"
( [ -z ${usb_audio+x} ] && [ -z ${hdmi_audio+x} ] ) || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio.yml"
[ -z ${usb_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_usb.yml"
[ -z ${hdmi_audio+x} ] || COMPOSE_FILES="${COMPOSE_FILES} -f $COMPOSE_YML_DIR/audio_hdmi.yml"
}
info () {
## Echoing System Info ## Echoing System Info
echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]" echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]"
echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}" echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}"
@@ -95,30 +92,42 @@ info ()
echolog "Roon-Channel" "${ROON_CHANNEL}" echolog "Roon-Channel" "${ROON_CHANNEL}"
} }
RoonOnNAS_folderCheck () RoonOnNAS_folderCheck () {
{
if [ -d "${ROONONNAS_DIR}" ]; then if [ -d "${ROONONNAS_DIR}" ]; then
[ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS" [ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS"
[ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin" [ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin"
fi fi
} }
start_RoonServer () { getCSStatus () {
if [ "${ROON_DATAROOT}" != "/RoonOnNAS" ] && [ -d "${ROON_DATAROOT}" ]; then echo "$(/sbin/getcfg container-station status -f /etc/qpkg_run_status)"
compose_docker_yml_files
export_vars
## Creating required directories, if they do not exist
[ -d "$ROON_ID_HOST_DIR" ] || mkdir "$ROON_ID_HOST_DIR"
[ -d "$ROON_TMP_DIR" ] || mkdir "$ROON_TMP_DIR"
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
fi
} }
export_vars ()
{ checkCS () {
case $(getCSStatus) in
0)
echolog "Container Station down."
exit 1;
;;
1)
echolog "Container Station is starting..."
SECONDS=0
until [[ $(getCSStatus) == "2" ]]; do
if (( SECONDS > 120 )); then
echolog "Giving up..."
exit 1
fi
echolog "($SECONDS) Container Station is not up yet. Waiting..."
sleep 5
done
;;
2)
echolog "Container Station is up."
;;
esac
}
export_vars () {
export ROON_DATAROOT export ROON_DATAROOT
export QPKG_ROOT export QPKG_ROOT
export QNAP_MODEL export QNAP_MODEL
@@ -128,55 +137,90 @@ export_vars ()
export ROON_CHANNEL export ROON_CHANNEL
} }
start_daemon () start_webpanel () {
{
[ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess" [ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess"
info
#Launch the service in the background if RoonServer share exists. #Launch the service in the background if RoonServer share exists.
ln -sfn "${QPKG_ROOT}/web" "${WEB_PATH}${WEBUI}" ln -sfn "${QPKG_ROOT}/web" "${WEB_PATH}${WEBUI}"
start_RoonServer }
}
start_roonserver () {
if [ "${ROON_DATAROOT}" != "/RoonOnNAS" ] && [ -d "${ROON_DATAROOT}" ]; then
compose_docker_yml_files
export_vars
## Creating required directories, if they do not exist
[ -d "$ROON_ID_HOST_DIR" ] || mkdir "$ROON_ID_HOST_DIR"
[ -d "$ROON_TMP_DIR" ] || mkdir "$ROON_TMP_DIR"
echo "Docker Command: $(ls -lha ${DOCKER_CMD})" 2>&1 >> ${ROON_LOG_FILE}
echo "Docker CMD: $(${DOCKER_CMD} --version)" 2>&1 >> ${ROON_LOG_FILE}
echo "COMPOSE_FILES: ${COMPOSE_FILES}" 2>&1 >> ${ROON_LOG_FILE}
echo "CS Run-Status: $(/sbin/getcfg container-station status -f /etc/qpkg_run_status)" >> ${ROON_LOG_FILE}
sleep 60
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d 2>&1 >> ${ROON_LOG_FILE}
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
fi
}
case "$1" in case "$1" in
start) start)
ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF) RS_ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
RoonOnNAS_folderCheck CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
if [ "$ENABLED" != "TRUE" ]; then
if [ "$RS_ENABLED" != "TRUE" ]; then
echolog "$QPKG_NAME is disabled." echolog "$QPKG_NAME is disabled."
exit 1 exit 1
fi fi
if [ "$CS_ENABLED" != "TRUE" ]; then
echolog "Container Station is disabled."
exit 1
fi
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME) CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then if [ ! "$CONTAINER_ID" ]; then
echo "not running" echolog "Starting Roon Server..."
start_daemon info
checkCS
RoonOnNAS_folderCheck
start_webpanel
start_roonserver
else else
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)" echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
fi fi
;; ;;
stop) stop)
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
# Check if CS has not been stopped before Roon Server
if [ "$CS_ENABLED" == "TRUE" ]; then
# --> CS is still up.
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME) CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
if [ ! "$CONTAINER_ID" ]; then if [ ! "$CONTAINER_ID" ]; then
# --> No roonserver conatiner running
echolog "${QPKG_NAME} is not running." echolog "${QPKG_NAME} is not running."
else else
# --> Stopping roonserver conatiner
echolog "Stopping RoonServer..." echolog "Stopping RoonServer..."
compose_docker_yml_files compose_docker_yml_files
export_vars export_vars
${DOCKER_CMD} compose ${COMPOSE_FILES} down ${DOCKER_CMD} compose ${COMPOSE_FILES} down
if [[ $2 != "keepwebalive" ]]; then [ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
rm -rf "${QPKG_ROOT}/web/tmp"/*
rm "${WEB_PATH}${WEBUI}"
fi
echolog "RoonServer has been stopped." echolog "RoonServer has been stopped."
fi fi
else
# -> CS is disabled:
# Edge case: CS has been stopped before RoonServer. We can assume RoonServer docker is down. Only the web-panel needs to be removed
[ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
echolog "RoonServer is not running."
fi
;; ;;
restart) restart)
isRestart=true
$0 stop $0 stop
$0 start $0 start
;; ;;
*) *)
echo "Usage: $0 {start|stop|restart}" echo "Usage: $0 {start|stop|restart}"
exit 1 exit 1

View File

@@ -90,7 +90,7 @@ $ContributorsManual = array(
<br><br> <br><br>
<div id="about-github" style="background-color: #d7d7d7; padding: 20px; text-align: center;"> <div id="about-github" style="padding: 20px; text-align: center;">
<div> <div>
<?php echo localize("MODAL_ABOUT_GITHUB"); ?><br> <?php echo localize("MODAL_ABOUT_GITHUB"); ?><br>
<div style="text-align: center; font-size: 50px;"> <div style="text-align: center; font-size: 50px;">

View File

@@ -28,7 +28,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br> <p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br>
<?php echo localize("OVERVIEW_TEXT2"); ?></p>--> <?php echo localize("OVERVIEW_TEXT2"); ?></p>-->
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-8">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<span class="fa-stack fa-2x"> <span class="fa-stack fa-2x">
@@ -39,7 +39,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<p class="card-text"> <p class="card-text">
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?> <b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
:</b> <?php if (strlen(isRunning()) > 1 ) { :</b> <?php if (strlen(isRunning()) > 1 ) {
echo '<span data-bs-toggle="tooltip" title="' . localize("OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID") .': ' . isRunning() . '" style="color: green;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_RUNNING") . '</span>'; echo '<span data-bs-toggle="tooltip" data-bs-title="' . localize("OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID") .': ' . isRunning() . '" style="color: green;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_RUNNING") . '</span>';
} else { } else {
echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>'; echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>';
} ?><br> } ?><br>
@@ -49,7 +49,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span> :</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
</p> </p>
<h5><?php echo localize("OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE"); ?></h5> <h5><?php echo localize("OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE"); ?></h5>
<span data-bs-toggle="tooltip" title="<?php echo $dblocation; ?>"> <span data-bs-toggle="tooltip" data-bs-title="<?php echo $dblocation; ?>">
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_LOCATION"); ?>: </b><?php echo $dblocation; ?> <b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_LOCATION"); ?>: </b><?php echo $dblocation; ?>
</span> </span>
<div class="progress" style="height: 20px;"> <div class="progress" style="height: 20px;">
@@ -59,19 +59,21 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<?php echo $db_perc . '% ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_OF") . ' ' . displayStorage($db_vol_cap) . ' ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_USED") . '.'; ?> <?php echo $db_perc . '% ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_OF") . ' ' . displayStorage($db_vol_cap) . ' ' . localize("OVERVIEW_ROONSERVER_PANEL_SPACE_USED") . '.'; ?>
</p> </p>
<div class="row"> <div class="row">
<span id="log" class="col getModal d-flex justify-content-start"> <span id="log" class="col-2 getModal d-flex justify-content-start">
<a href="#" <a href="#"
class="btn btn-light btn-icon float-left" class="btn btn-outline-danger"
data-bs-theme="dark"
data-bs-toggle="tooltip" data-bs-toggle="tooltip"
title="<?php echo localize("MODAL_LOGFILES_ICON_TOOLTIP"); ?>"> data-bs-title="<?php echo localize("MODAL_LOGFILES_ICON_TOOLTIP"); ?>">
<i class="fas fa-ambulance"></i> <i class="fas fa-ambulance"></i>
</a> </a>
</span> </span>
<span id="setStorage" class="col-6 getModal float-right"> <span id="setStorage" class="col-9 getModal ms-auto float-end">
<a href="#" <a href="#"
class="btn btn-primary" class="btn btn-primary"
data-bs-theme="dark"
data-bs-toggle="tooltip" data-bs-toggle="tooltip"
title="<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP"); ?>"> data-bs-title="<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP"); ?>">
<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION"); ?> <?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION"); ?>
</a> </a>
</span> </span>
@@ -79,15 +81,14 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-4">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<span class="fa-stack fa-2x"> <span class="fa-stack fa-2x">
<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i> <i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>
<i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i> <i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i>
</span> </span>
<h5>Settings</h5> <h5><?php echo localize("OVERVIEW_OPTIONS_PANEL_TITLE"); ?></h5>
<div class=" d-grid gap-3 w-50">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)"> <input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)">
@@ -95,7 +96,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
</div> </div>
<div class="form-check form-switch"> <div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="usb_audio" onchange="changeSettings(this)"> <input class="form-check-input" type="checkbox" role="switch" id="usb_audio" onchange="changeSettings(this)">
<label class="form-check-label justify-content-start" for="flexSwitchCheckChecked">USB audio (DAC)</label> <label class="form-check-label justify-content-start" for="flexSwitchCheckChecked" data-bs-toggle="tooltip" data-bs-title="<?php echo localize("OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP"); ?>">USB audio (DAC)</label>
</div> </div>
<div class="form-check form-switch"> <div class="form-check form-switch">
@@ -103,14 +104,15 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<label class="form-check-label justify-content-start text-left" for="flexSwitchCheckChecked">HDMI audio</label> <label class="form-check-label justify-content-start text-left" for="flexSwitchCheckChecked">HDMI audio</label>
</div> </div>
</div> <span id="save" class="getModal">
<span id="saveOptions" class="getModal">
<a href="#" <a href="#"
class="btn btn-primary float-right" id="saveButton"
class="btn btn-primary float-right disabled"
data-bs-toggle="tooltip" data-bs-toggle="tooltip"
onclick="saveOptions()" onclick="saveOptions()"
title="Save Options"> data-bs-title="Save & Restart"
Save data-bs-theme="dark"
><?php echo localize("OVERVIEW_OPTIONS_PANEL_SAVE_BTN"); ?>
</a> </a>
</span> </span>
</div> </div>
@@ -127,11 +129,6 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
echo "false"; echo "false";
} ?>; } ?>;
// Enable Tooltips
$(function () {
document.querySelectorAll('[data-bs-toggle="tooltip"]')
});
// Action when button for Modal is clicked // Action when button for Modal is clicked
$('.getModal').on('click', function (e) { $('.getModal').on('click', function (e) {
@@ -149,20 +146,42 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
$('#modal').modal('show'); $('#modal').modal('show');
return false; return false;
}); });
function changeSettings(el) { function changeSettings() {
// add code to guide user to press save next var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
//console.log(el.id + ": " + el.checked); var qpkg_options_arr = qpkg_options_str.split(' ');
var qnap_opt_arr = [];
document.getElementById('smb_cifs').checked && qnap_opt_arr.push("smb_cifs");
document.getElementById('usb_audio').checked && qnap_opt_arr.push("usb_audio");
document.getElementById('hdmi_audio').checked && qnap_opt_arr.push("hdmi_audio");
console.log(qnap_opt_arr.join(' ') == qpkg_options_arr.join(' '));
console.log(qnap_opt_arr.join(' ') == qpkg_options_arr.join(' '));
if ( qnap_opt_arr.join(' ') == qpkg_options_arr.join(' ') ) {
$("#saveButton").addClass("disabled");
} else {
$("#saveButton").removeClass("disabled");
}
} }
$( document ).ready(function() { $( document ).ready(function() {
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>"; var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
if ( qpkg_options_str.length > 0 ) {
var qpkg_options_arr = qpkg_options_str.split(' '); var qpkg_options_arr = qpkg_options_str.split(' ');
for (let conf_option of qpkg_options_arr) { for (let conf_option of qpkg_options_arr) {
document.getElementById(conf_option).checked = true; document.getElementById(conf_option).checked = true;
} }
}
}); });
// Function to download log files // Function to download log files
function saveOptions () { function saveOptions () {
var qnap_options = ""; var qnap_options = "";
@@ -170,6 +189,8 @@ function saveOptions () {
qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ; qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ;
qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ; qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ;
$("#saveButton").addClass("disabled");
document.getElementById('smb_cifs').checked document.getElementById('smb_cifs').checked
var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options; var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options;

View File

@@ -57,6 +57,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
imageCssClassField: 'faCssClass', imageCssClassField: 'faCssClass',
uiLibrary: 'bootstrap5', uiLibrary: 'bootstrap5',
cascadeSelection: false, cascadeSelection: false,
cascadeCheck: false,
selectionType: 'single', selectionType: 'single',
icons: { icons: {
expand: '<i class="fas fa-angle-right" />', expand: '<i class="fas fa-angle-right" />',
@@ -121,10 +122,11 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<div class="input-group"> <div class="input-group">
<span class="input-group-btn"> <span class="input-group-btn">
<span class="form form-control" <span class="form form-control"
style="background: #F5F5F5; border-radius: 0.25em 0 0 0.25em !important;" style="background: var(--bs-dark-bg-subtle); border-radius: 0.25em 0 0 0.25em !important;"
readonly><?php echo localize("MODAL_SETUP_DB_LOCATION"); ?></span> readonly><?php echo localize("MODAL_SETUP_DB_LOCATION"); ?></span>
</span> </span>
<input id="dblocform" type="text" class="form-control" style="background: #ffffff;" value="<?php <input id="dblocform" type="text" class="form-control" style="background: var(--bs-dark
); color: var(--bs-dark-text-emphasis)" value="<?php
if (isset($dblocation)) { if (isset($dblocation)) {
echo $dblocation; echo $dblocation;
} else { } else {

View File

@@ -38,13 +38,16 @@
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped", "OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped",
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version", "OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version", "OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
"OVERVIEW_ROONSERVER_PANEL_PID": "Process ID",
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database", "OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database",
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location", "OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location",
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of", "OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of",
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "used", "OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "used",
"OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID": "ID",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Change database location", "OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Change database location",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Change the location, where Roon Server stores its database.", "OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Change the location, where Roon Server stores its database.",
"OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP": "Enable this, if you want to connect usb audio devices directly to your QNAP NAS.",
"OVERVIEW_OPTIONS_PANEL_TITLE": "Settings",
"OVERVIEW_OPTIONS_PANEL_SAVE_BTN": "Save & Restart",
"OVERVIEW_AUDIO_PANEL_HEADLINE": "Connected Audio Devices", "OVERVIEW_AUDIO_PANEL_HEADLINE": "Connected Audio Devices",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimedia Functions disabled", "OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimedia Functions disabled",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1": "To use audio devices on your NAS, you'll need to turn them on in the General section of the QNAP ControlPanel.", "OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1": "To use audio devices on your NAS, you'll need to turn them on in the General section of the QNAP ControlPanel.",

View File

@@ -39,28 +39,17 @@
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten", "OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten",
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version", "OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version", "OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
"OVERVIEW_ROONSERVER_PANEL_PID": "Prozess ID", "OVERVIEW_ROONSERVER_PANEL_CONTAINER_ID": "ID",
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Datenbank", "OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Datenbank",
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Speicherort", "OVERVIEW_ROONSERVER_PANEL_LOCATION": "Speicherort",
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von", "OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von",
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt", "OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Speicherort ändern", "OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION": "Speicherort ändern",
"OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Speicherort ändern, an dem Roon Server seine Datenbank sichert.", "OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION_TOOLTIP": "Speicherort ändern, an dem Roon Server seine Datenbank sichert.",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimediafunktionen deaktiviert", "OVERVIEW_OPTIONS_PANEL_USB_AUDIO_TOOLTIP": "Zur Verwendung von lokalen Audiogeräten direkt am QNAP.",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1": "Zur Verwendung von lokalen Audiogeräten am QNAP, aktiviere Multimediafunktionen in den allgemeinen Einstellungen der QNAP Systemsteuerung.", "OVERVIEW_OPTIONS_PANEL_TITLE": "Einstellungen",
"OVERVIEW_OPTIONS_PANEL_SAVE_BTN": "Speichern & Neustarten",
"OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION2": "Um Audiogeräte direkt an deinem QNAP zu verwenden, muss Roon Server neu gestartet werden.", "OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION2": "Um Audiogeräte direkt an deinem QNAP zu verwenden, muss Roon Server neu gestartet werden.",
"OVERVIEW_AUDIO_PANEL_HEADLINE": "Verbundene Audiogeräte",
"OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES": "Audiogeräte",
"OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES_TOOLTIP": "Zeigt den Inhalt der Datei '<i>/proc/asound/cards</i>'",
"MODAL_REINSTALL_HEADLINE": "Roon Server erneut installieren?",
"MODAL_REINSTALL_DESCRIPTION_1": "Möchtest du die aktuelle Version von Roon Server installieren?",
"MODAL_REINSTALL_DESCRIPTION_2": "Bei diesem Vorgang werden die Programmdateien, durch die aktuelle Version von der Roon Labs Webseite ersetzt.",
"MODAL_REINSTALL_LOADING": "Laden...",
"MODAL_REINSTALL_ICON_TOOLTIP": "Aktuelle Version des Roon Server erneut von der Roon Labs Webseite laden.",
"MODAL_REINSTALL_DB_UNTOUCHED": "Deine Roon Datanbank bleibt dabei unberührt.",
"MODAL_REINSTALL_ROONSERVER_WILL_STOP": "Roon Server wird für diesen Vorgang kurzzeitig beendet.",
"MODAL_REINSTALL_PROCEED_TEXT": "Ja, mein QNAP soll die aktuelle Roon Server Version laden und installieren",
"MODAL_REINSTALL_DONE": "Roon Server wurde durch die aktuelle Version von der Roon Labs Webseite ersetzt.",
"MODAL_LOGFILES_HEADLINE": "Log-Dateien laden", "MODAL_LOGFILES_HEADLINE": "Log-Dateien laden",
"MODAL_LOGFILES_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.", "MODAL_LOGFILES_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.",
"MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.", "MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.",

View File

@@ -4,7 +4,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html data-bs-theme="dark">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -73,24 +73,17 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
} }
?> ?>
<!-- <nav class="navbar navbar-expand-lg navbar-light bg-light"> -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top"> <nav class="navbar navbar-expand-lg bg-body-tertiary" data-bs-theme="dark">
<a class="navbar-brand " href="index.php"> <div class="container-fluid">
<a class="navbar-brand" href="#">
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;"> <img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
</a> Roon Server</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-target="#navbarsExampleDefault" <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault"> <div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link active" href="index.php"><?php echo localize("NAV_MENU_ROONSERVER"); ?></a>
</li>
</ul>
';
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown pull-right dropdown-menu-right"> <li class="nav-item dropdown pull-right dropdown-menu-right">
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown" <a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a> aria-haspopup="true" aria-expanded="false"><?php echo localize("NAV_MENU_MORE"); ?></a>
@@ -109,8 +102,27 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<a id="about" class="getModal nav-link float-right" href="#"><i class="fas fa-info-circle"></i> <?php echo localize('NAV_MENU_INFO'); ?></a> <a id="about" class="getModal nav-link float-right" href="#"><i class="fas fa-info-circle"></i> <?php echo localize('NAV_MENU_INFO'); ?></a>
</li> </li>
</ul> </ul>
<!--
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item me-auto dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
</ul>-->
</div>
</div> </div>
</nav> </nav>
<div id="contentblock"> <div id="contentblock">
<?php <?php
$section = "info"; $section = "info";