first changes to docker
This commit is contained in:
287
QPKG/shared/web/__functions.php
Normal file
287
QPKG/shared/web/__functions.php
Normal file
@@ -0,0 +1,287 @@
|
||||
<?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];
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user