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 . '
  • ' . $strSCardName . '
    ' . $strSCardConnection . '
  • '; } 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]; } ?>