コード例 #1
0
 /**
  * clean stat file
  *
  * @param $transfer
  * @return boolean
  */
 function cleanStoppedStatFile($transfer)
 {
     $stat = new StatFile($this->transfer, $this->owner);
     return $stat->stop();
 }
コード例 #2
0
 /**
  * _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;
 }
コード例 #3
0
 /**
  * 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);
                 }
             }
         }
     }
 }
コード例 #4
0
 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();
 }