/** * factory * * @param $psLine ps-line * @param $client client * @return RunningTransfer */ function getInstance($psLine, $client = '') { global $cfg; // create and return object-instance switch ($client) { case "tornado": require_once 'inc/classes/RunningTransfer.tornado.php'; return new RunningTransferTornado($psLine); case "transmission": require_once 'inc/classes/RunningTransfer.transmissionrpc.php'; return new RunningTransferTransmissionRPC($psLine); case "transmissionrpc": require_once 'inc/classes/RunningTransfer.transmissionrpc.php'; return new RunningTransferTransmissionRPC($psLine); case "mainline": require_once 'inc/classes/RunningTransfer.mainline.php'; return new RunningTransferMainline($psLine); case "azureus": require_once 'inc/classes/RunningTransfer.azureus.php'; return new RunningTransferAzureus($psLine); case "vuzerpc": require_once 'inc/classes/RunningTransfer.vuzerpc.php'; return new RunningTransferVuzeRPC(); case "wget": require_once 'inc/classes/RunningTransfer.wget.php'; return new RunningTransferWget($psLine); case "nzbperl": require_once 'inc/classes/RunningTransfer.nzbperl.php'; return new RunningTransferNzbperl($psLine); default: global $cfg; return RunningTransfer::getInstance($psLine, $cfg["btclient"]); } }
/** * processes * * @param $action */ function sa_processes($action = "") { global $cfg, $error, $statusImage, $statusMessage, $htmlTitle, $htmlTop, $htmlMain; if ($action == "") { return; } buildPage("p"); switch ($action) { case "0": // Processes-main $htmlTitle = "Processes"; $htmlMain .= '<p>'; $htmlMain .= 'View currently running torrentflux-b4rt processes:<br><br>'; $htmlMain .= '<a href="' . _FILE_THIS . '?p=1"><img src="themes/' . $cfg["theme"] . '/images/arrow.gif" width="9" height="9" title="All" border="0"> All</a> - detailed process list'; $htmlMain .= '<p>'; $htmlMain .= '<a href="' . _FILE_THIS . '?p=2"><img src="themes/' . $cfg["theme"] . '/images/arrow.gif" width="9" height="9" title="Transfers" border="0"> Transfers</a> - simple list of running transfers with option to force stop individual transfers'; $htmlMain .= '<br><br>'; break; case "1": // Processes - All $htmlTitle = "Processes - All"; $htmlMain .= '<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid ' . $cfg['main_bgcolor'] . '; position:relative; width:740; height:498; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">'; $htmlMain .= '<br>'; $htmlMain .= '<p><strong>fluxd</strong>'; $htmlMain .= '<pre>'; $htmlMain .= tfb_htmlencode(shell_exec("ps auxww | " . $cfg['bin_grep'] . " fluxd | " . $cfg['bin_grep'] . " -v grep")); $htmlMain .= '</pre>'; $htmlMain .= '<p><strong>fluazu</strong>'; $htmlMain .= '<pre>'; $htmlMain .= tfb_htmlencode(shell_exec("ps auxww | " . $cfg['bin_grep'] . " fluazu.py | " . $cfg['bin_grep'] . " -v grep")); $htmlMain .= '</pre>'; $clients = array('tornado', 'transmission', 'mainline', 'wget', 'nzbperl', 'azureus'); foreach ($clients as $client) { $ch = ClientHandler::getInstance($client); $htmlMain .= '<p><strong>' . $client . '</strong>'; $htmlMain .= '<br>'; $htmlMain .= '<pre>'; $htmlMain .= tfb_htmlencode(shell_exec("ps auxww | " . $cfg['bin_grep'] . " " . tfb_shellencode($ch->binClient) . " | " . $cfg['bin_grep'] . " -v grep")); $htmlMain .= '</pre>'; $htmlMain .= '<br>'; $htmlMain .= '<pre>'; $htmlMain .= $ch->runningProcessInfo(); $htmlMain .= '</pre>'; } $htmlMain .= '</div>'; break; case "2": // Processes - Transfers $htmlTitle = "Processes - Transfers"; $htmlMain .= '<div align="left" id="BodyLayer" name="BodyLayer" style="border: thin solid ' . $cfg['main_bgcolor'] . '; position:relative; width:740; height:498; padding-left: 5px; padding-right: 5px; z-index:1; overflow: scroll; visibility: visible">'; $htmlMain .= '<br> <table width="700" border=1 bordercolor="' . $cfg["table_admin_border"] . '" cellpadding="2" cellspacing="0" bgcolor="' . $cfg["table_data_bg"] . '"> <tr><td colspan=6 bgcolor="' . $cfg["table_header_bg"] . '" background="themes/' . $cfg["theme"] . '/images/bar.gif"> <table width="100%" cellpadding=0 cellspacing=0 border=0><tr><td><font class="title"> Running Items </font></td></tr></table> </td></tr> <tr> <td bgcolor="' . $cfg["table_header_bg"] . '" width="15%" nowrap><div align=center class="title">' . $cfg["_USER"] . '</div></td> <td bgcolor="' . $cfg["table_header_bg"] . '" nowrap><div align=center class="title">' . $cfg["_FILE"] . '</div></td> <td bgcolor="' . $cfg["table_header_bg"] . '" width="1%" nowrap><div align=center class="title">' . $cfg["_FORCESTOP"] . '</div></td> </tr> '; $running = getRunningClientProcesses(); foreach ($running as $rng) { $rt = RunningTransfer::getInstance($rng['pinfo'], $rng['client']); $htmlMain .= '<tr bgcolor="' . $cfg["table_header_bg"] . '">'; $htmlMain .= '<td nowrap><div class="tiny">'; $htmlMain .= tfb_htmlencodekeepspaces($rt->transferowner); $htmlMain .= '</div></td>'; $htmlMain .= '<td nowrap><div align=center><div class="tiny" align="left">'; $htmlMain .= $rt->transferFile; $htmlMain .= '</div></td>'; $htmlMain .= '<td nowrap>'; $htmlMain .= '<a href="dispatcher.php?action=forceStop&riid=_referer_'; $htmlMain .= "&transfer=" . urlencode($rt->transferFile); $htmlMain .= "&pid=" . $rt->processId; $htmlMain .= '"><img src="themes/' . $cfg["theme"] . '/images/kill.gif" width="16" height="16" title="' . $cfg['_FORCESTOP'] . '" border="0"></a></td>'; $htmlMain .= '</tr>'; } $htmlMain .= '</table>'; $htmlMain .= '</div>'; break; } printPage(); exit; }
} $tmpl->setvar('pageop', $pageop); // op-switch switch ($pageop) { case "control": /* control */ switch ($sf->running) { case 1: // running // state $tmpl->setvar('state', "running"); // get pid $pid = 0; $running = $ch->runningProcesses(); foreach ($running as $rng) { $rt = RunningTransfer::getInstance($rng['pinfo'], $ch->client); if ($rt->transferFile == $transfer) { $pid = $rt->processId; break; } } if ($pid == 0) { $pid = getTransferPid($transfer); } $tmpl->setvar('pid', $pid); // break break; case 3: // queued // state $tmpl->setvar('state', "queued");
/** * stop a client * * @param $kill kill-param (optional) * @param $transferPid transfer Pid (optional) */ function _stop($kill = false, $transferPid = 0) { global $cfg; // log AuditAction($cfg["constants"]["stop_transfer"], $this->transfer); // send quit-command to client CommandHandler::add($this->transfer, "q"); CommandHandler::send($this->transfer); // wait until transfer is down waitForTransfer($this->transfer, false, 25); // one more second sleep(1); // flag the transfer as stopped (in db) stopTransferSettings($this->transfer); // set transfers-cache cacheTransfersSet(); // see if the transfer process is hung. $running = $this->runningProcesses(); $isHung = false; foreach ($running as $rng) { $rt = RunningTransfer::getInstance($rng['pinfo'], $this->client); if ($rt->transferFile == $this->transfer) { $isHung = true; AuditAction($cfg["constants"]["error"], "Possible Hung Process for " . $rt->transferFile . " (" . $rt->processId . ")"); } } // kill-request if ($kill && $isHung) { AuditAction($cfg["constants"]["kill_transfer"], $this->transfer); // set pid if (!empty($transferPid)) { // test for valid pid-var if (preg_match('/^[0-9]+$/D', $transferPid)) { $this->pid = $transferPid; } else { $this->state = CLIENTHANDLER_STATE_ERROR; AuditAction($cfg["constants"]["error"], "INVALID PID: " . $transferPid); array_push($this->messages, "INVALID PID: " . $transferPid); return false; } } else { $this->pid = getTransferPid($this->transfer); } // kill it require_once 'inc/defines/defines.signals.php'; if ($this->pid > 0) { $this->callResult = posix_kill($this->pid, SIGKILL); } // try to remove the pid file @unlink($this->transferFilePath . ".pid"); } }