restructuring, removed unneccessary options from web ui

This commit is contained in:
jt-chris
2026-04-12 03:06:36 +02:00
parent 615cf26bdd
commit cdc4554731
22 changed files with 129 additions and 332 deletions

View File

@@ -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-10"
QPKG_VER="2026-04-12"
# Author or maintainer of the package
QPKG_AUTHOR="Christopher Rieke"
# License for the packaged application

View File

@@ -6,7 +6,16 @@ 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
CONT_NAME="qnap-roonserver"
CONTAINER_NAME=roonserver
COMPOSE_YML_DIR=$QPKG_ROOT/docker/compose/
COMPOSE_FILES="\
-f $COMPOSE_YML_DIR/roonserver.yml \
-f $COMPOSE_YML_DIR/platform_specific.yml \
-f $COMPOSE_YML_DIR/smb_cifs_support.yml \
-f $COMPOSE_YML_DIR/audio.yml \
-f $COMPOSE_YML_DIR/audio_usb.yml \
-f $COMPOSE_YML_DIR/audio_hdmi.yml"
WEB_PATH="/home/httpd"
WEBUI=$(/sbin/getcfg $QPKG_NAME webUI -f ${CONF});
@@ -87,12 +96,14 @@ start_RoonServer () {
export QNAP_SERIAL
export QNAP_QTS_VER
export CONTAINER_NAME
## Creating required directories, if they do not exist
[ -d "$ROON_ID_DIR" ] || mkdir "$ROON_ID_DIR"
[ -d "$ROON_TMP_DIR" ] || mkdir "$ROON_TMP_DIR"
${DOCKER_CMD} compose -f $QPKG_ROOT/docker/docker-compose.yml -f $QPKG_ROOT/docker/qnap.yml up -d
${DOCKER_CMD} compose ${COMPOSE_FILES} up -d
fi
}
@@ -113,7 +124,8 @@ case "$1" in
echolog "$QPKG_NAME is disabled."
exit 1
fi
if [ -z `$DOCKER_CMD compose ps -q $CONT_NAME` ] || [ -z `$DOCKER_CMD ps -q --no-trunc | grep $($DOCKER_CMD compose ps -q $CONT_NAME)` ]; then
if [ ! "$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)" ]; then
echo "not running"
start_daemon
else
echolog "${QPKG_NAME} is already running with..."
@@ -121,18 +133,18 @@ case "$1" in
;;
stop)
if [ -z `$DOCKER_CMD compose ps -q $CONT_NAME` ] || [ -z `$DOCKER_CMD ps -q --no-trunc | grep $($DOCKER_CMD compose ps -q $CONT_NAME)` ]; then
if [ ! "$(${DOCKER_CMD} ps -a -q -f name=$CONTAINER_NAME)" ]; then
echolog "${QPKG_NAME} is not running."
else
echolog "Stopping RoonServer..."
${DOCKER_CMD} compose -f $QPKG_ROOT/docker/docker-compose.yml -f $QPKG_ROOT/docker/qnap.yml down
export CONTAINER_NAME
${DOCKER_CMD} compose ${COMPOSE_FILES} down
if [[ $2 != "keepwebalive" ]]; then
rm -rf "${QPKG_ROOT}/web/tmp"/*
rm "${WEB_PATH}${WEBUI}"
fi
echolog "RoonServer has been stopped."
fi
${DOCKER_CMD} compose -f $QPKG_ROOT/docker/docker-compose.yml -f $QPKG_ROOT/docker/qnap.yml down
;;
restart)

View File

@@ -1,30 +0,0 @@
FROM debian:12-slim
RUN apt-get update \
&& apt-get -y upgrade \
&& apt-get -y install bash curl bzip2 ffmpeg cifs-utils alsa-utils libicu72
ENV ROON_SERVER_PKG RoonServer_linuxx64.tar.bz2
ENV ROON_SERVER_URL https://download.roonlabs.net/builds/${ROON_SERVER_PKG}
ENV ROON_DATAROOT /data
ENV ROON_ID_DIR /data
ENV ROON_DATAROOT=/Roon/data
ENV ROON_ID_DIR=/Roon/data
COPY entrypoint.sh /entrypoint.sh
# Informational only — requires --net=host for multicast discovery
EXPOSE 9003/udp 9100-9200/tcp 9200-9250/tcp 9330-9339/tcp 55000/tcp
# Healthcheck uses /proc directly instead of pgrep to avoid procps dependency
HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=3 \
CMD grep -ql '[R]oonServer.dll' /proc/[0-9]*/cmdline 2>/dev/null || exit 1
STOPSIGNAL SIGTERM
# entrypoint.sh downloads RoonServer on first run (to /Roon/app), then
# exec's into Server/RoonServer — the stock bash launcher that handles
# .NET runtime discovery, ulimit, self-update swap, and restart (exit 122).
ENTRYPOINT ["/entrypoint.sh"]

View File

@@ -0,0 +1,6 @@
services:
roonserver:
devices:
- /dev/snd:/dev/snd
group_add:
- audio

View File

@@ -0,0 +1,5 @@
services:
roonserver:
devices:
- /dev/dri:/dev/dri

View File

@@ -0,0 +1,6 @@
services:
roonserver:
volumes:
- /run/udev:/run/udev:ro
devices:
- /dev/bus/usb:/dev/bus/usb

View File

@@ -1,13 +1,14 @@
services:
qnap-roonserver:
roonserver:
environment:
- "QNAP_MODEL=${QNAP_MODEL:-Docker}"
- "QNAP_SERIAL=${QNAP_SERIAL:-NoSerial}"
- "QNAP_QTS_VER=${QNAP_QTS_VER:-System}"
- "ROONMNT_DIR=/Roon"
volumes:
# mount all disks and shared folder as read-only
- /share:/share:ro
# mount all disks and shared folders
- /share:/share
# mount database folder
- ${ROON_DATAROOT:-/dev/null}:/Roon/data
@@ -16,6 +17,6 @@ services:
- /etc/os-release:/etc/os-release:ro
# fake qnap binaries
- ./getcfg.sh:/sbin/getcfg:ro
- ./getsysinfo.sh:/sbin/getsysinfo
- ./get_hwsn.sh:/sbin/get_hwsn
- ../scripts/getcfg.sh:/sbin/getcfg:ro
- ../scripts/getsysinfo.sh:/sbin/getsysinfo
- ../scripts/get_hwsn.sh:/sbin/get_hwsn

View File

@@ -0,0 +1,11 @@
services:
roonserver:
image: ghcr.io/roonlabs/roonserver:latest
container_name: ${CONTAINER_NAME}
network_mode: host
environment:
- TZ=${TZ:-UTC}
stop_grace_period: 45s
restart: unless-stopped
logging:
driver: local

View File

@@ -0,0 +1,6 @@
services:
roonserver:
cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH

View File

@@ -1,21 +0,0 @@
services:
qnap-roonserver:
#image: ghcr.io/roonlabs/roonserver:latest
build: .
container_name: qnap-roonserver
network_mode: host
environment:
- TZ=${TZ:-UTC}
stop_grace_period: 45s
restart: unless-stopped
cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH
devices:
- /dev/snd:/dev/snd
- /dev/bus/usb:/dev/bus/usb
- /dev/dri:/dev/dri
group_add:
- audio
logging:
driver: local

View File

@@ -1,35 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
ROON_APP_DIR="/Roon/app"
ROON_INSTALLED="${ROON_APP_DIR}/.installed"
ROON_DOWNLOAD_URL="${ROON_DOWNLOAD_URL:-https://download.roonlabs.net/builds/RoonServer_linuxx64.tar.bz2}"
# Download and install RoonServer on first run
if [ ! -f "$ROON_INSTALLED" ]; then
echo "RoonServer not found — downloading..."
mkdir -p "$ROON_APP_DIR"
curl -fL --progress-bar -o /tmp/RoonServer.tar.bz2 "$ROON_DOWNLOAD_URL"
echo "Extracting..."
tar xjf /tmp/RoonServer.tar.bz2 -C "$ROON_APP_DIR"
rm -f /tmp/RoonServer.tar.bz2
# libharfbuzz.so links against libfreetype.so.6 but bundled lib has no soname suffix
ln -sf "${ROON_APP_DIR}/RoonServer/Appliance/libfreetype.so" \
"${ROON_APP_DIR}/RoonServer/Appliance/libfreetype.so.6"
# Record the installed Roon version from the tarball's VERSION file
if [ -f "${ROON_APP_DIR}/RoonServer/VERSION" ]; then
cp "${ROON_APP_DIR}/RoonServer/VERSION" "$ROON_INSTALLED"
else
echo "unknown" > "$ROON_INSTALLED"
fi
echo "RoonServer installed successfully."
fi
# Log versions at startup
echo "Image: $(cat /etc/roon-image-version 2>/dev/null || echo 'unknown')"
echo "Roon: $(sed -n '2p' "$ROON_INSTALLED" 2>/dev/null || echo 'unknown')"
# start.sh handles restart-on-exit-122 without a full container restart
exec "${ROON_APP_DIR}/RoonServer/start.sh"

View File

@@ -1,3 +0,0 @@
#!/bin/sh
echo $QNAP_SERIAL
echo "get_hwsn $@" >> /Roon/data/args.txt

View File

@@ -0,0 +1,2 @@
#!/bin/sh
echo $QNAP_SERIAL

View File

@@ -59,7 +59,21 @@ body {
stroke-dashoffset: 48;
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
}
/* Toggle switch */
.toggle-track {
width: 40px; height: 22px; border-radius: 11px;
background: #a8a8a8; position: relative; cursor: pointer;
transition: background 0.2s ease; flex-shrink: 0;
}
.toggle-track::after {
content: ''; position: absolute; top: 2px; left: 2px;
width: 18px; height: 18px; border-radius: 50%;
background: #64748b; transition: all 0.2s ease;
}
input:checked + .toggle-track { background: #7ac142; }
input:checked + .toggle-track::after {
transform: translateX(18px); background: #fff;
}
@keyframes stroke {
100% {
stroke-dashoffset: 0;

View File

@@ -156,6 +156,14 @@ unset($arrData);
unset($arrTemp);
unset($arrNodes);
function debug_to_console($data) {
$output = $data;
if (is_array($output))
$output = implode(',', $output);
echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
function localize($phrase)
{
/* Static keyword is used to ensure the file is loaded only once */
@@ -192,67 +200,19 @@ function localize($phrase)
function isRunning($option = null)
{
$getPIDcmd = 'ps aux | grep "' . APPINSTALLPATH . '/RoonServer/start.sh" | grep -v grep | awk \'{print $1}\'';
$RoonServerPID = exec($getPIDcmd);
if ($RoonServerPID > 0) {
if (is_dir('/proc/' . $RoonServerPID)) {
$pid = $RoonServerPID;
$running = true;
} else {
$pid = "";
$running = false;
}
} else {
$pid = "";
$running = false;
}
switch ($option) {
case 'getpid':
return $pid;
break;
default:
return $running;
}
$getDockerCont = CS_INSTALLPATH . '/bin/system-docker ps -aqf "name=roonserver"';
$containerID = exec($getDockerCont);
return $containerID;
}
function GetAsoundCards()
function getRoonServerVersion($option = null)
{
$cards = array();
$cardsPath = "/proc/asound/cards";
$cardsContents = trim(file_get_contents($cardsPath));
$splitNewline = explode(PHP_EOL, $cardsContents);
foreach ($splitNewline as $line => $key) {
if (strpos($key, "]: ")) {
$r = parseCardsLine(trim($key));
$cards[] = $r;
}
}
return $cards;
}
$getRoonServerVer = CS_INSTALLPATH . '/bin/system-docker exec -it roonserver cat /Roon/app/RoonServer/VERSION';
$roonServerVer = exec($getRoonServerVer);
function parseCardsLine($str)
{
$result = array();
$r = explode(" - ", $str);
$result["connection"] = substr($r[0], strpos($r[0], ']: ') +3 );
preg_match('/\[([\s\S])\w+/', $r[0], $matches, PREG_OFFSET_CAPTURE);
$result["name"] = $r[1];
return $result;
}
function acardsNice()
{
$arrSCards = GetAsoundCards();
$strOutput = "";
foreach ($arrSCards as &$value) {
$strSCardName = $value['name'];
$strSCardConnection = $value['connection'];
$strOutput = $strOutput . '<li class="list-group-item justify-content-between"><b>' . $strSCardName . '</b><br>' . $strSCardConnection . '</li>';
}
return $strOutput;
return print_r($roonServerVer);
}
function downloadLogs($strSessionID, $dblocation)
@@ -274,6 +234,7 @@ function downloadLogs($strSessionID, $dblocation)
//return $url;
}
function displayStorage($diskspace){
$bytes = $diskspace;
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );

View File

@@ -54,6 +54,7 @@ $roon_qpkg_conf = $qpkg_conf['RoonServer'];
define("NASHOST", $NASHOST);
define("NASLOCALHOST", $NASLOCALHOST);
define("APPINSTALLPATH", $qpkg_conf['RoonServer']['Install_Path']);
define("CS_INSTALLPATH", $qpkg_conf['container-station']['Install_Path']);
# Getting free space of database directory
if (array_key_exists('DB_Path', $roon_qpkg_conf)) {
@@ -63,37 +64,11 @@ if (array_key_exists('DB_Path', $roon_qpkg_conf)) {
$dblocation = implode('/', $originalpath);
}
if (array_key_exists('MULTIMEDIA_DISABLE_ON_START', $roon_qpkg_conf)) {
$multimedia_disabled_on_start = $qpkg_conf['RoonServer']['MULTIMEDIA_DISABLE_ON_START'];
} else {
$multimedia_disabled_on_start = "";
}
$RoonVersion = file(rtrim(APPINSTALLPATH) . "/RoonServer/VERSION");
$WHICH_FFMPEG = trim(shell_exec('PATH="/share/'.$dblocation .'/RoonOnNAS/bin:$PATH" && which ffmpeg'));
if (strpos($WHICH_FFMPEG, $dblocation) !== false) {
$customFfmpeg = true;
}
else {
$customFfmpeg = false;
}
$ffmpegVersion=trim(shell_exec('PATH="/share/'.$dblocation.'/RoonOnNAS/bin:$PATH" && ffmpeg -version | sed -n "s/ffmpeg version \([^ ]*\).*/\1/p;"'));
$alsafull = file_get_contents('/proc/asound/cards');
$alsaraw = fopen("/proc/asound/cards", 'r');
$alsatext = fread($alsaraw, 25000);
preg_match_all("/\[[^\]]*\]/", $alsafull, $alsa);
if (isset($qpkg_conf_db)) {
$db_vol_cap = disk_total_space($qpkg_conf_db);
$db_free_space = disk_free_space($qpkg_conf_db);
$db_perc = round(100 - (($db_free_space / $db_vol_cap) * 100));
}
$application_conf = parse_ini_file('/var/.application.conf', 1, INI_SCANNER_RAW);
$multimediaDisabled = $application_conf['DISABLE']['HomeFeature'];
unset($application_conf);
?>

View File

@@ -22,8 +22,6 @@ define('DOCROOT', '/home/httpd/cgi-bin/qpkg/RoonServer/');
include(DOCROOT . "__include.php");
include(DOCROOT . "__functions.php");
$strNoDir = 'etc';
$strVarAction = filter_var($_GET['a'], FILTER_SANITIZE_STRING);
$strVarTree = filter_var($_GET['t'], FILTER_SANITIZE_STRING);
$strModalContent = filter_var($_GET['c'], FILTER_SANITIZE_STRING);
@@ -53,7 +51,6 @@ if ($strVarAction == 'checkHelperScript') {
'success' => false
));
}
return true;
}
@@ -79,12 +76,6 @@ if ($strVarAction == 'updateformfield') {
exit();
}
if ($strVarAction == 'redownload') {
$helper_script = APPINSTALLPATH . '/helper-scripts/roon-helper-actions.sh';
$output = shell_exec($helper_script . ' reinstall');
return $output;
}
if ($strVarAction == 'downloadlogs') {
$output = downloadLogs($strSessionID, $dblocation);
return $output;

View File

@@ -38,18 +38,15 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<h5 class="card-title">Roon Server</h5>
<p class="card-text">
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_STATUS"); ?>
:</b> <?php if (isRunning()) {
echo '<span data-toggle="tooltip" title="' . localize("OVERVIEW_ROONSERVER_PANEL_PID") .': ' . isRunning("getpid") . '" style="color: green;">' . localize("OVERVIEW_ROONSERVER_PANEL_STATUS_RUNNING") . '</span>';
:</b> <?php if (strlen(isRunning()) > 1 ) {
echo '<span data-toggle="tooltip" 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>
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_VERSION"); ?>
:</b> <?php echo $RoonVersion[1]; ?><br>
<b><?php echo localize("OVERVIEW_ROONSERVER_PANEL_QPKG_VERSION"); ?>
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?><br>
<b><?php echo "ffmpeg"; ?>
:</b>
<span id="ffmpeg" class="getModal" data-toggle="tooltip" title="<?php echo localize("OVERVIEW_ROONSERVER_PANEL_VERSION");?>: <?php echo $ffmpegVersion; ?>"><button class="btn btn-xs btn-outline-dark"><i style="color:#aaaaaa;" class="fas fa-cog"></i> <?php echo $customFfmpeg ? localize('MODAL_FFMPEG_USER_SUPPLIED_VERSION') : localize('MODAL_FFMPEG_SYSTEM_DEFAULT'); ?></button></span>
:</b> <?php echo $qpkg_conf['RoonServer']['Version']; ?></span>
</p>
<h5><?php echo localize("OVERVIEW_ROONSERVER_PANEL_SUBHEAD_DATABASE"); ?></h5>
<span data-toggle="tooltip" title="<?php echo $dblocation; ?>">
@@ -77,76 +74,36 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<?php echo localize("OVERVIEW_ROONSERVER_PANEL_CHANGE_DB_LOCATION"); ?>
</a>
</span>
<span id="reinstall" class="getModal">
<a href="#"
class="btn btn-light btn-icon float-left"
data-toggle="tooltip"
title="<?php echo localize("MODAL_REINSTALL_ICON_TOOLTIP"); ?>">
<i class="fas fa-box-open"></i>
</a>
</span>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="card">
<div class="card-body">
<?php if (!$multimediaDisabled) {
echo '<span class="fa-stack fa-2x">' .
'<i class="fa fa-circle fa-stack-2x" style="color: #222222;"></i>' .
'<i class="fas fa-volume-up fa-stack-1x fa-inverse"></i>' .
'</span>';
} else {
echo '<span class="fa-stack fa-2x">' .
'<i class="fa fa-circle fa-stack-2x" style="color: #dddddd;"></i>' .
'<i class="fas fa-volume-off fa-stack-1x fa-inverse" data-fa-transform="left-3"></i>' .
'<i class="fas fa-times fa-stack-1x fa-inverse" data-fa-transform="shrink-10 right-5" ></i>' .
'</span>';
}
?>
<h5 class="card-title"><?php
if (!$multimediaDisabled) {
echo localize("OVERVIEW_AUDIO_PANEL_HEADLINE");
} else {
echo localize("OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_HEADLINE");
}
?></h5>
<?php
if (!$multimediaDisabled) {
if (!$multimedia_disabled_on_start) {
echo '<ul class="list-group">' .
acardsNice() .
'</ul><br>' .
'<span id="alsa" class="getModal">' .
'<a href="#" ' .
'class="btn btn-primary" ' .
'data-toggle="tooltip" ' .
'data-html="true" ' .
'title="' . localize("OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES_TOOLTIP") . '">' .
'<i class="fas fa-eye"></i> ' . localize("OVERVIEW_AUDIO_PANEL_BTN_AUDIO_DEVICES") .
'</a>' .
'</span>';
} else {
echo localize("OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION2");
echo '<div id="restartRoonServerAudioPanel">'.
'<a id="restartRoonServer" href="#" onclick="restartRoonServerAndRefresh()"></p>' .
'<div class="fa-4x text-center" style="text-align: center;"><p>' .
'<span class="fa-layers fa-fw">' .
'<i class="fas fa-circle"></i>' .
'<i class="fa-inverse fas fa-redo-alt faa-shake animated" data-fa-transform="shrink-8"></i>' .
'</span></p>' .
'</div>' .
'<div class="text-center">' .
str_replace("'", "\'", localize("MODAL_SETUP_RESTART_ROONSERVER")) .
'</div>' .
'</a>'.
'</div>';
}
} else {
echo localize("OVERVIEW_AUDIO_PANEL_NO_MULTIMEDIA_DESCRIPTION1");
} ?>
<!-- USB Audio -->
<div class="py-3 border-b border-surface-500/30">
<div class="flex items-start gap-3">
<label class="relative inline-flex items-center cursor-pointer mt-0.5 flex-shrink-0">
<input type="checkbox" id="opt-usb-audio" class="sr-only peer">
<div class="toggle-track"></div>
</label>
<div class="flex-1 min-w-0">
<label class="text-sm font-medium cursor-pointer" for="opt-usb-audio" data-toggle="tooltip" title="Pass through USB and ALSA devices for local audio output to a USB DAC connected to the host. Not needed if streaming to network endpoints.">USB audio (DAC)</label>
</div>
</div>
</div>
<!-- HDMI Audio -->
<div class="py-3">
<div class="flex items-start gap-3">
<label class="relative inline-flex items-center cursor-pointer mt-0.5 flex-shrink-0">
<input type="checkbox" id="opt-hdmi-audio" class="sr-only peer">
<div class="toggle-track"></div>
</label>
<div class="flex-1 min-w-0">
<label class="text-sm font-medium cursor-pointer" for="opt-hdmi-audio" data-toggle="tooltip" title="Pass through GPU and ALSA devices for HDMI audio output. Requires GPU drivers on the host.">HDMI audio</label>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -65,9 +65,9 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
echo localize("DEBUG_SID") . ': ' . $_COOKIE['NAS_SID'] . '<br>';
echo localize("DEBUG_QPKG_ROOT") . ': ' . APPINSTALLPATH . "<br>";
echo localize("DEBUG_LANGUAGE") . ': ' . $_COOKIE['nas_lang'] . "<br>";
echo "RoonServer PID: " . isRunning('getpid') . '<br>';
echo "Container-ID: " . isRunning() . '<br>';
echo "RoonServer Ver: " . getRoonServerVersion() . '<br>';
echo localize("DEBUG_QPKG_DOCROOT") . ': ' . NASHOST . '<br>';
echo "HomeFeature disabled: " . $multimediaDisabled . '<br>';
}
}
@@ -93,13 +93,13 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-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://roonlabs.com/downloads.html" target="_blank">
<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://roonlabs.com/pricing.html" target="_blank">
<a class="dropdown-item" href="https://roon.app/de/pricing" target="_blank">
<?php echo localize("NAV_MENU_TRY_ROON"); ?></a>
</div>
</li>

View File

@@ -6,22 +6,6 @@ include_once("/home/httpd/cgi-bin/qpkg/RoonServer/__functions.php");
$section = filter_var($_GET['s'], FILTER_SANITIZE_STRING);
$req = filter_var($_GET['r'], FILTER_SANITIZE_STRING);
$modalTitle = "Alsa";
$modalContent = "Content";
if ($section == "alsa") {
echo nl2br(
'<div class="modal-header">' .
'<h4 id="modal-title" class="modal-title">/proc/asound/cards</h4>' .
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>' .
'</div>' .
'<div id="modal-body" class="modal-body modal-content">' .
'<pre>' . $alsatext . '</pre>' .
'</div>' .
'<div class="modal-footer">' .
'<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">' . localize("BTN_CLOSE") . '</button>');
}
if ($section == "log") {
echo nl2br(
'<div class="modal-header">' .
@@ -49,51 +33,6 @@ if ($section == "log") {
'<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">' . localize("BTN_CLOSE") . '</button>');
}
if ($section == "reinstall") {
echo nl2br(
'<div class="modal-header">' .
'<h4 id="modal-title" class="modal-title">' . localize("MODAL_REINSTALL_HEADLINE") . '</h4>' .
'<button type="button" class="btn-close" data-dismiss="modal" aria-hidden="true">×</button>' .
'</div>' .
'<div id="modal-body" class="modal-body modal-content">' .
localize("MODAL_REINSTALL_DESCRIPTION_1") . '<br>' .
localize("MODAL_REINSTALL_DESCRIPTION_2") .'<br><br>' .
localize("MODAL_REINSTALL_DB_UNTOUCHED") . '</b><br>' .
'<span style="color: red;">' . localize("MODAL_REINSTALL_ROONSERVER_WILL_STOP") . '</span>' .
'<span id="download-area">' .
'<a class="redownload" onclick="reinstall()" href="#">' .
'<div class="fa-4x text-center" style="text-align: center;">' .
'<span class="fa-layers fa-fw">' .
'<i class="fas fa-circle"></i>' .
'<i class="fa-inverse fas fa-box" data-fa-transform="shrink-8"></i>' .
'</span>' .
'</div>' .
'<div class="text-center">' .
localize("MODAL_REINSTALL_PROCEED_TEXT") .
'</div>' .
'</a>' .
'</span>' .
'</div>' .
'<div class="modal-footer">' .
'<button type="button" class="btn btn-outline-secondary btn-close" data-dismiss="modal">' . localize("BTN_CLOSE") . '</button>');
}
if ($section == "ffmpeg") {
echo nl2br(
'<div class="modal-header">' .
'<h4 id="modal-title" class="modal-title"><img style="align: center; width: 30px; height: auto; margin-right: 20px;" src="img/file_ffmpeg.svg">' . localize("MODAL_FFMPEG_HEADLINE") . '</h4>' .
'<button type="button" class="btn-close" data-dismiss="modal" aria-hidden="true">×</button>' .
'</div>' .
'<div id="modal-body" class="modal-body modal-content">' .
localize("MODAL_FFMPEG_DESCRIPTION_1") . '<br>' .
localize("MODAL_FFMPEG_DESCRIPTION_2") .'<br><br>' .
localize("MODAL_FFMPEG_DESCRIPTION_3") . '</b><br>' .
'</div>' .
'<div class="modal-footer">' .
'<button type="button" class="btn btn-outline-secondary btn-close" data-dismiss="modal">' . localize("BTN_CLOSE") . '</button>');
}
if ($section == "setStorage") {
$currentPath = (!empty($dblocation) ? json_encode($dblocation) : '""');