Files
QNAP_RoonServer/QPKG/shared/web/__functions.php
2026-04-10 02:25:36 +02:00

288 lines
9.2 KiB
PHP

<?php
if (isset($_COOKIE['NAS_USER']) && isset($_COOKIE['NAS_SID'])) {
$context = stream_context_create(array('ssl'=>array(
'verify_peer' => false,
'verify_peer_name' => false
)));
libxml_set_streams_context($context);
$url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://127.0.0.1:$_SERVER[SERVER_PORT]/cgi-bin/authLogin.cgi?sid=".$_COOKIE['NAS_SID'];
$xml = simplexml_load_file($url);
unset($context);
if ( (false === $xml) || !isset($xml->authPassed) || !isset($xml->username) || !isset($xml->isAdmin) ) {
die('Unable to retrieve xml authentication info from your qnap device.');
}
if ( !(bool)(int)$xml->authPassed[0] || !(bool)(int)$xml->isAdmin[0] || (string)$xml->username[0] !== $_COOKIE['NAS_USER']) {
die('No authentic session id of an admin user!');
}
} else {
die('Not logged in!');
}
function get_web_page($url)
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks
CURLOPT_SSL_VERIFYHOST => false
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
unset($options);
}
function getTreeRoot($strSessionID)
{
$strUrl = NASLOCALHOST . '/cgi-bin/filemanager/utilRequest.cgi?func=get_tree&sid=' . $strSessionID . '&is_iso=0&node=share_root';
$arrData = get_web_page($strUrl);
$arrShareTree = json_decode($arrData['content'], 1);
$arrShareTreeData = array();
foreach ($arrShareTree as $arrTemp) {
if (
substr($arrTemp['text'], 0, 1) != "@" &&
substr($arrTemp['text'], 0, 1) != "." &&
substr($arrTemp['text'], 0, 2) != ".." &&
$arrTemp['text'] != "home" &&
$arrTemp['text'] != "homes"
) {
// Set folder icon and check for external devices
switch ($arrTemp['iconCls']) {
case "external":
$arrTemp['iconCls'] = 'fas fa-hdd';
break;
default:
$arrTemp['iconCls'] = 'far fa-folder';
break;
}
$arrShareTreeData[] = array(
'text' => $arrTemp['text'],
'path' => $arrTemp['id'],
'faCssClass' => $arrTemp['iconCls'],
'anychildren' => true
);
}
}
return ($arrShareTreeData);
}
function removeFirstChildDir($path)
{
$path = explode('/', $path);
unset($path[1]);
$db_path = implode('/', $path);
return $db_path;
}
function set_db_path($folder)
{
if(strpos($folder, '/..') !== false)
{
die();
}
if ( is_dir(str_replace("'", "", $folder)) ) {
shell_exec('setcfg RoonServer DB_Path ' . $folder . ' -f /etc/config/qpkg.conf');
shell_exec(APPINSTALLPATH . '/Roonserver.sh start');
unset($folder);
} else {
die();
}
}
function getTreeAt($folder, $strSessionID)
{
$folder = str_replace('+', '%20', filter_var($folder, FILTER_SANITIZE_STRING));
if (strlen($folder) > 3) {
$strUrl = NASLOCALHOST . '/cgi-bin/filemanager/utilRequest.cgi?func=get_tree&sid=' . $strSessionID . '&is_iso=0&node=' . $folder;
$arrData = get_web_page($strUrl);
$arrShareTree = json_decode($arrData['content'], 1);
$arrShareTreeData = array();
foreach ($arrShareTree as $arrTemp) {
if (
substr($arrTemp['text'], 0, 1) != "@" &&
substr($arrTemp['text'], 0, 1) != "." &&
substr($arrTemp['text'], 0, 2) != ".."
) {
$arrTemp['iconCls'] = 'far fa-folder';
$browseable = true;
switch ($arrTemp['text']) {
case "RoonOnNAS":
if (file_exists('/share' . $arrTemp['id'] . '/RoonServer/Logs') && is_dir('/share' . $arrTemp['id'] . '/RoonServer/Logs')) {
$arrTemp['iconCls'] = 'fas fa-file-audio';
$arrTemp['id'] = dirname($arrTemp['id']);
$browseable = false;
}
break;
}
$arrShareTreeData[] = array(
'text' => $arrTemp['text'],
'path' => $arrTemp['id'],
'anychildren' => $browseable,
'faCssClass' => $arrTemp['iconCls']
);
}
}
return ($arrShareTreeData);
}
}
unset($arrData);
unset($arrTemp);
unset($arrNodes);
function localize($phrase)
{
/* Static keyword is used to ensure the file is loaded only once */
static $translations = NULL;
$default_file = $_SERVER['DOCUMENT_ROOT'] . '/cgi-bin/qpkg/RoonServer/i18n/locale-eng.json';
if (is_null($translations)) {
$lang_file = $_SERVER['DOCUMENT_ROOT'] . '/cgi-bin/qpkg/RoonServer/i18n/locale-' . NAS_LANG . '.json';
/* If no instance of $translations has occured load the language file */
if (!file_exists($lang_file)) {
$lang_file = $default_file;
}
$lang_file_content = file_get_contents($lang_file);
/* Load the language file as a JSON object
and transform it into an associative array */
$translations = json_decode($lang_file_content, true);
}
// Use english as a fallback option if string does not exist in translated file
if (!isset($translations[$phrase])) {
$default_file_content = file_get_contents($default_file);
$default_translations = json_decode($default_file_content, true);
if (!isset($default_translations[$phrase])) {
// Return $phrase if also fallback option fails.
return $phrase;
} else {
// Return fallback language
return $default_translations[$phrase];
}
} else {
// Return Translation
return $translations[$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;
}
}
function GetAsoundCards()
{
$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;
}
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;
}
function downloadLogs($strSessionID, $dblocation)
{
$dbLength = strlen($dblocation);
$folders = array($dblocation . '/RoonOnNAS/RoonServer/Logs', $dblocation . '/RoonOnNAS/RAATServer/Logs', $dblocation . '/RoonOnNAS/RoonOnNAS.log.txt');
$urlSnippet = "";
$count = 0;
foreach ($folders as $path) {
$path = substr($path, $dbLength+1);
$urlSnippet = $urlSnippet . '&source_file=' . $path;
$count++;
}
$url = NASHOST . '/cgi-bin/filemanager/utilRequest.cgi?func=download&sid=' . $strSessionID . '&isfolder=1&compress=2&source_path=' . $dblocation . $urlSnippet . '&source_total=' . $count;
echo $url;
//return $url;
}
function displayStorage($diskspace){
$bytes = $diskspace;
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );
$base = 1024;
$class = min((int)log($bytes , $base) , count($si_prefix) - 1);
return sprintf('%1.2f' , $bytes / pow($base,$class)) . ' ' . $si_prefix[$class];
}
?>