/** * Dequeue Transfer * * @param $transfer * @return mixed */ function _transferDequeue($transfer) { global $cfg; // initialize service-mod (why here ? see "fluxd-single-thread-problem") FluxdServiceMod::initializeServiceMod('Qmgr'); // check queue if (!FluxdQmgr::isRunning()) { $this->_outputError("Qmgr is not running.\n"); return false; } // check transfer if (!transferExists($transfer)) { $this->_outputError("transfer does not exist.\n"); return false; } // set user $cfg["user"] = getOwner($transfer); // output $this->_outputMessage("Dequeue " . $transfer . " for user " . $cfg["user"] . "...\n"); // dequeue FluxdQmgr::dequeueTransfer($transfer, $cfg["user"]); $this->_outputMessage("done.\n"); return true; }
/** * multi * * @param $action */ function dispatcher_multi($action) { global $cfg; // is enabled ? if ($cfg["enable_multiops"] != 1) { AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use multi-op " . $action); @error("multiops are disabled", "", ""); } // messages-ary $dispatcherMessages = array(); // loop if (empty($_POST['transfer'])) { return; } foreach ($_POST['transfer'] as $key => $element) { // url-decode $transfer = urldecode($element); // is valid transfer ? + check permissions $invalid = true; if (tfb_isValidTransfer($transfer) === true) { if (substr($transfer, -8) == ".torrent") { // this is a torrent-client $invalid = false; } else { if (substr($transfer, -5) == ".wget") { // this is wget. $invalid = false; // is enabled ? if ($cfg["enable_wget"] == 0) { $invalid = true; AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget"); array_push($dispatcherMessages, "wget is disabled : " . $transfer); } else { if ($cfg["enable_wget"] == 1) { if (!$cfg['isAdmin']) { $invalid = true; AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget"); array_push($dispatcherMessages, "wget is disabled for users : " . $transfer); } } } } else { if (substr($transfer, -4) == ".nzb") { // This is nzbperl. $invalid = false; if ($cfg["enable_nzbperl"] == 0) { $invalid = true; AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl"); array_push($dispatcherMessages, "nzbperl is disabled : " . $transfer); } else { if ($cfg["enable_nzbperl"] == 1) { if (!$cfg['isAdmin']) { $invalid = true; AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl"); array_push($dispatcherMessages, "nzbperl is disabled for users : " . $transfer); } } } } } } } if ($invalid) { AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: " . $cfg["user"] . " tried to " . $action . " " . $transfer); array_push($dispatcherMessages, "Invalid Transfer : " . $transfer); continue; } // client $client = getTransferClient($transfer); // is transfer running ? $tRunningFlag = isTransferRunning($transfer); // action switch switch ($action) { case "transferStart": /* transferStart */ if (!$tRunningFlag) { $ch = ClientHandler::getInstance($client); $ch->start($transfer, false, FluxdQmgr::isRunning()); if (count($ch->messages) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages); } } break; case "transferStop": /* transferStop */ if ($tRunningFlag) { $ch = ClientHandler::getInstance($client); $ch->stop($transfer); if (count($ch->messages) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages); } } break; case "transferEnQueue": /* transferEnQueue */ if (!$tRunningFlag) { // enqueue it $ch = ClientHandler::getInstance($client); $ch->start($transfer, false, true); if (count($ch->messages) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages); } } break; case "transferDeQueue": /* transferDeQueue */ if (!$tRunningFlag) { // dequeue it FluxdQmgr::dequeueTransfer($transfer, $cfg['user']); } break; case "transferResetTotals": /* transferResetTotals */ $msgs = resetTransferTotals($transfer, false); if (count($msgs) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $msgs); } break; default: if ($tRunningFlag) { // stop first $ch = ClientHandler::getInstance($client); $ch->stop($transfer); if (count($ch->messages) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages); } // is transfer running ? $tRunningFlag = isTransferRunning($transfer); } // if it was running... hope the thing is down... // only continue if it is if (!$tRunningFlag) { switch ($action) { case "transferWipe": /* transferWipe */ $msgsDelete = deleteTransferData($transfer); if (count($msgsDelete) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete); } $msgsReset = resetTransferTotals($transfer, true); if (count($msgsReset) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $msgsReset); } break; case "transferData": /* transferData */ $msgsDelete = deleteTransferData($transfer); if (count($msgsDelete) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete); } case "transfer": /* transfer */ $ch = ClientHandler::getInstance($client); $ch->delete($transfer); if (count($ch->messages) > 0) { $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages); } } } } // end switch } // end loop // error if messages if (count($dispatcherMessages) > 0) { @error("There were Problems", "", "", $dispatcherMessages); } }
/** * _maintenanceTransfers * * @param $trestart * @return boolean */ function _maintenanceTransfers($trestart = false) { global $cfg, $db, $transfers; // set var $this->_restartTransfers = $trestart; // output $this->_outputMessage("transfers-maintenance...\n"); // sanity-check for transfers-dir if (!is_dir($cfg["transfer_file_path"])) { $this->state = MAINTENANCEANDREPAIR_STATE_ERROR; $msg = "invalid dir-settings. no dir : " . $cfg["transfer_file_path"]; array_push($this->messages, $msg); $this->_outputError($msg . "\n"); return false; } // pid-files of transfer-clients $pidFiles = array(); if ($dirHandle = @opendir($cfg["transfer_file_path"])) { while (false !== ($file = @readdir($dirHandle))) { if (strlen($file) > 3 && substr($file, -4, 4) == ".pid") { array_push($pidFiles, $file); } } @closedir($dirHandle); } // return if no pid-files found if (count($pidFiles) < 1) { $this->_outputMessage("no pid-files found.\n"); $this->_outputMessage("transfers-maintenance done.\n"); return true; } // get process-list $psString = trim(shell_exec("ps x -o pid='' -o ppid='' -o command='' -ww")); // test if client for pid is still up $this->_bogusTransfers = array(); foreach ($pidFiles as $pidFile) { $transfer = substr($pidFile, 0, -4); if (stristr($psString, $transfer) === false) { if (getTransferClient($transfer) != "azureus") { array_push($this->_bogusTransfers, $transfer); } } } // return if no stale pid-files $this->_countProblems = count($this->_bogusTransfers); if ($this->_countProblems < 1) { $this->_outputMessage("no stale pid-files found.\n"); $this->_outputMessage("transfers-maintenance done.\n"); return true; } /* repair the bogus clients */ $this->_countFixed = 0; $this->_outputMessage("repairing died clients...\n"); foreach ($this->_bogusTransfers as $transfer) { // output $this->_outputMessage("repairing " . $transfer . " ...\n"); // set stopped flag in db stopTransferSettings($transfer); // rewrite stat-file $sf = new StatFile($transfer, getOwner($transfer)); $sf->running = 0; $sf->percent_done = -100.0; $sf->time_left = 'Transfer Died'; $sf->down_speed = 0; $sf->up_speed = 0; $sf->seeds = 0; $sf->peers = 0; $sf->write(); // delete pid-file @unlink($cfg["transfer_file_path"] . $transfer . ".pid"); // DEBUG : log the repair of the bogus transfer if ($cfg['debuglevel'] > 0) { AuditAction($cfg["constants"]["debug"], "transfers-maintenance : transfer repaired : " . $transfer); } // output $this->_outputMessage("done.\n"); // count $this->_countFixed++; } // output if ($this->_countProblems > 0) { $this->_outputMessage("repaired transfers : " . $this->_countFixed . "/" . $this->_countProblems . "\n"); } /* restart transfers */ if ($this->_restartTransfers) { $this->_fixedTransfers = array(); $this->_outputMessage("restarting died clients...\n"); // hold current user $whoami = $this->_mode == MAINTENANCEANDREPAIR_MODE_CLI ? GetSuperAdmin() : $cfg["user"]; foreach ($this->_bogusTransfers as $transfer) { // output $this->_outputMessage("Starting " . $transfer . " ...\n"); // set current user to transfer-owner $cfg["user"] = getOwner($transfer); // clientHandler + start $ch = ClientHandler::getInstance(getTransferClient($transfer)); $ch->start($transfer, false, FluxdQmgr::isRunning()); // DEBUG : log the restart of the died transfer if ($cfg['debuglevel'] > 0) { $staret = $ch->state == CLIENTHANDLER_STATE_OK ? "OK" : "FAILED"; AuditAction($cfg["constants"]["debug"], "transfers-maintenance : restarted transfer " . $transfer . " by " . $whoami . " : " . $staret); } if ($ch->state == CLIENTHANDLER_STATE_OK) { // output $this->_outputMessage("done.\n"); // add to ary array_push($this->_fixedTransfers, $transfer); // count $this->_countFixed++; } else { $this->messages = array_merge($this->messages, $ch->messages); $this->_outputError(implode("\n", $ch->messages) . "\n"); } } // set user back $cfg["user"] = $whoami; // output $this->_countFixed = count($this->_fixedTransfers); if ($this->_countFixed > 0) { $this->_outputMessage("restarted transfers : " . $this->_countFixed . "/" . $this->_countProblems . "\n"); } } /* done */ $this->_outputMessage("transfers-maintenance done.\n"); // return return true; }
$tmpl->setvar('_MONTHXFER', $cfg['_MONTHXFER']); $tmpl->setvar('_WEEKXFER', $cfg['_WEEKXFER']); $tmpl->setvar('_DAYXFER', $cfg['_DAYXFER']); $tmpl->setvar('_YOURXFERSTATS', $cfg['_YOURXFERSTATS']); $tmpl->setvar('totalxfer1', @formatFreeSpace($xfer_total['total']['total'] / 1048576)); $tmpl->setvar('monthxfer1', @formatFreeSpace($xfer_total['month']['total'] / 1048576)); $tmpl->setvar('weekxfer1', @formatFreeSpace($xfer_total['week']['total'] / 1048576)); $tmpl->setvar('dayxfer1', @formatFreeSpace($xfer_total['day']['total'] / 1048576)); $xfer = Xfer::getStats(); $tmpl->setvar('total2', @formatFreeSpace($xfer[$cfg["user"]]['total']['total'] / 1048576)); $tmpl->setvar('month2', @formatFreeSpace($xfer[$cfg["user"]]['month']['total'] / 1048576)); $tmpl->setvar('week2', @formatFreeSpace($xfer[$cfg["user"]]['week']['total'] / 1048576)); $tmpl->setvar('day2', @formatFreeSpace($xfer[$cfg["user"]]['day']['total'] / 1048576)); } // queue if (FluxdQmgr::isRunning()) { $tmpl->setvar('_QUEUEMANAGER', $cfg['_QUEUEMANAGER']); $tmpl->setvar('runningTransferCount', getRunningTransferCount()); $tmpl->setvar('countQueuedTransfers', FluxdQmgr::countQueuedTransfers()); $tmpl->setvar('limitGlobal', $cfg["fluxd_Qmgr_maxTotalTransfers"]); $tmpl->setvar('limitUser', $cfg["fluxd_Qmgr_maxUserTransfers"]); } // other $tmpl->setvar('_OTHERSERVERSTATS', $cfg['_OTHERSERVERSTATS']); $tmpl->setvar('downloadspeed1', @number_format($cfg["total_download"], 2)); $tmpl->setvar('downloadspeed11', @number_format($transfers['sum']['drate'], 2)); $tmpl->setvar('uploadspeed1', @number_format($cfg["total_upload"], 2)); $tmpl->setvar('uploadspeed11', @number_format($transfers['sum']['rate'], 2)); $tmpl->setvar('totalspeed1', @number_format($cfg["total_download"] + $cfg["total_upload"], 2)); $tmpl->setvar('totalspeed11', @number_format($transfers['sum']['rate'] + $transfers['sum']['drate'], 2)); $tmpl->setvar('id_connections1', $netstatConnectionsSum);
if ($cfg["showdirtree"] == 1) { tmplSetDirTree($ch->savepath, $cfg["maxdepth"]); } } else { $tmpl->setvar('showdirtree', 0); } // hash-check $tmpl->setvar('skip_hash_check_enabled', $cfg["supportMap"][$ch->client]['skip_hash_check']); if ($cfg["supportMap"][$ch->client]['skip_hash_check'] == 1) { $dsize = getTorrentDataSize($transfer); $tmpl->setvar('is_skip', $dsize > 0 && $dsize != 4096 ? $cfg["skiphashcheck"] : 0); } else { $tmpl->setvar('is_skip', 0); } // queue $tmpl->setvar('is_queue', FluxdQmgr::isRunning() ? 1 : 0); // break break; default: /* default */ @error("Invalid pageop", "", "", array($pageop)); } // title + foot tmplSetFoot(false); tmplSetTitleBar($transferLabel . " - Control", false); // lang vars $tmpl->setvar('_RUNTRANSFER', $cfg['_RUNTRANSFER']); $tmpl->setvar('_STOPTRANSFER', $cfg['_STOPTRANSFER']); $tmpl->setvar('_DELQUEUE', $cfg['_DELQUEUE']); // iid tmplSetIidVars();
/** * start a client. */ function _start() { global $cfg; if ($this->state != CLIENTHANDLER_STATE_READY) { $this->state = CLIENTHANDLER_STATE_ERROR; array_push($this->messages, "Error. ClientHandler in wrong state on start-request."); // write error to stat $sf = new StatFile($this->transfer, $this->owner); $sf->time_left = 'Error'; $sf->write(); // return return; } // Save transfer settings $this->settingsSave(); // flush session-cache (trigger transfers-cache-set on next page-load) cacheFlush($cfg['user']); // write the session to close so older version of PHP will not hang @session_write_close(); // sf $sf = new StatFile($this->transfer, $this->owner); // queue or start ? if ($this->queue) { // queue if (FluxdQmgr::isRunning()) { // write stat-file $sf->queue(); // send command FluxdQmgr::enqueueTransfer($this->transfer, $cfg['user']); // log AuditAction($cfg["constants"]["queued_transfer"], $this->transfer); $this->logMessage("transfer enqueued : " . $this->transfer . "\n", true); } else { $msg = "queue-request (" . $this->transfer . "/" . $cfg['user'] . ") but Qmgr not active"; array_push($this->messages, $msg); AuditAction($cfg["constants"]["error"], $msg); $this->logMessage($msg . "\n", true); } // set flag $this->running = 0; } else { // start // write stat-file $sf->start(); // log the command $this->logMessage("executing command : \n" . $this->command . "\n", true); // startup $this->callResult = exec($this->command); AuditAction($cfg["constants"]["start_torrent"], $this->transfer); // set flag $this->running = 1; // wait until transfer is up waitForTransfer($this->transfer, true, 20); } if (empty($this->messages)) { // set state $this->state = CLIENTHANDLER_STATE_OK; } else { // error $this->state = CLIENTHANDLER_STATE_ERROR; $msg = "error starting client. messages :\n"; $msg .= implode("\n", $this->messages); $this->logMessage($msg . "\n", true); // write error to stat $sf->time_left = 'Error'; $sf->write(); } }
} /******************************************************************************/ // is enabled ? if ($cfg["enable_multiupload"] != 1) { AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use multiupload"); @error("multiupload is disabled", "index.php?iid=index", ""); } // init template-instance tmplInitializeInstance($cfg["theme"], "page.multiup.tmpl"); // form $row_list = array(); for ($j = 0; $j < $cfg["hack_multiupload_rows"]; ++$j) { array_push($row_list, array()); } $tmpl->setloop('row_list', $row_list); // queue $tmpl->setvar('queueActive', FluxdQmgr::isRunning() ? 1 : 0); // $tmpl->setvar('file_types_label', $cfg['file_types_label']); // $tmpl->setvar('_UPLOAD', $cfg['_UPLOAD']); $tmpl->setvar('_SELECTFILE', $cfg['_SELECTFILE']); $tmpl->setvar('_ID_IMAGES', $cfg['_ID_IMAGES']); $tmpl->setvar('_MULTIPLE_UPLOAD', $cfg['_MULTIPLE_UPLOAD']); // $tmpl->setvar('enable_multiupload', $cfg["enable_multiupload"]); tmplSetTitleBar($cfg["pagetitle"] . ' - ' . $cfg['_MULTIPLE_UPLOAD']); tmplSetFoot(); tmplSetIidVars(); // parse template $tmpl->pparse();