function checkDirectory(&$dir) { if (substr($dir, -1) !== '/') { //append slash $dir .= '/'; } $dirHandle = opendir($dir); if ($dirHandle !== false) { while (($file = readdir($dirHandle)) !== false) { if ($file !== '..' && $file !== '.') { $fullfilename = $dir . $file; if (is_dir($fullfilename) === false) { //check file for BOM echo $fullfilename; if (isUTF8BOM($fullfilename) !== false) { echo ' contains BOM'; } else { echo ' does not contain BOM'; } echo PHP_EOL; } else { //check next directory checkDirectory($fullfilename); } } } closedir($dirHandle); } }
/** * Checks for the location of the incoming directory * If it does not exist, then it creates it. */ function checkIncomingPath() { global $cfg; switch ($cfg["enable_home_dirs"]) { case 1: default: // is there a user dir? checkDirectory($cfg["path"] . $cfg["user"], 0777); break; case 0: // is there a incoming dir? checkDirectory($cfg["path"] . $cfg["path_incoming"], 0777); break; } }
/** * backup of flux-installation * * @param $talk: boolean if function should talk * @param $compression: 0 = none | 1 = gzip | 2 = bzip2 * @return string with name of backup-archive, string with "" in error-case. */ function backupCreate($talk = false, $compression = 0) { global $cfg, $error; // backup-dir $dirBackup = $cfg["path"] . _DIR_BACKUP; if (!checkDirectory($dirBackup)) { $error = "Errors when checking/creating backup-dir: " . tfb_htmlencodekeepspaces($dirBackup); return ""; } // files and more strings $backupName = "backup_" . _VERSION . "_" . date("YmdHis"); $fileArchiveName = $backupName . ".tar"; $tarSwitch = "-cf"; switch ($compression) { case 1: $fileArchiveName .= ".gz"; $tarSwitch = "-zcf"; break; case 2: $fileArchiveName .= ".bz2"; $tarSwitch = "-jcf"; break; } // files $files = array(); $files['archive'] = $dirBackup . '/' . $fileArchiveName; $files['db'] = $dirBackup . '/database.sql'; $files['docroot'] = $dirBackup . '/docroot.tar'; $files['transfers'] = $dirBackup . '/transfers.tar'; $files['fluxd'] = $dirBackup . '/fluxd.tar'; $files['mrtg'] = $dirBackup . '/mrtg.tar'; // exec $exec = array(); $exec['transfers'] = @is_dir($cfg["transfer_file_path"]) === true; $exec['fluxd'] = @is_dir($cfg["path"] . '.fluxd') === true; $exec['mrtg'] = @is_dir($cfg["path"] . '.mrtg') === true; // commands $commands = array(); $commands['archive'] = "cd " . tfb_shellencode($dirBackup) . "; tar " . $tarSwitch . " " . $fileArchiveName . " "; $commands['db'] = ""; switch ($cfg["db_type"]) { case "mysql": $commands['db'] = "mysqldump -h " . tfb_shellencode($cfg["db_host"]) . " -u " . tfb_shellencode($cfg["db_user"]) . " --password="******"db_pass"]) . " --all -f " . tfb_shellencode($cfg["db_name"]) . " > " . tfb_shellencode($files['db']); $commands['archive'] .= 'database.sql '; break; case "sqlite": $commands['db'] = "sqlite " . tfb_shellencode($cfg["db_host"]) . " .dump > " . tfb_shellencode($files['db']); $commands['archive'] .= 'database.sql '; break; case "postgres": $commands['db'] = "pg_dump -h " . tfb_shellencode($cfg["db_host"]) . " -D " . tfb_shellencode($cfg["db_name"]) . " -U " . tfb_shellencode($cfg["db_user"]) . " -f " . tfb_shellencode($files['db']); $commands['archive'] .= 'database.sql '; break; } $commands['archive'] .= 'docroot.tar'; if ($exec['transfers'] === true) { $commands['archive'] .= ' transfers.tar'; } if ($exec['fluxd'] === true) { $commands['archive'] .= ' fluxd.tar'; } if ($exec['mrtg'] === true) { $commands['archive'] .= ' mrtg.tar'; } //$commands['docroot'] = "cd ".tfb_shellencode($dirBackup)."; tar -cf docroot.tar ".tfb_shellencode($cfg["docroot"]); // with path of docroot $commands['docroot'] = "cd " . tfb_shellencode($cfg["docroot"]) . "; tar -cf " . tfb_shellencode($files['docroot']) . " ."; // only content of docroot $commands['transfers'] = "cd " . tfb_shellencode($cfg["transfer_file_path"]) . "; tar -cf " . tfb_shellencode($files['transfers']) . " ."; $commands['fluxd'] = "cd " . tfb_shellencode($cfg["path"] . '.fluxd') . "; tar -cf " . tfb_shellencode($files['fluxd']) . " ."; $commands['mrtg'] = "cd " . tfb_shellencode($cfg["path"] . '.mrtg') . "; tar -cf " . tfb_shellencode($files['mrtg']) . " ."; // action if ($talk) { sendLine('<br>'); } // database-command if ($commands['db'] != "") { if ($talk) { sendLine('Backup of Database <em>' . tfb_htmlencodekeepspaces($cfg["db_name"]) . '</em> ...'); } shell_exec($commands['db']); } if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // docroot-command if ($talk) { sendLine('Backup of Docroot <em>' . tfb_htmlencodekeepspaces($cfg["docroot"]) . '</em> ...'); } shell_exec($commands['docroot']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // transfers-command if ($exec['transfers'] === true) { if ($talk) { sendLine('Backup of transfers <em>' . tfb_htmlencodekeepspaces($cfg["transfer_file_path"]) . '</em> ...'); } shell_exec($commands['transfers']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } } // fluxd-command if ($exec['fluxd'] === true) { if ($talk) { sendLine('Backup of fluxd <em>' . tfb_htmlencodekeepspaces($cfg["path"] . '.fluxd') . '</em> ...'); } shell_exec($commands['fluxd']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } } // mrtg-command if ($exec['mrtg'] === true) { if ($talk) { sendLine('Backup of mrtg <em>' . tfb_htmlencodekeepspaces($cfg["path"] . '.mrtg') . '</em> ...'); } shell_exec($commands['mrtg']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } } // create the archive if ($talk) { sendLine('Creating Archive <em>' . $fileArchiveName . '</em> ...'); } shell_exec($commands['archive']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // delete temp-file(s) if ($talk) { sendLine('Deleting temp-files ...'); } if ($commands['db'] != "") { @unlink($files['db']); } @unlink($files['docroot']); @unlink($files['transfers']); @unlink($files['fluxd']); @unlink($files['mrtg']); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // log if ($talk) { sendLine('<font color="green">Backup Complete.</font><br>'); } AuditAction($cfg["constants"]["admin"], "Backup Created: " . $fileArchiveName); return $fileArchiveName; }
/** * backup of flux-installation * * @param $talk : boolean if function should talk * @param $compression : 0 = none | 1 = gzip | 2 = bzip2 * @return string with name of backup-archive, string with "" in error-case. */ function backupCreate($talk = false, $compression = 0) { global $cfg, $error; // backup-dir $dirBackup = $cfg["path"] . _DIR_BACKUP; if (!checkDirectory($dirBackup)) { $error = "Errors when checking/creating backup-dir : " . $dirBackup; return ""; } // files and more strings $backupName = "backup_" . _VERSION_THIS . "_" . date("YmdHis"); $fileArchiveName = $backupName . ".tar"; $tarSwitch = "-cf"; switch ($compression) { case 1: $fileArchiveName .= ".gz"; $tarSwitch = "-zcf"; break; case 2: $fileArchiveName .= ".bz2"; $tarSwitch = "-jcf"; break; } $fileArchive = $dirBackup . '/' . $fileArchiveName; $fileDatabase = $dirBackup . '/database.sql'; $fileDocroot = $dirBackup . '/docroot.tar'; // command-strings $commandArchive = "cd " . $dirBackup . "; tar " . $tarSwitch . " " . $fileArchiveName . " "; $commandDatabase = ""; switch ($cfg["db_type"]) { case "mysql": $commandDatabase = "mysqldump -h " . $cfg["db_host"] . " -u " . $cfg["db_user"] . " --password="******"db_pass"] . " --all -f " . $cfg["db_name"] . " > " . $fileDatabase; $commandArchive .= 'database.sql '; break; case "sqlite": $commandDatabase = "sqlite " . $cfg["db_host"] . " .dump > " . $fileDatabase; $commandArchive .= 'database.sql '; break; case "postgres": $commandDatabase = "pg_dump -h " . $cfg["db_host"] . " -D " . $cfg["db_name"] . " -U " . $cfg["db_user"] . " -f " . $fileDatabase; $commandArchive .= 'database.sql '; break; } $commandArchive .= 'docroot.tar'; $docroot = dirname(__FILE__); //$commandDocroot = "cd ".$dirBackup."; tar -cf docroot.tar ".$docroot; // with path of docroot $commandDocroot = "cd " . escapeshellarg($docroot) . "; tar -cf " . $fileDocroot . " ."; // only content of docroot // database-command if ($commandDatabase != "") { if ($talk) { sendLine('Backup of Database <em>' . $cfg["db_name"] . '</em> ...'); } shell_exec($commandDatabase); } if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // docroot-command if ($talk) { sendLine('Backup of Docroot <em>' . $docroot . '</em> ...'); } shell_exec($commandDocroot); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // create the archive if ($talk) { sendLine('Creating Archive <em>' . $fileArchiveName . '</em> ...'); } shell_exec($commandArchive); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // delete temp-file(s) if ($talk) { sendLine('Deleting temp-files ...'); } if ($commandDatabase != "") { @unlink($fileDatabase); } @unlink($fileDocroot); if ($talk) { sendLine(' <font color="green">Ok</font><br>'); } // log if ($talk) { sendLine('<font color="green">Backup Complete.</font><br>'); } AuditAction($cfg["constants"]["admin"], "FluxBackup Created : " . $fileArchiveName); return $fileArchiveName; }
/** * process a feed * * @param $sdir * @param $filter * @param $hist * @param $url * @return boolean */ function instance_processFeed($sdir, $filter, $hist, $url) { // (re)set state $this->state = RSSD_STATE_NULL; // validate if (!checkDirectory($sdir, 0777)) { $this->state = RSSD_STATE_ERROR; $msg = "Save-Dir " . $sdir . " not valid."; array_push($this->messages, $msg); $this->_outputError($msg . "\n"); return false; } if (!is_file($filter)) { $this->state = RSSD_STATE_ERROR; $msg = "Filter-File " . $filter . " not valid."; array_push($this->messages, $msg); $this->_outputError($msg . "\n"); return false; } // output $this->_outputMessage("Processing feed " . $url . " ...\n"); // set vars $this->_dirSave = checkDirPathString($sdir); $this->_fileFilters = $filter; $this->_fileHistory = $hist; $this->_urlRSS = $url; $this->_filters = array(); $this->_history = array(); $this->_historyNew = array(); $this->_data = array(); $this->_filesSaved = array(); // load _filters if (!$this->_loadFilters()) { return false; } // load history if (!$this->_loadHistory()) { return false; } // load data if (!$this->_loadData()) { return false; } // something to do ? if ($this->_data['items_count'] <= 0) { // no // state $this->state = RSSD_STATE_OK; return true; } // process data if (!$this->_processData()) { return false; } // update history if (!$this->_updateHistory()) { return false; } // state $this->state = RSSD_STATE_OK; // output $this->_outputMessage("feed processed. downloaded and saved " . count($this->_filesSaved) . " torrents.\n"); // return return true; }
/** * prepares start of a bittorrent-client. * prepares vars and other generic stuff * @param $torrent name of the torrent * @param $interactive (1|0) : is this a interactive startup with dialog ? */ function prepareStartTorrentClient($torrent, $interactive) { if ($this->state < 1) { $this->state = -1; $this->messages .= "Error. ClientHandler in wrong state on prepare-request."; return; } $this->skip_hash_check = ""; if ($interactive == 1) { // interactive, get vars from request vars $this->rate = getRequestVar('rate'); if (empty($this->rate)) { if ($this->rate != "0") { $this->rate = $this->cfg["max_upload_rate"]; } } $this->drate = getRequestVar('drate'); if (empty($this->drate)) { if ($this->drate != "0") { $this->drate = $this->cfg["max_download_rate"]; } } $this->superseeder = getRequestVar('superseeder'); if (empty($this->superseeder)) { $this->superseeder = "0"; } // should be 0 in most cases $this->runtime = getRequestVar('runtime'); if (empty($this->runtime)) { $this->runtime = $this->cfg["torrent_dies_when_done"]; } $this->maxuploads = getRequestVar('maxuploads'); if (empty($this->maxuploads)) { if ($this->maxuploads != "0") { $this->maxuploads = $this->cfg["max_uploads"]; } } $this->minport = getRequestVar('minport'); if (empty($this->minport)) { $this->minport = $this->cfg["minport"]; } $this->maxport = getRequestVar('maxport'); if (empty($this->maxport)) { $this->maxport = $this->cfg["maxport"]; } $this->maxcons = getRequestVar('maxcons'); if (empty($this->maxcons)) { $this->maxcons = $this->cfg["maxcons"]; } $this->rerequest = getRequestVar("rerequest"); if (empty($this->rerequest)) { $this->rerequest = $this->cfg["rerequest_interval"]; } $this->sharekill = getRequestVar('sharekill'); if ($this->runtime == "True") { $this->sharekill = "-1"; } if (empty($this->sharekill)) { if ($this->sharekill != "0") { $this->sharekill = $this->cfg["sharekill"]; } } $this->savepath = getRequestVar('savepath'); $this->skip_hash_check = getRequestVar('skiphashcheck'); } else { // non-interactive, load settings from db and set vars $this->rerequest = $this->cfg["rerequest_interval"]; $this->skip_hash_check = $this->cfg["skiphashcheck"]; $this->superseeder = 0; // load settings $settingsAry = loadTorrentSettings(urldecode($torrent)); $this->rate = $settingsAry["max_upload_rate"]; $this->drate = $settingsAry["max_download_rate"]; $this->runtime = $settingsAry["torrent_dies_when_done"]; $this->maxuploads = $settingsAry["max_uploads"]; $this->minport = $settingsAry["minport"]; $this->maxport = $settingsAry["maxport"]; $this->maxcons = $settingsAry["maxcons"]; $this->sharekill = $settingsAry["sharekill"]; $this->savepath = $settingsAry["savepath"]; // fallback-values if fresh-torrent is started non-interactive or // something else strange happened if ($this->rate == '') { $this->rate = $this->cfg["max_upload_rate"]; } if ($this->drate == '') { $this->drate = $this->cfg["max_download_rate"]; } if ($this->runtime == '') { $this->runtime = $this->cfg["torrent_dies_when_done"]; } if ($this->maxuploads == '') { $this->maxuploads = $this->cfg["max_uploads"]; } if ($this->minport == '') { $this->minport = $this->cfg["minport"]; } if ($this->maxport == '') { $this->maxport = $this->cfg["maxport"]; } if ($this->maxcons == '') { $this->maxcons = $this->cfg["maxcons"]; } if ($this->sharekill == '') { $this->sharekill = $this->cfg["sharekill"]; } } // queue if ($this->cfg["AllowQueing"]) { if (IsAdmin()) { $this->queue = getRequestVar('queue'); if ($this->queue == 'on') { $this->queue = "1"; } else { $this->queue = "0"; } } else { $this->queue = "1"; } } else { $this->queue = "0"; } // $this->torrent = urldecode($torrent); $this->alias = getAliasName($this->torrent); $this->owner = getOwner($this->torrent); if (empty($this->savepath)) { $this->savepath = $this->cfg['path'] . $this->owner . "/"; } // ensure path has trailing slash $this->savepath = checkDirPathString($this->savepath); // check target-directory, create if not present if (!checkDirectory($this->savepath, 0777)) { AuditAction($this->cfg["constants"]["error"], "Error checking " . $this->savepath . "."); $this->state = -1; $this->messages .= "Error. TorrentFlux settings are not correct (path-setting)."; global $argv; if (isset($argv)) { die($this->messages); } else { if (IsAdmin()) { @header("location: admin.php?op=configSettings"); exit; } else { $this->messages .= " please contact an admin."; showErrorPage($this->messages); } } } // create AliasFile object and write out the stat file include_once "AliasFile.php"; $this->af = AliasFile::getAliasFileInstance($this->cfg["torrent_file_path"] . $this->alias . ".stat", $this->owner, $this->cfg, $this->handlerName); // set param for sharekill $this->sharekill = intval($this->sharekill); if ($this->sharekill == 0) { // nice, we seed forever $this->sharekill_param = 0; } elseif ($this->sharekill > 0) { // recalc sharekill // sanity-check. catch "data-size = 0". $transferSize = intval($this->af->size); if ($transferSize > 0) { $totalAry = getTorrentTotals($this->torrent); $upTotal = $totalAry["uptotal"] + 0; $downTotal = $totalAry["downtotal"] + 0; $upWanted = $this->sharekill / 100 * $transferSize; $sharePercentage = $upTotal / $transferSize * 100; if ($upTotal >= $upWanted && $downTotal >= $transferSize) { // we already have seeded at least wanted percentage. // skip start of client // set state $this->state = 1; // message $this->messages = "skipping start of transfer " . $this->torrent . " due to share-ratio (has: " . @number_format($sharePercentage, 2) . " ; set:" . $this->sharekill . ")"; // DEBUG : log the messages AuditAction($this->cfg["constants"]["debug"], $this->messages); // return return; } else { // not done seeding wanted percentage $this->sharekill_param = intval(ceil($this->sharekill - $sharePercentage)); // sanity-check. if ($this->sharekill_param < 1) { $this->sharekill_param = 1; } } } else { $this->messages = "data-size is 0 when recalcing share-kill for " . $this->torrent . ". setting sharekill absolute to " . $this->sharekill; AuditAction($this->cfg["constants"]["error"], $this->messages); $this->sharekill_param = $this->sharekill; } } else { $this->sharekill_param = $this->sharekill; } // set port if start (not queue) if (!($this->cfg["AllowQueing"] && $this->queue == "1")) { if ($this->setClientPort() === false) { return; } } //XFER: before a torrent start/restart save upload/download xfer to SQL $torrentTotals = getTorrentTotalsCurrent($this->torrent); saveXfer($this->owner, $torrentTotals["downtotal"] + 0, $torrentTotals["uptotal"] + 0); // update totals for this torrent updateTorrentTotals($this->torrent); // write stat-file if ($this->cfg["AllowQueing"] && $this->queue == "1") { $this->af->QueueTorrentFile(); } else { $this->af->StartTorrentFile(); } // set state $this->state = 2; }
/** * ctor */ function FluAzu() { global $cfg; // paths $this->_pathDataDir = $cfg["path"] . '.fluazu/'; $this->_pathPidFile = $this->_pathDataDir . 'fluazu.pid'; $this->_pathCommandFile = $this->_pathDataDir . 'fluazu.cmd'; $this->_pathLogFile = $this->_pathDataDir . 'fluazu.log'; $this->_pathStatFile = $this->_pathDataDir . 'fluazu.stat'; $this->_pathTransfers = $this->_pathDataDir . 'cur/'; $this->_pathTransfersRun = $this->_pathDataDir . 'run/'; $this->_pathTransfersDel = $this->_pathDataDir . 'del/'; // check path if (!checkDirectory($this->_pathDataDir)) { @error("fluazu-Main-Path does not exist and cannot be created or is not writable", "admin.php?op=serverSettings", "Server-Settings", array("path : " . $this->_pathDataDir)); } // check if fluazu running if ($this->instance_isRunning()) { $this->state = FLUAZU_STATE_RUNNING; } }
/** * checks main-directories. * * @return boolean */ function checkMainDirectories() { global $cfg; // main-path if (!checkDirectory($cfg["path"])) { @error("Main-Path does not exist and cannot be created or is not writable", "admin.php?op=serverSettings", "Server-Settings", array("path : " . $cfg["path"])); } // transfer-path if (!checkDirectory($cfg["transfer_file_path"])) { @error("Transfer-File-Path does not exist and cannot be created or is not writable", "admin.php?op=serverSettings", "Server-Settings", array("transfer_file_path : " . $cfg["transfer_file_path"])); } }
if (!defined("ENT_COMPAT")) { define("ENT_COMPAT", 2); } if (!defined("ENT_NOQUOTES")) { define("ENT_NOQUOTES", 0); } if (!defined("ENT_QUOTES")) { define("ENT_QUOTES", 3); } // Get RSS feeds from Database $arURL = GetRSSLinks(); // create lastRSS object $rss = new lastRSS(); // setup transparent cache $cacheDir = $cfg['path'] . ".rsscache"; if (!checkDirectory($cacheDir, 0777)) { @error("Error with rss-cache-dir", "index.php?iid=index", "", array($cacheDir)); } $rss->cache_dir = $cacheDir; $rss->cache_time = $cfg["rss_cache_min"] * 60; // 1200 = 20 min. 3600 = 1 hour $rss->strip_html = false; // don't remove HTML from the description // init template-instance tmplInitializeInstance($cfg["theme"], "page.readrss.tmpl"); // set vars // Loop through each RSS feed $rss_list = array(); foreach ($arURL as $rid => $url) { if (isset($_REQUEST["debug"])) { $rss->cache_time = 0;
/*** check table field expand by preload ***/ if (!checkTable()) { $messages[] = 'You must put extras/extra_preload/upgrade22.class.php in ' . XOOPS_ROOT_PATH . '/preload'; } /*** check latest language file ***/ $lang = XCube_Root::getSingleton()->mLanguageManager->mLanguageName; if (!checkLanguage($lang)) { $messages[] = 'You must move the latest language files from extras/extra_languages/' . $lang . '. DON\'T MOVE /install directory !'; } /*** check file existing ***/ $files = checkFile(); foreach ($files as $file) { $messages[] = $file; } /*** check directory existing ***/ $directories = checkDirectory(); foreach ($directories as $dir) { $messages[] = $dir; } /*** check directory permission to write ***/ $permissions = checkPermission(); foreach ($permissions as $perm) { $messages[] = $perm; } /*** check module version, if updated by module admin ***/ $modules = checkVersion(); foreach ($modules as $mod) { $messages[] = 'You must upgrade module "' . $mod . '" in module administration page.'; } if (count($messages) === 0) { $messages[] = 'Congraturation! You are ready for upgrade XCL2.2.<br />Remove ' . XOOPS_ROOT_PATH . '/legacy22_check.php file.';
/** * checks a dir. recursive process to emulate "mkdir -p" if dir not present * * @param $dir the name of the dir * @param $mode the mode of the dir if created. default is 0755 * @return boolean if dir exists/could be created */ function checkDirectory($dir, $mode = 0755) { if (is_dir($dir) && is_writable($dir) || @mkdir($dir, $mode)) { return true; } if (!checkDirectory(dirname($dir), $mode)) { return false; } return @mkdir($dir, $mode); }
// set vars // path $tmpl->setvar('path', $cfg["path"]); if (is_dir($cfg["path"])) { $tmpl->setvar('is_path', 1); $tmpl->setvar('is_writable', is_writable($cfg["path"]) ? 1 : 0); } else { $tmpl->setvar('is_path', 0); } // docroot $tmpl->setvar('docroot', $cfg["docroot"]); $tmpl->setvar('is_docroot', is_file($cfg["docroot"] . "version.php") ? 1 : 0); // homedirs + incoming $tmpl->setvar('enable_home_dirs', $cfg["enable_home_dirs"]); $tmpl->setvar('path_incoming', $cfg["path_incoming"]); $tmpl->setvar('path_incoming_ok', checkDirectory($cfg["path"] . $cfg["path_incoming"], 0777) ? 1 : 0); // bins $tmpl->setvar('btclient_transmission_bin', $cfg["btclient_transmission_bin"]); $tmpl->setvar('validate_transmission_bin', validateTransmissionCli($cfg["btclient_transmission_bin"])); $tmpl->setvar('perlCmd', $cfg["perlCmd"]); $tmpl->setvar('validate_perl', validateBinary($cfg["perlCmd"])); $tmpl->setvar('bin_grep', $cfg["bin_grep"]); $tmpl->setvar('validate_grep', validateBinary($cfg["bin_grep"])); $tmpl->setvar('bin_php', $cfg["bin_php"]); $tmpl->setvar('validate_php', validatePhpCli($cfg["bin_php"])); $tmpl->setvar('pythonCmd', $cfg["pythonCmd"]); $tmpl->setvar('validate_python', validateBinary($cfg["pythonCmd"])); $tmpl->setvar('bin_awk', $cfg["bin_awk"]); $tmpl->setvar('validate_awk', validateBinary($cfg["bin_awk"])); $tmpl->setvar('bin_du', $cfg["bin_du"]); $tmpl->setvar('validate_du', validateBinary($cfg["bin_du"]));
function checkDirectory($path) { global $fsPath, $aIgnore; $fullpath = sprintf('%s/%s', $fsPath, $path); if (!is_dir($fullpath)) { print "Not a directory: {$fullpath}\n"; } if ($path === '/Deleted') { // Deleted files handled separately. return; } if (!empty($path)) { $fod = KTBrowseUtil::folderOrDocument($path); if ($fod === false) { $GLOBALS['aFoldersToRemove'][] = $path; return; } } $dh = @opendir($fullpath); if ($dh === false) { print "Could not open directory: {$fullpath}\n"; } while (($filename = readdir($dh)) !== false) { if (in_array($filename, $aIgnore)) { continue; } $subrelpath = sprintf('%s/%s', $path, $filename); $subfullpath = sprintf('%s/%s', $fsPath, $subrelpath); if (is_dir($subfullpath)) { checkDirectory($subrelpath); } if (is_file($subfullpath)) { checkFile($subrelpath); } } }
if ($targetDir == "" && isset($_POST['selector'])) { $targetDir = trim(urldecode($_POST['selector'])); } $dirValid = true; if (strlen($targetDir) <= 0) { $dirValid = false; } else { // we need absolute paths or stuff will end up in docroot // inform user .. dont move it into a fallback-dir which may be a hastle if ($targetDir[0] != '/') { echo "Target-dirs must be specified with absolute and not relative paths. <br>"; $dirValid = false; } } // check dir if ($dirValid && checkDirectory($targetDir, 0777)) { $targetDir = checkDirPathString($targetDir); // move $cmd = "mv \"" . $cfg["path"] . $_POST['file'] . "\" " . $targetDir . ""; $cmd .= ' 2>&1'; $handle = popen($cmd, 'r'); // get the output and print it. $gotError = -1; while (!feof($handle)) { $buff = fgets($handle, 30); echo nl2br($buff); @ob_flush(); @flush(); $gotError = $gotError + 1; } pclose($handle);
/** * updates a single job * * @param $jobNumber * @param $savedir * @param $url * @param $filtername * @return boolean */ function instance_jobUpdate($jobNumber, $savedir, $url, $filtername, $checkdir = false) { if ($jobNumber > 0 && strlen($savedir) > 0 && strlen($url) > 0 && strlen($filtername) > 0) { $jobs = $this->instance_jobsGetList(); if ($jobs !== false && count($jobs) > 0) { $result = array(); $idx = 1; while (count($jobs) > 0) { $job = array_shift($jobs); if ($idx != $jobNumber) { array_push($result, $job); } else { array_push($result, array('savedir' => trim(checkDirPathString($savedir)), 'url' => $url, 'filtername' => $filtername)); } $idx++; } $jobsString = ""; $resultCount = count($result); for ($i = 0; $i < $resultCount; $i++) { $jobsString .= $result[$i]["savedir"] . $this->_delimJob; $jobsString .= $result[$i]["url"] . $this->_delimJob; $jobsString .= $result[$i]["filtername"]; if ($i < $resultCount - 1) { $jobsString .= $this->_delimJobs; } } // check dir if ($checkdir) { $check = checkDirectory($savedir); if (!$check) { array_push($this->messages, "dir " . $savedir . " does not exist and could not be created."); } } else { $check = true; } // update setting return $check && $this->_jobsUpdate($jobsString); } return false; } else { return false; } }
/** * checks a dir. recursive process to emulate "mkdir -p" if dir not present * * @param $dir the name of the dir * @param $mode the mode of the dir if created. default is 0755 * @return boolean if dir exists/could be created */ function checkDirectory($dir, $mode = 0755, $depth = 0) { if ($depth > 32) { return false; } if (@is_dir($dir) && @is_writable($dir) || @mkdir($dir, $mode)) { return true; } if ($dir == '/') { return false; } if (!@checkDirectory(dirname($dir), $mode, ++$depth)) { return false; } return @mkdir($dir, $mode); }
/** * init start of a client. * * @param $interactive * @param $enqueue * @param $setPort * @param $recalcSharekill */ function _init($interactive, $enqueue = false, $setPort = false, $recalcSharekill = false) { global $cfg; // request-vars / defaults / database if ($interactive) { // interactive, get vars from request vars $this->settingsInit(); } else { // non-interactive, load settings from db $this->skip_hash_check = $cfg["skiphashcheck"]; // load settings, default if settings could not be loaded (fresh transfer) if ($this->settingsLoad() !== true) { $this->settingsDefault(); } } // queue if ($enqueue) { $this->queue = $cfg['isAdmin'] ? $enqueue : true; } else { $this->queue = false; } // savepath-check if (empty($this->savepath)) { $this->savepath = $cfg["enable_home_dirs"] != 0 ? $cfg['path'] . $this->owner . "/" : $cfg['path'] . $cfg["path_incoming"] . "/"; } else { $this->savepath = checkDirPathString($this->savepath); } // check target-directory, create if not present if (!checkDirectory($this->savepath, 0777)) { $this->state = CLIENTHANDLER_STATE_ERROR; $msg = "Error checking savepath " . $this->savepath; array_push($this->messages, $msg); AuditAction($cfg["constants"]["error"], $msg); $this->logMessage($msg . "\n", true); // write error to stat $sf = new StatFile($this->transfer, $this->owner); $sf->time_left = 'Error'; $sf->write(); return false; } // umask $this->umask = $cfg["enable_umask"] != 0 ? " umask 0000;" : ""; // nice $this->nice = $cfg["nice_adjust"] != 0 ? "nice -n " . $cfg["nice_adjust"] . " " : ""; // set param for sharekill $this->sharekill = intval($this->sharekill); // recalc sharekill if ($recalcSharekill) { if ($this->_recalcSharekill() === false) { return false; } } else { $this->sharekill_param = $this->sharekill; $this->logMessage("setting sharekill-param to " . $this->sharekill_param . "\n", true); } // set port if start (only if not queue) if ($setPort && !$this->queue) { if ($this->_setClientPort() === false) { return false; } } // get current transfer $transferTotals = $this->getTransferCurrent($this->transfer); //XFER: before a transfer start/restart save upload/download xfer to SQL if ($cfg['enable_xfer'] == 1) { Xfer::save($this->owner, $transferTotals["downtotal"], $transferTotals["uptotal"]); } // update totals for this transfer $this->_updateTotals(); // set state $this->state = CLIENTHANDLER_STATE_READY; }
/** * update a job * * @param $jobnumber * @param $watchdir * @param $user * @param $profile * @param $checkdir * @return boolean */ function instance_jobUpdate($jobnumber, $watchdir, $user, $profile, $checkdir = false) { $jobInt = intval($jobnumber); if ($jobInt > 0 && strlen($watchdir) > 0 && strlen($user) > 0) { $watchdir = checkDirPathString($watchdir); // Get current jobs and make sure modified one is not a duplicate. $jobs = $this->instance_jobsGetList(); if ($jobs !== false && count($jobs) >= $jobInt) { $jobs[$jobInt - 1] = array(); foreach ($jobs as $job) { if (isset($job['D']) && $job['D'] == $watchdir) { array_push($this->messages, "dir " . $watchdir . " is already begin watched."); return false; } } // Check/create dir if needed. if ($checkdir && !checkDirectory($watchdir)) { array_push($this->messages, "dir " . $watchdir . " does not exist and could not be created."); return false; } // Create new job. $job = array('U' => $user, 'D' => $watchdir); if (isset($profile)) { $job['P'] = $profile; } $jobs[$jobInt - 1] = $job; // Update settings. return $this->_jobsUpdateSetting($jobs); } } return false; }
if (!empty($list_changes)) { $tmpl->setloop('list_changes', $list_changes); } if (empty($list_send)) { $doSend = false; } else { $tmpl->setloop('list_send', $list_send); } if (!empty($list_restart)) { $tmpl->setloop('list_restart', $list_restart); } // save settings if ($cfg["showdirtree"] == 1) { $newSavepath = checkDirPathString($settingsNew['savepath']); if ($newSavepath != $settingsCurrent['savepath']) { if (@checkDirectory($newSavepath, 0777) !== true) { $tmpl->setvar('error', "savepath " . $newSavepath . " not valid and change not saved."); } else { $ch->savepath = $newSavepath; } } } $ch->rate = $settingsNew['max_upload_rate']; $ch->drate = $settingsNew['max_download_rate']; $ch->maxuploads = $settingsNew['max_uploads']; $ch->superseeder = $settingsNew['superseeder']; $ch->runtime = $settingsNew['die_when_done']; $ch->sharekill = $settingsNew['sharekill']; $ch->minport = $settingsNew['minport']; $ch->maxport = $settingsNew['maxport']; $ch->maxcons = $settingsNew['maxcons'];
/** * checks a dir. recursive process to emulate "mkdir -p" if dir not present * * @param $dir the name of the dir * @param $mode the mode of the dir if created. default is 0755 * @return boolean if dir exists/could be created */ function checkDirectory($dir, $mode = 0755) { global $CHECKDIR_RECURSION; if (isset($CHECKDIR_RECURSION)) { $CHECKDIR_RECURSION++; } else { $CHECKDIR_RECURSION = 0; } if ($CHECKDIR_RECURSION > 10) { return false; } if (@is_dir($dir) && @is_writable($dir) || @mkdir($dir, $mode)) { return true; } if (!@checkDirectory(dirname($dir), $mode)) { return false; } return @mkdir($dir, $mode); }
/** * Add task for a work * ******************* * * @param (string) (url) Url for task * @param (string) (saveAs) Save to this file name * @return (array) */ function addWgetTask($url, $saveAs) { function checkPermissions($path) { return file_exists($path) && is_dir($path) && is_writable($path) ? true : false; } function checkDirectory($dir) { if (!checkPermissions($dir)) { mkdir($dir, 0777, true); chmod($dir, 0777); return checkPermissions($dir) ? true : false; } return true; } log::debug('(call) addWgetTask() called, $url=' . var_export($url, true) . ', $saveAs=' . var_export($saveAs, true)); define('OriginalTaskUrl', $url); // Save in constant original task url if (empty($url)) { return array('result' => false, 'msg' => 'No URL'); } if (defined('WGET_ONE_TIME_LIMIT') && count(getWgetTasks()) + 1 > WGET_ONE_TIME_LIMIT) { log::notice('Task not added, because one time tasks limit is reached'); return array('result' => false, 'msg' => 'One time tasks limit is reached'); } if (!defined('DOWNLOAD_PATH')) { log::error('"DOWNLOAD_PATH" not defined'); return array('result' => false, 'msg' => '"DOWNLOAD_PATH" not defined'); } if (!checkDirectory(DOWNLOAD_PATH)) { log::error('Directory ' . var_export(DOWNLOAD_PATH, true) . ' cannot be created'); return array('result' => false, 'msg' => 'Cannot create directory for downloads'); } // DOWNLOAD YOUTUBE VIDEO // Detect - if url is link to youtube video if (stripos($url, 'youtube.com/') !== false || stripos($url, 'youtu.be/') !== false) { $youtubeVideos = array(); // http://stackoverflow.com/a/10315969/2252921 preg_match('/^(?:https?:\\/\\/)?(?:www\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))((\\w|-){11})(?:\\S+)?$/i', $url, $founded); define('YoutubeVideoID', @$founded[1]); // Set as constant YouTube video ID if (strlen(YoutubeVideoID) == 11) { $rawVideoInfo = file_get_contents('http://youtube.com/get_video_info?video_id=' . YoutubeVideoID . '&ps=default&eurl=&gl=US&hl=en'); if ($rawVideoInfo !== false) { parse_str($rawVideoInfo, $videoInfo); //var_dump($videoInfo); if (isset($videoInfo['url_encoded_fmt_stream_map'])) { $my_formats_array = explode(',', $videoInfo['url_encoded_fmt_stream_map']); foreach ($my_formats_array as $videoItem) { parse_str($videoItem, $videoItemData); if (isset($videoItemData['url'])) { //var_dump($videoItemData); switch (@$videoItemData['quality']) { case 'small': $videoItemData['quality'] = '240p'; break; case 'medium': $videoItemData['quality'] = '360p'; break; case 'large': $videoItemData['quality'] = '480p'; break; case 'hd720': $videoItemData['quality'] = '720p'; break; case 'hd1080': $videoItemData['quality'] = '1080p'; break; } array_push($youtubeVideos, array('title' => trim(@$videoInfo['title']), 'thumbnail' => @$videoInfo['thumbnail_url'], 'url' => urldecode($videoItemData['url']), 'type' => @$videoItemData['type'], 'quality' => @$videoItemData['quality'])); } else { log::error('Link to youtube source video file not exists ' . var_export($videoItemData, true)); return array('result' => false, 'msg' => 'Link to youtube source video file not exists'); } } } else { $errorDescription = 'Youtube answer not contains data about video files'; if (isset($videoInfo['reason']) && !empty($videoInfo['reason'])) { $errorDescription = trim(strip_tags($videoInfo['reason'], '<a><br/>')); } log::error($errorDescription . ', raw=' . var_export($rawVideoInfo, true)); return array('result' => false, 'msg' => $errorDescription); } } else { log::error('Cannot call "file_get_contents()" for $url=' . var_export($url, true)); return array('result' => false, 'msg' => 'Cannot get remote content'); } } //var_dump($youtubeVideos); // If we found video links if (count($youtubeVideos) > 0) { // Get first 'mp4' video foreach ($youtubeVideos as $video) { if (isset($video['type']) && !empty($video['type'])) { preg_match('~\\/(.*?)\\;~', $video['type'], $videoType); if (@$videoType[1] == 'mp4') { $videoToDownload = $video; break; } } } // Or take first video (by default - with highest quality) if (!isset($videoToDownload)) { $videoToDownload = $youtubeVideos[0]; } preg_match('~\\/(.*?)\\;~', $videoToDownload['type'], $extension); switch (@$extension[1]) { case 'mp4': $fileExtension = 'mp4'; break; case 'webm': $fileExtension = 'webm'; break; case 'x-flv': $fileExtension = 'flv'; break; case '3gpp': $fileExtension = '3gp'; break; default: $fileExtension = 'video'; } $clearTitle = makeStringSafe(@$videoToDownload['title']); // Tadaaam :) $url = $videoToDownload['url']; if (empty($saveAs)) { if (empty($clearTitle)) { $saveAs = 'youtube_video_id' . YoutubeVideoID . ' (' . $videoToDownload['quality'] . ').' . $fileExtension; } else { $saveAs = $videoToDownload['title'] . ' (' . $videoToDownload['quality'] . ').' . $fileExtension; } } } } // DOWNLOAD VK.COM VIDEO // Detect - if url is link to vk.com video if (stripos($url, 'vk.com/video_ext.php') !== false) { // For test code/decode url - http://meyerweb.com/eric/tools/dencoder/ // Get url query and parse it to $q $urlParts = parse_url(urldecode($url)); parse_str($urlParts['query'], $q); define('VkVideoID', @$q['id']); // Set as constant VK video ID if (isset($q['oid']) && !empty($q['oid']) && is_numeric($q['oid']) && is_numeric(VkVideoID) && isset($q['hash']) && !empty($q['hash'])) { // Build request url $queryUrl = 'https://vk.com/video_ext.php?oid=' . $q['oid'] . '&id=' . $q['id'] . '&hash=' . $q['hash']; // Get page content $rawVideoInfo = file_get_contents($queryUrl); if ($rawVideoInfo !== false) { if (preg_match('/.*\\<div.*id\\=\\"video_player\\".*/im', $rawVideoInfo) !== 0) { $videoData = array(); preg_match('/\\&\\;url240\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['240'] = urldecode(@$f[1]); preg_match('/\\&\\;url360\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['360'] = urldecode(@$f[1]); preg_match('/\\&\\;url480\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['480'] = urldecode(@$f[1]); preg_match('/\\&\\;url720\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['720'] = urldecode(@$f[1]); preg_match('/\\&\\;thumb\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['thumbnail'] = trim(urldecode(@$f[1])); preg_match('/\\&\\;md_title\\=(.*?)\\&\\;/i', $rawVideoInfo, $f); $videoData['title'] = trim(urldecode(@$f[1])); // video in low quality always must exists, if parse complete without errors if (isset($videoData['240']) && !empty($videoData['240'])) { $videoQualityStr = ''; if (isset($videoData['240']) && !empty($videoData['240'])) { $url = $videoData['240']; $videoQualityStr = '240p'; } if (isset($videoData['360']) && !empty($videoData['360'])) { $url = $videoData['360']; $videoQualityStr = '360p'; } if (isset($videoData['480']) && !empty($videoData['480'])) { $url = $videoData['480']; $videoQualityStr = '480p'; } if (isset($videoData['720']) && !empty($videoData['720'])) { $url = $videoData['720']; $videoQualityStr = '720p'; } $clearTitle = makeStringSafe(@$videoData['title']); if (empty($saveAs)) { if (empty($clearTitle)) { $saveAs = 'vk_video_id' . VkVideoID . ' (' . $videoQualityStr . ').mp4'; } else { $saveAs = $clearTitle . ' (' . $videoQualityStr . ').mp4'; } } } else { log::error('Link to video file not found'); return array('result' => false, 'msg' => 'Link to video file not found'); } } else { log::error('Video container not found $queryUrl=' . var_export($queryUrl, true)); return array('result' => false, 'msg' => 'Video container not found'); } } else { log::error('Cannot call "file_get_contents()" for $url=' . var_export($url, true)); return array('result' => false, 'msg' => 'Cannot get remote content'); } } else { log::error('Request error - some important query part not exists, $url=' . var_export($url, true)); return array('result' => false, 'msg' => 'Request error - some important query part(s) not exists'); } } // DROPBOX 'Content-Disposition' bug fix // Issue - <https://github.com/tarampampam/wget-gui-light/issues/17> if (stripos($url, 'dropboxusercontent.com/') !== false) { $file_name = basename($url); if (!empty($file_name)) { $saveAs = $file_name; } } //var_dump($videoToDownload); $historyAction = ''; $saveAs = makeStringSafe($saveAs); if (defined('LOG_HISTORY')) { if (checkDirectory(dirname(LOG_HISTORY))) { $savedAsCmdString = !empty($saveAs) ? ' ## SavedAs: \\"' . $saveAs . '\\"' : ''; // If string passed in '$url' and saved 'OriginalTaskUrl' not equal each other, // we understand - URL was PARSED and changed. And now, for a history // (tadatadaaaam =)) we must write ORIGINAL url (not parsed) $urlForHistory = $url !== OriginalTaskUrl ? OriginalTaskUrl : $url; $urlForHistoryCmd = $url !== OriginalTaskUrl ? ' && URL="' . $urlForHistory . '"' : ''; $historyAction = ' && HISTORY="' . LOG_HISTORY . '"' . $urlForHistoryCmd . ' && if [ "$?" = "0" ]; then ' . 'echo "Success: \\"$URL\\"' . $savedAsCmdString . '" >> "$HISTORY"; ' . 'else ' . 'echo "Failed: \\"$URL\\"" >> "$HISTORY"; ' . 'fi'; } else { log::error('Directory ' . var_export(dirname(LOG_HISTORY), true) . ' cannot be created'); } } $speedLimit = defined('WGET_DOWNLOAD_LIMIT') ? '--limit-rate=' . WGET_DOWNLOAD_LIMIT . 'k ' : ' '; $saveAsFile = !empty($saveAs) ? '--output-document="' . DOWNLOAD_PATH . '/' . $saveAs . '" ' : ' '; $tmpFileName = TMP_PATH . '/wget' . rand(1, 32768) . '.log.tmp'; $cmd = '(URL="' . $url . '"; TMPFILE="' . $tmpFileName . '"; echo > "$TMPFILE"; ' . wget . ' ' . '--progress=bar:force --output-file="$TMPFILE" ' . '--tries=0 ' . '--no-check-certificate ' . '--no-cache ' . '--user-agent="Mozilla/5.0 (X11; Linux amd64; rv:21.0) Gecko/20100101 Firefox/21.0" ' . '--directory-prefix="' . DOWNLOAD_PATH . '" ' . '--content-disposition ' . '--restrict-file-names=nocontrol ' . $speedLimit . $saveAsFile . ' ' . WGET_SECRET_FLAG . ' ' . '"$URL"' . $historyAction . '; ' . rm . ' -f "$TMPFILE") > /dev/null 2>&1 & echo $!'; log::debug('Command to exec: ' . var_export($cmd, true)); $task = bash($cmd, 'string'); if (empty($task)) { log::error('Exec task ' . var_export($cmd, true) . ' error'); return array('result' => false, 'msg' => 'Exec task error'); } usleep(100000); // 1/10 sec preg_match("/(\\d{2,7})/i", $task, $founded); $parentPid = @$founded[1]; if (!validatePid($parentPid)) { log::error('Parent PID ' . var_export($parentPid, true) . ' for task ' . var_export($url, true) . ' not valid'); return array('result' => false, 'msg' => 'Parent PID not valid'); } //var_dump($cmd); var_dump($task); var_dump($parentPid); // Wait ~1 sec until child pipe not running, check every second for ($i = 1; $i <= 4; $i++) { // Get pipe with out wget task (search by $tmpFileName) $taskData = getWgetTasksList($tmpFileName); // Get last job with current URL $taskPid = @$taskData[0]['pid']; if (validatePid($taskPid)) { break; } else { usleep(250000); } // 1/4 sec } if (!file_exists($tmpFileName)) { log::notice('Task ' . var_export($url, true) . ' already complete (probably with error)'); return array('result' => true, 'msg' => 'Task completed too fast (probably with error)'); } if (!validatePid($taskPid)) { log::error('Task PID ' . var_export($taskPid, true) . ' for ' . var_export($url, true) . ' not valid'); return array('result' => false, 'msg' => 'Task PID not valid'); } log::notice('Task ' . var_export($url, true) . ' added successful (pid ' . var_export($taskPid, true) . ')'); return array('result' => true, 'pid' => (int) $taskPid, 'msg' => 'Task added successful'); }