wait for container station on start, web panel update
This commit is contained in:
@@ -112,7 +112,7 @@ QPKG_NAME="RoonServer"
|
||||
PKG_MAIN_REMOVE="{
|
||||
|
||||
## 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'
|
||||
|
||||
}"
|
||||
@@ -153,7 +153,7 @@ pkg_install(){
|
||||
## Creating required folders and setting permissions
|
||||
"${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.
|
||||
$CS_DIR/bin/system-docker pull 'ghcr.io/roonlabs/roonserver:latest'
|
||||
|
||||
@@ -3,7 +3,7 @@ QPKG_NAME="RoonServer"
|
||||
# Name of the display application.
|
||||
QPKG_DISPLAY_NAME="Roon Server"
|
||||
# Version of the packaged application.
|
||||
QPKG_VER="2026-04-14"
|
||||
QPKG_VER="2026-04-15"
|
||||
# Author or maintainer of the package
|
||||
QPKG_AUTHOR="Christopher Rieke"
|
||||
# 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."
|
||||
|
||||
# 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.
|
||||
QPKG_SERVICE_PROGRAM="RoonServer.sh"
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@ QPKG_NAME="RoonServer"
|
||||
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f ${CONF}`
|
||||
|
||||
QCS_NAME="container-station"
|
||||
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f $CONF)
|
||||
DOCKER_CMD=$QCS_QPKG_DIR/bin/system-docker
|
||||
QCS_QPKG_DIR=$(/sbin/getcfg $QCS_NAME Install_Path -f ${CONF})
|
||||
DOCKER_CMD="${QCS_QPKG_DIR}/bin/system-docker"
|
||||
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}`)
|
||||
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_LOG_FILE="${ROON_DATAROOT}/RoonOnNAS.log.txt"
|
||||
|
||||
echo $(basename "$0") >> ${ROON_LOG_FILE}
|
||||
echo $@ >> ${ROON_LOG_FILE}
|
||||
|
||||
ST_COLOR="\033[38;5;34m"
|
||||
HL_COLOR="\033[38;5;197m"
|
||||
REG_COLOR="\033[0m"
|
||||
@@ -44,22 +47,6 @@ do
|
||||
declare $i=true
|
||||
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
|
||||
echolog () {
|
||||
TIMESTAMP=$(date +%d.%m.%y-%H:%M:%S)
|
||||
@@ -77,8 +64,18 @@ echolog () {
|
||||
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
|
||||
echolog "ROON_DATABASE_DIR" "${ROON_DATAROOT} - [`[ -d \"${ROON_DATAROOT}\" ] && echo \"available\" || echo \"not available\"`]"
|
||||
echolog "ROON_DATABASE_DIR_FS" "${ROON_DATABASE_DIR_FS}"
|
||||
@@ -95,30 +92,42 @@ info ()
|
||||
echolog "Roon-Channel" "${ROON_CHANNEL}"
|
||||
}
|
||||
|
||||
RoonOnNAS_folderCheck ()
|
||||
{
|
||||
RoonOnNAS_folderCheck () {
|
||||
if [ -d "${ROONONNAS_DIR}" ]; then
|
||||
[ -d "${ROONONNAS_DIR}/RoonOnNAS" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS"
|
||||
[ -d "${ROONONNAS_DIR}/RoonOnNAS/bin" ] || mkdir "${ROONONNAS_DIR}/RoonOnNAS/bin"
|
||||
fi
|
||||
}
|
||||
|
||||
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"
|
||||
|
||||
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
|
||||
|
||||
fi
|
||||
getCSStatus () {
|
||||
echo "$(/sbin/getcfg container-station status -f /etc/qpkg_run_status)"
|
||||
}
|
||||
|
||||
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_vars () {
|
||||
export ROON_DATAROOT
|
||||
export QPKG_ROOT
|
||||
export QNAP_MODEL
|
||||
@@ -128,55 +137,90 @@ export_vars ()
|
||||
export ROON_CHANNEL
|
||||
}
|
||||
|
||||
start_daemon ()
|
||||
{
|
||||
start_webpanel () {
|
||||
[ -f ${ROON_DATAROOT}/earlyaccess.txt ] && ROON_CHANNEL="earlyaccess"
|
||||
info
|
||||
#Launch the service in the background if RoonServer share exists.
|
||||
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
|
||||
start)
|
||||
ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
|
||||
RoonOnNAS_folderCheck
|
||||
if [ "$ENABLED" != "TRUE" ]; then
|
||||
echolog "$QPKG_NAME is disabled."
|
||||
exit 1
|
||||
fi
|
||||
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
|
||||
if [ ! "$CONTAINER_ID" ]; then
|
||||
echo "not running"
|
||||
start_daemon
|
||||
else
|
||||
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
|
||||
fi
|
||||
RS_ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -d FALSE -f $CONF)
|
||||
CS_ENABLED=$(/sbin/getcfg "container-station" Enable -u -d FALSE -f $CONF)
|
||||
|
||||
if [ "$RS_ENABLED" != "TRUE" ]; then
|
||||
echolog "$QPKG_NAME is disabled."
|
||||
exit 1
|
||||
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)
|
||||
if [ ! "$CONTAINER_ID" ]; then
|
||||
echolog "Starting Roon Server..."
|
||||
info
|
||||
checkCS
|
||||
RoonOnNAS_folderCheck
|
||||
start_webpanel
|
||||
start_roonserver
|
||||
else
|
||||
echolog "${QPKG_NAME} is already running (ID: $CONTAINER_ID)"
|
||||
fi
|
||||
;;
|
||||
|
||||
stop)
|
||||
CONTAINER_ID=$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)
|
||||
if [ ! "$CONTAINER_ID" ]; then
|
||||
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)
|
||||
if [ ! "$CONTAINER_ID" ]; then
|
||||
# --> No roonserver conatiner running
|
||||
echolog "${QPKG_NAME} is not running."
|
||||
else
|
||||
else
|
||||
# --> Stopping roonserver conatiner
|
||||
echolog "Stopping RoonServer..."
|
||||
compose_docker_yml_files
|
||||
export_vars
|
||||
${DOCKER_CMD} compose ${COMPOSE_FILES} down
|
||||
if [[ $2 != "keepwebalive" ]]; then
|
||||
rm -rf "${QPKG_ROOT}/web/tmp"/*
|
||||
rm "${WEB_PATH}${WEBUI}"
|
||||
fi
|
||||
[ -d "${WEB_PATH}${WEBUI}" ] && rm "${WEB_PATH}${WEBUI}"
|
||||
echolog "RoonServer has been stopped."
|
||||
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)
|
||||
isRestart=true
|
||||
$0 stop
|
||||
$0 start
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart}"
|
||||
exit 1
|
||||
|
||||
@@ -90,7 +90,7 @@ $ContributorsManual = array(
|
||||
<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>
|
||||
<?php echo localize("MODAL_ABOUT_GITHUB"); ?><br>
|
||||
<div style="text-align: center; font-size: 50px;">
|
||||
|
||||
@@ -28,7 +28,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
<p class="lead"><?php echo localize("OVERVIEW_TEXT1"); ?><br>
|
||||
<?php echo localize("OVERVIEW_TEXT2"); ?></p>-->
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="col-sm-8">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<span class="fa-stack fa-2x">
|
||||
@@ -39,7 +39,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
<p class="card-text">
|
||||
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
|
||||
:</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 {
|
||||
echo '<span style="color: red;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED") . '</span>';
|
||||
} ?><br>
|
||||
@@ -49,7 +49,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
|
||||
</p>
|
||||
<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; ?>
|
||||
</span>
|
||||
<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") . '.'; ?>
|
||||
</p>
|
||||
<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="#"
|
||||
class="btn btn-light btn-icon float-left"
|
||||
class="btn btn-outline-danger"
|
||||
data-bs-theme="dark"
|
||||
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>
|
||||
</a>
|
||||
</span>
|
||||
<span id="setStorage" class="col-6 getModal float-right">
|
||||
<span id="setStorage" class="col-9 getModal ms-auto float-end">
|
||||
<a href="#"
|
||||
class="btn btn-primary"
|
||||
data-bs-theme="dark"
|
||||
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"); ?>
|
||||
</a>
|
||||
</span>
|
||||
@@ -79,23 +81,22 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="col-sm-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<span class="fa-stack fa-2x">
|
||||
<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>
|
||||
<i class="fas fa-cog fa-stack-1x" style="color: #ffffff;"></i>
|
||||
</span>
|
||||
<h5>Settings</h5>
|
||||
<div class=" d-grid gap-3 w-50">
|
||||
|
||||
<h5><?php echo localize("OVERVIEW_OPTIONS_PANEL_TITLE"); ?></h5>
|
||||
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="smb_cifs" onchange="changeSettings(this)">
|
||||
<label class="form-check-label justify-content-start" for="flexSwitchCheckChecked">SMB/CIFS mount support</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<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 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>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<span id="saveOptions" class="getModal">
|
||||
<span id="save" class="getModal">
|
||||
<a href="#"
|
||||
class="btn btn-primary float-right"
|
||||
id="saveButton"
|
||||
class="btn btn-primary float-right disabled"
|
||||
data-bs-toggle="tooltip"
|
||||
onclick="saveOptions()"
|
||||
title="Save Options">
|
||||
Save
|
||||
data-bs-title="Save & Restart"
|
||||
data-bs-theme="dark"
|
||||
><?php echo localize("OVERVIEW_OPTIONS_PANEL_SAVE_BTN"); ?>
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
@@ -127,11 +129,6 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
echo "false";
|
||||
} ?>;
|
||||
|
||||
// Enable Tooltips
|
||||
$(function () {
|
||||
document.querySelectorAll('[data-bs-toggle="tooltip"]')
|
||||
});
|
||||
|
||||
// Action when button for Modal is clicked
|
||||
$('.getModal').on('click', function (e) {
|
||||
|
||||
@@ -149,20 +146,42 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
$('#modal').modal('show');
|
||||
return false;
|
||||
});
|
||||
function changeSettings(el) {
|
||||
// add code to guide user to press save next
|
||||
//console.log(el.id + ": " + el.checked);
|
||||
function changeSettings() {
|
||||
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
|
||||
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() {
|
||||
var qpkg_options_str = "<?php echo $qpkg_conf_options ?>";
|
||||
var qpkg_options_arr = qpkg_options_str.split(' ');
|
||||
|
||||
for (let conf_option of qpkg_options_arr) {
|
||||
document.getElementById(conf_option).checked = true;
|
||||
}
|
||||
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(' ');
|
||||
|
||||
for (let conf_option of qpkg_options_arr) {
|
||||
document.getElementById(conf_option).checked = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Function to download log files
|
||||
function saveOptions () {
|
||||
var qnap_options = "";
|
||||
@@ -170,6 +189,8 @@ function saveOptions () {
|
||||
qnap_options += document.getElementById('usb_audio').checked ? "usb_audio;" : "" ;
|
||||
qnap_options += document.getElementById('hdmi_audio').checked ? "hdmi_audio;" : "" ;
|
||||
|
||||
$("#saveButton").addClass("disabled");
|
||||
|
||||
document.getElementById('smb_cifs').checked
|
||||
var strUrl = '<?php echo NASHOST;?>/cgi-bin/qpkg/RoonServer/ajax/ajax.php?a=setOptions&o=' + qnap_options;
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
imageCssClassField: 'faCssClass',
|
||||
uiLibrary: 'bootstrap5',
|
||||
cascadeSelection: false,
|
||||
cascadeCheck: false,
|
||||
selectionType: 'single',
|
||||
icons: {
|
||||
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">
|
||||
<span class="input-group-btn">
|
||||
<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>
|
||||
</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)) {
|
||||
echo $dblocation;
|
||||
} else {
|
||||
|
||||
@@ -38,13 +38,16 @@
|
||||
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Stopped",
|
||||
"OVERVIEW_ROONSERVER_PANEL_VERSION": "Version",
|
||||
"OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION": "QPKG-Version",
|
||||
"OVERVIEW_ROONSERVER_PANEL_PID": "Process ID",
|
||||
"OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE": "Database",
|
||||
"OVERVIEW_ROONSERVER_PANEL_LOCATION": "Location",
|
||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "of",
|
||||
"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_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_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.",
|
||||
|
||||
@@ -39,28 +39,17 @@
|
||||
"OVERVIEW_ROONSERVER_PANEL_STATUS_STOPPED": "Angehalten",
|
||||
"OVERVIEW_ROONSERVER_PANEL_VERSION": "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_LOCATION": "Speicherort",
|
||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_OF": "von",
|
||||
"OVERVIEW_ROONSERVER_PANEL_SPACE_USED": "belegt",
|
||||
"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_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE": "Multimediafunktionen deaktiviert",
|
||||
"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_USB_AUDIO_TOOLTIP": "Zur Verwendung von lokalen Audiogeräten direkt am QNAP.",
|
||||
"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_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_ICON_TOOLTIP": "Sämtliche Log-Dateien als .zip-Datei laden.",
|
||||
"MODAL_LOGFILES_CHECK_DOWNLOAD_FOLDER": "Bitte schaue in deinen Download-Ordner.",
|
||||
|
||||
@@ -4,7 +4,7 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html data-bs-theme="dark">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
@@ -73,44 +73,56 @@ 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">
|
||||
<a class="navbar-brand " href="index.php">
|
||||
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-target="#navbarsExampleDefault"
|
||||
aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
|
||||
<nav class="navbar navbar-expand-lg bg-body-tertiary" data-bs-theme="dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#">
|
||||
<img src="img/roonIcon.svg" alt="Roon Icon" style="height: 40px;">
|
||||
Roon Server</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav mr-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">
|
||||
<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>
|
||||
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
|
||||
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
|
||||
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
|
||||
<a class="dropdown-item" href="https://community.roonlabs.com"
|
||||
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
|
||||
<a class="dropdown-item" href="https://kb.roonlabs.com/Roon_Server_on_NAS"
|
||||
target="_blank"><?php echo localize("NAV_MENU_ROON_ON_NAS"); ?></a>
|
||||
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
|
||||
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<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>
|
||||
</ul>
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item dropdown pull-right dropdown-menu-right">
|
||||
<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>
|
||||
<div class="dropdown-menu pull-right" aria-labelledby="dropdown01">
|
||||
<a class="dropdown-item" href="https://roon.app/de/downloads" target="_blank">
|
||||
<?php echo localize("NAV_MENU_DOWNLOADS"); ?></a>
|
||||
<a class="dropdown-item" href="https://community.roonlabs.com"
|
||||
target="_blank"><?php echo localize("NAV_MENU_COMMUNITY"); ?></a>
|
||||
<a class="dropdown-item" href="https://kb.roonlabs.com/Roon_Server_on_NAS"
|
||||
target="_blank"><?php echo localize("NAV_MENU_ROON_ON_NAS"); ?></a>
|
||||
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
|
||||
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<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>
|
||||
</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>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="contentblock">
|
||||
<?php
|
||||
$section = "info";
|
||||
|
||||
Reference in New Issue
Block a user