/** * clean stat file * * @param $transfer * @return boolean */ function cleanStoppedStatFile($transfer) { $stat = new StatFile($this->transfer, $this->owner); return $stat->stop(); }
/** * _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 a -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); //remove ".pid" $client = getTransferClient($transfer); if ($client != "azureus" && strpos($client, 'rpc') === false) { if (stristr($psString, $transfer) === false) { 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->stop(); $sf->time_left = 'Transfer Died'; $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; }
/** * updateStatFiles * * @param $transfer string torrent name * @return boolean */ function updateStatFiles($transfer = "") { global $cfg, $db; $vuze = VuzeRPC::getInstance(); // do special-pre-start-checks if (!VuzeRPC::isRunning()) { return; } $tfs = $vuze->torrent_get_tf(); if (empty($tfs)) { return; } $sql = "SELECT hash, transfer, sharekill FROM tf_transfers WHERE type='torrent' AND client IN ('vuzerpc','azureus')"; if ($transfer != "") { //only update one transfer... $sql .= " AND transfer=" . $db->qstr($transfer); } else { //or a set of hashes $hashes = array("''"); foreach ($tfs as $hash => $t) { $hashes[] = "'" . strtolower($hash) . "'"; } $sql .= " AND hash IN (" . implode(',', $hashes) . ")"; } $recordset = $db->Execute($sql); $hashes = array(); $sharekills = array(); while (list($hash, $transfer, $sharekill) = $recordset->FetchRow()) { $hash = strtoupper($hash); $hashes[$hash] = $transfer; $sharekills[$hash] = $sharekill; } //convertTimeText require_once "inc/functions/functions.core.php"; foreach ($tfs as $hash => $t) { if (!isset($hashes[$hash])) { continue; } $transfer = $hashes[$hash]; $sf = new StatFile($transfer); $sf->running = $t['running']; if ($sf->running) { if ($t['eta'] > 0 || $t['eta'] < -1) { $sf->time_left = convertTimeText($t['eta']); } $sf->percent_done = $t['percentDone']; if ($t['status'] != 9 && $t['status'] != 5) { $sf->peers = $t['peers']; //(temp) force creation of pid file to fix first ones file_put_contents($cfg["transfer_file_path"] . '/' . $transfer . ".pid", "rpc"); } if ($t['seeds'] >= 0) { $sf->seeds = $t['seeds']; } if ($t['peers'] >= 0) { $sf->peers = $t['peers']; } if ((double) $t['speedDown'] > 0.0) { $sf->down_speed = formatBytesTokBMBGBTB($t['speedDown']) . "/s"; } if ((double) $t['speedUp'] > 0.0) { $sf->up_speed = formatBytesTokBMBGBTB($t['speedUp']) . "/s"; } if ($t['status'] == 8) { //seeding //$sf->percent_done = 100 + $t['sharing']; $sf->down_speed = ""; } if ($t['status'] == 9) { //seeding queued //$sf->percent_done = 100 + $t['sharing']; $sf->up_speed = ""; $sf->down_speed = ""; } } else { $sf->down_speed = ""; $sf->up_speed = ""; $sf->peers = ""; if ($t['eta'] < -1) { $sf->time_left = 'Done in ' . convertTimeText($t['eta']); } elseif ($sf->percent_done >= 100 && strpos($sf->time_left, 'Done') === false && strpos($sf->time_left, 'Finished') === false) { $sf->time_left = "Done!"; $sf->percent_done = 100; } if ($sf->percent_done < 100 && $sf->percent_done > 0) { //$sf->percent_done = 0 - $sf->percent_done; $sf->stop(); } } $sf->downtotal = $t['downTotal']; $sf->uptotal = $t['upTotal']; if (!$sf->size) { $sf->size = $t['size']; } if ($sf->seeds = -1) { } $sf->seeds = ''; $sf->write(); } //SHAREKILLS foreach ($tfs as $hash => $t) { if (isset($sharekills[$hash])) { if (($t['status'] == 8 || $t['status'] == 9) && $t['sharing'] > $sharekills[$hash]) { $transfer = $hashes[$hash]; if (!$vuze->torrent_stop_tf($hash)) { $msg = "transfer " . $transfer . " does not exist in vuze."; $this->logMessage($msg . "\n", true); AuditAction($cfg["constants"]["debug"], $this->client . "-stop : error {$hash} {$transfer}."); } else { // flag the transfer as stopped (in db) // log AuditAction($cfg["constants"]["stop_transfer"], $this->client . "-stat. : sharekill stopped {$transfer}"); stopTransferSettings($transfer); } } } } }
function stop($transfer, $kill = false, $transferPid = 0) { global $cfg; $this->_setVarsForTransfer($transfer); AuditAction($cfg["constants"]["debug"], $this->client . "-stop : {$transfer}."); // stop the client $this->_stop($kill, $transferPid); // flag the transfer as stopped (in db) stopTransferSettings($transfer); //@ unlink($this->transferFilePath.".pid"); $stat = new StatFile($this->transfer, $this->owner); return $stat->stop(); }