/** * startQueueManager */ function startQueueManager() { // is there a stat and torrent dir? if (is_dir($this->cfg["torrent_file_path"])) { if (is_writable($this->cfg["torrent_file_path"]) && !is_dir($this->cfg["torrent_file_path"] . "queue/")) { //Then create it mkdir($this->cfg["torrent_file_path"] . "queue/", 0777); } } if ($this->checkQManager() == 0) { $cmd1 = "cd " . $this->cfg["path"] . "TFQUSERNAME"; if (!array_key_exists("pythonCmd", $this->cfg)) { insertSetting("pythonCmd", "/usr/bin/python"); } if (!array_key_exists("debugTorrents", $this->cfg)) { insertSetting("debugTorrents", false); } if (!$this->cfg["debugTorrents"]) { $pyCmd = $this->cfg["pythonCmd"] . " -OO"; } else { $pyCmd = $this->cfg["pythonCmd"]; } $btphp = "'" . $cmd1 . "; HOME=" . $this->cfg["path"] . "; export HOME; nohup " . $pyCmd . " " . $this->cfg["btclient_tornado_bin"] . " '"; $startCommand = $pyCmd . " " . $this->cfg["tfQManager"] . " " . $this->cfg["torrent_file_path"] . "queue/ " . escapeshellarg($this->limitGlobal) . " " . $this->limitUser . " " . $this->cfg["sleepInterval"] . " " . $btphp . " > /dev/null &"; $result = exec($startCommand); sleep(2); // wait for it to start prior to getting pid $this->pid = $this->getQManagerPID(); AuditAction($this->cfg["constants"]["QManager"], "Started PID:" . $this->pid); // set status $this->status = 2; return true; } else { AuditAction($this->cfg["constants"]["QManager"], "QManager Already Started PID:" . $this->getQManagerPID()); return true; } }
/** * save Settings * * @param $dbTable * @param $settings */ function saveSettings($dbTable, $settings) { global $cfg, $db; foreach ($settings as $key => $value) { if (array_key_exists($key, $cfg)) { if (is_array($cfg[$key]) || is_array($value)) { if (serialize($cfg[$key]) != serialize($value)) { updateSetting($dbTable, $key, $value); } } elseif ($cfg[$key] != $value) { updateSetting($dbTable, $key, $value); } } else { insertSetting($dbTable, $key, $value); } } }
$priolist = implode(',', array_slice($priolist, 1, $priolist[0])); $command .= " --priority " . escapeshellarg($priolist); } if ($cfg["cmd_options"]) { $command .= " " . escapeshellarg($cfg["cmd_options"]); } $command .= " > /dev/null &"; if ($cfg["AllowQueing"] && $queue == "1") { // This file is being queued. } else { // This flie is being started manually. if (!array_key_exists("pythonCmd", $cfg)) { insertSetting("pythonCmd", "/usr/bin/python"); } if (!array_key_exists("debugTorrents", $cfg)) { insertSetting("debugTorrents", "0"); } if (!$cfg["debugTorrents"]) { $pyCmd = escapeshellarg($cfg["pythonCmd"]) . " -OO"; } else { $pyCmd = escapeshellarg($cfg["pythonCmd"]); } $command = "cd " . $cfg["path"] . $owner . "; HOME=" . $cfg["path"] . "; export HOME; nohup " . $pyCmd . " " . escapeshellarg($cfg["btphpbin"]) . " " . $command; } } else { // Must be using the Original BitTorrent Client // This is now being required to allow Queing functionality //$command = "cd " . $cfg["path"] . $owner . "; nohup " . $cfg["btphpbin"] . " ".$runtime." ".$sharekill." ".$cfg["torrent_file_path"].$alias.".stat ".$owner." --responsefile \"".$cfg["torrent_file_path"].$torrent."\" --display_interval 5 --max_download_rate ". $drate ." --max_upload_rate ".$rate." --max_uploads ".$maxuploads." --minport ".$minport." --maxport ".$maxport." --rerequest_interval ".$rerequest." ".$cfg["cmd_options"]." > /dev/null &"; $messages .= "<b>Error</b> BitTornado is only supported Client at this time.<br>"; } // write the session to close so older version of PHP will not hang
/** * starts a bittorrent-client * @param $torrent name of the torrent * @param $interactive (1|0) : is this a interactive startup with dialog ? */ function startTorrentClient($torrent, $interactive) { // do tornado special-pre-start-checks // check to see if the path to the python script is valid if (!is_file($this->cfg["btclient_tornado_bin"])) { AuditAction($this->cfg["constants"]["error"], "Error Path for " . $this->cfg["btclient_tornado_bin"] . " is not valid"); if (IsAdmin()) { $this->status = -1; header("location: admin.php?op=configSettings"); return; } else { $this->status = -1; $this->messages .= "<b>Error</b> TorrentFlux settings are not correct (path to python script is not valid) -- please contact an admin.<br>"; return; } } // prepare starting of client parent::prepareStartTorrentClient($torrent, $interactive); // prepare succeeded ? if ($this->status != 2) { $this->status = -1; $this->messages .= "<b>Error</b> parent::prepareStartTorrentClient(" . $torrent . "," . $interactive . ") failed<br>"; return; } // build the command-string $skipHashCheck = ""; if (!empty($this->skip_hash_check) && getTorrentDataSize($torrent) > 0) { $skipHashCheck = " --check_hashes 0"; } $this->command = $this->runtime; $this->command .= " " . $this->sharekill_param; $this->command .= " " . escapeshellarg($this->cfg["torrent_file_path"] . $this->alias . ".stat"); $this->command .= " " . $this->owner; $this->command .= " --responsefile " . escapeshellarg($this->cfg["torrent_file_path"] . $this->torrent); $this->command .= " --display_interval 5"; $this->command .= " --max_download_rate " . $this->drate; $this->command .= " --max_upload_rate " . $this->rate; $this->command .= " --max_uploads " . $this->maxuploads; $this->command .= " --minport " . $this->port; $this->command .= " --maxport " . $this->maxport; $this->command .= " --rerequest_interval " . $this->rerequest; $this->command .= " --super_seeder " . $this->superseeder; $this->command .= " --max_connections " . $this->maxcons; $this->command .= $skipHashCheck; if (file_exists($this->cfg["torrent_file_path"] . $this->alias . ".prio")) { $priolist = explode(',', file_get_contents($this->cfg["torrent_file_path"] . $this->alias . ".prio")); $priolist = implode(',', array_slice($priolist, 1, $priolist[0])); $this->command .= " --priority " . $priolist; } if (strlen($this->cfg["btclient_tornado_options"]) > 0) { $this->command .= " " . $this->cfg["btclient_tornado_options"]; } $this->command .= " > /dev/null &"; if ($this->cfg["AllowQueing"] && $this->queue == "1") { // This file is queued. } else { // This file is started manually. if (!array_key_exists("pythonCmd", $this->cfg)) { insertSetting("pythonCmd", "/usr/bin/python"); } if (!array_key_exists("debugTorrents", $this->cfg)) { insertSetting("debugTorrents", "0"); } $pyCmd = ""; if (!$this->cfg["debugTorrents"]) { $pyCmd = $this->cfg["pythonCmd"] . " -OO"; } else { $pyCmd = $this->cfg["pythonCmd"]; } $this->command = "cd " . escapeshellarg($this->savepath) . "; HOME=" . escapeshellarg($this->cfg["path"]) . "; export HOME;" . $this->umask . " nohup " . $this->nice . $pyCmd . " " . escapeshellarg($this->cfg["btclient_tornado_bin"]) . " " . $this->command; } // start the client parent::doStartTorrentClient(); }
function saveSettings($settings) { global $cfg, $db; if ($settings == null) { return; } foreach ($settings as $key => $value) { if (array_key_exists($key, $cfg)) { if (is_array($cfg[$key]) || is_array($value)) { if (serialize($cfg[$key]) != serialize($value)) { updateSetting($key, $value); } } elseif ($cfg[$key] != $value) { updateSetting($key, $value); } else { // Nothing has Changed.. } } else { insertSetting($key, $value); } } }
function queueSettings() { global $cfg; include_once "AliasFile.php"; include_once "RunningTorrent.php"; DisplayHead("Administration - Search Settings"); // Admin Menu displayMenu(); // Queue Manager Section echo "<div align=\"center\">"; echo "<a name=\"QManager\" id=\"QManager\"></a>"; echo "<table width=\"100%\" border=1 bordercolor=\"" . $cfg["table_admin_border"] . "\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"" . $cfg["table_data_bg"] . "\">"; echo "<tr><td bgcolor=\"" . $cfg["table_header_bg"] . "\" background=\"themes/" . $cfg["theme"] . "/images/bar.gif\">"; echo "<font class=\"title\">"; if (checkQManager() > 0) { echo " <img src=\"images/green.gif\" align=\"absmiddle\" align=\"absmiddle\"> Queue Manager Running [PID=" . getQManagerPID() . " with " . strval(getRunningTorrentCount()) . " torrent(s)]"; } else { echo " <img src=\"images/black.gif\" align=\"absmiddle\"> Queue Manager Off"; } echo "</font>"; echo "</td></tr><tr><td align=\"center\">"; ?> <script language="JavaScript"> function validateSettings() { var rtnValue = true; var msg = ""; if (isNumber(document.theForm.maxServerThreads.value) == false) { msg = msg + "* Max Server Threads must be a valid number.\n"; document.theForm.maxServerThreads.focus(); } if (isNumber(document.theForm.maxUserThreads.value) == false) { msg = msg + "* Max User Threads must be a valid number.\n"; document.theForm.maxUserThreads.focus(); } if (isNumber(document.theForm.sleepInterval.value) == false) { msg = msg + "* Sleep Interval must be a valid number.\n"; document.theForm.sleepInterval.focus(); } if (msg != "") { rtnValue = false; alert("Please check the following:\n\n" + msg); } return rtnValue; } function isNumber(sText) { var ValidChars = "0123456789."; var IsNumber = true; var Char; for (i = 0; i < sText.length && IsNumber == true; i++) { Char = sText.charAt(i); if (ValidChars.indexOf(Char) == -1) { IsNumber = false; } } return IsNumber; } </script> <div align="center"> <table cellpadding="5" cellspacing="0" border="0" width="100%"> <form name="theForm" action="admin.php?op=updateConfigSettings" method="post" onsubmit="return validateSettings()"> <input type="Hidden" name="continue" value="queueSettings"> <tr> <td align="left" width="350" valign="top"><strong>Enable Queue Manager</strong><br> Enable the Queue Manager to allow users to queue torrents: </td> <td> <select name="AllowQueing"> <option value="1">true</option> <option value="0" <?php if (!$cfg["AllowQueing"]) { echo "selected"; } ?> >false</option> </select> </td> </tr> <tr> <td align="left" width="350" valign="top"><strong>tfQManager Path</strong><br> Specify the path to the tfQManager python script: </td> <td valign="top"> <input name="tfQManager" type="Text" maxlength="254" value="<?php echo $cfg["tfQManager"]; ?> " size="55"><?php echo validateFile($cfg["tfQManager"]); ?> </td> </tr> <!-- Only used for develpment or if you really really know what you are doing <tr> <td align="left" width="350" valign="top"><strong>Enable Queue Manager Debugging</strong><br> Creates huge log files only for debugging. DO NOT KEEP THIS MODE ON: </td> <td> <select name="debugTorrents"> <option value="1">true</option> <option value="0" <?php if (array_key_exists("debugTorrents", $cfg)) { if (!$cfg["debugTorrents"]) { echo "selected"; } } else { insertSetting("debugTorrents", false); echo "selected"; } ?> >false</option> </select> </td> </tr> --> <tr> <td align="left" width="350" valign="top"><strong>Max Server Threads</strong><br> Specify the maximum number of torrents the server will allow to run at one time (admins may override this): </td> <td valign="top"> <input name="maxServerThreads" type="Text" maxlength="3" value="<?php echo $cfg["maxServerThreads"]; ?> " size="3"> </td> </tr> <tr> <td align="left" width="350" valign="top"><strong>Max User Threads</strong><br> Specify the maximum number of torrents a single user may run at one time: </td> <td valign="top"> <input name="maxUserThreads" type="Text" maxlength="3" value="<?php echo $cfg["maxUserThreads"]; ?> " size="3"> </td> </tr> <tr> <td align="left" width="350" valign="top"><strong>Polling Interval</strong><br> Number of seconds the Queue Manager will sleep before checking for new torrents to run: </td> <td valign="top"> <input name="sleepInterval" type="Text" maxlength="3" value="<?php echo $cfg["sleepInterval"]; ?> " size="3"> </td> </tr> <tr> <td align="center" colspan="2"> <br><br> <input type="Submit" value="Update Settings"> </td> </tr> </form> </table> </div> <br> <?php echo "</td></tr>"; echo "</table></div>"; $displayQueue = True; $displayRunningTorrents = True; // Its a timming thing. if ($displayRunningTorrents) { // get Running Torrents. $runningTorrents = getRunningTorrents(); } if ($displayQueue) { $output = ""; echo "\n"; echo "<table width=\"760\" border=1 bordercolor=\"" . $cfg["table_admin_border"] . "\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"" . $cfg["table_data_bg"] . "\">"; echo "<tr><td colspan=6 bgcolor=\"" . $cfg["table_header_bg"] . "\" background=\"themes/" . $cfg["theme"] . "/images/bar.gif\">"; echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr>"; echo "<td><img src=\"images/properties.png\" width=18 height=13 border=0> <font class=\"title\"> Queued Items </font></td>"; echo "</tr></table>"; echo "</td></tr>"; echo "<tr>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\" width=\"15%\"><div align=center class=\"title\">" . _USER . "</div></td>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\"><div align=center class=\"title\">" . _FILE . "</div></td>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\" width=\"15%\"><div align=center class=\"title\">" . _TIMESTAMP . "</div></td>"; echo "</tr>"; echo "\n"; $qDir = $cfg["torrent_file_path"] . "queue/"; if (is_dir($cfg["torrent_file_path"])) { if (is_writable($cfg["torrent_file_path"]) && !is_dir($qDir)) { @mkdir($qDir, 0777); } // get Queued Items and List them out. $output .= ""; $handle = @opendir($qDir); while ($filename = readdir($handle)) { if ($filename != "tfQManager.log") { if ($filename != "." && $filename != ".." && strpos($filename, ".pid") == 0) { $output .= "<tr>"; $output .= "<td><div class=\"tiny\">"; $af = new AliasFile(str_replace("queue/", "", $qDir) . str_replace(".Qinfo", "", $filename), ""); $output .= $af->torrentowner; $output .= "</div></td>"; $output .= "<td><div align=center><div class=\"tiny\" align=\"left\">" . str_replace(array(".Qinfo", ".stat"), "", $filename) . "</div></td>"; $output .= "<td><div class=\"tiny\" align=\"center\">" . date(_DATETIMEFORMAT, strval(filectime($qDir . $filename))) . "</div></td>"; $output .= "</tr>"; $output .= "\n"; } } } closedir($handle); } if (strlen($output) == 0) { $output = "<tr><td colspan=3><div class=\"tiny\" align=center>Queue is Empty</div></td></tr>"; } echo $output; echo "</table>"; } if ($displayRunningTorrents) { $output = ""; echo "\n"; echo "<table width=\"760\" border=1 bordercolor=\"" . $cfg["table_admin_border"] . "\" cellpadding=\"2\" cellspacing=\"0\" bgcolor=\"" . $cfg["table_data_bg"] . "\">"; echo "<tr><td colspan=6 bgcolor=\"" . $cfg["table_header_bg"] . "\" background=\"themes/" . $cfg["theme"] . "/images/bar.gif\">"; echo "<table width=\"100%\" cellpadding=0 cellspacing=0 border=0><tr>"; echo "<td><img src=\"images/properties.png\" width=18 height=13 border=0> <font class=\"title\"> Running Items </font></td>"; echo "</tr></table>"; echo "</td></tr>"; echo "<tr>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\" width=\"15%\"><div align=center class=\"title\">" . _USER . "</div></td>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\"><div align=center class=\"title\">" . _FILE . "</div></td>"; echo "<td bgcolor=\"" . $cfg["table_header_bg"] . "\" width=\"1%\"><div align=center class=\"title\">" . str_replace(" ", "<br>", _FORCESTOP) . "</div></td>"; echo "</tr>"; echo "\n"; // get running torrents and List them out. $runningTorrents = getRunningTorrents(); if (is_array($runningTorrents)) { foreach ($runningTorrents as $key => $value) { $rt = new RunningTorrent($value); $output .= $rt->BuildAdminOutput(); } } if (strlen($output) == 0) { $output = "<tr><td colspan=3><div class=\"tiny\" align=center>No Running Torrents</div></td></tr>"; } echo $output; echo "</table>"; } DisplayFoot(); }
function startQManager($maxServerThreads = 5, $maxUserThreads = 2, $sleepInterval = 10) { global $cfg; // is there a stat and torrent dir? if (is_dir($cfg["torrent_file_path"])) { if (is_writable($cfg["torrent_file_path"]) && !is_dir($cfg["torrent_file_path"] . "queue/")) { //Then create it mkdir($cfg["torrent_file_path"] . "queue/", 0777); } } if (checkQManager() == 0) { $cmd1 = "cd " . $cfg["path"] . "TFQUSERNAME"; if (!array_key_exists("pythonCmd", $cfg)) { insertSetting("pythonCmd", "/usr/bin/python"); } if (!array_key_exists("debugTorrents", $cfg)) { insertSetting("debugTorrents", false); } if (!$cfg["debugTorrents"]) { $pyCmd = $cfg["pythonCmd"] . " -OO"; } else { $pyCmd = $cfg["pythonCmd"]; } $btphp = "'" . $cmd1 . "; HOME=" . $cfg["path"] . "; export HOME; nohup " . $pyCmd . " " . $cfg["btphpbin"] . " '"; $command = $pyCmd . " " . $cfg["tfQManager"] . " " . $cfg["torrent_file_path"] . "queue/ " . escapeshellarg($maxServerThreads) . " " . escapeshellarg($maxUserThreads) . " " . escapeshellarg($sleepInterval) . " " . $btphp . " > /dev/null &"; //$command = $pyCmd . " " . $cfg["tfQManager"] . " ".$cfg["torrent_file_path"]."queue/ ".$maxServerThreads." ".$maxUserThreads." ".$sleepInterval." ".$btphp." > /dev/null2>&1 & &"; $result = exec($command); sleep(2); // wait for it to start prior to getting pid AuditAction($cfg["constants"]["QManager"], "Started PID:" . getQManagerPID()); } else { AuditAction($cfg["constants"]["QManager"], "QManager Already Started PID:" . getQManagerPID()); } }