Blame | Last modification | View Log | Download
<?php/************************************************************** TorrentFlux PHP Torrent Manager* www.torrentflux.com**************************************************************//*This file is part of TorrentFlux.TorrentFlux is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.TorrentFlux is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with TorrentFlux; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*//*****Usage: btmakemetafile.py <trackerurl> <file> [file...] [params...]--announce_list <arg>a list of announce URLs - explained below (defaults to '')--httpseeds <arg>a list of http seed URLs - explained below (defaults to '')--piece_size_pow2 <arg>which power of 2 to set the piece size to (0 = automatic) (defaultsto 0)--comment <arg>optional human-readable comment to put in .torrent (defaults to '')--filesystem_encoding <arg>optional specification for filesystem encoding (set automatically inrecent Python versions) (defaults to '')--target <arg>optional target file for the torrent (defaults to '')announce_list = optional list of redundant/backup tracker URLs, in the format:url[,url...][|url[,url...]...]where URLs separated by commas are all tried firstbefore the next group of URLs separated by the pipe is checked.If none is given, it is assumed you don't want one in the metafile.If announce_list is given, clients which support itwill ignore the <announce> value.Examples:http://tracker1.com|http://tracker2.com|http://tracker3.com(tries trackers 1-3 in order)http://tracker1.com,http://tracker2.com,http://tracker3.com(tries trackers 1-3 in a randomly selected order)http://tracker1.com|http://backup1.com,http://backup2.com(tries tracker 1 first, then tries between the 2 backups randomly)httpseeds = optional list of http-seed URLs, in the format:url[|url...]*****/include_once("config.php");include_once("functions.php");// Variable information$tpath = $cfg["torrent_file_path"];$tfile = $_POST['torrent'];$file = $_GET['path'];$torrent = cleanFileName(StripFolders( trim($file) )) . ".torrent";$announce = ( $_POST['announce'] ) ? $_POST['announce'] : "http://";$ancelist = $_POST['announcelist'];$comment = $_POST['comments'];$peice = $_POST['piecesize'];$alert = ( $_POST['alert'] ) ? 1 : "''";$private = ( $_POST['Private'] == "Private" ) ? true : false;$dht = ( $_POST['DHT'] == "DHT" ) ? true : false;// Let's create the torrentif( !empty( $announce ) && $announce != "http://" ){// Create maketorrent directory if it doesn't existif( !is_dir( $tpath ) ){@mkdir( $tpath );}// Clean up old filesif( @file_exists( $tpath . $tfile ) ){@unlink( $tpath . $tfile );}// This is the command to execute$app = "nohup " . $cfg["pythonCmd"] . " -OO " . $cfg["btmakemetafile"] . " " . $announce . " " . escapeshellarg( $cfg['path'] . $file ) . " ";// Is there comments to add?if( !empty( $comment ) ){$app .= "--comment " . escapeshellarg( $comment ) . " ";}// Set the piece sizeif( !empty( $peice ) ){$app .= "--piece_size_pow2 " . $peice . " ";}if( !empty( $ancelist ) ){$check = "/" . str_replace( "/", "\/", quotemeta( $announce ) ) . "/i";// if they didn't add the primary tracker in, we will add it for themif( preg_match( $check, $ancelist, $result ) )$app .= "--announce_list " . escapeshellarg( $ancelist ) . " ";else$app .= "--announce_list " . escapeshellarg ( $announce . "," . $ancelist ) . " ";}// Set the target torrent fiel$app .= "--target " . escapeshellarg( $tpath . $tfile );// Set to never timeout for large torrentsset_time_limit( 0 );// Let's see how long this takes...$time_start = microtime( true );// Execute the command -- w00t!exec( $app );// We want to check to make sure the file was successful$success = false;$raw = @file_get_contents( $tpath . $tfile );if( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) ){// This means it is a valid torrent$success = true;// Make an entry for the ownerAuditAction($cfg["constants"]["file_upload"], $tfile);// Check to see if one of the flags were setif( $private || $dht ){// Add private/dht Flags// e7:privatei1e// e17:dht_backup_enablei1e// e20:dht_backup_requestedi1eif( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) ){$pos = strpos( $raw, "6:pieces" ) + 9 + strlen( $results[1] ) + $results[1];$fp = @fopen( $tpath . $tfile, "r+" );@fseek( $fp, $pos, SEEK_SET );if( $private ){@fwrite( $fp, "7:privatei1e17:dht_backup_enablei0e20:dht_backup_requestedi0eee" );}else{@fwrite( $fp, "e7:privatei0e17:dht_backup_enablei1e20:dht_backup_requestedi1eee" );}@fclose( $fp );}}}else{// Something went wrong, clean upif( @file_exists( $tpath . $tfile ) ){@unlink( $tpath . $tfile );}}// We are done! how long did we take?$time_end = microtime( true );$diff = duration($time_end - $time_start);// make path URL friendly to support non-standard characters$downpath = urlencode( $tfile );// Depending if we were successful, display the required informationif( $success ){$onLoad = "completed( '" . $downpath . "', " . $alert. ", '" . $diff . "' );";}else{$onLoad = "failed( '" . $downpath . "', " . $alert . " );";}}// This is the torrent download promptif( !empty( $_GET["download"] ) ){$tfile = $_GET["download"];// ../ is not allowed in the file nameif (!ereg("(\.\.\/)", $tfile)){// Does the file exist?if (file_exists($tpath . $tfile)){// Prompt the user to download the new torrent file.header( "Content-type: application/octet-stream\n" );header( "Content-disposition: attachment; filename=\"" . $tfile . "\"\n" );header( "Content-transfer-encoding: binary\n");header( "Content-length: " . @filesize( $tpath . $tfile ) . "\n" );// Send the torrent file$fp = @fopen( $tpath . $tfile, "r" );@fpassthru( $fp );@fclose( $fp );AuditAction($cfg["constants"]["fm_download"], $tfile);}else{AuditAction($cfg["constants"]["error"], "File Not found for download: ".$cfg['user']." tried to download ".$tfile);}}else{AuditAction($cfg["constants"]["error"], "ILLEGAL DOWNLOAD: ".$cfg['user']." tried to download ".$tfile);}exit();}// Strip the folders from the pathfunction StripFolders( $path ){$pos = strrpos( $path, "/" ) + 1;$path = substr( $path, $pos );return $path;}// Convert a timestamp to a duration stringfunction duration( $timestamp ){$years = floor( $timestamp / ( 60 * 60 * 24 * 365 ) );$timestamp %= 60 * 60 * 24 * 365;$weeks = floor( $timestamp / ( 60 * 60 * 24 * 7 ) );$timestamp %= 60 * 60 * 24 * 7;$days = floor( $timestamp / ( 60 * 60 * 24 ) );$timestamp %= 60 * 60 * 24;$hrs = floor( $timestamp / ( 60 * 60 ) );$timestamp %= 60 * 60;$mins = floor( $timestamp / 60 );$secs = $timestamp % 60;$str = "";if( $years >= 1 )$str .= "{$years} years ";if( $weeks >= 1 )$str .= "{$weeks} weeks ";if( $days >= 1 )$str .= "{$days} days ";if( $hrs >= 1 )$str .= "{$hrs} hours ";if( $mins >= 1 )$str .= "{$mins} minutes ";if( $secs >= 1 )$str.="{$secs} seconds ";return $str;}?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1" /><META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>" /><TITLE><?php echo $cfg["pagetitle"]; ?> - Torrent Maker</TITLE><LINK REL="icon" HREF="images/favicon.ico" TYPE="image/x-icon" /><LINK REL="shortcut icon" HREF="images/favicon.ico" TYPE="image/x-icon" /><LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"]; ?>/style.css" TYPE="text/css" /></HEAD><SCRIPT SRC="tooltip.js" TYPE="text/javascript"></SCRIPT><SCRIPT LANGUAGE="JavaScript">function doSubmit( obj ){// Basic check to see if maketorrent is already runningif( obj.value === "Creating..." )return false;// Run some basic validationvar valid = true;var tlength = document.maketorrent.torrent.value.length - 8;var torrent = document.maketorrent.torrent.value.substr( tlength );document.getElementById('output').innerHTML = "";document.getElementById('ttag').innerHTML = "";document.getElementById('atag').innerHTML = "";if( torrent !== ".torrent" ){document.getElementById('ttag').innerHTML = "<b style=\"color: #990000;\">*</b>";document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Torrent file must end in .torrent</b><BR />";valid = false;}if( document.maketorrent.announce.value === "http://" ){document.getElementById('atag').innerHTML = "<b style=\"color: #990000;\">*</b>";document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Please enter a valid announce URL.</b><BR />";valid = false;}// For saftely reason, let's force the property to false if it's disabled (private tracker)if( document.maketorrent.DHT.disabled ){document.maketorrent.DHT.checked = false;}// If validation passed, submit formif( valid === true ){disableForm();toggleLayer('progress');document.getElementById('output').innerHTML += "<b>Creating torrent...</b><BR /><BR />";document.getElementById('output').innerHTML += "<i>* Note that larger folder/files will take some time to process,</i><BR />";document.getElementById('output').innerHTML += "<i> do not close the window until it has been completed.</i><BR /><BR />";document.getElementById('output').innerHTML += " When completed, the torrent will show in your list<BR />";document.getElementById('output').innerHTML += " and a download link will be provided.<BR />";return true;}return false;}function disableForm(){// Because of IE issue of disabling the submit button,// we change the text and don't allow resubmittingdocument.maketorrent.tsubmit.value = "Creating...";document.maketorrent.torrent.readOnly = true;document.maketorrent.announce.readOnly = true;}function ToggleDHT( dhtstatus ){document.maketorrent.DHT.disabled = dhtstatus;}function toggleLayer( whichLayer ){if( document.getElementById ){// This is the way the standards workvar style2 = document.getElementById(whichLayer).style;style2.display = style2.display ? "" : "block";}else if( document.all ){// This is the way old msie versions workvar style2 = document.all[whichLayer].style;style2.display = style2.display ? "" : "block";}else if( document.layers ){// This is the way nn4 worksvar style2 = document.layers[whichLayer].style;style2.display = style2.display ? "" : "block";}}function completed( downpath, alertme, timetaken ){document.getElementById('output').innerHTML = "<b style='color: #005500;'>Creation completed!</b><BR />";document.getElementById('output').innerHTML += "Time taken: <i>" + timetaken + "</i><BR />";document.getElementById('output').innerHTML += "The new torrent has been added to your list.<BR /><BR />"document.getElementById('output').innerHTML += "<img src='images/green.gif' border='0' title='Torrent Created' align='absmiddle'> You can download the <a style='font-weight: bold;' href='?download=" + downpath + "'>torrent here</a><BR />";if( alertme === 1 )alert( 'Creation of torrent completed!' );}function failed( downpath, alertme ){document.getElementById('output').innerHTML = "<b style='color: #AA0000;'>Creation failed!</b><BR /><BR />";document.getElementById('output').innerHTML += "An error occured while trying to create the torrent.<BR />";if( alertme === 1 )alert( 'Creation of torrent failed!' );}var anlst = "(optional) announce_list = list of tracker URLs<BR />\n";anlst += " <i>url[,url...][|url[,url...]...]</i><BR />\n";anlst += " URLs separated by commas are tried first<BR />\n";anlst += " before URLs separated by the pipe is checked.<BR />\n";anlst += "Examples:<BR />\n";anlst += " <i>http://a.com<strong>|</strong>http://b.com<strong>|</strong>http://c.com</i><BR />\n";anlst += " (tries <b>a-c</b> in order)<BR />\n";anlst += " <i>http://a.com<strong>,</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";anlst += " (tries <b>a-c</b> in a randomly selected order)<BR />\n";anlst += " <i>http://a.com<strong>|</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";anlst += " (tries <b>a</b> first, then tries <b>b-c</b> randomly)<BR />\n";var annce = "tracker announce URL.<BR /><BR />\n";annce += "Example:<BR />\n";annce += " <i>http://tracker.com/announce</i><BR />\n";var tornt = "torrent name to be saved as<BR /><BR />\n";tornt += "Example:<BR />\n";tornt += " <i>gnome-livecd-2.10.torrent</i><BR />\n";var comnt = "add a comment to your torrent file (optional)<BR />\n";comnt += "";var piece = "data piece size for torrent<BR />\n";piece += "power of 2 value to set the piece size to<BR />\n";piece += "(0 = automatic) (0 only option in this version)<BR />\n";var prvte = "private tracker support<BR />\n";prvte += "(disallows DHT if enabled)<BR />\n";var dhtbl = "DHT (Distributed Hash Table)<BR /><BR />\n";dhtbl += "can only be set abled if private flag is not set true<BR />\n";</SCRIPT><body topmargin="8" leftmargin="5" bgcolor="<?php echo $cfg["main_bgcolor"] ?>" style="font-family:Tahoma, 'Times New Roman'; font-size:12px;" onLoad="<?phpif( !empty( $private ) )echo "ToggleDHT(true);";elseecho "ToggleDHT(false);";if( !empty( $onLoad ) )echo $onLoad;?>"><div align="center"><table border="0" cellpadding="0" cellspacing="0"><tr><td><table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="4" cellspacing="0"><tr><td bgcolor="<?php echo $cfg["main_bgcolor"] ?>" background="themes/<?php echo $cfg["theme"] ?>/images/bar.gif"><?php DisplayTitleBar($cfg["pagetitle"]." - Torrent Maker", false); ?></td></tr><tr><td bgcolor="<?php echo $cfg["table_header_bg"] ?>"><div align="left"><table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>"><tr><td><form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post" id="maketorrent" name="maketorrent"><table><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(tornt);" hspace="1" />Torrent name:</td><td><input type="text" id="torrent" name="torrent" size="55" value="<?php echo $torrent; ?>" /> <label id="ttag"></label></td></tr><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(annce);" hspace="1" />Announcement URL:</td><td><input type="text" id="announce" name="announce" size="55" value="<?php echo $announce; ?>" /> <label id="atag"></label></td></tr><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(anlst);" hspace="1" />Announce List:</td><td><input type="text" id="announcelist" name="announcelist" size="55" value="<?php echo $ancelist; ?>" /> <label id="altag"></label></td></tr><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(piece);" hspace="1" />Piece size:</td><td><select id="piecesize" name="piecesize"><option id="0" value="0" selected>0 (Auto)</option><!-- Removed for now as it doesn't seem to be working with creating torrents (??) --><!--<option id="256" value="256">256</option><option id="512" value="512">512</option><option id="1024" value="1024">1024</option><option id="2048" value="2048">2048</option>--></select> bytes</td></tr><tr><td valign="top"><img align="absmiddle" src="images/info.gif" onmouseover="return escape(comnt);" hspace="1" />Comments:</td><td><textarea cols="50" rows="3" id="comments" name="comments"><?php echo $comment; ?></textarea></td></tr><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(prvte);" hspace="1" />Private Torrent:</td><td><input type="radio" id="Private" name="Private" value="Private" onClick="ToggleDHT(true);"<?php echo ( $private ) ? " checked" : ""; ?>>Yes</input><input type="radio" id="Private" name="Private" value="NotPrivate" onClick="ToggleDHT(false);"<?php echo ( !$private ) ? " checked" : ""; ?>>No</input></td></tr><tr><td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(dhtbl);" hspace="1" />DHT Support:</td><td><input type="checkbox" id="DHT" name="DHT"<?php echo ( $dht ) ? " checked" : ""; ?> value="DHT"></input></td></tr><tr><td> </td><td><input type="submit" id="tsubmit" name="tsubmit" onClick="return doSubmit(this);" value="Create" /><input type="button" id="Cancel" name="close" value="Close" onClick="window.close();" /><label for="alert" title="Send alert message box when torrent has been completed."><input type="checkbox" id="alert" name="alert"<?php echo ( $alert != "''" ) ? " checked" : ""; ?> value="AlertMe" />Notify me of completion</label></td></tr><tr><td colspan="2"><div id="progress" name="progress" align="center" style="display: none;"><img src="images/progress_bar.gif" width="200" height="20" /></div><label id="output"></label></td></tr></table></form></td></tr></table></div></td></tr></table><?phpDisplayTorrentFluxLink();?></td></tr></table></div><script language="javascript">tt_Init();</script></body></html>